본문 바로가기

TED 강연 데이터 분석하기! 가장 인기 있는 강의 유형은?

Derrick 발행일 : 2024-01-21
728x90
반응형

 

TED 강연의 관련하여 주어진 통계 자료(ted.csv)에 대해 아래와 같이 분석하고, 인기 있는 강연은 어떤 요소들이 있는지 파이썬을 통해 수치로 분석해보고, 그래프로 시각화해보자

가장 인기 있는 강연의 유형 Top5은?
강연을 끝까지 들은 비율 (강연 길이와 비교/분석)
- 강연에 지원되는 언어의 수에 따른 조회수 분석
- 강의에 대한 다양한 평가와 해당 평가에 대한 키워드 분석

이전 게시물(CSV, JSON 형태의 데이터를 효율적으로~)에서 학습한 assert(), map(), filter() 함수를 이용하면 더 쉽고 간단하게 할 수 있다.

 

# 이전 게시물 (csv, json 데이터 처리)

2024.01.11 - [Data Analyst/Project & Practice] - CSV, JSON 데이터 처리 - lambda, assert, map, filter 등

 

CSV, JSON 데이터 처리 - lambda, assert, map, filter 등

파이썬 데이터 분석을 하는 많은 경우에 주어지는 데이터들은 대부분 CSV, JSON 형태가 많습니다. 간단한 텍스트가 아닌 복잡한 형태로 된 데이터들을 어떻게 효율적으로 처리하고 분석하는지 기

derrick.tistory.com

 

# TED 강연데이터를 통해 분석하고자 하는 아래 목표 4가지를 어떻게 구현할지 미리 생각하고, 선행되어야 할 과정을 코드로 구현해보자. (목표마다 아래서부터 위로 구현하면 목표 달성)

1. 가장 인기 있는 강의 유형 Top N개 추출 (=get_popular_tags(talks, n))
 1) '인기있는(=인기도)''해당 태그(tag)를 포함하는 강의들의 조회수 총합'으로 정의
 2) (태그, 인기도) 형식의 리스트 형태에서 인기도(1번째 index)가 높은 순으로 정렬해서 추출
  → sorted(), itemgetter() 함수 사용. 상위 n번째 데이터까지 추출([:n])
 3) 강의데이터에서 'tags'와 'views'를 순회하면서 '태그별 조회수'인 딕셔너리 생성
     (key : 태그(tag), value : 조회수(views))
  → 빈 딕셔너리(tag_to_views)에 tag가 포함되어있거나 그렇지 않은 경우로 나누어서 조회수 합 구하기
  → 완성된 '태그별 조회수' 딕셔너리를 리스트 형태로 변환 필요
 4) 강연 데이터 분석을 위해 각 강연별 데이터들을 리스트로 변환 필요
  → 빈 리스트에 csv 파일을 순회하면서 필요한 row들만 모아서 리스트로 반환하기
     (=preprocess_talks(csv_file))

2. 강연 길이에 따라 강의를 끝까지 들은 비율의 변화 추이 (=completion_rate_by_duration(talks))
 1) 강의를 끝까지 들은 비율은 '(댓글 개수 / 조회수)'에 비례한다고 가정
  → 강연 데이터리스트(talks)를 순회하면서 'comments / views' 계산하여 비율 산출
  → 강연길이(durations)을 돌면서 각 강의별 강연길이를 리스트에 담기
  → scatter(산점도)를 통해 강연 길이(x축)에 따른 끝까지 들은 비율(y축)을 시각화하기
 2) scatter 그래프를 그리는 함수 생성 (=scatter_plot(x, y, x_label, y_label))

3. 강연에서 지원되는 언어의 수에 따른 조회수 분석 (=views_by_languages(talks))
 1) 'talks' 강의데이터리스트를 순회하면서 강의별 조회수(views)와 언어의 수(languages)를 각각 리스트 추출
 2) scatter 그래프를 통해서 언어의 수(x축)별 조회수(y축)로 시각화하기

