🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

넷플릭스 콘텐츠 트렌드 인사이트 파이썬 프로젝트 - 슬라이드 1/8
A

AI Generated

2025. 12. 17. · 6 Views

넷플릭스 콘텐츠 트렌드 인사이트 파이썬 프로젝트

넷플릭스 데이터셋을 활용하여 장르별, 연도별, 국가별 콘텐츠 트렌드를 분석하는 실전 데이터 분석 프로젝트입니다. 파이썬의 pandas와 matplotlib를 활용하여 실무 수준의 데이터 인사이트를 도출합니다.


목차

  1. 넷플릭스_데이터셋_소개
  2. 데이터_로드_및_탐색
  3. 장르별_콘텐츠_분포_분석
  4. 연도별_콘텐츠_추가_트렌드
  5. 국가별_제작_현황_분석
  6. 영화_vs_TV쇼_비교
  7. 인사이트_정리_및_시각화

1. 넷플릭스 데이터셋 소개

데이터 분석가 지망생 김개발 씨가 포트폴리오를 준비하고 있습니다. "실제 데이터로 분석 프로젝트를 만들고 싶은데, 어떤 데이터가 좋을까요?" 선배 박시니어 씨가 추천합니다.

"넷플릭스 데이터셋으로 시작해보세요. 실무에서 다루는 데이터 형태와 비슷해서 좋은 연습이 될 거예요."

넷플릭스 데이터셋은 실제 넷플릭스 플랫폼에서 제공되는 콘텐츠 정보를 담은 CSV 파일입니다. 영화와 TV쇼의 제목, 감독, 출연진, 국가, 출시일, 장르 등 다양한 정보가 포함되어 있습니다.

이 데이터셋은 Kaggle에서 무료로 제공되며, 데이터 분석 입문자들이 실무 감각을 익히기에 적합합니다. 우리는 이 데이터를 통해 글로벌 콘텐츠 산업의 트렌드를 파악할 수 있습니다.

다음 코드를 살펴봅시다.

# 필요한 라이브러리 임포트
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 한글 폰트 설정 (맥OS의 경우)
plt.rc('font', family='AppleGothic')
# 마이너스 기호 깨짐 방지
plt.rcParams['axes.unicode_minus'] = False

# 데이터셋 정보 확인용 설정
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 1000)

print("넷플릭스 데이터 분석 프로젝트 시작!")

김개발 씨는 대학에서 파이썬 기초를 배웠지만, 실제 데이터로 프로젝트를 해본 적은 없습니다. 토이 프로젝트 수준을 넘어 포트폴리오에 넣을 만한 결과물을 만들고 싶었습니다.

고민하던 김개발 씨에게 선배 박시니어 씨가 조언합니다. "실무에서는 항상 실제 데이터를 다루게 돼요.

넷플릭스 데이터셋으로 시작해보는 건 어때요? 구조도 깔끔하고, 분석할 거리도 많거든요." 데이터셋이란 무엇일까요? 쉽게 비유하자면, 데이터셋은 마치 거대한 엑셀 파일과 같습니다.

행에는 각각의 콘텐츠가, 열에는 제목, 감독, 장르 같은 속성이 정리되어 있습니다. 우리가 식당에서 메뉴판을 보듯이, 데이터 분석가는 이 데이터셋을 보고 인사이트를 찾아냅니다.

왜 넷플릭스 데이터인가? 넷플릭스는 전 세계 2억 명 이상이 사용하는 스트리밍 서비스입니다. 이 플랫폼에 어떤 콘텐츠가 많은지, 어느 국가의 콘텐츠가 인기인지 분석하면 글로벌 엔터테인먼트 산업의 흐름을 파악할 수 있습니다.

과거에는 이런 데이터에 접근하기 어려웠습니다. 하지만 요즘은 Kaggle이나 Data.world 같은 플랫폼에서 무료로 제공됩니다.

특히 넷플릭스 데이터셋은 구조가 명확하고, 결측치도 적당히 있어서 실무 연습에 안성맞춤입니다. 데이터셋의 구조 넷플릭스 데이터셋은 보통 CSV(Comma-Separated Values) 형식으로 제공됩니다.

주요 컬럼은 다음과 같습니다. show_id 컬럼은 각 콘텐츠의 고유 식별자입니다.

type 컬럼은 영화인지 TV쇼인지 구분하고, title은 콘텐츠 제목을 담고 있습니다. directorcast는 감독과 출연진 정보를, country는 제작 국가를, date_added는 넷플릭스 추가 날짜를 나타냅니다.

그리고 release_year는 실제 제작 연도를, rating은 연령 등급을, duration은 러닝타임을, listed_in은 장르 정보를 담고 있습니다. 프로젝트의 목표 우리는 이 데이터를 활용하여 여러 질문에 답할 것입니다.

"어떤 장르가 가장 많을까?", "최근에는 어떤 콘텐츠가 많이 추가되고 있을까?", "한국 콘텐츠는 얼마나 될까?", "영화와 TV쇼의 비율은?" 같은 질문들입니다. 필요한 도구들 위의 코드에서 보듯이, 우리는 세 가지 핵심 라이브러리를 사용합니다.

pandas는 데이터를 불러오고 가공하는 도구입니다. 마치 엑셀의 파이썬 버전이라고 생각하면 됩니다.

matplotlib는 그래프를 그리는 기본 도구이고, seaborn은 matplotlib를 더 예쁘게 만들어주는 고급 시각화 도구입니다. 한글 폰트 설정은 꼭 필요합니다.

설정하지 않으면 그래프에 한글이 깨져서 나옵니다. 윈도우 사용자라면 malgun gothic이나 gulim을 사용하면 됩니다.

실무 관점 실제 데이터 분석가들은 이런 오픈 데이터셋으로 포트폴리오를 만듭니다. 채용 담당자들은 "이론을 아는 것"보다 "데이터를 다룰 수 있는 것"을 더 중요하게 봅니다.

김개발 씨는 박시니어 씨의 조언을 듣고 Kaggle에서 데이터셋을 다운로드했습니다. "생각보다 파일 크기가 크지 않네요.

한번 열어볼까요?" 이제 본격적으로 데이터 분석을 시작할 시간입니다.

