소품집

[빅분기] 빅데이터분석기사 작업형 1유형 100문제 풀어보기 본문

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

[빅분기] 빅데이터분석기사 작업형 1유형 100문제 풀어보기

sodayeong 2023. 11. 15. 20:15

 

https://www.datamanim.com/dataset/99_pandas/pandasMain.html

 

판다스 연습 튜토리얼 — DataManim

Question 43 df의 데이터 중 new_price값이 lst에 해당하는 경우의 데이터 프레임을 구하고 그 갯수를 출력하라 lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]

www.datamanim.com

 

위 블로그는 빅분기 시험범위가 바뀐 시험 범위를 기준으로 기출 문제를 공유해주고 있어서 보고있는 블로그다.

작업형 1유형 데이터 전처리 문제를 풀어보겠습니다~!

 

 

# 1. 롤 랭킹 데이터 

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

top_channel = df['channelId'].value_counts().head(10).index
df[df['channelId'].isin(top_channel)]['channelTitle'].unique()

 

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

list(df[(df['dislikes']) > (df['likes'])]['channelTitle'].unique())

 

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

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

 

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

df['trending_date2'] = pd.to_datetime(df['trending_date2'])
df['day_name'] = df['trending_date2'].dt.day_name()

df[df['day_name']=='Sunday']['categoryId'].value_counts().index[0]

 

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

df.pivot_table(index='categoryId', columns='day_name')

 

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

df_2 = df[df['view_count']!=0]

df['ration'] = (df_2['comment_count'] / df_2['view_count'])
df_2.sort_values(by='ration', ascending=False).reset_index(drop=False)['title'][0]

 

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

df_reaction = df[(df['view_count']!=0)]
df_reaction['ration'] = (df['comment_count']/df['view_count'])
df_reaction.head(1)

 

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

df_likes = df[(df['likes']!=0) & (df['dislikes']!=0)]
df_likes['ration'] = (df['dislikes']/df['likes'])

df_likes.sort_values(by='ration', ascending=True).reset_index(drop=True)['title'][0]

 

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

df[['channelTitle', 'channelId']]['channelTitle'].value_counts().index[0]

 

10. 20회(20일) 이상 인기동영상 리스트에 포함된 동영상의 개수는?

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

 

 

# 2. 유튜브 공범콘텐츠 동영상 데이터 

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')

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

channel['ct'] = pd.to_datetime(channel['ct'])
video['ct'] = pd.to_datetime(video['ct'])

video['videoname'].value_counts()

 

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

video[['viewcnt', 'videoname', 'ct']].sort_values(by='ct', ascending=True)

 

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

channel_sub = channel[channel['ct']>='2021-10-03'].reset_index(drop=True)
channel_sub = channel_sub.drop_duplicates('channelname') # 중복행 제거
channel_sub[['channelname', 'subcnt']].reset_index(drop=True)

 

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

start = channel[channel['ct'].dt.strftime('%Y-%m-%d %H')=='2021-10-03 03']
end = channel[channel['ct'].dt.strftime('%Y-%m-%d %H')=='2021-11-01 15']

start_df = start[['channelname', 'subcnt']].reset_index(drop=True)
end_df = end[['channelname', 'subcnt']].reset_index(drop=True)

end_df['diff'] = end_df['subcnt']-start_df['subcnt']
final_df = end_df.drop(columns='subcnt', axis=1)

final_df

 

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

- 틀림!

 

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

video_ep = video[['ct', 'videoname']].sort_values(by='ct').drop_duplicates('videoname')
video_ep['ct'] = pd.to_datetime(video_ep['ct'])
video_ep['ct'] = video_ep['ct'].dt.date
video_ep

 

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

# video['ct'] = pd.to_datetime(video['ct'])
video_cnt = video[video['ct'].dt.hour==21]

video[['videoname', 'viewcnt', 'ct']].sort_values('viewcnt', ascending=False).drop_duplicates('videoname').reset_index(drop=True)
video_cnt.sort_values('viewcnt', ascending=False)[['videoname', 'viewcnt', 'ct']].drop_duplicates('videoname').reset_index(drop=True)

 

18. video 정보의 가장 최근 데이터들에서 각 에피소드의 싫어요/좋아요 비율을 ratio 컬럼으로 만들고 videoname, ratio로 구성된 데이터 프레임을 ratio를 오름차순으로 정렬하라

video['ration'] = video['dislikecnt']/video['likecnt']
video[['videoname', 'ration']].drop_duplicates('videoname').sort_values('ration', ascending=True).reset_index(drop=True)

 

19. 2021-11-01 00:00:00 ~ 15:00:00까지 각 에피소드별 viewcnt의 증가량을 데이터 프레임으로 만드시오

video['ct'] = pd.to_datetime(video['ct'])

videon_cnt_2 = video[(video['ct']>='2021-11-01 00:00:00') & (video['ct']<='2021-11-01 15:00:00')]
video_cnt_2

def diff(x) : 
    result = max(x) - min(x)
    return result 

