# 넷플릭스 브랜드 상징 색깔 시각화
sns.palplot(['#221f1f', '#b20710', '#e50914','#f5f5f1'])
plt.title("Netflix brand palette ", loc='left', fontfamily='serif', fontsize=15, y=1.2)
plt.show()
앞서 전처리를 마친 Netflix를 가지고 시각화하여 분석해보았다.
시각화에 사용할 색깔로 넷플릭스의 브랜드 컬러인 4가지 색깔을 활용하였다.
- Type별 비율(%) by PieChart
plt.pie( ) : 파이 플롯 시각화
- labels : 부채꼴 조각 이름
- autopct : 부채꼴 안에 표기될 숫자 형식 지정 문자열 % 포맷팅으로 %0.f 형태는 소수점 없이 정수처럼 인식 진짜 %를 표시하기 위해 %%로 작성
- startangle : 부채꼴이 그려지는 시작 각도 설정, 90이면 12시 방향
- explode : 부채꼴이 파이 플롯의 중심에서 벗어나는 정도 설정
- shadow : 그림자 효과 표시
plt.suptitle( ) : 전체 플롯의 제목
plt.title( ) : 서브 플롯의 제목
# Type = Movies, TV shows
# .T : 전치(Transpose) 변환
ratio = pd.DataFrame(netflix['type'].value_counts()).T
ratio
plt.figure(figsize=(5,5))
## 만약 plt.pie 함수에서 ratio 삽입시 오류가 발생하면 ratio.loc['type'] 입력
## ratio.loc['type']는 ratio에서 특정 행인 'type'만 추출하여 1차원으로 변경하여 pie 차트에 x값으로 넣어준 값
plt.pie(ratio.loc['count'], labels=ratio.columns, 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()
Netflix는 드라마(TV Shows)보다 영화(Movie)를 다루는 비중이 훨씬 높다.
- Type별, 연도별 비율(%) by BarChart
countplot( ) : 각 범주에 속하는 데이터의 개수를 막대 그래프 시각화
- data : 카운트 플롯에서 사용할 데이터 셋
- x : x축 설정
- hue : 특정 열 데이터로 색상을 구분하여 출력
# Type별, 연도별 막대차트 만들기
sns.countplot(data=netflix, x = netflix['year_added'], hue = 'type', palette=['#b20710', '#221f1f'])
plt.suptitle('Movie & TV Show added by year', fontfamily='serif', fontsize=15, fontweight='bold')
plt.title('Regardless of the year, we always watch more movies than TV shows on Netflix. The most movies were added in 2019.', fontfamily='serif', fontsize=12)
plt.show()
위 시각화로 2013년까지는 수치가 거의 보이지 않아서 확실하지 않지만, 2014년 부터 Movie가 TV Show보다 비중이 높고 그 격차는 점점 벌어졌다. 그러나 전체적인 증감추이는 비슷한 경향성을 보이는 것을 확인할 수 있다.
2020년부터 코로나가 본격화 되면서 시청자 유입이 엄청 증가한 것으로 알고 있는데 2020년부터 콘텐츠 추가는 감소한 것을 확인할 수 있었는데, 영화/드라마 제작에 있어서 셧다운, 거리두기 제한 등의 이유로 어려움이 있었던 것으로 생각된다.
- Type별, 월별 수치
unstack( ) : 인덱스를 컬럼으로 바꾸는 역할
<-> stack( ) : 컬럼을 인덱스로 바꾸는 역할
fill_between( ) : x축을 기준으로 그래프 영역을 채우는 함수
<-> fill_betweenx( ) : y축을 기준으로 그래프 영역을 채우는 함수
- x : 곡선을 정의하는 노드의 x 좌표
- y1 : 첫 번째 곡선을 정의하는 노드의 y 좌표
- y2 : 두 번째 곡선을 정의하는 노드의 y 좌표
- label : 'Movie', 'TV Show' 문자열 입력
- alpha : 투명도
xticks(x, month_name) : x축의 눈금 레이블에 month_name 값의 순서대로 설정
월별 시각화를 위해 groupby와 unstack을 이용하여 month로 피봇팅 해주었다.
netflix_month = netflix.groupby('month_added')['type'].value_counts().unstack()
netflix_month
plt.figure(figsize=(15, 5))
plt.fill_between(x=netflix_month['Movie'].index, y1=0, y2=netflix_month['Movie'], color='#b20710', alpha=0.9, label = 'Movie')
plt.fill_between(x=netflix_month['TV Show'].index, y1=0, y2=netflix_month['TV Show'], color='#221f1f', alpha=0.9, label = 'TV Show')
plt.xticks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'])
plt.legend()
plt.suptitle('Movie & TV Show added by month', fontfamily='serif', fontsize=15, fontweight='bold')
plt.title('The most movies were added in July and the most tv Show were added in December.', fontfamily='serif', fontsize=12)
plt.show()
Movie와 TV Show 모두 2월과 5월에 새로운 콘텐츠가 가장 적게 나오고 연말인 12월과 여름 7월에 콘텐츠가 가장 많이 나오는 것을 보아 여름휴가, 연말휴가에 맞춰서 나오는 영화나 드라마가 있어서 그런게 아닐까라는 추측을 해보았다.
- Netflix 나라별 타겟팅하는 연령 by heatmap
heatmap( ) : 직사각형 데이터를 색으로 행렬을 표현하여 시각화 열을 뜻하는 heat와 지도를 뜻하는 map을 결합시켜 색상으로 다양한 정보를 제공
- cmp : 시각화 시키는 컬러맵
- linewidth : 각 셀을 분할할 선의 너비
- annot : True라면 각 셀에 데이터 값 표시
- fmt : 문자열 형식화 코드 (.0% = X, .1% = X.x, .2% = X.xx)
plt.matplotlib.colors.LinearSegmentedColormap.from_list( ) : 컬러맵 생성
우선 heatmap으로 보고자 하는 형태의 테이블로 피봇팅 해준다.
netflix_age_country = netflix.groupby('age_group')['country'].value_counts().unstack()
netflix_age_country
# 특정 나라별 타겟팅하는 특정 연령 선택하여 수치화
age_order = ['Kids','Older Kids','Teens','Adults']
country_order = ['United States', 'India', 'United Kingdom', 'Canada', 'Japan',
'France', 'South Korea', 'Spain', 'Mexico', 'Turkey']
netflix_age_country = netflix_age_country.loc[age_order, country_order]
netflix_age_country.fillna(0, inplace = True)
netflix_age_country
그런데 나라별로 모수가 다르기 때문에 count가 아닌 비율(%)로 보는 것이 더 정확하여 다시 한번 비율 값으로 변환했다.
# 비율(%)로 집계
# .sum(axis=0) : 열 기준으로 더하기
# .div(axis=1) : 행 기준으로 나누기
netflix_age_country = netflix_age_country.div(netflix_age_country.sum(axis=0), axis=1)
netflix_age_country
# 히트맵 그리기
plt.figure(figsize=(15, 5))
cmap = plt.matplotlib.colors.LinearSegmentedColormap.from_list("", ['#221f1f', '#b20710','#f5f5f1'])
sns.heatmap(netflix_age_country, cmap = cmap, linewidth=2.5, annot=True, fmt='.0%', annot_kws={"size": 10})
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()
분명 DataFrame 만들고 그대로 히트맵으로 구현한건데,,, 수치가 위에 4개밖에 안나온다...ㅠㅠ
글씨크기 때문인가 싶어서 annot_kws={'size':10} 설정 해봐도 안되서 결국 포기,,,
색깔대로 보면 대부분의 나라에서 adults > older kids > teens, kids 순서대로 콘텐츠가 많이 나오는 것을 알 수 있는데,
특히 프랑스, 한국, 스페인, 멕시코, 터키에서는 성인 이상의 콘텐츠가 8-90% 이상을 차지하며 매우 큰 비중인 것을 확인할 수 있다.
다만 미국, 인도, 영국, 캐나다, 일본은 상대적으로 Adults 콘텐츠 비율이 적지만 older kids 콘텐츠 비중이 앞 5개 국가보다 높은 점을 고려해보았을 때 이 나라들이 연령 규제가 더 낮다는 가설을 세워볼 수 있을 듯 하다. 가설이 맞다면 Older kids부터 시청이 허용되는 경우가 많기 때문에 Adults 콘텐츠가 상대적으로 적은 것이라고 볼 수 있겠다.
'Python' 카테고리의 다른 글
[Netflix] WordCloud, 이미지로 결과 표현하기 (0) | 2024.05.31 |
---|---|
[Netflix] 전처리(결측치 처리, 데이터타입 변경), Feature Engineering (0) | 2024.05.31 |