실전 팁

💡 - Kaggle에서 netflix-shows 키워드로 검색하면 다양한 버전의 데이터셋을 찾을 수 있습니다

  • CSV 파일을 먼저 엑셀로 열어보면 데이터 구조를 빠르게 파악할 수 있습니다
  • 한글 폰트 설정은 운영체제마다 다르니 본인의 환경에 맞게 조정하세요

2. 데이터 로드 및 탐색

김개발 씨가 파일을 다운로드하고 코드를 작성하기 시작했습니다. "일단 데이터를 불러와야겠죠?" 하지만 막상 코드를 실행하니 에러가 발생했습니다.

당황한 김개발 씨에게 박시니어 씨가 말합니다. "데이터를 불러온 후에는 항상 탐색부터 해야 해요.

그게 분석의 첫걸음이죠."

데이터 로드는 외부 파일을 파이썬 메모리에 불러오는 과정입니다. pandas의 read_csv() 함수를 사용하면 간단하게 CSV 파일을 DataFrame 객체로 변환할 수 있습니다.

데이터를 불러온 후에는 head(), info(), describe() 같은 메서드로 데이터의 구조와 특성을 파악해야 합니다. 이 탐색 과정이 없으면 나중에 엉뚱한 분석을 하게 될 수 있습니다.

다음 코드를 살펴봅시다.

# 데이터 파일 경로 설정 (실제 경로로 수정 필요)
file_path = 'netflix_titles.csv'

# CSV 파일 로드
df = pd.read_csv(file_path)

# 데이터 기본 정보 확인
print(f"전체 데이터 개수: {len(df)}개")
print(f"컬럼 개수: {len(df.columns)}개\n")

# 상위 5개 데이터 미리보기
print("=== 데이터 샘플 ===")
print(df.head())

# 각 컬럼의 데이터 타입과 결측치 확인
print("\n=== 데이터 정보 ===")
print(df.info())

김개발 씨는 처음으로 실제 데이터 파일을 다뤄봅니다. "CSV 파일이라는 건 알겠는데, 이걸 어떻게 파이썬으로 읽어오지?" 고민이 많았습니다.

박시니어 씨가 화면을 보며 설명합니다. "pandas 라이브러리의 read_csv() 함수를 쓰면 돼요.

엑셀 파일을 여는 것처럼 간단하죠." DataFrame이란? read_csv()로 데이터를 불러오면 DataFrame이라는 객체가 만들어집니다. 이것은 마치 엑셀 시트와 같습니다.

행과 열로 구성되어 있고, 각 열에는 이름(컬럼명)이 있으며, 각 행에는 인덱스 번호가 있습니다. DataFrame은 pandas의 핵심 자료구조입니다.

리스트나 딕셔너리처럼 기본 자료형이 아니라, 데이터 분석에 특화된 고급 자료구조입니다. 덕분에 우리는 복잡한 데이터 처리를 단 몇 줄의 코드로 해낼 수 있습니다.

데이터 로드하기 위 코드의 첫 번째 줄을 보면 파일 경로를 변수에 저장합니다. 이렇게 하면 나중에 경로를 바꿀 때 한 곳만 수정하면 됩니다.

실무에서는 이런 작은 습관이 중요합니다. pd.read_csv(file_path)가 실행되면 pandas가 CSV 파일을 읽어서 DataFrame으로 변환합니다.

이 과정은 보통 1초도 걸리지 않습니다. 하지만 파일이 수십 GB라면 시간이 오래 걸릴 수도 있습니다.

탐색의 중요성 데이터를 불러왔다고 끝이 아닙니다. 오히려 여기서부터 진짜 시작입니다.

head() 메서드는 상위 5개 행을 보여줍니다. 마치 책의 목차를 훑어보는 것처럼, 데이터가 어떻게 생겼는지 빠르게 파악할 수 있습니다.

제목, 감독, 출연진 같은 실제 값들을 눈으로 확인하면 "아, 이런 형태구나" 하고 감이 옵니다. info() 메서드는 더 깊은 정보를 제공합니다.

각 컬럼의 데이터 타입이 무엇인지, 얼마나 많은 값이 비어있는지(결측치) 알려줍니다. 예를 들어 director 컬럼에 2,000개의 값이 있는데 전체 데이터는 8,000개라면?

6,000개는 감독 정보가 없다는 뜻입니다. 실무에서의 함정 초보자들이 자주 하는 실수가 있습니다.

데이터를 불러오자마자 바로 분석에 들어가는 것입니다. 김개발 씨도 처음에는 그랬습니다.

"바로 장르별 통계를 내볼까요?" 하고 코드를 작성했다가 에러가 났습니다. 알고 보니 listed_in 컬럼(장르 정보)에 일부 결측치가 있었고, 데이터 형태도 예상과 달랐습니다.

박시니어 씨가 말합니다. "실무에서는 전체 분석 시간의 70%를 데이터 탐색과 전처리에 씁니다.

급할수록 천천히 데이터를 살펴봐야 해요." 컬럼별 특성 파악 info()를 실행하면 object, int64, float64 같은 데이터 타입이 나옵니다. object는 보통 문자열입니다.

제목, 감독, 장르 같은 텍스트 데이터가 이에 해당합니다. int64는 정수형으로, 출시 연도 같은 숫자 데이터입니다.

float64는 실수형인데, 넷플릭스 데이터셋에서는 잘 쓰이지 않습니다. 결측치 확인 결측치(Missing Value)는 데이터 분석의 골칫거리입니다.

어떤 영화는 감독 정보가 없고, 어떤 TV쇼는 출연진 정보가 비어있을 수 있습니다. info()를 보면 "non-null count"라고 나옵니다.

이것이 실제로 값이 있는 개수입니다. 전체 개수와 차이가 나면 그만큼 결측치가 있다는 뜻입니다.

첫 탐색의 결과 김개발 씨는 head()info()를 실행하고 나서 많은 것을 알게 되었습니다. "아, 이 데이터셋은 약 8,000개의 콘텐츠 정보가 있고, 12개의 컬럼이 있네요.

감독과 출연진 정보에 결측치가 좀 있고요." 이제 본격적인 분석을 할 준비가 되었습니다. 데이터가 어떻게 생겼는지 알아야 어떤 질문을 던질 수 있는지 알 수 있으니까요.