# 최종
video_cnt_2[['videoname', 'viewcnt']].groupby('videoname').agg(diff)

 

20. video 데이터 중에서 중복되는 데이터가 존재한다. 중복되는 각 데이터의 시간대와 videoname 을 구하여라

video[['videoname', 'ct']].duplicated()

 

# 2. 월드컵 출전선수 골 기록 데이터 

# 데이터 출처 :https://www.kaggle.com/darinhawley/fifa-world-cup-goalscorers-19302018(참고, 데이터 수정)
# 데이터 설명 : 1930 ~2018년도 월드컵 출전선수 골기록
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/worldcup/worldcupgoals.csv

 

21. 주어진 전체 기간의 각 나라별 골득점수 상위 5개 국가와 그 득점수를 데이터프레임형태로 출력하라

df.groupby('Country')['Goals'].sum().to_frame().reset_index().sort_values(by='Goals', ascending=False).head(5)

 

22. 주어진 전체기간동안 골득점을 한 선수가 가장 많은 나라 상위 5개 국가와 그 선수 숫자를 데이터 프레임 형식으로 출력하라

df.groupby('Country').size().sort_values(ascending=False).head(5).to_frame().reset_index().rename(columns={0 : 'Total Goals'})

 

23. Years 컬럼은 년도 -년도 형식으로 구성되어있고, 각 년도는 4자리 숫자이다. 년도 표기가 4자리 숫자로 안된 케이스가 존재한다. 해당 건은 몇건인지 출력하라

- 틀림!

 

24. Q3에서 발생한 예외 케이스를 제외한 데이터프레임을 df2라고 정의하고 데이터의 행의 숫자를 출력하라

df['yearLst'] = df['Years'].str.split('-')

def checkFour(x) : 
    for value in x :
        if len(str(value))!=4 : 
            return False
    return True
df['check'] = df['yearLst'].apply(checkFour)

result = len(df[df['check']==False])
result

df2 = df[df['check']==True].reset_index(drop=True)
print(df2.shape[0])

 

25. 월드컵 출전횟수를 나타내는 ‘LenCup’ 컬럼을 추가하고 4회 출전한 선수의 숫자를 구하여라

df['LenCup'] = df['check'].str.len()
df[df['LenCup']>=4]['Player'].value_counts().sum()

 

26. Yugoslavia 국가의 월드컵 출전횟수가 2회인 선수들의 숫자를 구하여라

df[(df['Country']=='Yugoslavia') & (df['LenCup']==2)]['Player'].value_counts().sum()

 

27. 2002년도에 출전한 전체 선수는 몇명인가?

print(len(df[df['Years'].str.contains('2002')]))

 

28. 이름에 ‘carlos’ 단어가 들어가는 선수의 숫자는 몇 명인가? (대, 소문자 구분 x)

df[df['Player'].str.contains('carlos')].reset_index(drop=True).shape[0]

 

29. 월드컵 출전 횟수가 1회뿐인 선수들 중에서 가장 많은 득점을 올렸던 선수는 누구인가?

df[df['LenCup']==1].sort_values(by='Goals', ascending=False).reset_index(drop=True)['Player'][0]

 

30. 월드컵 출전횟수가 1회 뿐인 선수들이 가장 많은 국가는 어디인가?

df[df['LenCup']==1]['Country'].value_counts().index[0]

 

# 3. 서울시 따릉이 이용정보 데이터

# 데이터 출처 :https://www.data.go.kr/data/15051872/fileData.do(참고, 데이터 수정)
# 데이터 설명 : 서울특별시_공공자전거 시간대별 이용정보
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/bicycle/seoul_bi.csv

31. 대여일자별 데이터의 수를 데이터프레임으로 출력하고, 가장 많은 데이터가 있는 날짜를 출력하라

df.groupby('대여일자').size().reset_index().rename(columns={0:'count'}).sort_values(by='count', ascending=False).iloc[0]

 

32. 각 일자의 요일을 표기하고 (‘Monday’ ~’Sunday’) ‘day_name’컬럼을 추가하고 이를 이용하여 각 요일별 이용 횟수의 총합을 데이터 프레임으로 출력하라

df['대여일자'] = pd.to_datetime(df['대여일자'])
df['day_name'] = df['대여일자'].dt.day_name()

df['day_name'].value_counts().to_frame()

 

33. 각 요일별 가장 많이 이용한 대여소의 이용횟수와 대여소 번호를 데이터 프레임으로 출력하라

df_2 = df.groupby(['day_name', '대여소번호']).size().to_frame().sort_values(by=['day_name', 0], ascending=False).reset_index().rename(columns={0:'size'})
df_2.drop_duplicates('day_name', keep='first').reset_index(drop=True)

 

34. 나이대별 대여구분 코드의 (일일권/전체횟수) 비율을 구한 후 가장 높은 비율을 가지는 나이대를 확인하라. 일일권의 경우 일일권 과 일일권(비회원)을 모두 포함하라

daily = df[(df['대여구분코드']=='일일권') | (df['대여구분코드']=='일일권(비회원)')]['연령대코드'].value_counts().sort_index()
daily

