준비단계

기본적인 분석도구 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
 

드라이브 마운트를 통한 데이터 불러오기

from google.colab import drive
drive.mount('/content/drive')
 
disney = pd.read_csv("/content/drive/MyDrive/disney_plus_titles.csv")

데이터 출처 캐글

https://www.kaggle.com/datasets/shivamb/disney-movies-and-tv-shows

 

Disney+ Movies and TV Shows

Movies and TV Shows listings on Disney+

www.kaggle.com

변수확인 및 설명

disney.columns

show_id : Unique ID

type : Is it a Movie or a TV Show

title : Name of the movie / show

director : Directors of the movie / tv show

cast : Main cast of the movie / show

country : Country of production

date_added : Date added on Disney+

release_year : Original Release Year of the movie / tv show

rating : Rating of the movie / tv show

duration : Total duration of the movie / tv show

listed_in : Listed in - Genere

description : Description of the movie / tv show

 

date_added 는 디즈니에 추가된 날짜 release_year는 실제 발매 연도

 

rating은 시청 등급

 

duration은 영상 길이

 

근데 1분짜리도 있고 8분짜리도 있길래 찾아보기로 했습니다.

피스트는 8분짜리 단편 애니메이션이 맞지만 오비완 케노비는 감독 배우도 모두 NULL값이고 아마 예고편도 포함되어있는 자료인듯 합니다.

disney.info()

유독 감독쪽이 NULL값이 많다.

결측치 처리

반복문을 통한 결측치 비율확인

for i in disney.columns :
    missingValueRate = disney[i].isna().sum() / len(disney) * 100 
    if missingValueRate > 0 :
        print("{} null rate: {}%".format(i,round(missingValueRate, 2))) 

결측치 대체 및 제거

disney['director'].fillna('No Data', inplace = True)
disney['cast'].replace(np.nan,'No Data', inplace = True)
disney['country'].replace(np.nan, 'No Data', inplace = True)

결측치 비율이 높은 변수들은 fillna와 replace를 이용하여 대체 (똑같음)

원본 객체를 변경하려면 inplace = True 옵션 추가
 
disney.dropna(axis =0, inplace = True)
 
그래도 남아있는 NULL값들은 얼마 되지 않기 때문에 행전체를 제거
 

Feature Engineering

개봉한 월, 연도 변수 새로 만들기

date_added 변수를 이용하여 month_added(개봉한 월), year_added(개봉한 연도) 정보를 변수로 생성

 

disney["date_added"] = pd.to_datetime(disney['date_added'])
 
pd.to_datetime을 이용해 시간 형식의 object 타입의 컬럼을 datetime 타입으로 변환
disney['month_added'] = disney['date_added'].dt.month
disney['year_added'] = disney['date_added'].dt.year
 
Disney의 date_added 변수를 이용하여 개봉한 연도, 월 정보를 변수로 생성
year_added 변수를 생성하여 개봉한 연도 정보 저장
month_added 변수를 생성하여 개봉한 월 정보 저장
dt.year : datetime에서 연도 정보 추출
dt.month : datetime에서 월 정보 추출

데이터 시각화

Disney+ Movie & TV show 비율 시각화

시각화 하기 전 최근 재미있게본 드라마도 데이터에 포함되어있나 검색해보았으나,, 없음 ,, 

disney[disney["title"].str.contains('casino', na = Falsecase = False)]
str.contains() : 지정한 문자열이 포함되어 있으면 True 반환, 그 외에는 False 반환
na = False : 값이 NA일 경우, False로 처리
case = Fasle : 대소문자를 구분하지 않고 검색  
 

시각화에 사용할 3가지 색상

 
sns.palplot(['#0E0F37','#335B92','#C6E8E5'])
plt.title("Disney brand palette ", loc='left', fontfamily='serif', fontsize=15, y=1.2)
plt.show()

Pie plot

ratio = pd.DataFrame(disney['type'].value_counts()).T

 

plt.pie의 매개변수 설명 
labels : 부채꼴 조각 이름
autopct : 부채꼴 안에 표시될 숫자 형식 지정
문자열에서 % 포맷팅으로 %0.f 형태로 사용하면 소수점 없이 정수처럼 인식
진짜 %를 표시하기 위해 %%로 작성
startangle : 부채꼴이 그려지는 시작 각도 설정, 90이면 12시 방향
explode : 부채꼴이 파이 플롯의 중심에서 벗어나는 정도 설정
shadow : 그림자 효과 표시
 
