이번 시간에는 넷플릭스 데이터 분석 과정을 소개해보려고 한다.
내가 다운로드한 자료는 다음 링크에서 확인할 수 있다.
https://www.kaggle.com/datasets/shivamb/netflix-shows
해당 넷플릭스 데이터는 2008년 1월부터 2021년 9월까지 데이터가 업로드되어 있다. 넷플릭스에 추가된 8000편의 영화, TV Show 정보가 담겨 있다.
데이터 분석 목표
- 데이터 파악
- 데이터 전처리
- 결측치 처리
- 피처 엔지니어링(파생변수 생성)
- 데이터 분석을 통한 인사이트 도출
- 오징어 게임('Squid Game') 검색
- Movie & TV Show 비율 시각화
- 연도별 Movie & TV Show 수치 시각화
- 월별 Movie & TV Show 수치 시각화
- 나라별 타겟팅하는 연령 시각화
- 워드클라우드(핵심 단어 시각화)
(나는 해당 실습을 구글 코랩에서 진행했다.)
Netfilx 데이터 분석 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# csv 파일 읽어오기
netflix = pd.read_csv("/content/sample_data/NetFlix.csv")
netflix.head(3)
이제 info로 간단하게 파악해 보자.
netflix.info()
이렇게 봤을 때 Non-null 개수가 서로 다른 게 있어서 일단 null값을 처리해줘야 할게 조금 있겠다는 생각이 든다.
Netflix 결측치 비율 확인
for 반복문을 통해 각 칼럼별 결측치 비율을 계산하여 문자열로 출력해 보자. 여기서 사용된 .isna( ) 함수는 결측 값은 True 반환, 그 외에는 False를 반환해 준다.
for column in netflix.columns :
missingValueRate = netflix[column].isna().sum() / len(netflix) * 100
if missingValueRate > 0 :
print("{} null rate: {}%".format(column,round(missingValueRate, 2)))
- netflix[column].isna().sum(): 해당 컬럼에서 결측 값의 개수를 세서 전부 더해준다.
- / len(netflix) * 100: 행 개수로 나눠주고 값이 만약에 0.2가 나오면 20퍼센트로 보일 수 있게 100을 곱해준다.
결측치 처리
💡 결측치가 왜 발생했는지 그 과정을 아는 것도 중요하다. 이 결측치를 무조건 특정 값으로 대체하면 안 된다. 의미 있는 값으로 처리해 줘야 의미 있는 결과가 나올 수 있다.
그래서 이런 domain knowledge가 중요하다. 데이터 도메인을 잘 알거나, 아니면 수집하는 절차를 알게 된다면, 이게 의도적으로 결측치를 비워둔 건지, 아니면 어떻게 내가 처리해줘야 하는지 알 수 있기 때문에 결측치 처리가 중요하다.
결측치를 처리하는데 두 가지 방법이 있다.
결측치를 제거하거나 결측치를 대체해 주는 방법이다.
우리가 위에서 비율을 구해봤던 이유는 비율이 만약에 굉장히 낮으면 의미가 없으니까 행 자체를 제거하는 방법을 사용할 수도 있고, 결측치가 적당히 50% 이하면 그걸 대체해 주려는 노력을 해야 하는데 그 노력은 이제 도메인마다 달라질 수 있다. 또 데이터 사이언티스트에 따라 달라질 수 있다. 결측치 비율이 80% 이상이 되면 그걸 행을 날려야 할지, 열을 날려야 할지 이런 걸 여러 명과 상의해서 결정하곤 한다.
- .fillna( ) : 결측 값을 특정 값으로 채우거나 대체하여 처리, 원본 객체를 변경하려면 inplace=True 옵션 추가
- .replace(np.nan, '문자') : 결측치를 문자열 바꾸기 함수를 통해 처리. np.nan은 결측치를 의미하며, '문자'로 변경시켜준다.
- .dropna(axis = 0) : 결측치가 있는 행 전체 제거
결측치 처리 (1) - fillna
9퍼센트 정도는 문자로 바꿔줘도 될 수준이다.
# 원본 객체를 변경하려면 inplace = True 옵션 추가
# 결측치 비율 : country(9.44%)
netflix['country'].fillna('No Data', inplace = True)
결측치 처리 (2) - replace
# .replace(np.nan, 'b') : 결측치를 문자열 바꾸기 함수를 통해 처리
# 결측치 비율 : director(29.91%), cast(9.37%)
netflix['cast'].replace(np.nan, 'No Data',inplace = True)
netflix['director'].replace(np.nan, 'No Data',inplace = True)
결측치 처리 (3) - dropna
# .dropna(axis = 0) : 결측치가 있는 행 전체 제거
# 결측치 비율 : date_added(0.11%), rating(0.05%), duration(0.03%)
netflix.dropna(axis = 0, inplace=True)
결측치 처리 확인
- .info( ) : 데이터에 대한 전반적인 정보 제공
- 컬럼명
- 컬럼별 결측치
- 컬럼별 데이터 타입
- 행과 열의 크기
- .isnull().sum() == .isna().sum() : 각 컬럼별 결측치 개수 반환
- .isnull 함수는 결측 값은 True 반환한다., 그 외에는 False 반환하며, 데이터프레임 내에 결측 값을 확인하기 위해 사용된다.
처리된 결측치 확인 (1) - info
netflix.info()
위에서 확인한 info 출력물과 비교했을 때 Index가 8807에서 8790으로 17개 행이 제거된 걸 확인할 수 있다.
처리된 결측치 확인 (2) - .isnull().sum()
# 각 컬럼별 결측치 개수 반환
# .isnull() == .isna() : 결측 값은 True 반환, 그 외에는 False 반환하며
# 데이터프레임 내에 결측 값을 확인하기 위해 사용
netflix.isnull().sum()
데이터 확인
netflix.head(2)
위에서 replace로 바꿔준 No Data도 확인할 수 있다.
'EDA' 카테고리의 다른 글
사분위 범위 및 Boxplot으로 데이터 분포 분석 (2) (0) | 2024.08.26 |
---|---|
Pandas를 이용한 기초 통계 계산 (1) (0) | 2024.08.26 |
[넷플릭스 데이터 분석 - 3] 넷플릭스 데이터 시각화(수치 시각화, 워드 클라우드) (5) | 2024.08.05 |
[넷플릭스 데이터 분석 - 2] Feature Engineering (0) | 2024.08.05 |