total = df['연령대코드'].value_counts().sort_index()
total 

ration = (daily/total).sort_values(ascending=False)
ration

 

35. 연령대별 평균 이동거리를 구하여라

df.groupby('연령대코드')['이동거리'].mean().to_frame().reset_index()

 

36. 연령대 코드가 20대인 데이터를 추출하고,이동거리값이 추출한 데이터의 이동거리값의 평균 이상인 데이터를 추출한다.최종 추출된 데이터를 대여일자, 대여소 번호 순서로 내림차순 정렬 후 1행부터 200행까지의 탄소량의 평균을 소숫점 3째 자리까지 구하여라

df_2 = df[(df['연령대코드']=='20대')]
co2 = df_2[df_2['이동거리'] >= df_2['이동거리'].mean()].sort_values(by=['대여일자', '대여소번호'], ascending=False).reset_index(drop=True).iloc[0:200]['탄소량'].astype(float).mean()

 

37. 6월 7일 ~10대의 “이용건수”의 중앙값은?

df[(df['대여일자']=='2021-06-07') & (df['연령대코드']=='~10대')]['사용시간'].median()

 

38. 평일 (월~금) 출근 시간대(오전 6,7,8시)의 대여소별 이용 횟수를 구해서 데이터 프레임 형태로 표현한 후 각 대여시간별 이용 횟수의 상위 3개 대여소와 이용횟수를 출력하라

df_daily = df[(df['day_name'].isin(['Monday', 'Wednesday', 'Friday', 'Tuesday', 'Thursday'])) & (df['대여시간'].isin([6,7,8]))]
df_daily.reset_index(drop=True, inplace=True)

df_daily.groupby(['대여시간', '대여소번호']).size().to_frame().rename(columns={0:'이용건수'}).sort_values(by='이용건수', ascending=False).groupby('대여시간').head(3)

 

39. 이동거리의 평균 이상의 이동거리 값을 가지는 데이터를 추출하여 추출데이터의 이동거리의 표본표준편차 값을 구하여라

df[df['이동거리']>=df['이동거리'].mean()].reset_index(drop=True)['이동거리'].std()

 

40. 남성(‘M’ or ‘m’)과 여성(‘F’ or ‘f’)의 이동거리값의 평균값을 구하여라

print('남자:', df[df['성별'].isin(['M', 'm'])]['이동거리'].mean())
print('여자:', df[df['성별'].isin(['F', 'f'])]['이동거리'].mean())

 

# 4. 전세계 행복도 지표 데이터 

# 데이터 출처 :https://www.kaggle.com/unsdsn/world-happiness(참고, 데이터 수정)
# 데이터 설명 : 전세계 행복도 지표 조사
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/happy2/happiness.csv

 

41. 데이터는 2018년도와 2019년도의 전세계 행복 지수를 표현한다. 각년도의 행복랭킹 10위를 차지한 나라의 행복점수의 평균을 구하여라

df[df['행복랭킹']==10]['점수'].mean()

42. 데이터는 2018년도와 2019년도의 전세계 행복 지수를 표현한다. 각년도의 행복랭킹 50위이내의 나라들의 각각의 행복점수 평균을 데이터프레임으로 표시하라

df[df['행복랭킹']<=50].groupby('년도')['점수'].mean().to_frame()

 

43. 2018년도 데이터들만 추출하여 행복점수와 부패에 대한 인식에 대한 상관계수를 구하여라

df[df['년도']==2018][['점수', '부패에 대한인식']].corr().iloc[0,1]

 

44. 2018년도와 2019년도의 행복랭킹이 변화하지 않은 나라명의 수를 구하여라

len(df[['행복랭킹', '나라명']])-len(df[['행복랭킹', '나라명']].drop_duplicates())

 

45. 2019년도 데이터들만 추출하여 각변수간 상관계수를 구하고 내림차순으로 정렬한 후 상위 5개를 데이터 프레임으로 출력하라. 컬럼명은 v1,v2,corr으로 표시하라

df_1 = df[df['년도']==2018].corr().unstack().to_frame().reset_index().rename(columns={'level_0': 'level_0', 'level_1': 'level_1', 0:'corr'}).sort_values(by='corr', ascending =False)
df_1[df_1['corr']!=1].reset_index(drop=True).head(5)

 

46. 각 년도별 하위 행복점수의 하위 5개 국가의 평균 행복점수를 구하여라

df.groupby('년도').tail(5).groupby('년도')['점수'].mean().to_frame()

 

47. 2019년 데이터를 추출하고 해당데이터의 상대 GDP 평균 이상의 나라들과 평균 이하의 나라들의 행복점수 평균을 각각 구하고 그 차이값을 출력하라

df_19 = df[df['년도']==2019]
df_19_over = df_19[df_19['상대GDP']>=df_19['상대GDP'].mean()]['점수'].mean()
df_19_down = df_19[df_19['상대GDP']<=df_19['상대GDP'].mean()]['점수'].mean()
df_19_over-df_19_down

 