실전 팁

💡 - head() 대신 tail()을 쓰면 마지막 5개 행을 볼 수 있습니다

  • head(10)처럼 숫자를 넣으면 원하는 개수만큼 확인 가능합니다
  • describe() 메서드는 숫자형 컬럼의 통계 정보를 한눈에 보여줍니다

3. 장르별 콘텐츠 분포 분석

"이제 재밌는 걸 해볼까요?" 김개발 씨가 신이 났습니다. "넷플릭스에서 어떤 장르가 제일 많을까요?" 박시니어 씨가 웃으며 답합니다.

"좋은 질문이에요. 하지만 장르 데이터가 생각보다 복잡할 거예요.

하나의 콘텐츠가 여러 장르를 가질 수 있거든요."

장르별 분포 분석은 데이터에서 카테고리별 빈도를 계산하는 과정입니다. 넷플릭스 데이터에서 장르 정보는 listed_in 컬럼에 쉼표로 구분된 문자열 형태로 저장되어 있습니다.

이를 제대로 분석하려면 문자열을 분리하고, 각 장르를 개별적으로 카운트해야 합니다. 이 분석을 통해 넷플릭스가 어떤 콘텐츠에 집중하는지 파악할 수 있습니다.

다음 코드를 살펴봅시다.

# 장르 데이터 전처리 - 결측치 제거
df_genre = df[df['listed_in'].notna()].copy()

# 장르 문자열을 분리하여 리스트로 만들기
genres_list = df_genre['listed_in'].str.split(', ').explode()

# 각 장르별 빈도수 계산
genre_counts = genres_list.value_counts()

# 상위 10개 장르 시각화
plt.figure(figsize=(12, 6))
genre_counts.head(10).plot(kind='barh')
plt.title('넷플릭스 상위 10개 장르 분포', fontsize=16)
plt.xlabel('콘텐츠 개수')
plt.ylabel('장르')
plt.tight_layout()
plt.show()

print(f"총 {len(genre_counts)}개의 고유 장르가 있습니다")

김개발 씨가 먼저 장르 컬럼을 살펴봤습니다. "음, listed_in 컬럼을 보니까 'International Movies, Dramas, Comedies' 이런 식으로 되어 있네요.

이거 어떻게 분석하죠?" 박시니어 씨가 화면을 가리키며 설명합니다. "바로 그게 핵심이에요.

하나의 셀에 여러 개의 장르가 들어있으니까, 먼저 이것을 분리해야 합니다." 문자열 분리의 필요성 실무 데이터에서는 이런 경우가 정말 많습니다. 한 컬럼에 여러 정보가 쉼표나 세미콜론으로 묶여 있는 경우 말이죠.

예를 들어 "Action, Thriller, Sci-Fi"라는 값이 있다면, 이것은 사실 세 개의 장르입니다. 단순히 value_counts()를 하면 "Action, Thriller, Sci-Fi"를 하나의 고유한 값으로 인식합니다.

우리가 원하는 것은 Action, Thriller, Sci-Fi를 각각 세는 것입니다. 전처리 첫 단계: 결측치 제거 코드의 첫 줄을 보면 notna()로 결측치를 제거합니다.

장르 정보가 없는 행을 분석에 포함시키면 에러가 납니다. copy()를 사용한 이유는 원본 DataFrame을 보호하기 위해서입니다.

실무에서는 항상 원본 데이터를 건드리지 않고 복사본으로 작업합니다. 나중에 뭔가 잘못되었을 때 처음부터 다시 시작할 수 있어야 하니까요.

문자열 분리: str.split() str.split(', ')는 문자열을 쉼표와 공백을 기준으로 나눕니다. 예를 들어 "Action, Thriller"는 ['Action', 'Thriller']라는 리스트가 됩니다.

여기서 중요한 점은 ', '처럼 쉼표 뒤에 공백을 포함해야 한다는 것입니다. 만약 ','만 쓰면 'Action'과 ' Thriller'로 나뉘어서 앞에 공백이 포함됩니다.

리스트 풀어내기: explode() explode()는 pandas의 강력한 메서드입니다. 각 행의 리스트를 개별 행으로 펼쳐줍니다.

예를 들어 이런 데이터가 있다면: - 행1: ['Action', 'Thriller'] - 행2: ['Comedy'] explode() 후에는 이렇게 됩니다: - 행1: 'Action' - 행2: 'Thriller' - 행3: 'Comedy' 이렇게 펼쳐놓으면 각 장르를 개별적으로 셀 수 있습니다. 빈도수 계산: value_counts() value_counts()는 pandas에서 가장 자주 쓰는 메서드 중 하나입니다.

각 고유한 값이 몇 번 나타나는지 자동으로 세어줍니다. 심지어 내림차순으로 정렬까지 해줍니다.

결과는 Series 객체로 반환되는데, 인덱스가 장르 이름이고 값이 빈도수입니다. 예를 들어 'International Movies'가 2,000번 나타났다면 그 값이 2,000으로 표시됩니다.

시각화의 힘 숫자만 보면 지루합니다. 그래프로 그려야 한눈에 들어옵니다.

plot(kind='barh')는 가로 막대 그래프를 그립니다. 세로 막대보다 장르 이름을 읽기 편합니다.

head(10)으로 상위 10개만 선택한 이유는 너무 많은 장르를 한 번에 그리면 그래프가 복잡해지기 때문입니다. 분석 결과의 해석 김개발 씨가 그래프를 보며 감탄합니다.

"와, International Movies가 압도적으로 많네요! 그다음이 Dramas, Comedies 순이고요." 박시니어 씨가 고개를 끄덕입니다.

"맞아요. 넷플릭스가 글로벌 플랫폼이다 보니 국제 영화에 집중하는 게 보이죠?

그리고 드라마와 코미디는 항상 인기 장르니까 많을 수밖에 없어요." 실무 활용 실제 기업에서는 이런 분석을 토대로 의사결정을 합니다. "우리 플랫폼에 어떤 콘텐츠를 더 확보할까?", "어떤 장르에 투자를 늘릴까?" 같은 전략을 세우는 거죠.

