본문 바로가기

Data Science

캐글 데이터 시각화 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (3)

캐글 데이터 시각화 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (3)

캐글 데이터 시각화 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (3)

 

캐글의 넷플릭스 데이터를 이용한 데이터 분석 3번째 시간 입니다.
이번편은 종전에 데이터 전처리를 하고, 일부 데이터 시각화를 하였었는데, 본격적으로 시각화를 하는 과정 입니다.
그럼 우선, 지난 편들 링크를 남길테니, 이걸 처음으로 보신분들은 전편부터 보시고 오시길 바랍니다.

 

이전 분석 포스트 보러가기

2021.03.02 - [Data Science] - 캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (1)

 

캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (1)

캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (1) 오랫만에 데이터 분석 실습 포스트를 진행 합니다. 데이터 분석은 저도 아직.. 많이 허접한 실력을 가지고 있기 때문에, 이 글을 보시

stricky.tistory.com

2021.03.03 - [Data Science] - 캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (2)

 

캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (2)

캐글 넷플릭스(netflix) 데이터를 이용한 데이터 분석 실습 (2) 안녕하세요. 지난번 넷플릭스 데이터를 이용한 데이터 분석 실습 1편에 이어서 2편을 작성 합니다. 지난 1편을 보시고 싶으신 분들은

stricky.tistory.com

데이터 시각화

이번에는 조금 더 이쁘게 정리를 해보도록 하겠습니다. 배경색상도 넣고, 타이틀도 보기좋게 나오도록 말이죠.
코드는 다음과 같습니다.

rating_order_movie =  ['G', 'TV-Y', 'TV-G', 'PG', 'TV-Y7', 'TV-Y7-FV', 'TV-PG', 'PG-13', 'TV-14', 'R', 'NC-17', 'TV-MA']
rating_order_tv =  [ 'TV-Y', 'TV-G', 'TV-Y7', 'TV-Y7-FV', 'TV-PG', 'TV-14', 'R', 'TV-MA']
movie_rating = df_movies['rating'].value_counts()[rating_order_movie]
tv_rating = df_tv['rating'].value_counts()[rating_order_tv].fillna(0)
def rating_barplot(data, title, height, h_lim=None):
    fig, ax = plt.subplots(1,1, figsize=(15, 7))
    if h_lim :
        ax.set_ylim(0, h_lim)
    ax.bar(data.index, data,  color="#d0d0d0", width=0.6, edgecolor='black')

    color =  ['green',  'blue',  'orange',  'red']
    span_range = [[0, 2], [3,  6], [7, 8], [9, 11]]

    for idx, sub_title in enumerate(['Little Kids', 'Older Kids', 'Teens', 'Mature']):
        ax.annotate(sub_title,
                    xy=(sum(span_range[idx])/2 ,height),
                    xytext=(0,0), textcoords='offset points',
                    va="center", ha="center",
                    color="w", fontsize=16, fontweight='bold',
                    bbox=dict(boxstyle='round4', pad=0.4, color=color[idx], alpha=0.6))
        ax.axvspan(span_range[idx][0]-0.4,span_range[idx][1]+0.4,  color=color[idx], alpha=0.1)

    ax.set_title(f'Distribution of {title} Rating', fontsize=20, fontweight='bold', position=(0.5, 1.0+0.03))
    plt.show()

rating_barplot(movie_rating,'Movie', 1500)

결과는 아래와 같이 이쁘게 나오게 됩니다.
위 코드를 보시면 sub_title을 정의 하는 for문이 있습니다. 여기서 이리저리 수정을 하시다 보면 원하시는 형태로 수정을 하실수 있을겁니다. 저도 아직 수정을 하는 수준이라..ㅎㅎ 

Distribution of Movies Rating

위에껀 Movie 컨텐츠에 대한 내용이고, 아래 코드와 결과는 TV Show에 대한 내용 입니다.

rating_barplot(tv_rating,'TV Show' , 600, 1500)

결과는 다음과 같습니다.

Distribution of TV Show Rating

 

 

 

년도별 컨텐츠 등록 수 시각화

자, 이번에는 년도별로 넷플릭스에 컨텐츠가 얼마나 등록이 되고 있는지에 대한 내용 입니다.
아래 코드를 이용해서, Movies와 TV Shows, 그리고 Total 건수에 대한 데이터를 꺽은선 그래프로 표현하도록 하겠습니다. 코드는 다음과 같습니다.

df_content = main_df['year_added'].value_counts().reset_index().rename(columns = {
    'year_added' : 'count', 'index' : 'year_added'}).sort_values('year_added')
df_content['percent'] = df_content['count'].apply(lambda x : 100*x/sum(df_content['count']))


df_tv1 = df_tv['year_added'].value_counts().reset_index().rename(columns = {
    'year_added' : 'count', 'index' : 'year_added'}).sort_values('year_added')
df_tv1['percent'] = df_tv1['count'].apply(lambda x : 100*x/sum(df_tv1['count']))


df_movies1 = df_movies['year_added'].value_counts().reset_index().rename(columns = {
    'year_added' : 'count', 'index' : 'year_added'}).sort_values('year_added')
df_movies1['percent'] = df_movies1['count'].apply(lambda x : 100*x/sum(df_movies1['count']))

t1 = go.Scatter(x=df_movies1['year_added'], y=df_movies1["count"], name="Movies", marker=dict(color="royalblue"))
t2 = go.Scatter(x=df_tv1['year_added'], y=df_tv1["count"], name="TV Shows", marker=dict(color="red"))
t3 = go.Scatter(x=df_content['year_added'], y=df_content["count"], name="Total Contents", marker=dict(color="black"))

