Moonie

[빅데이터 분석기사 실기] 작업 1유형 - 1 본문

공부/자격증

[빅데이터 분석기사 실기] 작업 1유형 - 1

Moonie' 2024. 10. 28. 12:04
반응형

데이터마님 블로글 참조하여 실습 했습니다.

https://www.datamanim.com/dataset/03_dataq/typeone.html

 

작업 1유형 — DataManim

작업 1유형 9회 빅분기 실기 대비 강의, 블로그만으로는 도저히 안되겠다ㅠ 하시는분들에게 추천합니다. 본격적으로 시작하시기 전에 웹광고 한번 눌러주세요 문제 풀이 영상 : https://www.youtube.co

www.datamanim.com

유튜브 인기동영상 데이터

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

 

Question 1

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

 

answer =list(df.loc[df.channelId.isin(df.channelId.value_counts().head(10).index)].channelTitle.unique())
print(answer)

 

  • df.channelId.value_counts(): channelId 열에서 각 값의 빈도를 세어, 내림차순으로 정렬된 시리즈를 생성합니다.
  • .head(10).index: value_counts() 결과의 상위 10개 인덱스(즉, channelId 값 중에서 상위 10개의 빈도가 높은 값)를 가져옵니다.
  • df.channelId.isin(...): df의 channelId 열에서 상위 10개의 channelId 값을 포함하는 행만 필터링합니다. 즉, 상위 10개의 channelId 값에 해당하는 모든 행을 선택하는 조건입니다.
  • df.loc[조건].channelTitle.unique(): 이 조건을 만족하는 행들 중 channelTitle 열의 고유한 값을 반환합니다.
  • list(...): 최종적으로, 고유한 channelTitle 값을 리스트 형태로 반환합니다.

 

Question 2

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

answer = list(df.loc[df.likes < df.dislikes].channelTitle.unique())
print(answer)

 

 

list(df.loc[df.likes < df.dislikes].channelTitle.unique())는 주어진 데이터프레임 df에서 특정 조건을 만족하는 고유한 channelTitle 값을 리스트로 반환하는 코드입니다. 작동 방식은 다음과 같습니다:

  1. df.likes < df.dislikes: likes 열의 값이 dislikes 열의 값보다 작은 행을 찾습니다. 즉, '좋아요' 수가 '싫어요' 수보다 적은 행들을 선택하는 조건입니다.
  2. df.loc[조건].channelTitle.unique(): 위 조건을 만족하는 행들 중에서 channelTitle 열의 고유한 값을 반환합니다.
  3. list(...): 최종적으로, 고유한 channelTitle 값을 리스트 형태로 반환합니다.

결과적으로, 이 코드는 df에서 '좋아요' 수가 '싫어요' 수보다 적은 채널의 channelTitle을 고유한 값으로 리스트에 담아 반환합니다.

 

Question 3

 

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

 

change = df[['channelTitle','channelId']].drop_duplicates().channelId.value_counts()
target =change[change>1]
print(len(target))

 

1. change 결과

2. target 결과

 

이 코드는 df 데이터프레임에서 중복되지 않은 channelTitle과 channelId 쌍을 찾고, 각 channelId가 중복되는 횟수를 계산한 다음, 중복된 횟수가 1회 초과인 channelId만 선택하여 target 변수에 저장합니다. 코드의 동작 방식은 다음과 같습니다:

  1. df[['channelTitle','channelId']].drop_duplicates(): channelTitle과 channelId 열에서 중복된 행을 제거합니다. 이는 channelTitle과 channelId 쌍이 고유한 행만을 남기기 위한 처리입니다.
  2. .channelId.value_counts(): 고유한 데이터에서 channelId 값의 빈도를 계산해, 내림차순으로 정렬된 시리즈를 생성합니다. 이 시리즈의 인덱스는 channelId, 값은 빈도입니다.
  3. change[change>1]: change 시리즈에서 빈도가 1을 초과하는 channelId 값만 필터링합니다. 즉, 하나 이상의 고유한 channelTitle에 매핑된 channelId 값만 남깁니다.

결과적으로 target 변수에는 여러 channelTitle에 매핑된 channelId와 그 빈도가 저장됩니다.

 

Question 4

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

df['trending_date2'] = pd.to_datetime(df['trending_date2'])
print(df['trending_date2'])
answer = df.loc[df['trending_date2'].dt.day_name() == 'Sunday'].categoryId.value_counts().index[0]
print(answer)

df['tending_date2'] 의 결과

 

Question 5

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

 

group = df.groupby([df['trending_date2'].dt.day_name(),'categoryId'],as_index=False).size()
answer= group.pivot(index='categoryId',columns='trending_date2')
display(answer)

1. 그룹화

group = df.groupby([df['trending_date2'].dt.day_name(),'categoryId'], as_index=False).size()
  • df.groupby(...)를 사용해 trending_date2 열에서 요일(.dt.day_name()으로 변환)을 추출하고 categoryId와 함께 그룹화합니다.
  • as_index=False는 결과에서 인덱스를 유지하지 않고 데이터프레임 형태로 반환하도록 설정합니다.
  • size()는 각 그룹의 행 개수를 계산하여 크기를 반환합니다. 이렇게 하면 각 요일과 categoryId 조합의 데이터 수를 구할 수 있습니다.

 

2.피벗 테이블 생성

answer = group.pivot(index='categoryId', columns='trending_date2')

 

 group 데이터프레임을 피벗하여 categoryId를 인덱스로, trending_date2 요일을 컬럼으로 설정합니다. 각 요일과 categoryId 조합의 데이터 개수가 피벗 테이블에 채워지며, 요일별로 categoryId에 해당하는 데이터를 확인할 수 있게 정리합니다.

 