4. 강의에 대한 다양한 평가 분석 (=show_ratings(talk))
 1) 특정 강의에 대한 다양한 평가별 키워드를 카운팅해서 막대그래프(bar chart)로 표현
 2) json 형태인 'ratings' row를 순회하면서 평가키워드(name)과 횟수(count) 데이터를 리스트로 추출
 3) 막대그래프를 그리는 함수 생성 (=bar_plot(x_ticks, y, x_label, y_label))
  → x_ticks : 강의별 평가키워드, y : 해당 평가의 수

 

인기 있는 TED 강의 분석하기!
강의별 인기도, 조회수, 키워드, 평가 등

 

[ TED 사진 ]

 

1. 필요한 라이브러리 import + ted.csv 확인

실습을 진행하기 위해 필요한 파이썬 라이브러리 import

 

import csv
import json
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from operator import itemgetter
- import matplotlib.pyplot as plt
 : pyplot을 이용해서 마지막에 차트를 그리기 위한 라이브러리

- import json (import csv)
 : 입력받을 JSON(&CSV) 타입의 파일을 불러와서 dictionary로 변환하기 위한 라이브러리

- from operator import itemgetter
 : itemgetter 함수는 주로 데이터 정렬 혹은 특정 데이터 추출하는 역할 수행. 

 # ex1) 원소 추출
 from operator import itemgetter
 a = [1, 3, 5]
 func = itemgetter(2)
 print(func(a))                    # 5

# ex2) 데이터 정렬
 from operator import itemgetter
 dots = [(1, 2), (1, 3), (-1, 7), (-1, 4)]
 dots = sorted(dots, key = itemgetter(1))
 print(dots)                         # [(1, 2), (1, 3), (-1, 4), (-1, 7)]
 → dots 리스트의 1번째 index에 해당하는 값을 기준으로 정렬

- import matplotlib.font_manager as fm
 : 차트 내 한글 폰트를 사용하기 위한 라이브러리

 # ted.csv (강의 데이터) 내용 구성 확인하기

강의 데이터가 담긴 'ted.csv' 파일은 아래와 같은 내용으로 1열부터 순서대로 구성되어 있다.
- 댓글 개수
- 강연에 대한 부가 설명
- 강연 길이 (초 단위)
- 행사명 (ex, TED2009)
- 녹화 일자
- 번역된 언어 수
- 연사 이름
- 연사 이름과 강연 제목
- 연사 수
- 강연 공개 일자
- 강연 평가 (JSON 형식, CSV 파일로 확인)
- 연관된 강연 (JSON 형식)
- 연사 직업
- 태그 (관련 키워드) (JSON 형식)
- 강연 제목
- 강연 동영상 URL 주소
- 조회수

 

[ ted.csv 자료 사진 ]

위 사진을 보면을 보면 1번째 row부터 위의 내용 순서대로 데이터를 확인할 수 있고 강연 평가, 연관된 강연 그리고 태그(관련 키워드)JSON 형식으로 Dictionary 형태로 데이터가 있는 것을 확인할 수 있다.
→ row[10], row[11], row[13] 에 해당하는 데이터

 

2. 주어진 csv 파일을 리스트 형태로 변환하기

주어진 csv 파일(ted.csv)을 열어서 데이터 처리가 가능한 리스트(List) 형태로 변환한다. 리스트의 각 원소는 딕셔너리(Dictionary) 형태로 이루어져있으며, 리스트로 변환 후, 원소를 출력하여 확인해보자
preprocess_talks(csv_file) 

 