48. 각년도의 부패에 대한인식을 내림차순 정렬했을때 상위 20개 국가의 부패에 대한인식의 평균을 구하여라

df.sort_values(['년도', '부패에 대한인식'], ascending=False).groupby('년도').head(20).groupby('년도')[['부패에 대한인식']].mean()

 

49. 2018년도 행복랭킹 50위 이내에 포함됐다가 2019년 50위 밖으로 밀려난 국가의 숫자를 구하여라

df_18 = df[df['년도']==2018].iloc[0:50]
df_18_top = df_18[['행복랭킹', '나라명']]

df_19 = df[df['년도']==2019].iloc[0:50]
df_19_top = df_19[['행복랭킹', '나라명']]

len(set(df_18_top['나라명'])-set(df_19_top['나라명'])) # set 중복 제거

50. 2018년,2019년 모두 기록이 있는 나라들 중 년도별 행복점수가 가장 증가한 나라와 그 증가 수치는?

- 틀림!

 

 

# 5. 지역구 에너지 소비량 데이터

# 데이터 출처 : https://archive.ics.uci.edu/ml/datasets/Power+consumption+of+Tetouan+city (참고, 데이터 수정)
# 데이터 설명 : 기온, 습도,바람풍속에 따른 도시의 3개 지역구의 에너지 소비량
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/consum/Tetuan City power consumption.csv

 

51. DateTime컬럼을 통해 각 월별로 몇개의 데이터가 있는지 데이터 프레임으로 구하여라

df['DateTime'] = pd.to_datetime(df['DateTime'])
df.groupby(df['DateTime'].dt.month).size()

 

52. 3월달의 각 시간대별 온도의 평균들 중 가장 낮은 시간대의 온도를 출력하라

df['DateTime'] = pd.to_datetime(df['DateTime'])
df_3month = df[df['DateTime'].dt.month==3].reset_index(drop=True)

df_3month.groupby(df_3month['DateTime'].dt.hour)['Temperature'].mean().min()

 

53. 3월달의 각 시간대별 온도의 평균들 중 가장 높은 시간대의 온도를 출력하라

df_3month = df[df['DateTime'].dt.month==3]
df_3month.groupby(df_3month['DateTime'].dt.hour)['Temperature'].mean().max()

 

54. Zone 1 Power Consumption 컬럼의 value값의 크기가 Zone 2 Power Consumption 컬럼의 value값의 크기보다 큰 데이터들의 Humidity의 평균을 구하여라

df[df['Zone 1 Power Consumption']>df['Zone 2  Power Consumption']]['Humidity'].mean()

 

55. 각 zone의 에너지 소비량의 상관관계를 구해서 데이터 프레임으로 표기하라

df.iloc[:, -3:].corr()

 

56. Temperature의 값이 10미만의 경우 A, 10이상 20미만의 경우 B,20이상 30미만의 경우 C, 그 외의 경우 D라고 할때 각 단계의 데이터 숫자를 구하여라

A = df[df['Temperature']<10]
B = df[(df['Temperature']>=10) & (df['Temperature']<20)]
C = df[(df['Temperature']>=20) & (df['Temperature']<30)]
D = df[(df['Temperature']>=30)]

print('A:', A.shape)
print('B:', B.shape)
print('C:', C.shape)
print('D:', D.shape)

 

57. 6월 데이터중 12시의 Temperature의 표준편차를 구하여라

df[(df['DateTime'].dt.month==6) & (df['DateTime'].dt.hour==12)]['Temperature'].std()

 

58. 6월 데이터중 12시의 Temperature의 분산을 구하여라

df[(df['DateTime'].dt.month==6) & (df['DateTime'].dt.hour==12)]['Temperature'].var()

 

59. Temperature의 평균이상의 Temperature의 값을 가지는 데이터를 Temperature를 기준으로 정렬 했을때 4번째 행의 Humidity 값은?

df[(df['Temperature'])>=(df['Temperature'].mean())].sort_values(by='Temperature').reset_index(drop=True)['Humidity'][3]

 

60. Temperature의 중간값 이상의 Temperature의 값을 가지는 데이터를Temperature를 기준으로 정렬 했을때 4번째 행의 Humidity 값은?

df[(df['Temperature']>=df['Temperature'].median())].sort_values(by='Temperature').reset_index(drop=True)['Humidity'][3]

 

 

# 6. 포켓몬 정보 데이터

# 데이터 출처 : https://www.kaggle.com/abcsds/pokemon (참고, 데이터 수정)
# 데이터 설명 : 포켓몬 정보
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/pok/Pokemon.csv

61. Legendary 컬럼은 전설포켓몬 유무를 나타낸다.전설포켓몬과 그렇지 않은 포켓몬들의 HP평균의 차이를 구하여라

df.groupby('Legendary')['HP'].mean()[0]-df.groupby('Legendary')['HP'].mean()[1]

62. Type 1은 주속성 Type 2 는 부속성을 나타낸다. 가장 많은 부속성 종류는 무엇인가?

df['Type 2'].value_counts().index[0]