plt.figure(figsize=(5,5))

plt.pie(ratio, labels =ratio.columns, autopct='%0.f%%', startangle =100,
         explode=[0.050.05], shadow=True, colors=['#0E0F37','#335B92'])

이렇게 pie plot을 그리려던 찰나 에러발생

ValueError: x must be 1D

구글링을 해보니 데이터가 1차원이어야 된다는거 같은데 

나는 저 오류 설명을 보고 labels = ratio.columns 이 부분이 잘못된 줄 알고 헤매기 시작함

하지만 아무리 해봐도 ratio.columns는 1차원이 맞았고 

이놈을 바꿔보기로 했습니다.

plt.pie(np.array([1051,393]), labels =ratio.columns, autopct='%0.f%%', startangle =100,
         explode=[0.050.05], shadow=True, colors=['#0E0F37','#335B92'])

ratio를 바로 넣지않고 위에서 확인한 데이터대로 그냥 넘파이어레이로 넣었더니 해결 

Count plot

아까 추가한 월 변수를 사용하여 어떤 달에 가장 많이 추가되었는지 확인 

plt.figure(figsize=(15,5))
sns.countplot(data=disney, x='month_added', hue='type', palette=['#0E0F37','#335B92'])
plt.suptitle('Movie & TV Show added by month', fontfamily='serif', fontsize=15, fontweight='bold')
plt.title('The most Movies and TV shows were added in November.', fontfamily='serif', fontsize=12)
plt.show()

무언가 이상하다 .. 11월달이 너무 앞도적으로 많다.


plt.xticks([01234567891011], 
           ['January''February''March''April''May''June'
            'July''August''September''October''November''December'])  

우선 x 스틱을 사용하여 조금 더 보기 편하게 

 

연도별 출시도 확인해보기 

이렇게 보고나니 바로 드는 생각 디즈니+ 출시가 2019년 11월에 한게 아닐까 ?

 

역시나..

그럼 결국 출시년도 11월을 제외하고 비교해보면 특정 달에 유의미하게 많은 작품이 등록되거나 하지는 않는거같다.

(4월에 조금 많고 3월에 조금 적은 정도)

 

Disney+ Word Cloud

사용 패키지

from wordcloud import WordCloud
from PIL import Image
 
PIL은 디즈니 모양으로 워드클라우드를 작성하기 위함
 

워드클라우드 그리기 (title)

 wordcolud에서 작동할 수 있도록 데이터프레임을 list로 1차 변환시키고 str(문자열)로 2차 변환

 mask : 단어를 그릴 위치 설정, 흰색(#FFFFFF) 항목은 마스킹된 것으로 간주
 plt.matplotlib.colors.LinearSegmentedColormap.from_list( ) : 컬러맵 생성
 WordCloud( ).generate(text) : 선언해준 text에서 wordcloud를 생성
 plt.imshow( ) : array에 색을 채워서 이미지로 표시
 plt.axis('off') : 축 삭제
plt.figure(figsize=(15,5))

text = str(list(disney['title']))
mask = np.array(Image.open('/content/drive/MyDrive/disney.jpg'))
cmap = plt.matplotlib.colors.LinearSegmentedColormap.from_list("", ['#335B92','#C6E8E5'])
wordcloud = WordCloud(background_color = 'white', width = 1400, height  = 1400, max_words = 170, mask = mask, colormap = cmap).generate(text)

plt.suptitle('Keywords in the title of Movies and TV shows', fontweight='bold', fontfamily='serif', fontsize=15)   

plt.imshow(wordcloud)
plt.axis('off')
plt.show()

워드클라우드 그리기 (distription)

plt.figure(figsize=(15,5))

text = str(list(disney['description']))
mask = np.array(Image.open('/content/drive/MyDrive/disney.jpg'))
cmap = plt.matplotlib.colors.LinearSegmentedColormap.from_list("", ['#335B92','#C6E8E5'])
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(wordcloud)
plt.axis('off')
plt.show()

 

 

'데이터 분석 실습 > Python' 카테고리의 다른 글

달력 만들기 with google colab  (0) 2023.04.24
뉴스 3줄 요약하기  (1) 2023.04.20
복사했습니다!