# csv파일을 리스트로 변환하는 함수
def preprocess_talks(csv_file):
    # 강연 데이터를 저장할 빈 리스트를 선언
    talks = []
    
    # CSV 파일을 열고, 데이터를 읽어와서 'talks'라는 list에 저장
    with open(csv_file) as talk_files:
        reader = csv.reader(talk_files, delimiter=',')
        
        for row in reader:
            try:
                talk = {
                    'title': row[14],			# 강연 제목
                    'speaker': row[6],			# 강연자(연사) 이름
                    'views': int(row[16]),		# 조회수
                    'comments': int(row[0]),		# 댓글의 개수
                    'duration': int(row[2]),		# 강연 길이
                    'languages': int(row[5]),		# 지원하는 언어의 수
                    'tags': json.loads(row[13].replace("'", '"')),	# 관련 태그(키워드)
                    'ratings': json.loads(row[10].replace("'", '"')),	# 강의 평가
                }
            except:
                pass
            talks.append(talk)
    
    return talks

# 함수 테스트
src = 'ted.csv'
talk_file = preprocess_talks(src)
print(talk_file[0])

 

[ talk_file[0] 실행결과 ]

위 실행결과를 보면 'preprocess_talk(csv_file)' 함수를 통해 csv파일을 열고 각 강의 데이터를 처리할 수 있는 list 형식으로 잘 변환이 되었고, 그 중 첫번째(index 0번째)인 원소를 출력해보면 딕셔너리(dictionary) 형식으로 구성된 것을 확인할 수 있다.
→ 원소마다 'title', 'speaker', 'views', 'comments', 'duration', 'languages', 'tags', 'ratings'의 총 8개의 필드를 추출

 

3. 가장 인기 있는 태그의 상위 n개 추출하기

이번에는 강의들 중에서 가장 인기 있는 태그의 상위 n개를 반환하는 함수를 생성해보자. 
태그의 인기도는 해당 태그를 포함하는 강의들의 조회수 합으로 결정하면 된다. 
ex) 'education' 태그가 포함된 강의가 총 15개라면, 'educaion' 태그의 인기도는 그 15개 강의의 조회수 총합이 된다.

get_popular_tags(talks, n)
: 주어진 강의 데이터리스트(talks)를 인자로 받고, 해당 태그가 포함된 강의들의 조회수의 총합을 '인기도'라는 키에 저장한 딕셔너리를 반환한다. 그리고 해당 태그가 포함된 강의의 조회수를 합산하여 '인기도'라는 키에 저장하고, 인기도가 높은 순으로 정렬하여 상위 n개의 태그를 반환한다.

 

# 함수 선언
def get_popular_tags(talks, n):
    
    # 태그별 인기도를 저장할 딕셔너리
    tags_to_views = {}
    
    # 태그별 인기도를 구해서 'tag_to_views'에 저장
    for talk in talks:
    
        # 데이터리스트(talks)를 순회하면서 'tags(태그)'와 'views(조회수)'를 tags, views로 저장
        tags, views = talk['tags'], talk['views']
        
        # 태그가 있고 없는 경우에 따라서 태그별 조회수 추가하기
        for tag in tags:
            if tag in tag_to_views:
                tag_to_views[tag] += views
            else:
                tag_to_views[tag] = views
                
    # (태그, 인기도)의 리스트 형식으로 변환 → 상위 5개를 추출하기 위함
    tag_view_pairs = list(tag_to_views.items())
    
    # 인기도가 높은 순서로 정렬해서 상위(앞)의 n개 취합
    top_tag_and_views = sorted(tag_view_pairs, key = itemgetter(1), reverse=True)[:n]
    
    # n개를 취한 후에는 태그만 남기기
    top_tags = map(itemgetter(0), top_tag_and_views)
    
    # map 형태이기 때문에 리스트로 변환
    return list(top_tags)
    
# 함수 테스트
src = 'ted.csv'
talks = preprocess_talks(src)
print("# 인기 있는 태그 상위 Top5 :")
print(get_popular_tags(talks, 5))

 

[ 실행 결과 ]

