AI/Data Science

[Data Science] 유튜브 인기 동영상 분석하기

Linuxias 2023. 1. 17. 23:25
반응형

 

데이터과학에서 python을 도구로 사용할 시 pandas, numpy 등의 라이브러리를 떨어질 수 없는 관계이다. 해당 연습을 위해 DataMinim 님의 데이터를 활용하여 연습하고, 결과를 공유하려 한다.

 

작업 1유형 — DataManim

Question 15 각 비디오는 10분 간격으로 구독자수, 좋아요, 싫어요수, 댓글수가 수집된것으로 알려졌다. 공범 EP1의 비디오정보 데이터중 수집간격이 5분 이하, 20분이상인 데이터 구간( 해당 시점 전,

www.datamanim.com

 

데이터 다운받기

사용하는 데이터는 DataMinim 님이 정제해둔 데이터이다. 아래와 같이 다운로드 한다.

import pandas as pd

df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/youtube.csv",index_col=0)
df.head()

 

문제 1. 인기동영상 제작횟수가 많은 채널 상위 10개명을 출력하라 (날짜기준, 중복포함)

결과를 구하면 아래와 같은 리스트를 얻을 수 있다.

['짤툰',
 '파뿌리',
 'SPOTV',
 '런닝맨 - 스브스 공식 채널',
 '엠뚜루마뚜루 : MBC 공식 종합 채널',
 '장삐쭈',
 'BANGTANTV',
 '채널 십오야',
 '이과장',
 '총몇명']
더보기
df_channelTitle = df.groupby('channelTitle')['title'].count().reset_index()
df_channelTitle.sort_values("title", ascending=False).head(10).channelTitle.to_list()

 

 

문제 2.  논란으로 인기동영상이 된 케이스를 확인하고 싶다. dislikes수가 like 수보다 높은 동영상을 제작한 채널을 모두 출력하라

결과

['핫도그TV', 'ASMR 애정TV', '하얀트리HayanTree', '양팡 YangPang', '철구형 (CHULTUBE)', '왜냐맨하우스', '(MUTUBE)와꾸대장봉준', '오메킴TV', '육지담', 'MapleStory_KR', 'ROAD FIGHTING CHAMPIONSHIP', '사나이 김기훈', '나혼자산다 STUDIO', 'Gen.G esports']
더보기
df[(df.dislikes > df.likes)].channelTitle.unique()

 

 

문제 3.  채널명을 바꾼 케이스가 있는지 확인하고 싶다. channelId의 경우 고유값이므로 이를 통해 채널명을 한번이라도 바꾼 채널의 갯수를 구하여라.

결과

71
더보기
df_sub = df[['channelTitle', 'channelId']].drop_duplicates()
change_channel = df_sub.channelId.value_counts()
change_channel = change_channel[change_channel > 1]
len(change_channel)

 

 

문제 4. 일요일에 인기있었던 영상들중 가장많은 영상 종류(categoryId)는 무엇인가?

결과

24
더보기

해설

youtube = df.copy()

# 1) pandas의 to_datetime을 이용하여 datetime object를 값으로 하는 새로운 컬럼 생성
youtube['datetime'] = pd.to_datetime(youtube.trending_date2)

# 2) youtube 데이터프레임에서 일요일에 해당하는지 is_sunday 컬럼에 추가 (일요일 1, 아니면 0)
youtube['is_sunday'] = (youtube.datetime.dt.day_name() == 'Sunday') + 0

# 3) 일요일에 해당하는 행만 추출
youtube_sunday = youtube[youtube.is_sunday == 1]

# 4) 일요일 중 categoryId 기준으로 값을 카운팅하고 가장 많은 값을 가진 0번째 index를 출력
youtube_sunday.categoryId.value_counts().index[0]

 

 

문제 5. 각 요일별 인기 영상들의 categoryId는 각각 몇개 씩인지 하나의 데이터 프레임으로 표현하라.

답안

 

더보기

해설

두 가지 방법으로 해결을 할 수 있다. 첫 번째는 pandas에서 제공하는 crosstab() 을 이용하는 방법이고, 두 번째는 pivot() 을 이용하는 방법이다.

첫 번재 crosstab()을 이용하는 방법은 아래와 같다.

youtube = df.copy()

# 1) datetime 정보를 기반으로 새로운 컬럼 생성
youtube['datetime'] = pd.to_datetime(youtube.trending_date2)

# 2) datetime에서 day_name()을 이용하여 요일 정보 새로운 컬럼에 추가
youtube['day'] = youtube.datetime.dt.day_name()

# 3) crosstab을 이용하여 정보 출력
pd.crosstab(youtube.categoryId, youtube.day)

 두번 째 pivot()을 이용하는 방법이다.

# datetime 전처리는 동일하다.
youtube['datetime'] = pd.to_datetime(youtube.trending_date2)
youtube['day'] = youtube.datetime.dt.day_name()

# 1) groupby()를 이용하여 day, categoryId를 포함한 새로운 데이터 프레임을 생성한다.
#    해당 데이터 프레임은 day, categoryId, size를 컬럼으로 가진 데이터프레임이다.
youtube_group = youtube.groupby(['day', 'categoryId'], as_index = False).size()

# 2) 데이터프레임을 pivot()을 이용하여 day를 컬럼데이터로 전환하다.
youtube_group.pivot(index = 'categoryId', columns='day')

 

 

문제 6. 댓글의 수로 (comment_count) 영상 반응에 대한 판단을 할 수 있다. viewcount대비 댓글수가 가장 높은 영상을 확인하라 (view_count값이 0인 경우는 제외한다)

답안

'60분 동안 댓글이 달리지 않으면, 영상이 삭제됩니다. (챌린지)'
더보기
# 1) 기존 데이터에서 view_count가 0보다 큰 행들만 추출하여 새로운 데이터프레임 변수에 할당
view_count_not0 = df[df.view_count > 0].copy()

# 2) viewcount 대비 comment_count 비율 계산하여 새로운 컬럼 추가
view_count_not0['ratio'] = (df.comment_count / df.view_count)

# 3) 새로운 컬럼 기준으로 정렬하고, 첫 번재 데이터의 제목 확인
view_count_not0.sort_values(by = 'ratio', ascending=False).iloc[0,:].title

 

 

문제 7. 댓글의 수로 (comment_count) 영상 반응에 대한 판단을 할 수 있다.viewcount대비 댓글수가 가장 낮은 영상을 확인하라 (view_counts, ratio값이 0인경우는 제외한다.)

답안

Join the BTS #PermissiontoDance Challenge only on YouTube #Shorts
더보기
#1. view_counts, ratio값이 0인경우는 제외한 데이터 추출
view_count_not0 = df[(df.view_count > 0) & ((df.comment_count / df.view_count) > 0)].copy()

#2. 비율을 구한다.
view_count_not0['ratio'] = (df.comment_count / df.view_count)

#3. 오름차순 정렬하여 제목 추출
view_count_not0.sort_values(by = 'ratio').iloc[0,:].title

 

문제 8. like 대비 dislike의 수가 가장 적은 영상은 무엇인가? (like, dislike 값이 0인경우는 제외한다)

답안

[줌터뷰] *최초공개* 사부작즈🐰🐶의 비공식 이름은 아이라인즈? 꿀조합 티키타카 가득한 NCT 127 도영&정우의 줌터뷰
더보기
# likes, dislikes 0이 아닌 데이터 추출
like_dislike = df[(df.likes > 0) & (df.dislikes > 0)].copy()

# likes 대비 dislikes의 비율값을 새로운 컬럼으로 추가
like_dislike['ratio'] = (df.dislikes / df.likes)

# ratio 기준으로 정렬 및 title 출력
like_dislike.sort_values('ratio').head(1).title

 

 

반응형