AI/Data Science

[Data Science] 유튜브 공범컨텐츠 동영상 데이터 분석하기

Linuxias 2023. 1. 19. 16:26
반응형

 

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

 

작업 1유형 — DataManim

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

www.datamanim.com

 

데이터 다운받기

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

import pandas as pd

channel =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/channelInfo.csv')
video =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/videoInfo.csv')
display(channel.head())
display(video.head())

 

 

문제1. 각 데이터의 ‘ct’컬럼을 시간으로 인식할수 있게 datatype을 변경하고 video 데이터의 videoname의 각 value 마다 몇개의 데이터씩 가지고 있는지 확인하라.

답안

더보기
# 1) ct 컬럼을 datetime 객체로 변환
channel.ct = pd.to_datetime(channel.ct)
video.ct = pd.to_datetime(video.ct)

# 2) video 데이터의 videoname의 
# 각 value 마다 몇개의 데이터씩 가지고 있는지 확인하라
video.videoname.value_counts()

 

문제 2. 수집된 각 video의 가장 최신화 된 날짜의 viewcount값을 출력하라

답안

더보기
remove_video = video.sort_values(['videoname', 'ct']).drop_duplicates('videoname', keep = 'last')
remove_video_sub = remove_video[["viewcnt", "videoname", "ct"]]
remove_video_sub.reset_index(drop=True)

 

 

문제 3. Channel 데이터중 2021-10-03일 이후 각 채널의 처음 기록 됐던 구독자 수(subcnt)를 출력하라

답안

더보기
channel_sub = channel[channel.ct >= pd.to_datetime('2021-10-03')]
channel_sub.head(2)

drop_channel_sub = channel_sub.sort_values(['channelname','ct']).drop_duplicates('channelname')
drop_channel_sub[["channelname", "subcnt"]].reset_index(drop=True)

 

 

문제 4. 각채널의 2021-10-03 03:00:00 ~ 2021-11-01 15:00:00 까지 구독자수 (subcnt) 의 증가량을 구하여라

답안

더보기
start_channel = channel.loc[channel.ct.dt.strftime('%Y-%m-%d %H') == '2021-10-03 03']
end_channel = channel.loc[channel.ct.dt.strftime('%Y-%m-%d %H') == '2021-11-01 15']

start_df = start_channel[["channelname", "subcnt"]].reset_index(drop=True)
end_df = end_channel[["channelname", "subcnt"]].reset_index(drop=True)

df_merge = pd.merge(left = start_df, right = end_df, left_on = 'channelname', right_on = 'channelname')
df_merge['diff'] = df_merge.subcnt_y - df_merge.subcnt_x
df_merge[["channelname", "diff"]]

 

 

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

답안

video_ep1 = video[video.videoname == " 공범 EP1"]
video_ep1 = video_ep1.sort_values('ct').reset_index(drop=True)

# diff(1)는 해당 행과 1만큼 차이 나는 행과의 차이를 의미한다.
cond1 = (video_ep1.ct.diff(1) >= datetime.timedelta(minutes=20))
cond2 = (video_ep1.ct.diff(1) <= datetime.timedelta(minutes=5))

# 해당 조건 수행 시 721, 722, 1636 행을 찾을 수 있다.
video_ep1 = video_ep1[(cond1) | (cond2)]

# 찾은 행의 전후까지 포함하여 출력한다.
video.iloc[[720, 721, 722, 723, 1635, 1636, 1637], :]

 

 

문제 6. 각 에피소드의 시작날짜(년-월-일)를 에피소드 이름과 묶어 데이터 프레임으로 만들고 출력하라

답안

# video에서 videoname 기준으로 ct 값 중 가장 오래된 날짜을 제외한 모든 데이터 제거
video_sub = video.sort_values(['videoname', 'ct']).drop_duplicates('videoname')

video_sub = video_sub[["videoname", "ct"]]
video_sub.ct = video_sub.ct.dt.date

# 컬럼 rename
video_sub.rename(columns={"ct":"date"})

 

문제 7. “공범” 컨텐츠의 경우 19:00시에 공개 되는것으로 알려져있다. 공개된 날의 21시의 viewcnt, ct, videoname 으로 구성된 데이터 프레임을 viewcnt를 내림차순으로 정렬하여 출력하라

답안

더보기
video_df = video.copy()

# 공개된 날 21시의 데이터만 추출
df_sub = video_df[(video_df.ct.dt.hour == 21)] \
.sort_values(['videoname', 'ct']) \
.drop_duplicates('videoname')

# 추출한 데이터에서 viewcnt 기준으로 내림차순 정렬
df_sub = df_sub.sort_values('viewcnt', ascending = False)

# 정렬한 데이터에서 viewcnt, ct, videoname만 추출하여 출력
df_sub[["viewcnt", "ct", "videoname"]].reset_index(drop=True)
반응형