- if tag in tag_to_view:
    tag_to_views[tag] += views
  : 전체 tags 중, 딕셔너리(tag_to_views)에 포함되어있는 tag(태그)면 조회수(views) 더하기
 
 else:
    tag_to_views[tag] = views
  : 포함 안되어있는 처음 나온 tag(태그)면 조회수(views) 넣어주기

- tag_view_pairs = lsit(tag_to_views.items())
 : (태그, 인기도)의 리스트 형식으로 변환 → 이후 인기도 상위 5개를 추출하기 위함
  → 여기서 '인기도'란 해당 태그에 해당되는 '조회수'의 총합

- top_tag_and_views = sorted(tag_view_pairs, key=itemgetter(1), reverse=True)[:n]
 : 인기도가 높은 순서로 정렬해서 상위 n개 취합 → sorted(), itemgetter() 사용

- top_tags = map(itemgetter(0), top_tag_and_views)
 : n개를 취한 후에 태그만 출력 → map(), itemgetter() 사용

 

4. 강의를 끝까지 들은 비율은 얼마나 될까?

강연의 길이에 따라 사람들은 강의를 얼마나 끝까지 들을까? 길이(duration)에 따라 강의를 끝까지 들은 비율이 어떻게 변화하는지 확인해보자. 이때, 끝까지 들은 비율은 해당 강의의 (댓글 개수 / 조회수) 값에 비례한다고 가정하고, 아래 함수를 통해서 강의를 모두 들은 비율(completion_rates)강의 길이(duration)을 반환하고 scatter 그래프(산점도) 시각화를 통해 "강연 길이와 강의를 듣는 비율 간 관계"를 분석하시오.

scatter_plot(x, y, x_label, y_label)
: x와 y 데이터를 받고, 각각 label를 인자를 받아서 산점도(scatter)를 그리는 함수 그리기

completion_rate_by_duration(talks) 
: 주어진 강의 데이터 리스트(talks)를 인자로 받고, 각 강의를 끝까지 모두 들은 비율을 계산한다. 여기서 이 비율은 각 강의에 대한 댓글 개수와 조회수의 비율로 계산되고, 함수는 해당 비율(completion_rate_by_duration)과 강의 길이(duration)을 return 한다. 이를 통해 강의 길이에 따라 강의를 끝까지 들은 비율이 어떻게 변화하는지 확인해보자.

 

# x, y 데이터를 이용하여 scatter plot(산점도)을 그리는 함수
def scatter_plot(x, y, x_label, y_label):

    # font 설정
    font = fm.FontProperties(fname='./NanumBarunGothic.ttf')
    
    # 그래프 속성
    plt.scatter(x, y)
    plt.xlabel(x_label, fontproperties=font)
    plt.ylabel(y_label, fontproperties=font)
    
    plt.xlim((min(x), max(x)))
    plt.ylim((min(y), max(y)))
    plt.tight_layout()
    
    plot_filename = 'plot.png'
    plt.savefig(plot_filename)

 

# 강연 길이에 따른 끝까지 시청하는 비율 분석 및 시각화
def completion_rate_by_duration(talks):

    # 'talks'를 돌면서 강의를 들은 비율을 리스트로 저장
    completion_rates = [talk['comments'] / talk['views'] for talk in talks]
    
    # talks 내 강연길이(duration)을 'durations'으로 저장
    durations = [talk['duration'] for talk in talks]
    
    # scatter 그래프 그리기
    scatter_plot(durations, completion_rates, '강연 길이', '강연을 끝까지 들은 비율')
    
    # 결과 return
    return completion_rates, durations
    
# 함수 테스트
src = 'ted.csv'
talks = preprocess_talks(src)
completion_rate_by_durations(talks)

 

[ 실행 결과 - completion_rate_by_durations ]

위의 scatter plot(산점도)를 보면 강연 길이가 짧은 구간강연을 끝까지 들은 비율이 높은 분포를 가진다는 것을 알 수 있다.

