5주간의 교육이 끝나고 드디어 데이터 분석 실습이 시작되었다!
오늘은 '캐글'이라는 사이트에서 제공하는 데이터 분석을 위한 셋 중 하나인 넷플릭스 데이터를 활용한 실습을 진행한다. 먼저 필요한 파일들을 다운받아 내가 만드는 구글 코랩 세션에 파일을 업로드 한 뒤, 명령어를 입력하여 이 데이터들을 다양한 도구들을 통해 활용하여 데이터분석 실습을 해볼 수 있다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
netflix=pd.read_csv('netflix_titles.csv')
netflix.head()
여태까지 배웠던 모든 것들의 총집합~! 아래와 같이 컬럼과 정보도 확인 가능하다.
list(netflix.columns)
['show_id',
'type',
'title',
'director',
'cast',
'country',
'date_added',
'release_year',
'rating',
'duration',
'listed_in',
'description']
netflix.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8807 entries, 0 to 8806
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 show_id 8807 non-null object
1 type 8807 non-null object
2 title 8807 non-null object
3 director 6173 non-null object
4 cast 7982 non-null object
5 country 7976 non-null object
6 date_added 8797 non-null object
7 release_year 8807 non-null int64
8 rating 8803 non-null object
9 duration 8804 non-null object
10 listed_in 8807 non-null object
11 description 8807 non-null object
dtypes: int64(1), object(11)
memory usage: 825.8+ KB
결측치 처리하기: 결측치의 비율에 따라
데이터 시각화를 진행하기에 앞서 가장 먼저 할 일은 결측치를 처리하는 것이다. 데이터셋의 특성에 맞는 결측치에 대한 기준들을 세운 뒤, 이 기준들에 따라 로직을 세워서 처리를 진행한다.
for i in netflix.columns:
missingValueRate=netflix[i].isna().sum()/len(netflix)*100
if missingValueRate > 0 :
print("{} null rate: {}%".format(i,round(missingValueRate,2)))
director null rate: 29.91%
cast null rate: 9.37%
country null rate: 9.44%
date_added null rate: 0.11%
rating null rate: 0.05%
duration null rate: 0.03%
각 열에 대해 값이 비어있는 컬럼의 개수들을 세어서, 이를 비율로 카운트한다.
director는 결측치가 매우 높고(25%이상), cast와 country는 중간 정도(10%내외), 그 이외의 데이터들은 0.1% 정도이므로 각 컬럼 별 결측치의 비율에 따라 조금씩 다른 대응을 진행할 것이다.
1) 중간 정도의 결측치를 가진 컬럼에 대해서는 다른 데이터로 변경(fillna() 및 replace()활용)
netflix['country']=netflix['country'].fillna('No Data')
netflix['director']=netflix['director'].replace(np.nan, 'No Data')
netflix['cast']=netflix['cast'].replace(np.nan, 'No Data')
결측치 비율이 낮은 행들은 그냥 해당 행을 제거하는 방식으로 간다.
여기서 axis=1을 바꾸면 열을 제거하는 방식으로 진행된다고 한다.
# .dropna(axis = 0) : 결측치가 있는 행 전체 제거
# 원본 객체를 수정하려면 inplace = True 옵션 추가
# 결측치 비율 : date_added(0.11%), rating(0.05%), duration(0.03%)
netflix.dropna(axis = 0, inplace=True)
결측치 처리를 완료하고 다시 저옵를 확인해 보면, 17개의 행이 제거 된 8790 열이 출력된다.
# .info() : 열에 대한 요약 정보 확인
# 8807 rows(원본 데이터 행 개수) - 17 rows(결측치 행) = 8790 rows(결측치가 제거된 행 개수)
netflix.info()
<class 'pandas.core.frame.DataFrame'>
Index: 8790 entries, 0 to 8806
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 show_id 8790 non-null object
1 type 8790 non-null object
2 title 8790 non-null object
3 director 8790 non-null object
4 cast 8790 non-null object
5 country 8790 non-null object
6 date_added 8790 non-null object
7 release_year 8790 non-null int64
8 rating 8790 non-null object
9 duration 8790 non-null object
10 listed_in 8790 non-null object
11 description 8790 non-null object
dtypes: int64(1), object(11)
memory usage: 892.7+ KB
isna()를 통해 이젠 null 값이 없음을 확인 할 수 있다.
# 데이터프레임의 각 컬럼별 결측치 개수 반환
# isna() == isnull() : 결측 값은 True 반환하고, 그 외에는 False 반환
netflix.isna().sum()
피처 엔지니어링: 새로운 변수를 생성하는 방법
피처 엔지니어링이란, 데이터프레임의 기존 변수를 조합하거나 변형하여 새로운 변수를 만들어내는 것을 의미한다. 현장에서 필요로 하는 데이터들을 만들어내고 더 유의미한 결과를 도출하기 위해 진행하는 과정이라고 한다.
'age_group'이라는 시청등급 정보를 더 이해하기 쉬운 표현으로 매핑하는 딕셔너리를 만들어 본다. 그리고 이를 새로 만든 컬럼에 저장, 출력해 보면 새로운 'rating'이라는 컬럼이 생겨있는 것을 볼 수 있다.
# 시청 등급 기준표를 참고하여 Netflix의 rating 변수를 이용한 age_group_dic 변수 생성
# rating 컬럼의 값을 age_group이라는 새로운 컬럼으로 복사
netflix['age_group'] = netflix['rating']
# 시청 등급 코드를 더 이해하기 쉬운 표현으로 매핑할 딕셔너리 정의(key, value 선언)
age_group_dic = {
'G': 'All',
'TV-G': 'All',
'TV-Y': 'All',
'PG': 'Older Kids',
'TV-Y7': 'Older Kids',
'TV-Y7-FV': 'Older Kids',
'TV-PG': 'Older Kids',
'PG-13': 'Teens',
'TV-14': 'Young Adults',
'NC-17': 'Adults',
'NR': 'Adults',
'UR': 'Adults',
'R': 'Adults',
'TV-MA': 'Adults'
}
# map 함수를 이용하여 rating 컬럼의 값을 딕셔너리를 기반으로 변환하여 age_group 컬럼에 저장
# .map( ) : 사전에 정의한 내용을 변수에 적용
netflix['age_group'] = netflix['age_group'].map(age_group_dic)
netflix.head(2)
indexshow_idtypetitledirectorcastcountrydate_addedrelease_yearratingdurationlisted_indescriptionage_group
0 | s1 | Movie | Dick Johnson Is Dead | Kirsten Johnson | No Data | United States | September 25, 2021 | 2020 | PG-13 | 90 min | Documentaries | As her father nears the end of his life, filmmaker Kirsten Johnson stages his death in inventive and comical ways to help them both face the inevitable. | Teens |
1 | s2 | TV Show | Blood & Water | No Data | Ama Qamata, Khosi Ngema, Gail Mabalane, Thabang Molaba, Dillon Windvogel, Natasha Thahane, Arno Greeff, Xolile Tshabalala, Getmore Sithole, Cindy Mahlangu, Ryle De Morny, Greteli Fincham, Sello Maake Ka-Ncube, Odwa Gwanya, Mekaila Mathys, Sandi Schultz, Duane Williams, Shamilla Miller, Patrick Mofokeng | South Africa | September 24, 2021 | 2021 | TV-MA | 2 Seasons | International TV Shows, TV Dramas, TV Mysteries | After crossing paths at a party, a Cape Town teen sets out to prove whether a private-school swimming star is her sister who was abducted at birth. | Adults |
잘 나오는 군요~
netflix.to_csv('netflix_preprocessed.csv', index=False)
이렇게 전처리된 데이터를 저장저장~
만약 피처 엔지니어링에 대한 아이디어가 떠오르지 않는다면, 셀레나 쌤은 여기서 챗지피티의 도움을 받아볼 것을 추천하셨다. 챗지피티에게 아이디어를 물어보면, 예시 코드까지 딱딱 제시해주니 너무 편리하다~데이터 분석의 역사는 정말 챗지피티로 인해 다시 쓰인다고 봐도 무방할 듯~!(놀라워~)
넷플릭스 시각화하기
이제 전처리가 완료된 데이터를 불러와, 이를 시각화에 활용하자
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 전처리가 완료된 데이터셋 불러오기
netflix = pd.read_csv('netflix_preprocessed.csv')
넷플릭스의 상징 색을 출력해 본다. 마치 커튼이 걷혀지듯 두둥-하는 브금과 함께 자주 보던 그 컬러!
# sns.palplot([`색상RBG`]) : 색상 확인하는 함수
# plt.title() : 그래프의 타이틀 설정
# plt.show() : 화면에 표시하는 기능을 하며, Jupyter를 사용할 때는 자동으로 표시되기 때문에 호출할 필요가 없음(하지만, 쓰는 걸 권장)
# 넷플릭스 브랜드 상징 색깔 시각화
sns.palplot(['#221f1f','#b20710','#e50914','#f5f5f1'])
# 제목 정하기
plt.title('Netflix brand palette', loc='left', fontfamily='serif', fontsize=15, y=1.2)
plt.show()
넷플릭스 파이 차트 그리기
넷플릭스 데이터셋의 type 에 대해 차트를 그려본다.
1) 먼저 type 열에 있는 TV show와 Movie 데이터가 각각 몇개 있는지 살펴본다.
# Movies & TV shows의 각각 value_counts 출력
# .value_counts() : 값의 개수 출력
type_counts = netflix['type'].value_counts()
print(type_counts)
type
Movie 6126
TV Show 2664
Name: count, dtype: int64
value_counts() 함수는 시리즈 객체에 있는 각 값의 빈도를 센다. Movie, TV Show의 개수 비율은 어떻게 될까?
# 5 x 5 크기의 플롯 만들기
plt.figure(figsize=(5, 5))
# pie plot 통해 Movies & TV shows 각각 비율 시각화
# plt.pie의 매개변수 설명
# labels : 부채꼴 조각 이름
# autopct : 부채꼴 안에 표시될 숫자 형식 지정
# 문자열에서 % 포맷팅으로 %0.f 형태로 사용하면 소수점 없이 정수처럼 인식
# 진짜 %를 표시하기 위해 %%로 작성
# startangle : 부채꼴이 그려지는 시작 각도 설정, 90이면 12시 방향
# explode : 부채꼴이 파이 플롯의 중심에서 벗어나는 정도 설정
# shadow : 그림자 효과 표시
plt.pie(type_counts, labels=type_counts.index, autopct='%0.f%%', startangle=100,
explode=[0.05, 0.05], shadow=True, colors=['#b20710', '#221f1f'])
plt.suptitle('Movie & TV Show distribution', fontfamily='serif', fontsize=15, fontweight='bold')
plt.title('We see more movies than TV shows on Netflix.', fontfamily='serif', fontsize=12)
plt.show()
넷플릭스 막대 그래프 그리기
파이 차트보다 더욱 다양한 범주를 표현할 수 있는 막대 그래프!
장르별로 얼마나 많은 데이터들이 있는지 본다.
# 넷플릭스 데이터셋의 장르별 등장 횟수 계산
# [1단계]~[3단계]로 코드를 단계별로 설명 예정!
genres = netflix['listed_in'].str.split(', ', expand=True).stack().value_counts()
genres
count
International Movies 2752
Dramas 2426
Comedies 1674
International TV Shows 1349
Documentaries 869
Action & Adventure 859
이 외에도 많은 장르들이 있다.
이제 이것을 막대그래프로 표현하기 위해 조금씩 튜닝을 해 나간다. 총 4단계를 통해 데이터를 조금씩 튜닝해 나가며 plt 제공 함수를 통해 최종 그래프 출력까지 차근차근 진행해보자.
1) listed_in 열에 있는 장르를 쉼표로 분할하여 별도 열로 만들기
# [1단계] listed_in 열에 있는 장르를 쉼표로 분할하기
# 예시) 인덱스 1의 listed_in 열 값 : International TV Shows, TV Dramas, TV Mysteries
netflix['listed_in'].str.split(', ', expand=True)
Documentaries | None | None |
International TV Shows | TV Dramas | TV Mysteries |
Crime TV Shows | International TV Shows | TV Action & Adventure |
Docuseries | Reality TV | None |
International TV Shows | Romantic TV Shows | TV Comedies |
... | ... | ... |
Cult Movies | Dramas | Thrillers |
Kids' TV | Korean TV Shows | TV Comedies |
Comedies | Horror Movies | None |
Children & Family Movies | Comedies | None |
Dramas | International Movies | Music & Musicals |
8790 rows × 3 columns
2) 여러 열로 구성한 데이터프레임을 1개의 열로 만들어 쌓기
# [2단계] .stack( )을 사용하면 여러 열로 구성한 데이터프레임을 1개의 열로 만들어 쌓음
# 예시) 인덱스 1의 listed_in 열 값 : International TV Shows, TV Dramas, TV Mysteries
netflix['listed_in'].str.split(', ', expand=True).stack()
Documentaries |
International TV Shows |
TV Dramas |
TV Mysteries |
Crime TV Shows |
... |
Children & Family Movies |
Comedies |
Dramas |
International Movies |
Music & Musicals |
3) count 함수를 통해 장르의 등장 횟수를 계산한다.
# [3단계] .value_counts( )를 붙여 장르의 등장 횟수 계산
# 예시) 인덱스 1의 listed_in 열 값 : International TV Shows, TV Dramas, TV Mysteries
genres = netflix['listed_in'].str.split(', ', expand=True).stack().value_counts()
genres
4) 장르별 등장 횟수 count 값을 시각화한다
plt.figure(figsize=(12, 6))
# bar plot 통해 장르별 등장 횟수 시각화
# sns.barplot의 매개변수 설명
# x, y : x축과 y축에 표시할 데이터
# hue : 데이터를 분류할 때 사용할 값
# palette : 색상 팔레트
sns.barplot(x=genres.values, y=genres.index, hue=genres.index, palette='RdGy')
plt.title('Distribution of Genres for Movies and TV Shows on Netflix', fontsize=16)
plt.xlabel('Count', fontsize=14)
plt.ylabel('Genre', fontsize=14)
plt.grid(axis='x')
plt.show()
이렇게 다양한 장르가 있다니~
넷플릭스 히트맵 그리기
이번에는 나이 그룹 별 국가별 콘텐츠 수를 집계해 본다. 어떤 국가에서 어떤 나이 그룹이 어떤 콘텐츠를 많이 보는지 알 수 있다. 이를 통해 국가별 특정 장르에 대한 마케팅 전략을 도출해 볼 것이고, 새로운 시장에 대한 니즈를 만들어 신 시장을 개척할 수도 있을 것이다. 마치 내가 넷플릭스의 마케터가 된 기분을 느껴볼 수 있다.
이때 country, age_group을 활용!
1) country 열과 age_group 열에 어떤 데이터가 어떤 형태로 존재하고 있는지 예시를 보자.
# str.contains() : 지정한 문자열이 포함되어 있으면 True 반환, 그 외에는 False 반환
# na = False : 값이 NA일 경우, False로 처리
# case = False : 대소문자를 구분하지 않고 검색
# title 열의 값이 ‘Sankofa’인 행을 확인하여 country 열과
# age_group 열에 어떤 값이 들어 있는지 살펴보기
# 예시) 인덱스 7의 country 열 값 : United States, Ghana, Burkina Faso, United Kin..
netflix[netflix['title'].str.contains('Sankofa', na=False, case=False)]
s8 | Movie | Sankofa | Haile Gerima | Kofi Ghanaba, Oyafunmike Ogunlano, Alexandra D... | United States, Ghana, Burkina Faso, United Kin... | September 24, 2021 | 1993 | TV-MA | 125 min | Dramas, Independent Movies, International Movies | On a photo shoot in Ghana, an American model s... | Adults |
country를 보면 아주 많은 국가가 ',' 로 구분이 되어 있다. 연령대는 Adults이다. 가장 먼저 해야할 일은 이 country의 value를 ','를 기준으로 구분해 내는 것이다.
2) 구분자를 이용하여 해당 값들을 파이썬 리스트로 만든다.
# 출력할 최대 행 수를 None으로 설정해서 모두 출력
# 판다스는 기본 출력 행이 매우 짧으므로 기본값으로 행을 출력하면 앞에서 분리한 값이 보이지 않습니다
pd.set_option('display.max_rows', None)
# 쉼표로 country 열의 값을 파이썬 리스트로 만들기
netflix['country'] = netflix['country'].str.split(', ')
netflix['country']
3) explode() 함수를 활용하여 개별 행으로 분리한다.
# 파이썬 리스트로 바꾼 country 열의 값에 explode( ) 함수를 적용하여 개별 행으로 분리
# country 열의 각 행에 하나의 국가만 포함되도록 변환
# 예시) 인덱스 7의 country 열 값 : United States, Ghana, Burkina Faso, United Kin..
netflix_age_country = netflix.explode('country')
netflix_age_country
이제 하나의 행에는 country 내 하나의 국가만이 표시되게 변경되었다.
4) 나이 별로 해당 국가에서 볼 수 있는 컨텐츠 count를 찾는다.
# 각 나이 그룹에 따른 국가별 넷플릭스 콘텐츠 수 구하기
# groupby('age_group')['country'].value_counts( )
# : age_group 열을 기준으로 데이터를 그룹화하고, 각 그룹 내에서 country 열의 값들을 세기
# : 각 나이 그룹별로 각 국가의 콘텐츠 수를 집계
# unstack( )
# : 그룹화된 데이터를 풀어서 다시 데이터 프레임 형태 생성
# : age_group 열을 인덱스로, country 열을 열로 가지는 데이터프레임이 생성
netflix_age_country_unstack = netflix_age_country.groupby('age_group')['country'].value_counts().unstack()
netflix_age_country_unstack
value_counts()를 통해 age_group 열을 기준으로 데이터를 그룹화 한 후, 각 그룹 내에서 country 열의 값이 얼마나 자주 등장하는지 계산한다.
unstack()을 통해 그룹화된 데이터를 다시 풀어서 데이터프레임 형태로 만든다.
age_group 열을 인덱스로, country 열을 열로 만든 새로운 데이터 프레임을 만든다.
그 다음 이 데이터프레임을 출력해 본다.
5) 특정 나이 그룹에 따른 특정 나라별 컨텐츠로 필터링한 결과를 본다.
# 특정 나이 그룹에 따른 특정 나라별 콘텐츠로 필터링
# 연령, 국가 리스트
age_order = ['All', 'Older Kids', 'Teens', 'Adults']
country_order = ['United States', 'India', 'United Kingdom', 'Canada', 'Japan',
'France', 'South Korea', 'Spain', 'Mexico', 'Turkey']
# 데이터 필터링
# .loc[] : 데이터프레임의 행과 열의 이름을 사용
netflix_age_country_unstack = netflix_age_country_unstack.loc[age_order, country_order]
# 결측치 0으로 처리
netflix_age_country_unstack = netflix_age_country_unstack.fillna(0)
netflix_age_country_unstack
255.0 | 16.0 | 63.0 | 64.0 | 6.0 | 29.0 | 11.0 | 9.0 | 3.0 | 1.0 |
694.0 | 169.0 | 145.0 | 108.0 | 93.0 | 54.0 | 35.0 | 15.0 | 20.0 | 9.0 |
433.0 | 11.0 | 84.0 | 32.0 | 9.0 | 35.0 | 1.0 | 5.0 | 4.0 | 0.0 |
1803.0 | 278.0 | 408.0 | 192.0 | 110.0 | 227.0 | 98.0 | 185.0 | 120.0 | 71.0 |
국가별로 넷플릭스 컨텐츠 수 정리까지는 되었지만, 이것을 비율로 나타내야 히트맵으로 좀 더 정확히 표현할 수 있다.
6) 나이 그룹에 따른 국가별 넷플릭스 콘텐츠의 비율 구하기
# 나이 그룹에 따른 국가별 넷플릭스 콘텐츠 비율 구하기
# div(netflix_age_country_unstack.sum(axis=0), axis=1)
# <1> netflix_age_country_unstack.sum(axis=0)
# : 열 방향 합 구하기
# <2> div(netflix_age_country_unstack.sum(axis=0), axis=1)
# : 각 열의 값을 열의 합으로 나누기
netflix_age_country_unstack = netflix_age_country_unstack.div(netflix_age_country_unstack.sum(axis=0), axis=1)
netflix_age_country_unstack
각 열의 값을 열의 합으로 나눈다. 즉 전체 컨텐츠 수 대비 대상 그룹의 컨텐츠 수를 구하면 그것이 바로 전체 대비 대상 값의 비율이 되기 때문이다. 가령 United_States에서는
Older kids의 경우: 694/3185=0.32178
Teens의 경우: 433/3185=0.1359
Adults의 경우: 1803/3185=0.5660
의 값이 도출된다.
7) 마지막! Seaborn으로 히트맵 그리기
plt.figure(figsize=(15, 5))
# 사용자 정의 컬러맵 만들기
cmap = plt.matplotlib.colors.LinearSegmentedColormap.from_list('', ['#221f1f','#b20710','#f5f5f1'])
# 히트맵 시각화
# heatmap() : 직사각형 데이터를 색으로 행렬을 표현하여 시각화
# 열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시켜 색상으로 다양한 정보를 제공
# cmp : 시각화 시키는 컬러맵
# linewidth : 각 셀을 분할할 선의 너비
# annot : True라면 각 셀에 데이터 값 표시
# fmt : 문자열 형식화 코드
# .0% = X
# .1% = X.x
# .2% = X.xx
sns.heatmap(netflix_age_country_unstack, cmap = cmap, linewidth=2.5, annot=True, fmt='.0%')
plt.suptitle('Target ages proportion of total content by country',
fontweight='bold', fontfamily='serif', fontsize=15)
plt.title('Here we see interesting differences between countries. Most shows in South Korea are targeted to adults, for instance.',
fontsize=12, fontfamily='serif')
plt.show()
시본의 heatmap()을 이용해 시각화를 하였다.
해당 내용으로 다음과 같은 사항을 도출할 수 있다. (1) 전 국가에서 성인 대상 컨텐츠 비율이 가장 높으며, (2)일본이나 인도 등 아시아 국가에서는 어린이 대상 컨텐츠가 많이 서비스되고 있다는 점이다. 이러한 데이터들을 활용하여 앞으로 어떤 국가에서 어떤 연력대 컨텐츠들을 만들 수 있을지 전략을 도출해 볼 수 있다.
위험하더라도 신규 시장에 뛰어들 것인가, 아니면 안정적인 시청자 수가 확보되지만 경쟁이 있는 시장에 뛰어들 것인가..!내가 마치 넷플릭스의 마케터나 CEO가 된 것 처럼 여러 전략을 상상해 보는 것도 꽤 재밌는 활동이다^__^
넷플릭스 워드 클라우드
재밌는 시각화 기술 중 하나인 'word Cloud' 실습도 빼놓을 수 없다. 텍스트의 빈도, 중요도를 통해 데이터를 시각화 하는 기법으로, 예전에 페이스북에서 내가 많이 사용한 단어를 표현해주는 웹사이트 같은게 있어서 사용해 보았던 기억이 난다. 내 페이스북에는 '아놔' '아니' '진짜' 이런 감탄사가 많이 표출되었던 기억이...ㅋㅋㅋ
실습 파일에서 제공되는 netflix 로고 그림을 활용,
넷플릭스 데이터의 description 열을 활용해 워드 클라우드를 형성해 본다.
# 넷플릭스 데이터의 description 열 이용한 워드 클라우드 생성
# from wordcloud import WordCloud : 워드 클라우드 생성에 필요한 모듈
# from PIL import Image : 워드 클라우드를 원하는 형태로 그리기 위해 그림을 불러오는 패키지
from wordcloud import WordCloud
from PIL import Image
plt.figure(figsize=(15, 5))
# wordcolud에서 작동할 수 있도록 데이터프레임을 list로 1차 변환시키고 str(문자열)로 2차 변환
text = str(list(netflix['description']))
# mask : 단어를 그릴 위치 설정, 흰색(#FFFFFF) 항목은 마스킹된 것으로 간주
# 로고 이미지 열고 넘파이 배열로 변환
mask = np.array(Image.open('netflix_logo.jpg'))
# 워드 클라우드 색상맵 만들기
cmap = plt.matplotlib.colors.LinearSegmentedColormap.from_list('', ['#221f1f','#b20710'])
# 워드 클라우드 생성
# WordCloud( ).generate(text) : 선언해준 text에서 wordcloud를 생성
wordcloud = WordCloud(background_color = 'white', width = 1400, height = 1400,
max_words = 170, mask = mask, colormap=cmap).generate(text)
plt.suptitle('Keywords in the description of Movies and TV shows',
fontweight='bold', fontfamily='serif', fontsize=15)
# 워드 클라우드 표시
# plt.imshow( ) : array에 색을 채워서 이미지로 표시
plt.imshow(wordcloud)
# 축 감추기
plt.axis('off')
plt.show()
오 너무 재밌고 귀엽잖아?!ㅋㅋ크게 표시된 단어들은 데이터프레임에서 중요하며, 자주 나오는 단어들임을 알 수 있다.
셀레나 쌤의 추천으로 챗지피티를 통해 'KOREA'를 주제로 한 워드 클라우드도 한번 시도해 보았다.
ChatGPT의 말:
시본(Seaborn)과 맷플롭립(Matplotlib)을 활용하여 피처 엔지니어링을 수행한 후, "KOREA"를 주제로 한 워드클라우드를 생성하겠습니다.
- 피처 엔지니어링 수행: 가상의 데이터를 생성하고, 이를 시각화
- 워드클라우드 생성: "KOREA" 관련 단어들을 활용하여 워드클라우드 제작
코드를 실행해보겠습니다.
얘가 가상 데이터를 만들어서 각 단어별 빈도수를 피처 데이터로 만들고
(그런데 여기에 어떤 단어가 매칭되는지도 표현해달라 했더니 오류남..ㅡㅡ)

워드 클라우드로 표현을 해 주었다.

불고기, 김치 같은 음식
팝, 드라마, 한류 같은 문화컨텐츠 관련
태권도, 한복같은 전통문화
제주도, 경복궁 같은 유명 관광지 등
다양한 주제로 데이터를 도출하여 피처 엔지니어링을 진행하여 워드 클라우드를 만들어 주었다.
앞으로 관심 있는 주제들에 대해 이렇게 데이터를 수집한 뒤, 피처 엔지니어링을 통해 다양한 모양으로 워드 클라우드를 만들어 보면 재밌을 것 같다.
이번주부터는 좀 더 생활에 가까운 데이터를 통해 실습을 해보니 데이터 시각화 활동이 더욱 재밌고 생활과 밀접하게 느껴져서 재밌고 유익하게 느껴졌다. 남은 기간도 화이팅~!