63. 가장 많은 Type 1 의 종의 평균 Attack 을 평균 Defense로 나눈값은?

df_at_mean = df[df['Type 1'] == df['Type 1'].value_counts().index[0]]['Attack'].mean()
df_de_mean = df[df['Type 1'] == df['Type 1'].value_counts().index[0]]['Defense'].mean()

print(df_at_mean/df_de_mean)

64. 포켓몬 세대(Generation) 중 가장많은 Legendary를 보유한 세대는 몇세대인가?

df[df['Legendary']==True][['Generation', 'Legendary']].value_counts(ascending=False).index[0]

 

65. ‘HP’, ‘Attack’, ‘Defense’, ‘Sp. Atk’, ‘Sp. Def’, ‘Speed’ 간의 상관 계수중 가장 절댓값이 큰 두 변수와 그 값을 구하여라

df_corr = df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']].corr().unstack().reset_index().rename(columns = {0: 'corr'})
df_corr[df_corr['corr']!=1].sort_values(by='corr', ascending=False).reset_index(drop=True).iloc[1]

 

66. 각 Generation의 Attack으로 오름차순 정렬시 상위 3개 데이터들(18개)의 Attack의 전체 평균을 구하여라

df[['Generation', 'Attack']].sort_values('Attack', ascending=True).groupby('Generation')['Attack'].head(3).mean()

 

67. 각 Generation의 Attack으로 내림차순 정렬시 상위 5개 데이터들(30개)의 Attack의 전체 평균을 구하여라

df[['Generation', 'Attack']].sort_values('Attack', ascending=False).groupby('Generation')['Attack'].head(5).mean()

 

68. 가장 흔하게 발견되는 (Type1 , Type2) 의 쌍은 무엇인가?

df[['Type 1', 'Type 2']].value_counts().index[0]

 

69. 한번씩만 존재하는 (Type1 , Type2)의 쌍의 갯수는 몇개인가?

print(len(df[['Type 1', 'Type 2']].value_counts()==1))

70. 한번씩만 존재하는 (Type1 , Type2)의 쌍을 각 세대(Generation)은 각각 몇개씩 가지고 있는가?

틀림!

 

# 7. 대한민국 체력장 데이터 

# 데이터 출처 : 국민체육진흥공단 (문화 빅데이터플랫폼) (참고, 데이터 수정)
# 데이터 설명 : 대한민국 국민 체력장 평가
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/body/body.csv

71. 전체데이터의 수축기혈압(최고) - 이완기혈압(최저)의 평균을 구하여라

df['수축기혈압(최고) : mmHg'].mean()-df['이완기혈압(최저) : mmHg'].mean()

 

72. 50~59세의 신장평균을 구하여라

df[(df['측정나이']>=50) & (df['측정나이']<=59)]['신장 : cm'].mean()

 

73. 연령대 (20~29 : 20대 …) 별 인원수를 구하여라

df['연령대'] = df['측정나이']//10 *10
df['연령대'].value_counts()

 

74. 연령대 (20~29 : 20대 …) 별 등급의 숫자를 데이터 프레임으로 표현하라

df.groupby(['연령대', '등급'])['등급'].size()

 

75. 남성 중 A등급과 D등급의 체지방률 평균의 차이(큰 값에서 작은 값의 차)를 구하여라

a = df[(df['측정회원성별']=='M') & (df['등급']=='A')]['체지방율 : %'].mean()
b = df[(df['측정회원성별']=='M') & (df['등급']=='D')]['체지방율 : %'].mean()
b-a

 

76. 여성 중 A등급과 D등급의 체중의 평균의 차이(큰 값에서 작은 값의 차)를 구하여라

a = df[(df['측정회원성별']=='F') & (df['등급']=='A')]['체중 : kg'].mean()
b = df[(df['측정회원성별']=='F') & (df['등급']=='D')]['체중 : kg'].mean()

b-a

 

77. bmi는 자신의 몸무게(kg)를 키의 제곱(m)으로 나눈값이다. 데이터의 bmi 를 구한 새로운 컬럼을 만들고 남성의 bmi 평균을 구하여라

df['bmi'] = (df['체중 : kg']) / (df['신장 : cm']/100)**2 # cm니까 미터로 바꿔줘야해서100나눔
df[df['측정회원성별']=='M']['bmi'].mean()

 

78. bmi보다 체지방율이 높은 사람들의 체중평균을 구하여라

df[(df['체지방율 : %'])>= (df['bmi'])]['체중 : kg'].mean()

 

79. 남성과 여성의 악력 평균의 차이를 구하여라

df.groupby('측정회원성별')['악력D : kg'].mean()[1] - df.groupby('측정회원성별')['악력D : kg'].mean()[0]

 

80. 남성과 여성의 교차윗몸일으키기 횟수의 평균의 차이를 구하여라

df.groupby('측정회원성별')['교차윗몸일으키기 : 회'].mean()[1]-df.groupby('측정회원성별')['교차윗몸일으키기 : 회'].mean()[0]

 

# 8. 기온 강수량 데이터

