📝 자격증/빅데이터 분석기사
[빅분기 실기 준비] 데이터마님 1유형 유튜브 공범컨텐츠 동영상 데이터
b5ingbo2ng
2024. 7. 6. 18:06
- 데이터 출처 :https://www.kaggle.com/kukuroo3/youtube-episodic-contents-kr(참고, 데이터 수정)
- 데이터 설명 : 유튜브 “공범” 컨텐츠 동영상 정보 ( 10분 간격 수집)
- dataurl1 (비디오 정보) = https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/videoInfo.csv
- dataurl2 (참가자 채널 정보)= https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/channelInfo.csv
⭕️ 1. 각 데이터의 ‘ct’컬럼을 시간으로 인식할수 있게 datatype을 변경하고 video 데이터의 videoname의 각 value 마다 몇개의 데이터씩 가지고 있는지 확인하라
channel['ct'] = pd.to_datetime(channel['ct'])
video['ct'] = pd.to_datetime(video['ct'])
video['videoname'].value_counts()
❌ 2. 수집된 각 video의 가장 최신화 된 날짜의 viewcount값을 출력하라
★ iloc에 여러개 컬럼 지정 가능하다는 것
idx = video.groupby('videoname')['ct'].idxmax()
video.loc[idx, ['videoname', 'viewcnt', 'ct']]
⭕️ 3. Channel 데이터중 2021-10-03일 이후 각 채널의 처음 기록 됐던 구독자 수(subcnt)를 출력하라
temp = channel[channel['ct']>='2021-10-03 00:00:00']
idx = temp.groupby('channelname')['ct'].idxmin()
channel.loc[idx, ['channelname', 'ct', 'subcnt']]
🔺 각채널의 2021-10-03 03:00:00 ~ 2021-11-01 15:00:00 까지 구독자수 (subcnt) 의 증가량을 구하여라
- 연도별 최댓값-최솟값
- 여기서 말하는 x는 pop
- pop에 하나씩 접근을 해서 최대값에서 최소값을 빼라는 함수를 적용해
- df.groupby('year')['pop'].apply(lambda x : x.max()-x.min())
temp = channel[(channel['ct'] >= '2021-10-03 03:00:00') & (channel['ct'] <= '2021-11-01 15:00:00')]
maxidx = temp.groupby('channelname')['ct'].idxmax()
minidx = temp.groupby('channelname')['ct'].idxmin()
maxrows = temp.loc[maxidx, ['channelname', 'subcnt', 'ct']]
minrows = temp.loc[minidx, ['channelname', 'subcnt', 'ct']]
maxrows.set_index('channelname')['subcnt'] - minrows.set_index('channelname')['subcnt']
🔺 5. 각 비디오는 10분 간격으로 구독자수, 좋아요, 싫어요수, 댓글수가 수집된것으로 알려졌다. 공범 EP1의 비디오정보 데이터중수집간격이 5분 이하, 20분이상인 데이터 구간( 해당 시점 전,후) 의 시각을 모두 출력하라
- 문제 제대로 읽기
- shift(-1) : 그 다음행의 날짜를 내 행의 새로운 컬럼으로 만들어줌
- shift(1) : 이전 데이터를 불러옴
- diff(1) : 이전 데이터에서 지금 데이터를 뺀 것
temp['ct'].shift(1)
video.loc[video['videoname'].str.contains('1')].sort_values('ct').reset_index(drop=True)
# 다음 행의 값을 얻기 위해 shift 사용
temp = video[video['videoname'].str.contains('1')]
temp['next_value'] = temp['ct'].shift(-1)
# 현재 행의 값에서 다음 행의 값을 뺌
temp['diff'] = temp['next_value'] - temp['ct']
import datetime
temp[(temp['diff'] <= datetime.timedelta(minutes=5)) | (temp['diff'] >= datetime.timedelta(minutes=20))]
temp[temp.index.isin([8,9,10, 416,417,418, 719, 720, 721, 722, 1635,1645, 1636])]
720,721,722,723,1635,1636,1637
# (720, 721, 722, 723, 1635, 1636, 1637)
import datetime
temp = video[video['videoname'].str.contains('1')]
temp = temp.sort_values('ct').reset_index(drop=True)
temp['diff2'] = temp['ct'].diff(1)
result = temp[(temp['diff2']<=datetime.timedelta(minutes=5)) | (temp['diff2']>=datetime.timedelta(minutes=20))]
temp[temp.index.isin([720, 721,722,723,1635,1636,1637])]
🔺 6. 각 에피소드의 시작날짜(년-월-일)를 에피소드 이름과 묶어 데이터 프레임으로 만들고 출력하라
result = pd.DataFrame(video.groupby('videoname')['ct'].min())
result = result.reset_index()
result['ct'] = result['ct'].apply(lambda x:x.date())
display(result)
⭕️ 7. “공범” 컨텐츠의 경우 19:00시에 공개 되는것으로 알려져있다. 공개된 날의 21시의 viewcnt, ct, videoname 으로 구성된 데이터 프레임을 viewcnt를 내림차순으로 정렬하여 출력하라
idx = video[video['ct'].dt.hour == 21].groupby('videoname')['ct'].idxmin()
video[video.index.isin(idx)][['videoname', 'viewcnt', 'ct']].sort_values('viewcnt', ascending=False)
⭕️ 8. video 정보의 가장 최근 데이터들에서 각 에피소드의 싫어요/좋아요 비율을 ratio 컬럼으로 만들고 videoname, ratio로 구성된 데이터 프레임을 ratio를 오름차순으로 정렬하라
video['ratio'] = video['dislikecnt'] / video['likecnt']
idx = video.groupby('videoname')['ct'].idxmax()
temp = video[video.index.isin(idx)]
temp[['videoname', 'ratio']].sort_values('ratio')
❌ 9. 2021-11-01 00:00:00 ~ 15:00:00까지 각 에피소드별 viewcnt의 증가량을 데이터 프레임으로 만드시오
- 날짜 같다고 할때는 datetime.date(2021, 11, 1) 활용
- '2021-11-01' 안됨
- 채널수는 일단 시간이 지날수록 계속 오르기만하지, 그러니까 max-min을 쓸 수 있는거고
- 람다를 이용하면, 그 자체 최댓값만 구할 수 있지만, 그룹바이를 하고, 그 agg함수를 내가 만들어주면 이 문제 풀이 가능함
1. 람다 사용
temp.groupby('videoname')['ct'].apply(lambda x : x.max()-x.min())
2. 함수를 만드는 방법
def check(x):
result = max(x) - min(x)
return result
answer = temp[['videoname','viewcnt']].groupby("videoname").agg(check)
answer
start = pd.to_datetime('2021-11-01 00:00:00')
end = pd.to_datetime('2021-11-01 15:00:00')
temp = video[(video['ct']>=start) & (video['ct']<=end)]
result = temp[['videoname','viewcnt']].groupby("videoname")['viewcnt'].max() - temp[['videoname','viewcnt']].groupby("videoname")['viewcnt'].min()
result = pd.DataFrame(result)
print(result)
🔺 10. video 데이터 중에서 중복되는 데이터가 존재한다. 중복되는 각 데이터의 시간대와 videoname 을 구하여라
result = video[video.duplicated()][['ct', 'videoname']]
print(result)
# ct videoname
# 722 2021-10-13 09:41:37 공범 EP1
# 3927 2021-10-13 09:41:37 공범 EP2