Question 6

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

 

target2 = df.loc[df.view_count!=0]
t = target2.copy()
t['ratio'] = (target2['comment_count']/target2['view_count']).dropna()
result = t.sort_values(by='ratio',ascending=False).iloc[0].title
print(result)

 

Question 7

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

ratio = (df['comment_count']/df['view_count']).dropna().sort_values()
ratio[ratio!=0].index[0]
result = df.iloc[ratio[ratio!=0].index[0]].title
print(result)

 

  • ratio = (df['comment_count']/df['view_count']).dropna().sort_values():
    • df['comment_count']/df['view_count'] 부분에서 댓글 수와 조회 수의 비율을 계산합니다.
    • .dropna()는 이 비율 계산에서 결측값을 제거합니다. (예: 조회 수가 0이어서 계산이 불가능한 경우)
    • .sort_values()는 비율을 오름차순으로 정렬합니다.
  • ratio[ratio!=0].index[0]:
    • ratio[ratio!=0]은 비율이 0이 아닌 값들만 필터링합니다.
    • .index[0]는 필터링된 데이터 중에서 첫 번째(가장 작은 비율을 가진) 인덱스를 반환합니다.
  • result = df.iloc[ratio[ratio!=0].index[0]].title:
    • df.iloc[ratio[ratio!=0].index[0]]는 가장 작은 비율을 가진 행을 선택합니다.
    • .title은 해당 행에서 'title' 열의 값을 가져옵니다. 즉, 비율이 가장 낮은 비디오의 제목을 추출합니다.

Question 8

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

target = df.loc[(df.likes !=0) & (df.dislikes !=0)]
num = (target['dislikes']/target['likes']).sort_values().index[0]
answer = df.iloc[num].title
print(answer)

 

 

  • target = df.loc[(df.likes != 0) & (df.dislikes != 0)]:
    • df.likes != 0과 df.dislikes != 0 조건을 동시에 만족하는 행들을 필터링합니다.
    • 즉, 좋아요와 싫어요 수가 모두 0이 아닌 비디오만 선택합니다. 결과는 target이라는 새로운 데이터프레임에 저장됩니다.
  • num = (target['dislikes']/target['likes']).sort_values().index[0]:
    • target['dislikes']/target['likes']는 싫어요 수를 좋아요 수로 나눈 비율을 계산합니다.
    • .sort_values()는 비율을 오름차순으로 정렬하여 가장 낮은 비율이 맨 앞에 오도록 합니다.
    • .index[0]는 가장 낮은 비율을 가진 비디오의 인덱스를 가져옵니다.
  • answer = df.iloc[num].title:
    • df.iloc[num]은 가장 낮은 비율을 가진 비디오의 행을 선택합니다.
    • .title은 해당 행에서 'title' 열의 값을 가져옵니다. 즉, 비율이 가장 낮은 비디오의 제목을 추출합니다.

Question 9

가장많은 트렌드 영상을 제작한 채널의 이름은 무엇인가? (날짜기준, 중복포함)

answer = df.loc[df.channelId == df.channelId.value_counts().index[0]].channelTitle.unique()[0]

 

  • df.channelId.value_counts():
    • channelId 열의 각 값이 몇 번 나타나는지를 세고, 이를 내림차순으로 정렬된 시리즈 형태로 반환합니다.
    • 결과는 가장 많이 등장하는 channelId부터 순서대로 정렬됩니다.
  • df.channelId.value_counts().index[0]:
    • .index[0]를 사용하여 가장 많이 등장한 channelId 값을 가져옵니다.
    • 즉, 가장 많이 등장한 채널의 channelId를 얻습니다.
  • df.loc[df.channelId == ... ]:
    • df.channelId == df.channelId.value_counts().index[0] 조건을 사용하여 데이터프레임에서 가장 많이 등장한 channelId에 해당하는 모든 행을 필터링합니다.
    • 이 필터링된 결과에는 가장 많이 등장한 channelId에 속한 데이터만 남습니다.
  • .channelTitle.unique():
    • .channelTitle.unique()는 필터링된 데이터의 channelTitle 열에서 중복을 제거하여 유일한 값을 배열 형태로 반환합니다.
    • 즉, 가장 많이 등장한 channelId에 대응하는 고유한 channelTitle 목록을 얻습니다.
  • [0]:
    • 고유한 channelTitle 배열의 첫 번째 값을 가져옵니다.
    • 이 값은 가장 많이 등장한 channelId에 해당하는 채널의 이름이 됩니다.

 

 

Question 10

20회(20일)이상 인기동영상 리스트에 포함된 동영상의 숫자는?

 

answer = (df[['title','channelId']].value_counts()>=20).sum()
print(answer)

 

 

  • df[['title','channelId']].value_counts():
    • df[['title', 'channelId']]는 title과 channelId 열만 선택합니다.
    • .value_counts()는 각 title과 channelId의 조합이 데이터프레임 내에서 몇 번 등장하는지를 세고, 이를 내림차순으로 정렬된 시리즈 형태로 반환합니다.
    • 결과는 각 (제목, 채널) 조합의 등장 횟수입니다.
  • (df[['title','channelId']].value_counts() >= 20):
    • value_counts() 결과가 20 이상인 항목을 True로, 20 미만인 항목을 False로 변환합니다.
    • 이 부분의 결과는 20번 이상 등장한 (제목, 채널) 쌍에 True, 그 외에는 False를 가지는 불리언 시리즈가 됩니다.
  • .sum():
    • True 값은 1로 계산되고, False 값은 0으로 계산되기 때문에 .sum()을 사용하면 20번 이상 등장하는 (제목, 채널) 쌍의 개수를 구할 수 있습니다.

 

 

반응형
Comments