# 데이터 출처 : https://data.kma.go.kr/cmmn/static/staticPage.do?page=intro
# 데이터 설명 : 2020년도 이화동(서울) , 수영동(부산)의 시간단위의 기온과 강수량
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/weather/weather2.csv

81. 여름철(6월,7월,8월) 이화동이 수영동보다 높은 기온을 가진 시간대는 몇개인가?

df['time'] = pd.to_datetime(df['time'])
df_summer = df[df['time'].dt.month.isin([6,7,8])].reset_index(drop=True)
df_summer.head()

print(len(df_summer[df_summer['이화동기온']>=df_summer['수영동기온']]))

 

82. 이화동과 수영동의 최대강수량의 시간대를 각각 구하여라

print('이화동:', df[df['이화동강수']==df['이화동강수'].max()]['time'].dt.time)
print('수영동:', df[df['수영동강수']==df['수영동강수'].max()]['time'].dt.time)

 

# 9. 서비스 이탈 예측 데이터 

# 데이터 출처 : https://www.kaggle.com/shubh0799/churn-modelling 에서 변형
# 데이터 설명 : 고객의 신상정보 데이터를 통한 회사 서비스 이탈 예측 (종속변수 : Exited)
Data url =  https://raw.githubusercontent.com/Datamanim/datarepo/main/churn/train.csv

83. 남성 이탈(Exited)이 가장 많은 국가(Geography)는 어디이고 이탈 인원은 몇명인가?

df[df['Gender']=='Male'][['Geography', 'Exited']].groupby('Geography')['Exited'].sum().sort_values(ascending=False).head(1)
df[(df['Gender']=='Male') & (df['Exited']==1)].groupby('Geography').size().sort_values(ascending=False).to_frame().reset_index().rename(columns={0:'count'}).iloc[0:1]

 

84. 카드를 소유(HasCrCard ==1)하고 있으면서 활성멤버(IsActiveMember ==1) 인 고객들의 평균 나이를 소숫점이하 4자리까지 구하여라

round(df[(df['HasCrCard']==1) & (df['IsActiveMember']==1)]['Age'].mean(), 4)

 

85. Balance 값이 중간값 이상을 가지는 고객들의 CreditScore의 표준편차를 소숫점이하 3자리까지 구하여라

round(df[(df['Balance'])>=(df['Balance'].median())]['CreditScore'].std(),3)

 

# 10. 성인 건강검진 데이터 

# 데이터 출처 :https://www.data.go.kr/data/15007122/fileData.do (참고, 데이터 수정)
# 데이터 설명 : 2018년도 성인의 건강검 진데이터 (흡연상태 1- 흡연, 0-비흡연 )
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/smoke/train.csv

86. 수축기혈압과 이완기 혈압기 수치의 차이를 새로운 컬럼(‘혈압차’) 으로 생성하고, 연령대 코드별 각 그룹 중 ‘혈압차’ 의 분산이 5번째로 큰 연령대 코드를 구하여라

df['혈압차'] = df['수축기혈압']-df['이완기혈압']
df.groupby('연령대코드(5세단위)')['혈압차'].var().sort_values(ascending=False).to_frame().index[4]

 

87. 비만도를 나타내는 지표인 WHtR는 허리둘레 / 키로 표현한다. 일반적으로 0.58이상이면 비만으로 분류한다. 데이터중 WHtR 지표상 비만인 인원의 남/여 비율을 구하여라

df['WHtR'] = df['허리둘레']/df['신장(5Cm단위)']
df[df['WHtR']>=0.58]['성별코드'].value_counts()['M']/df[df['WHtR']>=0.58]['성별코드'].value_counts()['F']

 

# 11. 자동차 보험가입 예측 데이터 

# 데이터 출처 :https://www.kaggle.com/anmolkumar/health-insurance-cross-sell-prediction(참고, 데이터 수정)
# 데이터 설명 : 자동차 보험 가입 예측
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/insurance/train.csv

88. Vehicle_Age 값이 2년 이상인 사람들만 필터링 하고 그중에서 Annual_Premium 값이 전체 데이터의 중간값 이상인 사람들을 찾고, 그들의 Vintage값의 평균을 구하여라

df_2 = df[(df['Vehicle_Age']=='> 2 Years')]
df_2[(df_2['Annual_Premium'])>=(df['Annual_Premium'].median())]['Vintage'].mean()

 

89. vehicle_age에 따른 각 성별(gender)그룹의 Annual_Premium값의 평균을 구하여 아래 테이블과 동일하게 구현하라

df_2 = df.groupby(['Vehicle_Age', 'Gender'], as_index=False)['Annual_Premium'].mean()
df_2

* pivot_table(index, columns, values) 지정해서 테이블 만들기

df_2.pivot_table(index = 'Vehicle_Age', columns='Gender', values='Annual_Premium')

 

# 12. 핸드폰 가격 예측 데이터

