📝 자격증/빅데이터 분석기사

[빅분기 실기 준비] 데이터마님 1유형 유튜브 공범컨텐츠 동영상 데이터

b5ingbo2ng 2024. 7. 6. 18:06

 

 

⭕️ 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