김개발 씨는 스스로 해보니 뿌듯했습니다. "복잡해 보였는데 막상 해보니 이해가 되네요.

문자열 분리하고, 펼치고, 세고, 그래프 그리면 끝이네요." 흔한 실수 초보자들이 자주 하는 실수는 split() 후에 explode()를 빼먹는 것입니다. 그러면 리스트 자체가 하나의 값으로 카운트됩니다.

또한 쉼표 뒤의 공백을 고려하지 않아서 'Comedy'와 ' Comedy'가 다른 값으로 인식되기도 합니다.

실전 팁

💡 - explode()는 pandas 0.25 버전부터 지원되니 버전을 확인하세요

  • plot() 대신 seaborn의 barplot을 쓰면 더 예쁜 그래프를 그릴 수 있습니다
  • value_counts(normalize=True)를 쓰면 비율로 계산됩니다

4. 연도별 콘텐츠 추가 트렌드

장르 분석을 마친 김개발 씨가 다음 질문을 던집니다. "넷플릭스가 최근 몇 년간 콘텐츠를 얼마나 추가했을까요?

코로나 시기에 급증하지 않았을까요?" 박시니어 씨가 답합니다. "좋은 관점이에요.

시간에 따른 트렌드를 보려면 날짜 데이터를 다룰 줄 알아야 합니다."

연도별 트렌드 분석은 시계열 데이터의 패턴을 파악하는 과정입니다. 넷플릭스 데이터에서 date_added 컬럼은 콘텐츠가 플랫폼에 추가된 날짜를 나타냅니다.

이 문자열 데이터를 datetime 객체로 변환하고, 연도를 추출하여 연도별 콘텐츠 추가 개수를 계산합니다. 이를 통해 넷플릭스의 콘텐츠 확장 전략과 시장 변화를 읽을 수 있습니다.

다음 코드를 살펴봅시다.

# 날짜 데이터 전처리
df_date = df[df['date_added'].notna()].copy()

# 문자열을 datetime 객체로 변환
df_date['date_added'] = pd.to_datetime(df_date['date_added'])

# 연도 추출
df_date['year_added'] = df_date['date_added'].dt.year

# 연도별 콘텐츠 추가 개수 계산
yearly_counts = df_date['year_added'].value_counts().sort_index()

# 시각화
plt.figure(figsize=(14, 6))
plt.plot(yearly_counts.index, yearly_counts.values, marker='o', linewidth=2)
plt.title('넷플릭스 연도별 콘텐츠 추가 추이', fontsize=16)
plt.xlabel('연도')
plt.ylabel('추가된 콘텐츠 개수')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

김개발 씨는 date_added 컬럼을 살펴봤습니다. "December 31, 2020 이런 형식이네요.

이걸 어떻게 연도만 뽑아내죠?" 박시니어 씨가 설명합니다. "날짜 데이터는 특별한 처리가 필요해요.

문자열 상태로는 계산을 할 수 없으니까, datetime 객체로 변환해야 합니다." 날짜 데이터의 어려움 실무에서 날짜 데이터는 정말 골치 아픕니다. 형식이 천차만별이거든요.

"2020-12-31", "12/31/2020", "December 31, 2020", "31-Dec-20" 등 같은 날짜를 표현하는 방법이 수십 가지입니다. 게다가 시간대(timezone)까지 고려하면 더 복잡해집니다.

다행히 pandas는 to_datetime()이라는 강력한 함수를 제공합니다. 이 함수는 대부분의 날짜 형식을 자동으로 인식하고 변환해줍니다.

datetime 변환 pd.to_datetime()을 실행하면 문자열이 datetime64 타입으로 바뀝니다. 이렇게 변환하면 두 가지 장점이 있습니다.

첫째, 날짜 연산이 가능해집니다. 두 날짜의 차이를 계산하거나, 특정 기간을 필터링할 수 있습니다.

둘째, .dt 접근자를 사용할 수 있습니다. 연도, 월, 일, 요일 등을 쉽게 추출할 수 있죠.

연도 추출: dt.year .dt.year는 마법 같은 메서드입니다. datetime 객체에서 연도만 쏙 빼냅니다.

예를 들어 "2020-12-31"이라는 날짜가 있으면, .dt.year를 적용하면 2020이라는 정수가 나옵니다. 마찬가지로 .dt.month는 12를, .dt.day는 31을 반환합니다.

새로운 컬럼 year_added를 만들어서 저장하면, 나중에 연도별 분석을 할 때 편리합니다. 빈도수 계산과 정렬 value_counts()로 연도별 개수를 세는데, 여기서 중요한 점은 sort_index()입니다.

value_counts()는 기본적으로 빈도순으로 정렬됩니다. 가장 많이 나타난 연도가 맨 위에 옵니다.

하지만 시계열 분석에서는 시간 순서가 중요합니다. 2015년, 2016년, 2017년...

이런 식으로 정렬되어야 트렌드를 볼 수 있죠. sort_index()는 인덱스(여기서는 연도)를 기준으로 오름차순 정렬합니다.

그래야 선 그래프를 그렸을 때 왼쪽에서 오른쪽으로 시간이 흐르는 자연스러운 흐름이 만들어집니다. 선 그래프의 선택 막대 그래프 대신 선 그래프를 선택한 이유가 있습니다.

시계열 데이터는 연속적인 변화를 보여주는 것이 중요하기 때문입니다. marker='o'를 추가하면 각 데이터 포인트에 동그라미가 표시됩니다.

이렇게 하면 정확한 값의 위치를 확인할 수 있습니다. grid=True는 격자를 추가해서 값을 읽기 쉽게 만듭니다.

분석 결과의 인사이트 김개발 씨가 그래프를 보며 흥미로운 패턴을 발견합니다. "2019년과 2020년에 급증했네요!

코로나 시기랑 딱 맞아떨어져요." 박시니어 씨가 설명을 덧붙입니다. "맞아요.

팬데믹으로 사람들이 집에 있는 시간이 늘면서 넷플릭스가 콘텐츠 확보에 공격적으로 투자했죠. 2021년 이후로는 조금 완만해진 것도 보이네요." 실무에서의 적용 이런 트렌드 분석은 투자자들에게도 중요합니다.

