일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- reinforced learning
- 공개키 docker
- dice loss
- whisper jax
- focal loss
- tersorboard mapping
- gpt excel 사용
- 강화학습 간단 정리
- ImportError: cannot import name 'Mapping' from 'collections' tensrorbaord
- docker 환경 문제
- 엑셀에 ollama
- OPIC 당일치기
- OPIC 번개
- 인간종말
- tesorboard
- tensorboard html5
- AI모델
- 빅데이터 분석기사 #빅분기실기 #데이터마님 # 빅분기실기준비
- cross entoropy
- OPIC 하루 전
- OPIC 시험 전날
- tensorboard 에러
- 일기 #다짐
- OPIC 하루전 시작
- DDPG
- OPIC 오늘 시작
- AI생성함
- ollama
- 음성전처리 #음성처리 #python 음성추출 # python 음성 추출 #moviepy
- ImportError: cannot import name 'Mapping' from 'collections'
- Today
- Total
Moonie
[빅데이터 분석기사 실기] 작업 1유형 - 1 본문
데이터마님 블로글 참조하여 실습 했습니다.
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 값을 리스트로 반환하는 코드입니다. 작동 방식은 다음과 같습니다:
- df.likes < df.dislikes: likes 열의 값이 dislikes 열의 값보다 작은 행을 찾습니다. 즉, '좋아요' 수가 '싫어요' 수보다 적은 행들을 선택하는 조건입니다.
- df.loc[조건].channelTitle.unique(): 위 조건을 만족하는 행들 중에서 channelTitle 열의 고유한 값을 반환합니다.
- 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 변수에 저장합니다. 코드의 동작 방식은 다음과 같습니다:
- df[['channelTitle','channelId']].drop_duplicates(): channelTitle과 channelId 열에서 중복된 행을 제거합니다. 이는 channelTitle과 channelId 쌍이 고유한 행만을 남기기 위한 처리입니다.
- .channelId.value_counts(): 고유한 데이터에서 channelId 값의 빈도를 계산해, 내림차순으로 정렬된 시리즈를 생성합니다. 이 시리즈의 인덱스는 channelId, 값은 빈도입니다.
- 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)
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번 이상 등장하는 (제목, 채널) 쌍의 개수를 구할 수 있습니다.
'공부 > 자격증' 카테고리의 다른 글
[빅데이터 분석기사 실기] 작업 1유형 - 3 (0) | 2024.10.30 |
---|---|
[빅데이터 분석기사 실기] 작업 1유형 - 2 (4) | 2024.10.29 |
[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 8 (3) | 2024.10.26 |
[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 7 (3) | 2024.10.26 |
[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 6 (5) | 2024.10.22 |