- completion_rates = [talk['comments'] / talk['views'] for talk in talks]
 : 강의데이터 리스트(talks)를 돌면서 강의를 들은 비율을 구하고 리스트 형식으로 저장
 → 'durations'도 동일한 방식으로 강연길이(duration)을 리스트 형식으로 저장

 

5. 지원되는 언어의 수에 따른 조회수 분석하기

지원되는 언어의 수에 따른 조회수를 분석하고 scatter plot(산점도)로 그리기 위해서 각 언어와 조회수를 반환하는 함수를 생성해보자.

views_by_languages(talks)
: 주어진 각 강의 데이터 리스트(talks)를 인자로 받고, 각 강의에 대한 조회수를 계산한다. return 값은 각 강의의 조회수를 계산한 후, 조회수와 각 언어의 수이다.

 

# 함수 선언
def views_by_languages(talks):
    views = [talk['views'] for talk in talks]
    languages = [talk['languages'] for talk in talks]
    scatter_plot(languages, views, '언어의 수', '조회수')
    
    return views, languages

# 함수 테스트
src = 'ted.csv'
talks = preprocess_talks(src)
views_by_languages(talks)

 

[ 실행 결과 - views_by_languages ]

위 실행 결과를 통해 지원되는 언어의 수에 따른 조회수를 확인할 수 있으며, 자료를 보면 30~40개의 언어에 대한 조회수가 높은 분포를 가지고 있는 것을 확인할 수 있다.

- views = [talk['views'] for talk in talks]
 : 강의데이터(talks)를 순회하면서 조회수(views)를 'views'에 리스트 형식으로 저장
  → languages(언어의 수)도 동일한 방식

 

6. 강의에 대한 다양한 평가를 막대그래프로 시각화하기

강의에 대한 다양한 평가(rating)을 막대그래프(bar chart)로 표현하기 위해서 각각의 평가 키워드와 횟수(count)를 세어 반환 해야한다. 각 키워드를 나타내는 'keywords'와 횟수를 나타내는 'counts'를 반환한다.

show_ratings(talk)
: 주어진 각 강의 데이터(talk)를 인자로 받고, 해당 강의에 대한 평가(rating)을 그래프로 시각화하는 함수. 이 함수는 각 평가키워드(ex, 'fun', 'confusing' 등)별로 숫자로 계산한 후에 각 키워드와 숫자를 return 한다.

 

# 막대 그래프 그리는 함수
def bar_plot(x_ticks, y, x_label, y_label):
    # 막대의 높이 데이터인 y와 각 막대에 대한 설명인 x_ticks를 인자로 받는다.
    
    # x_ticks와 y의 길이가 동일한지 확인. 다르다면 에러 발생
    assert(len(x_ticks) == len(y))
    
    font = fm.FontProperties(fname='./NanumBarunGothic.ttf')
    
    pos = range(len(y))
    plt.bar(pos, y, align='center')
    plt.xticks(pos, x_ticks, rotation='vertical', fontproperties=font)
    
    plt.xlabel(x_label, fontproperties=font)
    plt.ylabel(y_label, fontproperties=font)
    plt.tight_layout()
    
    plot_filename = 'plot.png'
    plt.savefig(plot_filename)

 

# 강의에 대한 다양한 평가 - 키워드별로 카운팅하는 함수
def show_ratings(talk):
    # 강의에 대한 다양한 평가(ratings)를 막대그래프로 표현
    # 각 키워드별(ex, fun, Inspiring 등)을 평가 수를 숫자로 표현
 
    ratings = talk['ratings']
    keywords = [rating['name'] for rating in ratings]
    counts = [rating['count'] for rating in ratings]
    bar_plot(keywords, counts, '키워드', '평가 수')
    
    return keywords, counts

# 테스트
src = 'ted.csv'
talks = preprocess_talks(src)
print(show_ratings(talks[0]))
# print(show_ratings(talks[1]))