회사가 얼마나 빠르게 성장하는지, 시장 변화에 어떻게 대응하는지 한눈에 볼 수 있으니까요. 또한 경쟁사 분석에도 유용합니다.

"넷플릭스는 2019년부터 콘텐츠를 급격히 늘렸는데, 우리는?" 같은 비교를 할 수 있습니다. 주의할 점 김개발 씨가 한 가지 의문을 품습니다.

"그런데 2021년 데이터가 적은 건, 그 해에 정말 적게 추가한 건가요? 아니면 데이터셋이 2021년 초에 수집되어서 그런 건가요?" 날카로운 질문입니다.

데이터 분석에서는 항상 데이터의 수집 시점을 고려해야 합니다. 만약 데이터가 2021년 3월에 수집되었다면, 2021년 데이터는 3개월치밖에 없는 것이죠.

더 깊이 파고들기 박시니어 씨가 제안합니다. "월별로도 한번 분석해보세요.

.dt.month를 쓰면 되는데, 연도와 월을 함께 보면 계절성도 파악할 수 있어요." 김개발 씨는 이제 날짜 데이터를 다루는 것이 두렵지 않습니다. to_datetime으로 변환하고, dt 접근자로 원하는 단위를 추출하면 끝이니까요.

실전 팁

💡 - to_datetime이 실패하면 errors='coerce'를 추가하여 에러를 NaT(Not a Time)로 변환하세요

  • dt.month_name()을 쓰면 숫자 대신 'January', 'February' 같은 월 이름을 얻을 수 있습니다
  • 최근 5년 데이터만 보려면 df[df['year_added'] >= 2019] 같은 필터를 사용하세요

5. 국가별 제작 현황 분석

"한국 드라마가 요즘 전 세계적으로 인기잖아요. 넷플릭스에 한국 콘텐츠가 얼마나 있을까요?" 김개발 씨의 질문에 박시니어 씨가 답합니다.

"좋은 질문이에요. 하지만 국가 데이터도 장르처럼 복잡할 거예요.

한 콘텐츠가 여러 국가에서 공동 제작되기도 하니까요."

국가별 분석country 컬럼의 데이터를 분리하고 집계하는 과정입니다. 넷플릭스 콘텐츠는 국제 공동 제작이 많아서 "United States, India" 같이 여러 국가가 쉼표로 나열되어 있습니다.

장르 분석과 유사한 방법으로 문자열을 분리하고, 각 국가별 콘텐츠 개수를 세어 글로벌 콘텐츠 제작 현황을 파악합니다. 이를 통해 넷플릭스의 지역별 전략을 이해할 수 있습니다.

다음 코드를 살펴봅시다.

# 국가 데이터 전처리
df_country = df[df['country'].notna()].copy()

# 국가명 분리 및 개별화
countries_list = df_country['country'].str.split(', ').explode()

# 공백 제거 (일부 데이터에 불필요한 공백이 있을 수 있음)
countries_list = countries_list.str.strip()

# 국가별 빈도수 계산
country_counts = countries_list.value_counts()

# 상위 15개 국가 시각화
plt.figure(figsize=(12, 8))
country_counts.head(15).plot(kind='barh', color='steelblue')
plt.title('넷플릭스 콘텐츠 제작 상위 15개 국가', fontsize=16)
plt.xlabel('콘텐츠 개수')
plt.ylabel('국가')
plt.tight_layout()
plt.show()

print(f"한국 콘텐츠: {country_counts.get('South Korea', 0)}개")

김개발 씨는 country 컬럼을 살펴보다가 흥미로운 점을 발견했습니다. "어떤 콘텐츠는 'United States'만 있고, 어떤 건 'United States, United Kingdom, Canada' 이렇게 여러 국가가 나열되어 있네요." 박시니어 씨가 설명합니다.

"요즘 영화나 드라마는 국제 공동 제작이 많아요. 투자도 여러 나라에서 받고, 촬영 장소도 여러 곳이니까요.

그래서 데이터도 복잡해진 거죠." 공동 제작의 시대 엔터테인먼트 산업이 글로벌화되면서 한 나라에서만 만드는 콘텐츠가 줄어들었습니다. 예를 들어 어떤 영화는 미국 자본으로 시작했지만, 영국에서 촬영하고, 한국 배우가 출연하고, 캐나다에서 후반 작업을 합니다.

이런 경우 제작 국가를 어떻게 표시할까요? 정답은 모두 나열하는 것입니다.

넷플릭스 데이터도 마찬가지입니다. 쉼표로 구분하여 여러 국가를 나열합니다.

이것은 좋은 데이터 표현 방식이지만, 분석할 때는 추가 작업이 필요합니다. 장르 분석과의 유사성 국가 분석 코드를 보면 장르 분석과 거의 똑같습니다.

split(', ')로 분리하고, explode()로 펼치고, value_counts()로 세는 패턴입니다. 이런 패턴은 데이터 분석에서 정말 자주 쓰입니다.

한 번 익혀두면 태그 분석, 키워드 분석, 카테고리 분석 등 다양한 곳에 적용할 수 있습니다. 추가 전처리: strip() 한 가지 다른 점은 str.strip()을 사용한다는 것입니다.

실무 데이터는 깔끔하지 않습니다. 어떤 데이터는 "United States"이고, 어떤 건 " United States "(앞뒤에 공백)일 수 있습니다.

사람 눈에는 같아 보이지만, 컴퓨터는 다른 값으로 인식합니다. strip()은 문자열 앞뒤의 공백을 제거합니다.

덕분에 "United States"와 " United States "를 같은 값으로 처리할 수 있습니다. 이런 작은 전처리가 분석 결과의 정확도를 크게 높입니다.

상위 15개 국가 왜 15개일까요? 10개는 너무 적고, 20개는 너무 많아서 그래프가 복잡해지기 때문입니다.

실무에서는 이렇게 적당한 개수를 선택합니다. color='steelblue'로 색상을 지정하면 그래프가 더 전문적으로 보입니다.

기본 파란색보다 세련된 느낌을 줍니다. 분석 결과 해석 김개발 씨가 그래프를 보며 감탄합니다.