# 데이터 출처 :https://www.kaggle.com/iabhishekofficial/mobile-price-classification?select=train.csv(참고, 데이터 수정)
# 데이터 설명 : 핸드폰 가격예측 (price_range컬럼 0(저렴) ~3(매우비쌈) 범위 )
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/mobile/train.csv

90. price_range 의 각 value를 그룹핑하여 각 그룹의 n_cores 의 빈도가 가장높은 value와 그 빈도수를 구하여라

df[['price_range', 'n_cores']].groupby(['price_range', 'n_cores'], as_index=False).size().sort_values(0).groupby(level=0).tail(1)

91. price_range 값이 3인 그룹에서 상관관계가 2번째로 높은 두 컬럼과 그 상관계수를 구하여라

df_2 = df[df['price_range']==3].corr().unstack().reset_index().rename(columns={0:'corr'}).dropna().sort_values(by='corr', ascending=False)
df_2

df_2[df_2['corr']!=1].reset_index(drop=True).iloc[1] # 자기자신과의 corr 제외

 

# 13. 비행 탑승 경험 만족 데이터 

# 데이터 출처 :https://www.kaggle.com/teejmahal20/airline-passenger-satisfaction?select=train.csv (참고, 데이터 수정)
# 데이터 설명 : 비행탑승 경험 만족도 (satisfaction 컬럼 : ‘neutral or dissatisfied’ or satisfied ) (83123, 24) shape
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/airline/train.csv

92. Arrival Delay in Minutes 컬럼이 결측치인 데이터들 중 ‘neutral or dissatisfied’ 보다 ‘satisfied’의 수가 더 높은 Class는 어디 인가?

df_2 = df[df['Arrival Delay in Minutes'].isna()][['Class', 'satisfaction']]
df_2[(df_2['satisfaction']=='statisfied')>=(df_2['satisfaction']=='neutral or dissatisfied')].groupby('Class').size().index[0]

 

# 14. 수질 음용성 여부 데이터 

# 데이터 출처 :https://www.kaggle.com/adityakadiwal/water-potability
# 데이터 설명 : 수질 음용성 여부 (Potablillity 컬럼 : 0 ,1 )
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/waters/train.csv

93. ph값은 상당히 많은 결측치를 포함한다. 결측치를 제외한 나머지 데이터들 중 사분위값 기준 하위 25%의 값들의 평균값은?

df = df.dropna()
df[(df['ph']<=df['ph'].describe()['25%'])]['ph'].mean()

 

# 15. 의료 비용 예측 데이터 

# 데이터 출처 :https://www.kaggle.com/mirichoi0218/insurance/code(참고, 데이터 수정)
# 데이터 설명 : 의료비용 예측문제
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/MedicalCost/train.csv

94. 흡연자와 비흡연자 각각 charges의 상위 10% 그룹의 평균의 차이는?

* 비율 나누기? quantile(n)

a = train[train['smoker']=='yes'].quantile(0.9)['charges'].mean()
b = train[train['smoker']=='no'].quantile(0.9)['charges'].mean()
a-b

 

# 16. 킹카운티 주거지 가격 예측 문제 데이터 

# 데이터 출처 :https://www.kaggle.com/harlfoxem/housesalesprediction (참고, 데이터 수정)
# 데이터 설명 : 킹카운티 주거지 가격 예측문제
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/kingcountyprice/train.csv

95. bedrooms 의 빈도가 가장 높은 값을 가지는 데이터들의 price의 상위 10%와 하위 10%값의 차이를 구하여라

df[df['bedrooms']==3]['price'].quantile(0.9)-df[df['bedrooms']==3]['price'].quantile(0.1)

 

# 17. 대학원 입학가능성 데이터 

# 데이터 출처 :https://www.kaggle.com/mohansacharya/graduate-admissions(참고, 데이터 수정)
# 데이터 설명 : 대학원 입학 가능성 예측
daa_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/admission/train.csv

96. Serial No. 컬럼을 제외하고 ‘Chance of Admit’을 종속변수, 나머지 변수를 독립변수라 할때, 랜덤포레스트를 통해 회귀 예측을 할 떄 변수중요도 값을 출력하라 (시드값에 따라 순서는 달라질수 있음)

df = df.drop(columns='Serial No.')

target = 'Chance of Admit'

y = df[target]
x = df.drop(columns=target, axis=1)

from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor()
model.fit(x, y)

pd.DataFrame({'importance':model.feature_importances_},x.columns).sort_values('importance',ascending=False)
model.feature_importances_

 

# 18. 레드와인 퀄리티 예측 데이터

# 데이터 출처 :https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009(참고, 데이터 수정)
# 데이터 설명 : 레드 와인 퀄리티 예측문제
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/redwine/train.csv

97. quality 값이 3인 그룹과 8인 데이터그룹의 각 컬럼별 독립변수의 표준편차 값의 차이를 구할때 그값이 가장 큰 컬럼명을 구하여라

df[(df['quality']==3) | (df['quality']==8)].reset_index(drop=True).std().sort_values(ascending=False).index[0]

 

# 19. 약물 분류 데이터 

