본문 바로가기

카테고리 없음

<파이썬 데이터 분석가 되기 (feat. 챗지피티)> 6주차 스터디 - 넷플릭스 분석 데이터 만들어보기 실습

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'를 주제로 한 워드 클라우드도 한번 시도해 보았다.

 

나: 시본과 맷플롭릿을 활용하여 피처엔지니어링을 해서 피쳐 값을 만든 뒤, KOREA 를 주제로 한 워드클라우드 하나 만들어죠
 

ChatGPT의 말:

시본(Seaborn)과 맷플롭립(Matplotlib)을 활용하여 피처 엔지니어링을 수행한 후, "KOREA"를 주제로 한 워드클라우드를 생성하겠습니다.

  1. 피처 엔지니어링 수행: 가상의 데이터를 생성하고, 이를 시각화
  2. 워드클라우드 생성: "KOREA" 관련 단어들을 활용하여 워드클라우드 제작

코드를 실행해보겠습니다.

 

얘가 가상 데이터를 만들어서 각 단어별 빈도수를 피처 데이터로 만들고

(그런데 여기에 어떤 단어가 매칭되는지도 표현해달라 했더니 오류남..ㅡㅡ)

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

불고기, 김치 같은 음식

팝, 드라마, 한류 같은 문화컨텐츠 관련

태권도, 한복같은 전통문화

제주도, 경복궁 같은 유명 관광지 등

다양한 주제로 데이터를 도출하여 피처 엔지니어링을 진행하여 워드 클라우드를 만들어 주었다.

 

앞으로 관심 있는 주제들에 대해 이렇게 데이터를 수집한 뒤, 피처 엔지니어링을 통해 다양한 모양으로 워드 클라우드를 만들어 보면 재밌을 것 같다.

 

이번주부터는 좀 더 생활에 가까운 데이터를 통해 실습을 해보니 데이터 시각화 활동이 더욱 재밌고 생활과 밀접하게 느껴져서 재밌고 유익하게 느껴졌다. 남은 기간도 화이팅~!