"미국이 압도적으로 많네요! 그 다음이 인도, 영국 순이고요.

한국은 몇 위일까요?" 코드 마지막 줄에서 country_counts.get('South Korea', 0)로 한국 콘텐츠 개수를 출력합니다. get() 메서드는 딕셔너리처럼 동작하는데, 키가 없으면 기본값(여기서는 0)을 반환합니다.

박시니어 씨가 설명합니다. "한국 콘텐츠는 약 200개 정도 있을 거예요.

전체 대비 비율로 보면 2-3% 정도지만, 최근 몇 년간 급증했을 가능성이 높죠." 미국의 압도적 비중 미국이 1위인 이유는 명확합니다. 할리우드가 세계 최대 영화 산업이고, 넷플릭스 자체가 미국 회사이니까요.

하지만 최근 몇 년간 다른 국가들의 비중이 늘어나고 있습니다. 넷플릭스가 글로벌 시장을 공략하면서 현지 콘텐츠에 투자를 늘렸기 때문입니다.

한국의 '오징어 게임', 스페인의 '종이의 집' 같은 현지 콘텐츠가 세계적인 히트를 치면서 전략이 증명되었죠. 추가 분석 아이디어 김개발 씨가 질문합니다.

"시간에 따라 국가별 비중 변화를 보면 재밌을 것 같아요. 최근 들어 한국 콘텐츠가 늘어났는지 확인할 수 있잖아요." 훌륭한 아이디어입니다.

year_addedcountry를 함께 분석하면 연도별 국가별 트렌드를 파악할 수 있습니다. 이런 식으로 여러 차원을 결합하는 것이 데이터 분석의 진수입니다.

실무 적용 글로벌 기업에서는 이런 국가별 분석을 마케팅 전략에 활용합니다. "어느 지역에 더 투자할까?", "어느 나라 콘텐츠가 글로벌 시장에서 잘 먹힐까?" 같은 의사결정을 데이터로 뒷받침하는 거죠.

김개발 씨는 점점 자신감이 붙습니다. "패턴이 보이기 시작해요.

문자열 데이터를 분리하고, 펼치고, 세는 것. 이게 핵심이네요."

실전 팁

💡 - get() 메서드를 사용하면 KeyError를 피할 수 있습니다

  • 특정 국가만 필터링하려면 countries_list[countries_list == 'South Korea']를 사용하세요
  • 대륙별로 그룹화하려면 별도의 매핑 딕셔너리가 필요합니다

6. 영화 vs TV쇼 비교

"영화와 TV쇼 중 뭐가 더 많을까요?" 김개발 씨의 간단한 질문에 박시니어 씨가 답합니다. "이번 건 간단해요.

type 컬럼을 보면 바로 알 수 있죠. 하지만 단순히 개수만 비교하는 게 아니라, 다양한 각도로 분석해봅시다."

타입별 비교 분석은 카테고리형 변수의 분포를 파악하는 기본적인 분석입니다. 넷플릭스 데이터에서 type 컬럼은 'Movie' 또는 'TV Show' 두 가지 값만 가집니다.

이 간단한 이진 분류 데이터를 통해 넷플릭스의 콘텐츠 전략을 읽을 수 있습니다. 개수 비교뿐만 아니라 시간에 따른 변화, 국가별 선호도 차이도 함께 분석하면 더 깊은 인사이트를 얻을 수 있습니다.

다음 코드를 살펴봅시다.

# 타입별 개수 계산
type_counts = df['type'].value_counts()

# 원형 차트로 비율 시각화
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.pie(type_counts.values, labels=type_counts.index, autopct='%1.1f%%', startangle=90)
plt.title('영화 vs TV쇼 비율')

# 막대 그래프로 절대 개수 시각화
plt.subplot(1, 2, 2)
type_counts.plot(kind='bar', color=['coral', 'skyblue'])
plt.title('영화 vs TV쇼 개수')
plt.ylabel('콘텐츠 개수')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

print(f"영화: {type_counts['Movie']}개 ({type_counts['Movie']/len(df)*100:.1f}%)")
print(f"TV쇼: {type_counts['TV Show']}개 ({type_counts['TV Show']/len(df)*100:.1f}%)")

김개발 씨는 이번 분석이 쉬워 보여서 자신있게 시작했습니다. "type 컬럼만 보면 되니까 금방 끝나겠네요!" 박시니어 씨가 웃으며 답합니다.

"맞아요. 하지만 간단한 분석일수록 시각화를 잘 해야 해요.

데이터 하나를 여러 방식으로 보여주는 것도 중요한 스킬이죠." 이진 분류의 단순함 type 컬럼은 정말 단순합니다. 'Movie'와 'TV Show' 두 가지 값만 있습니다.

결측치도 거의 없습니다. 이런 이진 분류 데이터는 분석하기 쉬우면서도 중요한 정보를 담고 있습니다.

넷플릭스가 장편 영화에 집중하는지, 아니면 시리즈물에 집중하는지 바로 알 수 있으니까요. value_counts의 활용 또다시 value_counts()가 등장합니다.

이 메서드는 카테고리형 데이터 분석의 기본 중의 기본입니다. 결과는 Series 객체로, 인덱스가 'Movie'와 'TV Show'이고 값이 각각의 개수입니다.

이렇게 간단한 집계만으로도 많은 것을 알 수 있습니다. 파이 차트의 선택 비율을 보여줄 때는 파이 차트가 직관적입니다.

전체를 100%로 봤을 때 각 카테고리가 얼마나 차지하는지 한눈에 들어옵니다. autopct='%1.1f%%'는 각 조각에 퍼센트를 표시합니다.

%1.1f는 소수점 한 자리까지 표시하라는 뜻입니다. 마지막 %%는 % 기호를 출력하기 위한 이스케이프 문자입니다.

startangle=90을 설정하면 차트가 12시 방향부터 시작합니다. 이렇게 하면 더 보기 좋습니다.

막대 그래프의 보완 파이 차트는 비율은 잘 보여주지만, 절대적인 개수는 파악하기 어렵습니다. 그래서 막대 그래프를 함께 그립니다.