[ 실행 결과 - show_ratings(talks[0]) ]

 

[ talks[0]의 키워드별 카운팅 결과 ]

 

[ 실행결과 - show_ratings(talks[1])

 

[ talks[1]의 키워드별 카운팅 결과 ]

위의 키워드별 카운팅과 그래프에 대한 실행 결과를 보면,

talks[0]에 해당하는 강연인 'Do schools kill creativity?'에서는 'Funny', 'Beautiful', 'Ingenious'라는 평가키워드가 각각 '19,645', '4,573', '6,073'으로 제일 높다는 것을 결과와 그래프를 통해 알 수 있다.

talks[1]에 해당하는 강연인 'Averting the climate crisis' 'Fuuny', 'Courageous', 'Confusing'라는 키워드각 '544', '139', '62'으로 높은 것을 확인할 수 있다.

 

7. 최종 코드 (main() 함수로 통합 실행)

위에서 실습한 최종코드를 작성해보고 각 기능별로 연습해보자. 맨 마지막에는 main() 함수를 추가해서 통합적으로 실행될 수 있도록 한다.

 

# 라이브러리 import
import csv
import json
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from operator import itemgetter

# 1) 주어진 csv파일을 리스트로 변환
def preprocess_talks(csv_file):

    # 강연 데이터를 저장할 빈 리스트 선언
    talks = []
    
    # csv 파일을 열고, 데이터를 읽어와서 talks에 저장
    with open(csv_file) as talk_files:
        reader = csv.reader(talk_files, delimiter=',')
        
        for row in reader:
            try:
                talk = {
                    'title': row[14],					# 강연의 제목
                    'speaker': row[6],					# 강연자의 이름
                    'views': int(row[16]),				# 조회수
                    'comments': int(row[0]),				# 댓글의 개수
                    'duration': int(row[2]),				# 강연 길이
                    'languages': int(row[5]),				# 지원하는 언어의 수
                    'tags': json.loads(row[13].replace("'", '"')),	# 관련 태그(키워드)
                    'ratings': json.loads(row[10].replae("'", '"')),	# 강의 평가
                }
            except:
                pass
            talks.append(talk)
        
        return talks
            	
# 1번 테스트
# src = 'ted.csv'
# talks = preprocess_talks(src)
# print(talks[0])


# 2) 가장 인기 있는 태그 상위 n개 추출
def get_popular_tags(talks, n):

    # 태그별 인기도를 저장할 딕셔너리
    tag_to_views = {}
    
    # 태그별 인기도를 구해서 tag_to_views에 저장
    for talk in talks
        # 데이터리스트(talks)를 순회하면서 'tags(태그)'와 'views(조회수)'를 tags, views로 저장
        tags, views = talk['tags'], talk['views']
        for tag in tags:
            # 전체 tags 중, 딕셔너리에 포함되어있는 tag(태그)이면 조회수(views) 더하기
            if tag in tag_to_views:
                tag_to_views[tag] += views
            # 포함 안되어있는 처음 나온 tag(태그)이면 조회수(views) 넣어주기
            else:
                tag_to_views[tag] = views
                
    # (태그, 인기도) 형태의 리스트 형식으로 변환 → 상위 n개를 추출하기 위함
    # 여기서 '인기도'란 해당 태그에 해당하는 '조회수'의 총합
    tag_view_pairs = list(tag_to_views.items())
    
    # 인기도가 높은 순서로 정렬해서 앞의 n개를 취합 → sorted(), itemgetter() 사용
    top_tag_and_views = sorted(tag_view_pairs, key=itemgetter(1), reverse=True)[:n]
    
    # n개를 취한 후에는 태그만 남기기 → map(), itemgetter() 사용
    top_tags = map(itemgetter(0), top_tag_and_views)
    
    # map 형태이기 때문에 리스트로 변환 필요
    return list(top_tags)

# 2번 테스트
# src = 'ted.csv'
# talks = preprocess_talks(src)
# print("# 인기 있는 태그 상위 Top5 :")
# print(get_popular_tags(talks, 5))


# 3) 강의를 끝까지 들은 비율 시각화
# scatter 그래프를 그리는 함수
def scatter_plot(x, y, x_label, y_label):
    # x, y 데이터를 이용하여 scatter plot을 그린다.
    font = fm.FontProperties(fname='./NanumBarunGothic.ttf')
    
    plt.scatter(x, y)
    plt.xlabel(x_label, fontproperties=font)
    plt.ylabel(y_label, fontproperties=font)
    
    plt.xlim((min(x), max(x))
    plt.ylim((min(y), max(y))
    plt.tight_layout()
    
    plot_filename = 'plot.png'
    plt.savefig(plot_filename)

# 강의를 끝까지 들은 비율 계산하는 함수 + 그래프 그리기
def completion_rate_by_duration(talks):

    # 강의데이터 리스트(talks)를 돌면서 강의를 들은 비율을 계산하여 리스트로 저장
    completion_rates = [talk['comments'] / talk['views'] for talk in talks]
    
    # talks 내 강연길이(duration)을 'durations'으로 저장
    durations = [talk['duration'] for talk in talks]
    
    # scatter 그래프 그리기
    scatter_plot(durations, completion_rates, '강연 길이', '강연을 끝까지 들은 비율')
    
    # 결과 return
    return completion_rates, durations

# 3번 테스트
# src = 'ted.csv'
# talks = preprocess_talks(src)
# completion_rate_by_duration(talks)


# 4) 지원하는 언어의 수에 따른 조회수 분석
def views_by_languages(talks):
    views = [talk['views'] for talk in talks]
    languages = [talk['languages'] for talk in talks]
    scatter_plot(languages, views, '언어의 수', '조회수')
    
    return views, languages

# 4번 테스트
# src = 'ted.csv'
# talks = preprocess_talks(src)
# views_by_languages(talks)


# 5) 강의에 대한 다양한 평가를 막대그래프로 시각화
# 막대 그래프를 그리는 함수
def bar_plot(x_ticks, y, x_label, y_label):
    # 막대의 높이 데이터인 y와 각 막대에 대한 설명인 x_ticks를 인자로 받는다.
    
    # x_ticks와 y의 길이가 동일한지 확인. 다르다면 에러 발생
    assert(len(x_ticks) == len(y))
    
    font = fm.FontProperties(fname='./NanumBarunGothic.ttf')
    
    pos = range(len(y))
    plt.bar(pos, y, align='center')
    plt.xticks(pos, x_ticks, rotation='vertical', fontproperties=font)
    
    plt.xlabel(x_label, fontproperties=font)
    plt.ylabel(y_label, fontproperties=font)
    plt.tight_layout()
    
    plot_filename = 'plot.png'
    plt.savefig(plot_filename)

# 강의에 대한 다양한 평가를 키워드별로 카운팅하는 함수 + 그래프 그리기
def show_ratings(talk):
    # 강의에 대한 다양한 평가(ratings)를 막대그래프로 표현
    # 각 키워드별(ex, fun, confuson 등)의 횟수를 숫자로 표현
    
    rating = talk['ratings']
    keywords = [rating['name'] for rating in ratings]
    counts = [rating['count'] for rating in ratings]
    bar_plot(keywords, counts, '키워드', '평가 수')
    
    return keywords, counts

# 5번 테스트
# src = 'ted.csv'
# talks = preprocess_talks(src)
# print(show_ratings(talks[1]))


# 6) main() 함수로 통합 실행
def main():
    src = 'ted.csv'
    talks = preprocess_talks(src)
    print(get_popular_tags(talks, 10))
    # completion_rate_by_duration(talks)
    # views_by_languages(talks)
    # show_ratings(talks[0])

if __name__ == "__main__":
    main()

 

 

댓글