5. 데이터 시각화
1) 콘텐츠 유형 분석
#유형별 콘텐츠 수 count
unique_movies = netflix_data[netflix_data['type']=='Movie']['title'].nunique()
unique_tv_shows = netflix_data[netflix_data['type']=='TV Show']['title'].nunique()
unique_movies, unique_tv_shows
#그래프 시각화
labels = 'Movies', 'TV Shows'
sizes = [unique_movies, unique_tv_shows]
colors = ['#000000', '#E50914']
plt.figure(figsize=(8, 6))
plt.pie(sizes, labels=labels, colors=colors, autopct='%0.2f%%', startangle=90, textprops={'color':'white', 'fontweight':'bold'})
plt.axis('equal')
plt.title('Netflix 콘텐츠 유형')
plt.legend()
plt.show()
2) 콘텐츠 유형별 업데이트 연도
#date_added 컬럼 데이터 전처리
netflix_data_f = netflix_data[netflix_data['date_added'] != 'No data'] #'No data' 제거
netflix_data_f['date_added'] = pd.to_datetime(netflix_data_f['date_added'], format='%B %d, %Y') #데이터 타입 변경
#’date_added’에서 연도 추출
netflix_data_f['year_added'] = netflix_data_f['date_added'].dt.year
#콘텐츠 유형별로 필터링
movies_data = netflix_data_f[netflix_data_f['type']=='Movie']
tv_shows_data = netflix_data_f[netflix_data_f['type']=='TV Show']
#연도별 업데이트 수 count
unique_total_per_year = netflix_data_f.groupby('year_added')['show_id'].nunique()
unique_movies_per_year = movies_data.groupby('year_added')['show_id'].nunique()
unique_tv_shows_per_year = tv_shows_data.groupby('year_added')['show_id'].nunique()
#그래프 시각화
plt.figure(figsize=(10,5))
plt.plot(unique_total_per_year, color='#E50914', label='Total')
plt.plot(unique_movies_per_year, color='#000000', label='Movies')
plt.plot(unique_tv_shows_per_year, color='#1859c9', label='TV Shows')
plt.title('콘텐츠 유형별 업데이트 연도')
plt.xlabel('연도')
plt.ylabel('콘텐츠 수')
plt.grid(axis='y', linestyle='--', color='gray', alpha=0.5)
plt.legend()
plt.show()
3) 요일별 콘텐츠 업데이트 비율
#'date_added'에서 요일 추출
netflix_data_f['week_added'] = netflix_data_f['date_added'].dt.day_name()
#요일별 업데이트 수 count
contents_per_week = netflix_data_f.groupby('week_added')['show_id'].nunique()
#그래프 시각화
days = contents_per_week.index
counts = contents_per_week.values
colors = ['#E50914', '#C80813', '#A70711', '#87060F', '#66050D', '#44040B', '#000000']
plt.figure(figsize=(8, 8))
plt.pie(counts, labels=days, colors=colors, autopct='%1.1f%%', textprops={'color':'white', 'fontweight':'bold'})
plt.title('요일별 콘텐츠 업데이트 비율')
plt.legend()
plt.show()
4) Netflix 장르 Top 10
#데이터 중첩 해제 함수
def unnest_dataframe(df, column):
return (
df.drop(column, axis=1)
.join(
df[column].str.split(',', expand=True)
.stack()
.reset_index(level=1, drop=True)
.rename(column)
)
)
#1. df.drop(column, axis=1) : 주어진 column 삭제
#2. .join( ) : 새로운 데이터프레임을 기존 데이터프레임에 결합
#3. df[column].str.split(',', expand=True) : 주어진 column 값을 쉼표로 분할하여 새로운 열로 생성. ‘expand=True’는 분할된 값을 새로운 열로 배치하도록 지정
#4. .stack() : 열의 값을 행으로 쌓아올림. 하나의 행에 여러 값을 가진 경우 각각의 행으로 만들어 중첩을 해제
#5. .reset_index(level=1, drop=True) : 중첩 해제된 행의 인덱스 재설정. ‘level=1’은 특정 레벨의 인덱스를 재설정하라는 의미이고, ‘drop=True’는 현재 인덱스 삭제하라는 의미
#6. .rename(column) : 새롭게 생성된 열에 대해 이름을 다시 지정
#'listed_in' 데이터 전처리
unnested_listed_in = unnest_dataframe(netflix_data, 'listed_in') #'listed_in' 데이터 중첩 해제
unnested_listed_in['listed_in'] = unnested_listed_in['listed_in'].str.strip() #시작과 끝 공백 제거
unique_listed_in = unnested_listed_in.drop_duplicates(subset=['show_id', 'listed_in']) #중복값 제거
genre_counts = unnested_listed_in['listed_in'].value_counts().sort_values(ascending=False) #장르별 빈도 count, 내림차순 정렬
#그래프 시각화
plt.figure(figsize=(10,5))
genre_counts.head(10).plot.bar(color = '#E50914')
plt.title('Netflix 장르 Top 10')
plt.xlabel('장르')
plt.ylabel('콘텐츠 수')
plt.xticks(rotation=45)
plt.show()
5) 국가별 콘텐츠 제작 수 Top 10
#'No data' 제거
netflix_data_f = netflix_data[netflix_data['country'] != 'No data']
#국가별 콘텐츠 수 count
unnested_country = unnest_dataframe(netflix_data_f, 'country')
unique_titles_per_country = unnested_country.groupby('country')['show_id'].nunique()
unique_titles_per_country_sorted = unique_titles_per_country.sort_values(ascending=False) #내림차순 정렬
unique_titles_per_country_sorted
#데이터 시각화
plt.figure(figsize=(10,5))
unique_titles_per_country_sorted.head(10).plot.bar(color='#E50914')
plt.title('국가별 콘텐츠 수 Top 10')
plt.xlabel('국가')
plt.ylabel('콘텐츠 수')
plt.xticks(rotation=45)
plt.show()
- United States나 France의 경우 같은 국가인데 데이터가 두 개로 나눠져 있는 것이 확인되어 데이터 중첩 제거 후 행 단위로 만들 때 EXPLODE를 이용해 다시 시각화를 해주었다.
#'country' 컬럼의 데이터를 쉼표로 구분하여 리스트 생성
netflix_data_f['countries_list'] = netflix_data['country'].str.split(',')
#리스트의 각 데이터를 행 단위로 확장
expanded_countries = netflix_data_f.explode('countries_list')
#시작과 끝 공백 제거
expanded_countries['countries_list'] = expanded_countries['countries_list'].str.strip()
#국가별 콘텐츠 수 count, 내림차순 정렬
unique_title_counts = expanded_countries.groupby('countries_list')['show_id'].nunique().sort_values(ascending=False)
#데이터 시각화
plt.figure(figsize=(10,5))
unique_title_counts.head(10).plot.bar(color='#E50914')
plt.title('국가별 콘텐츠 수 Top 10')
plt.xlabel('국가')
plt.ylabel('콘텐츠 수')
plt.xticks(rotation=45)
plt.show()
6. 결론
- 넷플릭스의 컨텐츠 유형은 'Movie'와 'TV Show'로 구분되는데 'Movie'가 69.62%로 많은 비율을 차지하고 있다.
- 유형별로 콘텐츠 업데이트 연도를 살펴보면 2018년에서 2020년 사이에 그래프가 급격하게 증가하는 것을 볼 수 있다. 특히 'Movie' 그래프가 가파른 상승을 보이는데 이는 COVID-19의 영향으로 극장보다 OTT 수요가 증가함에 따른 영향으로 보인다.
- 다음으로 요일별 콘텐츠 업데이트 비율을 분석한 결과 금요일이 28.4%로 가장 큰 비율을 차지하고 있었고 다음으로는 목요일과 수요일, 화요일 순으로 높은 비율을 차지했다. 이는 주말에 OTT를 시청하는 사용자 수가 많기 때문이라고 예상된다.
- 장르별 콘텐츠 수 Top 10의 그래프를 보면 ‘International Movies’가 1순위를 차지하고 있는데 이것은 다양한 언어로 번역된 국제 영화를 의미하기 때문에 장르에서 제외하는 것이 좋을 것 같다. 마찬가지로 'International TV Shows'도 제외하고 나머지 장르의 순위를 보면 '드라마' 장르가 가장 많이 제작된 것을 확인할 수 있다. 다음으로는 '코미디'와 '다큐멘터리', '액션&어드벤처' 장르의 수가 많은 것으로 파악됐다.
- 국가별 콘텐츠 제작 수는 미국이 압도적으로 많이 차지하고 있으며 다음으로는 인도와 영국, 캐나다 등에서 제작된 콘텐츠가 많은 것으로 나온다. 우리나라의 경우 8위를 차지하며 콘텐츠 제작 수 Top 10 순위권에 들어있는 것을 확인했다. 최근 K-Culture의 수요가 증가함에 따라 우리나라의 콘텐츠도 국제적인 경쟁력을 가지고 있는 것으로 보인다.
7. 느낀점
처음엔 공공자전거 '따릉이' 데이터 분석을 주제로 잡고 이틀정도 데이터 분석을 진행해 봤는데 데이터 파일 수도 너무 많고, 데이터 인코딩부터 오류 문제가 생기는 이슈로 현재 레벨에서 진행 가능한 주제를 다시 선정해서 데이터 분석을 진행했다. 중간에 주제를 바꾸는 바람에 데이터 분석을 할 수 있는 기간이 줄었지만 주어진 기간에 할 수 있는 만큼 데이터의 시각화까지 마무리지었다.
프로젝트 진행 방향에 대한 갈피를 제대로 잡지 못하고 데이터 분석 선례 코드를 보면서 따라 하듯이 EDA를 진행했지만 그 과정에서 오류도 해결해 보고 새로운 함수도 알아가며 파이썬에 대한 좋은 학습이 되었다. 마감 기한이 여유롭게 있었으면 더 다양한 방면으로 데이터 분석을 해보고, 다른 OTT 서비스와 비교 분석도 해보고 싶었는데 이 부분은 파이썬을 더 학습한 뒤 다시 해보면 좋을 것 같다.
참고 자료
- "Netflix Trends- A Data Driven View", https://www.kaggle.com/code/eshabahal/netflix-trends-a-data-driven-view
- "[데이터분석] 요즘 핫한 넷플릭스 영화/TV쇼 트렌드는?", https://www.blog.spiderkim.com/post/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%9A%94%EC%A6%98-%ED%95%AB%ED%95%9C-%EB%84%B7%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%98%81%ED%99%94-tv%EC%87%BC-%ED%8A%B8%EB%A0%8C%EB%93%9C%EB%8A%94
- "넷플릭스의 콘텐츠 보유 현황과 수급 전략 분석 - 파이썬 비즈니스 데이터 분석", https://songseungwon.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%B5%9C%EA%B7%BC-%EB%84%B7%ED%94%8C%EB%A6%AD%EC%8A%A4%EC%9D%98-%EC%BD%98%ED%85%90%EC%B8%A0-%EB%B3%B4%EC%9C%A0-%ED%98%84%ED%99%A9%EA%B3%BC-%EC%88%98%EA%B8%89-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC?category=921052
'스파르타 코딩클럽 > [프로젝트] 내일배움캠프 데이터분석 1기' 카테고리의 다른 글
[기초 프로젝트] 데이팅 앱 지하철 광고 전략 (2) - 데이터 시각화 및 결론 (0) | 2024.01.19 |
---|---|
[기초 프로젝트] 데이팅 앱 지하철 광고 전략 (1) - 데이터 수집 및 가공 (0) | 2024.01.19 |
[미니 프로젝트] Netflix 데이터 분석 (1) - 데이터 확인 (0) | 2023.12.21 |