subplot(1, 2, 1)subplot(1, 2, 2)로 한 화면에 두 개의 그래프를 배치합니다. 왼쪽에 파이 차트, 오른쪽에 막대 그래프를 놓으면 비율과 절대 개수를 동시에 파악할 수 있습니다.

color=['coral', 'skyblue']로 막대마다 다른 색을 지정하면 구분이 명확해집니다. 분석 결과 해석 김개발 씨가 결과를 보며 놀랍니다.

"영화가 70% 정도네요! TV쇼보다 훨씬 많아요." 박시니어 씨가 설명합니다.

"넷플릭스는 초기에 영화 중심이었어요. 하지만 최근 몇 년간 오리지널 시리즈에 많이 투자하고 있죠.

시간에 따른 변화를 보면 더 재밌을 거예요." 추가 분석: 연도별 변화 단순히 전체 비율만 보면 영화가 많지만, 최근 트렌드는 다를 수 있습니다. year_addedtype을 함께 분석하면 연도별로 영화와 TV쇼의 비율이 어떻게 변했는지 볼 수 있습니다.

아마도 최근으로 올수록 TV쇼의 비중이 늘어났을 것입니다. 국가별 차이 또 다른 흥미로운 분석은 국가별로 영화와 TV쇼 비율을 비교하는 것입니다.

미국은 TV쇼 비중이 높을 수 있고, 인도는 영화 중심일 수 있습니다. 이런 차이는 각 나라의 미디어 소비 문화를 반영합니다.

실무 적용 콘텐츠 기획자들은 이런 데이터로 포트폴리오를 조정합니다. "경쟁사는 TV쇼를 늘리는데 우리는?", "우리 플랫폼의 강점이 영화인데, TV쇼에도 투자해야 할까?" 같은 질문에 답하는 거죠.

시각화의 중요성 김개발 씨가 깨달은 점이 있습니다. "숫자만 보면 '영화가 5,000개, TV쇼가 2,000개' 이런 식인데, 그래프로 보니 확 와닿네요." 맞습니다.

데이터 분석에서 시각화는 선택이 아니라 필수입니다. 같은 데이터를 여러 방식으로 표현하면 더 많은 사람이 이해할 수 있습니다.

간단함 속의 깊이 이번 분석은 코드도 간단하고 개념도 어렵지 않습니다. 하지만 여기서 얻은 인사이트는 결코 가볍지 않습니다.

넷플릭스의 콘텐츠 전략, 시장의 변화, 소비자 선호도까지 읽을 수 있으니까요. 간단한 분석이라고 무시하지 말고, 제대로 하는 것이 중요합니다.

실전 팁

💡 - 파이 차트는 카테고리가 5개 이하일 때 효과적입니다

  • explode 파라미터를 사용하면 특정 조각을 강조할 수 있습니다
  • 정확한 비율을 텍스트로도 출력하면 보고서 작성에 유용합니다

7. 인사이트 정리 및 시각화

모든 분석을 마친 김개발 씨가 뿌듯해합니다. "와, 생각보다 많은 걸 발견했네요!" 박시니어 씨가 마지막 조언을 합니다.

"좋아요. 이제 핵심 인사이트를 정리하고, 한 장의 대시보드로 만들어봅시다.

분석은 결과를 잘 전달하는 것까지가 일입니다."

인사이트 정리는 여러 분석 결과를 종합하여 핵심 발견사항을 도출하는 과정입니다. 지금까지 우리는 장르, 연도, 국가, 타입별로 넷플릭스 데이터를 분석했습니다.

이제 이 모든 결과를 하나의 대시보드로 통합하고, 비즈니스적 의미를 정리해야 합니다. 좋은 데이터 분석은 단순히 숫자를 계산하는 것이 아니라, 그 숫자가 말하는 스토리를 찾아내는 것입니다.

다음 코드를 살펴봅시다.

# 종합 대시보드 생성
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
fig.suptitle('넷플릭스 콘텐츠 트렌드 종합 대시보드', fontsize=20, fontweight='bold')

# 1. 장르 분포 (상위 8개)
genres_list = df[df['listed_in'].notna()]['listed_in'].str.split(', ').explode()
genre_counts = genres_list.value_counts().head(8)
axes[0, 0].barh(range(len(genre_counts)), genre_counts.values, color='teal')
axes[0, 0].set_yticks(range(len(genre_counts)))
axes[0, 0].set_yticklabels(genre_counts.index)
axes[0, 0].set_title('상위 8개 장르 분포')
axes[0, 0].set_xlabel('콘텐츠 개수')

# 2. 연도별 추이
df_date = df[df['date_added'].notna()].copy()
df_date['year_added'] = pd.to_datetime(df_date['date_added']).dt.year
yearly_counts = df_date['year_added'].value_counts().sort_index()
axes[0, 1].plot(yearly_counts.index, yearly_counts.values, marker='o', color='darkgreen', linewidth=2)
axes[0, 1].set_title('연도별 콘텐츠 추가 추이')
axes[0, 1].set_xlabel('연도')
axes[0, 1].set_ylabel('추가된 콘텐츠')
axes[0, 1].grid(True, alpha=0.3)

# 3. 상위 10개 국가
countries_list = df[df['country'].notna()]['country'].str.split(', ').explode().str.strip()
country_counts = countries_list.value_counts().head(10)
axes[1, 0].barh(range(len(country_counts)), country_counts.values, color='steelblue')
axes[1, 0].set_yticks(range(len(country_counts)))
axes[1, 0].set_yticklabels(country_counts.index)
axes[1, 0].set_title('상위 10개 제작 국가')
axes[1, 0].set_xlabel('콘텐츠 개수')

# 4. 영화 vs TV쇼
type_counts = df['type'].value_counts()
axes[1, 1].pie(type_counts.values, labels=type_counts.index, autopct='%1.1f%%', startangle=90, colors=['coral', 'skyblue'])
axes[1, 1].set_title('영화 vs TV쇼 비율')

plt.tight_layout()
plt.savefig('netflix_dashboard.png', dpi=300, bbox_inches='tight')
plt.show()

print("대시보드가 'netflix_dashboard.png'로 저장되었습니다.")

김개발 씨는 지금까지 만든 그래프들을 하나씩 보며 생각합니다. "이 그래프들을 따로따로 보여주면 좀 산만할 것 같은데, 한 장으로 만들 수 없을까?" 박시니어 씨가 답합니다.