data = [t1, t2, t3]

layout = go.Layout(title="Content added over the years", legend=dict(x=0.1, y=1.1, orientation="h"))
fig = go.Figure(data, layout=layout)
fig.show()

결과는 다음과 같습니다.

년도별 컨텐츠 등록 추이

위 코드를 보시면 아시겠지만, 위에서 먼저 데이터들을 정리를 하고, t1, t2, t3를 이용하여 꺽은선에대한 정보를 넣어줍니다. 그리고 마지막으로 그래프를 그리게 됩니다.

TV Shows 보다 Movies가 더 많은 컨텐츠를 가지고 있다는것을 한눈에 파악 할 수 있습니다.

 

 

 

Movies 재생시간 데이터 시각화

Movies의 각 편당 재생시간의 추이를 보겠습니다.
대체적으로 어느정도의 재생시간을 가지고 있는지에 대한 데이터를 시각적으로 확인 할 수 있습니다.

from scipy.stats import norm

plt.figure(figsize=(15,7))
sns.distplot(df_movies['duration'].str.extract('(\d+)'),fit=norm,kde=False, color=['royalblue'])
plt.title('Distplot with Normal distribution for Movies',fontweight="bold")
plt.show()

결과는 다음과 같습니다.

Movies의 재생시간 추이 데이터

대체적으로 85분에서 120분 사이의 데이터가 몰려 있는것을 확인 할 수 있습니다.

 

 

 

TV Shows 와 Movies의 10대 장르

넷플릭스에 있는 데이터에서 TV Shows 와 Movies의 10대 장르는 어떤것이 있는지 확인 해보겠습니다.
각각의 코드와 결과를 확인 해보겠습니다.

plt.figure(figsize=(15,5))
sns.barplot(x = df_movies["listed_in"].value_counts().head(10).index,
            y = df_movies["listed_in"].value_counts().head(10).values,palette="pink")
plt.xticks(rotation=60)
plt.title("Top10 Genre in Movies",fontweight="bold")
plt.show()

Movies의 10대 장르

다음은 TV Shows 입니다.

plt.figure(figsize=(15,5))
sns.barplot(x = df_tv["listed_in"].value_counts().head(10).index,
            y = df_tv["listed_in"].value_counts().head(10).values,palette="vlag")
plt.xticks(rotation=70)
plt.title("Top10 Genre in TV Shows",fontweight="bold")
plt.show()

TV Shows 의 10대 장르

각각 다큐멘터리와 Kid's TV가 1등 장르네요. 제 예상과는 좀 다릅니다. 여러분들은 어떠신가요?

 

 

 

넷플릭스 제작 10대 국가

넷플릭스에 컨텐츠를 제작하는 10대 국가 정보 입니다.
아래와 같이 코드를 이용하여 시각화 할 수 있습니다.

from collections import Counter
country_data = main_df['country']
country_count = pd.Series(dict(Counter(','.join(country_data).replace(' ,',',').replace(
    ', ',',').split(',')))).sort_values(ascending=False)
top20country = country_count.head(10)

plt.figure(figsize=(15,5))
sns.barplot(x= top20country.index, y=top20country, palette="pastel")
plt.xticks(rotation=50)
plt.title('Top 10 countries with most contents', fontsize=15, fontweight='bold')
plt.show()

결과는 다음과 같습니다.

넷플릭스 10대 제작 국가

역시나 미국이 1위군요. 세계적인 영화 대국 인도가 2위고, 같은 영어권인 영국이 3위에 랭크되어 있습니다. 요즘 넷플릭스에서 핫한 우리나라 대한민국이 8위에 랭크되어 있는것을 알 수 있습니다.

 

 

 

TV Shows와 Moview의 제목을 이용한 Word Cloud

TV Shows와 Movies의 제목 텍스트를 이용한 Word Cloud 분석입니다.
잘 아시겠지만 많이 나오는 텍스트는 크게 표시되는 데이터 시각화 기법 입니다.

from wordcloud import WordCloud, STOPWORDS

text = ' '.join(df_movies['title'])

plt.rcParams['figure.figsize'] = (12,12)
wordcloud = WordCloud(background_color = 'white', width = 1200,  height = 1200, max_words = 121).generate(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

결과는 다음과 같습니다.

Movies의 제목을 이용한 Word Cloud

다음은 TV Show를 이용한 Word Cloud 입니다.

from wordcloud import WordCloud, STOPWORDS

text = ' '.join(df_tv['title'])

plt.rcParams['figure.figsize'] = (12,12)
wordcloud = WordCloud(background_color = 'black',colormap='vlag', width = 1200,  height = 1200, max_words = 121).generate(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

다음과 같이 결과가 나옵니다.

TV Show를 이용한 Word Cloud

TV Show 나 Movie나 Love가 눈에 띄이는건 저 뿐인가요? ㅎㅎ 
이러한 단어들이 많이 들어갔다는것을 알 수 있었습니다.

자, 이렇게 넷플릭스를 이용한 데이터 전처리, 분석, 시각화 까지 실습을 쭉~ 진행해 보았습니다.
이젠 코드를 보면서 수정도 해보고, 다른 데이터 소스를 이용해서 비슷하게 해보는 실습도 해보면 좋을것 같습니다.
자, 그럼 이젠 다음 데이터 분석을 위해서 한번 또 한발짝 뛰어 보도록 하겠습니다.

#본 실습은 아래 데이터 실습 코드를 번역 및 일부 수정하며 진행되고 있음을 알려드립니다.
www.kaggle.com/bhartiprasad17/netflix-movies-and-tv-shows-eda

by.sTricky