# 데이터 출처 :https://www.kaggle.com/prathamtripathi/drug-classification(참고, 데이터 수정)
# 데이터 설명 : 투약하는 약을 분류
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/drug/train.csv

 

98. 남성들의 연령대별 (10살씩 구분 0~9세 10~19세 …) Na_to_K값의 평균값을 구해서 데이터 프레임으로 표현하여라

df['Age_Group'] = df['Age']//10*10
df[df['Sex']=='M'].groupby('Age_Group')['Na_to_K'].mean().to_frame()

 

# 20. 사기회사 분류 데이터 

# 데이터 출처 :https://www.kaggle.com/sid321axn/audit-data(참고, 데이터 수정)
#데이터 설명 : 사기회사 분류
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/audit/train.csv

 

99. 데이터의 Risk 값에 따른 score_a와 score_b의 평균값을 구하여라

df.groupby('Risk')[['Score_A', 'Score_B']].mean()


# 21. 센서데이터 동작 유형 분류 데이터 

# 데이터 출처 :https://www.kaggle.com/kyr7plus/emg-4(참고, 데이터 수정)
# 데이터 설명 : 센서데이터로 동작 유형 분류
data_url = https://raw.githubusercontent.com/Datamanim/datarepo/main/muscle/train.csv

 

100. pose값에 따른 각 motion컬럼의 중간값의 가장 큰 차이를 보이는 motion컬럼은 어디이며 그값은?

df_2 = df.groupby('pose').median().T
df_2['diff'] = abs(df_2[0]-df_2[1]) # 절대값의 차이가 diff
df_2.sort_values(by='diff', ascending=False).index[0:2]

 

# 22. 현대 차량 가격 분류 문제 데이터

df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/hyundai/train.csv")
df.head()

 

101.정보수(row)가 가장 많은 상위 3차종의 price 값의 각 평균은?

df[df['model'].isin(df.groupby('model').size().sort_values(ascending=False).head(3).index)].groupby('model')['price'].mean().to_frame()

 

# 23. 당뇨 여부 판단 데이터

df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/diabetes/train.csv")
df.head()

 

102. Outcome 값에 따른 각 그룹의 각 컬럼의 평균 차이를 구하여라

df_1 = df.groupby('Outcome').mean().T # 전치 T
df_1 

df_1['diff'] = df_1[1] - df_1[0]
df_1

 

# 24. 넷플릭스 주식 데이터

df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/nflx/NFLX.csv")
df.head()

 

103. 매년 5월달의 open 가격의 평균값을 데이터프레임으로 표현하라

df['Date'] = df['Date'].dt.strftime('%Y-%m')
df.groupby('Date')['Open'].mean().to_frame()

 

# 25. NBN 선수 능력치 데이터

df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/nba/nba.csv",encoding='latin',sep=';')
df.head()

 

104. TM 컬럼은 각 팀의 이름을 의미한다. TOR 팀의 평균 나이를 소수 4짜리까지 구하여라

round(df[df['Tm']=='TOR']['Age'].mean(),4)

 

105. Pos 컬럼은 포지션을 의미한다. 전체 선수 중 최소 나이대의 선수들을 필터하고, 그 들중 가장 많은 포지션은 무엇인지 확인하라

df[df['Age']==df['Age'].min()]['Pos'].value_counts().index[0]

 

106. 선수들의 이름은 first_name+공백+last_name으로 이루어졌다. 가장 많은 first_name은 무엇이며 몇회 발생했는가?

df['Player'].str.split(' ').str[0].str.lower().value_counts().sort_values(ascending=False).head(1)

 

107. PTS 컬럼은 경기당 평균득점수이다. 각 포지션별로 경기당 평균 득점수의 평균을 구하여라

df.groupby('Pos')['PTS'].mean()

 

108. G컬럼은 참여한 경기의 숫자이다. 각 팀별로 가장 높은 경기참여 수를 가진 선수들의 경기 참여 숫자의 평균을 구하여라

df.sort_values(['Tm', 'G']).groupby('Tm').tail(1)['G'].mean()

 

109. Tm의 값이 MIA이며 Pos는 C or PF인 선수의 MP 값의 평균은?

df_1 = df[df['Tm']=='MIA']
df_1[df_1['Pos'].isin(['C', 'PF'])]['MP'].mean()

 

110. 전체 데이터중 G의 평균값의 1.5배 이상인 데이터들만 추출했을때, 3P값의 평균은?

df[(df['G'])>=(df['G'].mean()*1.5)]['3P'].mean()

 

 

111. Age의 평균 이상인 그룹과, 평균 미만인 그룹간의 G 값의 평균 차이는?

a = df[df['Age']>=df['Age'].mean()]['G'].mean()
b = df[df['Age']<=df['Age'].mean()]['G'].mean()
a-b

 

112. 평균 나이가 가장 젊은 팀은 어디인가?

df.groupby('Tm')['Age'].mean().sort_values(ascending=False).tail(1).index[0]

 

113. Pos 그룹별 평균 MP 값을 구하여라

df.groupby('Pos')['MP'].mean()

 

728x90
Comments