"바로 그겁니다! 실무에서는 대시보드를 많이 만들어요.

한눈에 전체 상황을 파악할 수 있도록 말이죠." 대시보드의 중요성 데이터 분석 결과를 발표할 때, 그래프 10개를 따로따로 보여주면 청중이 지루해합니다. 핵심 인사이트가 무엇인지도 흐려집니다.

대시보드는 마치 자동차 계기판과 같습니다. 속도, 연료, 온도 등 중요한 정보가 한 화면에 모여 있어서 운전자가 빠르게 판단할 수 있죠.

데이터 대시보드도 마찬가지입니다. subplot의 마법 plt.subplots(2, 2)는 2행 2열의 그래프 공간을 만듭니다.

총 4개의 그래프를 배치할 수 있는 거죠. fig는 전체 캔버스이고, axes는 각각의 그래프 공간입니다.

axes[0, 0]은 왼쪽 위, axes[0, 1]은 오른쪽 위, axes[1, 0]은 왼쪽 아래, axes[1, 1]은 오른쪽 아래를 가리킵니다. 제목의 통일성 fig.suptitle()로 전체 대시보드 제목을 설정합니다.

fontsize=20, fontweight='bold'로 크고 굵게 만들어 눈에 띄게 합니다. 각 서브 그래프도 set_title()로 개별 제목을 붙입니다.

이렇게 계층적 제목 구조를 만들면 정보 전달이 명확해집니다. 네 가지 핵심 분석 왼쪽 위에는 장르 분포를 배치합니다.

넷플릭스가 어떤 콘텐츠에 집중하는지 보여줍니다. 상위 8개만 선택한 이유는 너무 많으면 그래프가 복잡해지기 때문입니다.

오른쪽 위에는 연도별 추이를 그립니다. 시간에 따른 성장세를 한눈에 파악할 수 있습니다.

특히 2019-2020년의 급증이 눈에 띕니다. 왼쪽 아래에는 국가별 분포를 넣습니다.

글로벌 콘텐츠 제작 현황을 보여줍니다. 미국이 압도적이지만, 인도, 영국, 캐나다도 상위권입니다.

오른쪽 아래에는 영화와 TV쇼 비율을 파이 차트로 표현합니다. 전체 포트폴리오 구성을 직관적으로 보여줍니다.

색상의 일관성 각 그래프마다 다른 색상을 사용했지만, 전체적으로 차분한 톤을 유지합니다. teal, darkgreen, steelblue, coral, skyblue 같은 색은 전문적이면서도 보기 좋습니다.

형광색이나 원색을 남발하면 눈이 피로하고 신뢰도가 떨어집니다. 데이터 시각화에서 색상 선택은 생각보다 중요합니다.

이미지로 저장 plt.savefig()로 대시보드를 이미지 파일로 저장합니다. dpi=300은 고해상도로 저장하라는 뜻입니다.

보고서나 발표 자료에 넣을 때 화질이 좋아야 하니까요. bbox_inches='tight'는 여백을 최소화합니다.

불필요한 흰 공간을 줄여서 그래프가 꽉 차게 보입니다. 핵심 인사이트 정리 김개발 씨가 대시보드를 보며 발견한 인사이트를 정리합니다.

첫째, 넷플릭스는 국제 영화와 드라마에 집중합니다. 글로벌 플랫폼답게 다양한 국가의 콘텐츠를 제공하려는 전략이 보입니다.

둘째, 2019년부터 콘텐츠 추가가 급증했습니다. 경쟁이 치열해지면서 공격적으로 라이브러리를 확장했음을 알 수 있습니다.

셋째, 미국이 압도적이지만 인도, 영국 등 다른 국가의 비중도 점차 늘고 있습니다. 현지화 전략이 강화되고 있다는 증거입니다.

넷째, 영화가 70% 정도로 많지만, TV쇼에 대한 투자도 꾸준히 증가하고 있습니다. 시리즈물이 사용자를 묶어두는 효과가 크기 때문입니다.

실무에서의 활용 박시니어 씨가 칭찬합니다. "잘했어요.

이런 대시보드를 CEO나 투자자에게 보여주면 한 번에 이해시킬 수 있어요. 숫자 나열하는 것보다 백 배 효과적이죠." 실제로 데이터 분석가의 핵심 역량 중 하나가 커뮤니케이션입니다.

아무리 좋은 분석을 해도 전달이 안 되면 의미가 없습니다. 대시보드는 그 전달력을 극대화하는 도구입니다.

더 나아가기 김개발 씨가 욕심을 냅니다. "이걸 인터랙티브하게 만들 수는 없을까요?

클릭하면 상세 정보가 나오는 식으로요." 박시니어 씨가 답합니다. "좋은 생각이에요.

Plotly나 Dash 같은 라이브러리를 쓰면 인터랙티브 대시보드를 만들 수 있어요. 다음 단계로 도전해보세요." 포트폴리오 완성 이제 김개발 씨는 완성된 넷플릭스 분석 프로젝트를 포트폴리오에 추가할 수 있습니다.

코드도 있고, 인사이트도 있고, 멋진 대시보드까지 있으니까요. 박시니어 씨가 마지막으로 조언합니다.

"실무에서는 이렇게 끝이 아니에요. 이 인사이트를 바탕으로 '그래서 우리는 무엇을 해야 하는가?'라는 액션 플랜까지 제시해야 해요.

하지만 포트폴리오로는 충분해요. 잘했습니다!" 김개발 씨는 뿌듯한 마음으로 프로젝트를 마무리합니다.

처음 CSV 파일 하나로 시작했는데, 이렇게 풍부한 분석을 해냈다니 스스로도 놀랍습니다.

실전 팁

💡 - subplots의 figsize는 출력 매체에 맞게 조정하세요 (모니터용은 크게, 보고서용은 적당히)

  • savefig 전에 plt.show()를 하면 화면에도 표시되고 파일로도 저장됩니다
  • 대시보드는 3-6개의 그래프가 적당하며, 너무 많으면 오히려 산만합니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#Pandas#DataAnalysis#Visualization#Netflix

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.