일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FLUTTER
- 빅분기
- 주말도 식지않아
- late 키워드
- 빅분기 필기
- null 억제 연산자
- null 병합 연산자
- 1일 1쿼리
- mysql mongo 성능 비교
- 빅분기 판다스 100제
- 주말도 한다
- 작업 1유형
- null check 연산자
- my_sql
- SQL
- 주말에도 1일 1쿼리
- 컴포지션과 집합
- rdbms nosql 차이
- 빅분기 1유형
- ?. ?? ! late
- 앱개발 가보자고
- null safety
- 빅분기 캐글놀이터
- MySQL
- 비동기 처리
- 빅분기 필기 pdf
- 빅데이터분석기사
- 빅데이터 분석기사
- flutter 믹스인
- 오늘은 1일 2쿼리
- Today
- Total
subindev 님의 블로그
[실기] 빅데이터 분석기사 작업 1유형(35문제) 본문
캐글 놀이터 작업 1유형(35문제)
https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr
Big Data Certification KR
퇴근후딴짓 의 빅데이터 분석기사 실기 (Python, R tutorial code) 커뮤니티
www.kaggle.com
빅데이터 분석기사 실기 취득에 굉장히 도움이 많이 된 캐글 놀이터 입니다!
데이터도 주어지고 예시 코드까지 볼 수 있기에 너무나 공부하기에 좋았습니다
양질의 자료를 제공해주신 '퇴근후 딴짓'님에게 너무 감사합니다 🥹
2025/06/12(목)
1-1 이상치(IQR)
# 데이터에서 IQR을 활용해 Fare컬럼의 이상치를 찾고, 이상치 데이터의 여성 수를 구하시오
import pandas as pd
df = pd.read_csv('../input/titanic/train.csv')
# IQR 구하기
Q1 = df['Fare'].quantile(0.25)
Q3 = df['Fare'].quantile(0.75)
IQR = Q3 - Q1
min = Q1 - (1.5 * IQR)
max = Q3 + (1.5 * IQR)
# 이상치 데이터
outData1 = df[df['Fare'] < min]
outData2 = df[df['Fare'] > max]
print(outData1.shape, outData2.shape) #(0, 116)
# 이상치 데이터에서 여성 수 구하기
print(outData2['Sex' == 'female']) #True, False 출력
sum(outData2['Sex'=='female']) #True인 값 세기
1-2 이상치 (소수점 분류)
# 주어진 데이터에서 이상치(소수점 나이)를 찾고 올림, 내림, 버림(절사)했을때
#3가지 모두 이상치 'age' 평균을 구한 다음 모두 더하여 출력하시오
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
# 소수점인 데이터 - 기존 값에서 내림한 값을 뺐을 때 0이 아닌 수 ex) 5.2 - 5 = 0.2
df = df[df['age']-np.floor(df['age'])!=0]
m_ceil = np.ceil(df['age']).mean()
m_floor = np.floor(df['age']).mean()
m_trunc = np.trunc(df['age']).mean()
print(m_ceil + m_floor + m_trunc)
1-3 결측치 처리 + map()
# 주어진 데이터에서 결측치가 80%이상 되는 컬럼은(변수는) 삭제하고,
# 80% 미만인 결측치가 있는 컬럼은 'city'별 중앙값으로 값을 대체하고
#'f1'컬럼의 평균값을 출력하세요!
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.isnull().sum()
df.shape # (100,8)
# 결측치 80% 이상되는 열 삭제
df.isnull().sum() / df.shape[0] # 0.8이 넘는 열 - f3
df = df.drop(['f3'], axis = 1)
# city 데이터 확인
df['city'].unique()
city = ['서울','부산','대구','경기']
# city 별 중앙값
s = df.loc[df['city']=='서울', 'f1'].median()
b = df.loc[df['city']=='부산', 'f1'].median()
d = df.loc[df['city']=='대구', 'f1'].median()
k = df.loc[df['city']=='경기', 'f1'].median()
# f1 결측치 채우기
df['f1'] = df['f1'].fillna(df['city'].map({'서울's,'부산':b,'대구':d,'경기':k}))
# 결과 출력
df['f1'].mean()
1-4 왜도와 첨도 .skew() .kurt() .np.log1p
# 주어진 데이터 중 train.csv에서 'SalePrice'컬럼의 왜도와 첨도를 구한 값과,
# 'SalePrice'컬럼을 스케일링(log1p)로 변환한 이후 왜도와 첨도를 구해 모두 더한 다음
# 소수점 2째자리까지 출력하시오
import pandas as pd
import numpy as np
df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
df['SalePrice'].head()
# 'SalePrice'컬럼 왜도와 첨도계산
s1 = df['SalePrice'].skew()
k1 = df['SalePrice'].kurt()
print("왜도:" , s1)
print("첨도:" , k1)
# 'SalePrice'컬럼 로그변환
df['SalePrice'] = np.log1p(df['SalePrice'])
# 'SalePrice'컬럼 왜도와 첨도계산
s2 = df['SalePrice'].skew()
k2 = df['SalePrice'].kurt()
print("왜도:" , s1)
print("첨도:" , k1)
print(round(s1+s2+k1+k2,2))
1-5 표준편차 .std()
# 주어진 데이터 중 basic1.csv에서 'f4'컬럼 값이 'ENFJ'와 'INFP'인 l
# 'f1'의 표준편차 차이를 절대값으로 구하시오
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head()
# 조건에 맞는 데이터 (ENFJ, INFP)
df.loc[df['f4']=='ENFJ','f1']
df.loc[df['f4']=='INFP', 'f1']
# 조건에 맞는 f1의 표준편차 (ENFJ, INFP)
std_enfj = df.loc[df['f4']=='ENFJ','f1'].std()
std_infp = df.loc[df['f4']=='INFP', 'f1'].std()
std_enfj , std_infp
# 두 표준편차 차이 절대값 출력 - 절대값 np.abs()
result =np.abs(std_enfj - std_infp)
1-6 결측치 제거 및 그룹합 .dropna(subset=[’ ’])
# 주어진 데이터 중 basic1.csv에서 'f1'컬럼 결측 데이터를 제거하고,
# 'city'와 'f2'을 기준으로 묶어 합계를 구하고,
# 'city가 경기이면서 f2가 0'인 조건에 만족하는 f1 값을 구하시오
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head()
# f1 결측치 제거
df.isnull().sum()
df.shape #(100,8)
df = df.dropna(subset=['f1']) # 결측치가 있는 행 모두 삭제
df.shape #(69,8)
# city, f2를 기준으로 묶어 합계 구하기
df2 =. df.groupby(['city','f2']).sum()
# 조건에 맞는 값 출력
print(df2.iloc[0].f1)
1-7 값 변경 .replace( ‘A’, ‘B’)
# 'f4'컬럼의 값이 'ESFJ'인 데이터를 'ISFJ'로 대체하고,
# 'city'가 '경기'이면서 'f4'가 'ISFJ'인 데이터 중 'age'컬럼의 최대값을 출력하시오!
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head()
df[df['f4']=='ESFJ']
# 값 변경하기
df['f4'] = df['f4'].replace('ESFJ','ISFJ')
result = df[( df['city'] == '경기' ) & ( df['f4'] == 'ISFJ' )]
result['age'].max()
1-8 누적합과 보간 df.fillna(method = 'bfill'|'ffill')
# 주어진 데이터 셋에서 'f2' 컬럼이 1인 조건에 해당하는 데이터의 'f1'컬럼 누적합을 계산한다.
# 이때 발생하는 누적합 결측치는 바로 뒤의 값을 채우고. (단, 결측치 바로 뒤의 값이 없으면 다음에 나오는 값을 채워넣는다
# 누적합의 평균값을 출력한다.
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
# 누적합 .cumsum()
df2 = df[df['f2']==1]['f1'].cumsum()
# 결측치 처리 (뒤에 나오는 값으로 채움)
df2 = df2.fillna(method = 'bfill')
#.fillna(method = 'ffill') #앞에 나오는 값
# 평균 출력
print(df2.mean())
2025/06/13(금)
1-9 수치형 변수 z-score 표준화
# 주어진 데이터에서 'f5'컬럼을 표준화(Standardization
# (Z-score Normalization))하고 그 중앙값을 구하시오
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head(2)
# MinMaxScaler - 0 ~ 1 사이의 값으로
# StandardScaler - 0 의 양쪽으로
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['f5'] = scaler.fit_transform(df[['f5']]) # DataFrame 형식
df['f5'].median()
1-10 여존슨과 박스카스 데이터 분포 → 정규 분포
# 라이브러리 및 데이터 불러오기
import pandas as pd
import numpy as np
from sklearn.preprocessing import power_transform
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head(5)
df = df[df['age']>=20]
df['f1'] = df['f1'].fillna(df['f1'].mode()[0])
df.isnull().sum()
# 'f1' 데이터 여-존슨 yeo-johnson 값 구하기
# 디폴트로 표준화까지 완료 - 여존슨(정규 분포) 변환 후 표준화 된 값
df['y'] = power_transform(df[['f1']])
# 현재 우리가 필요한 건 변환 값이므로 표준화 False
df['y'] = power_transform(df[['f1']],standardize = False) # 여존슨 변환 값
# 'f1'데이터 박스-콕스 box-cox 값 구하기
# 정규분포 후 표준화
df['b'] = power_transform(df[['f1']],method='box-cox')
# 정규분포
df['b'] = power_transform(df[['f1']],method='box-cox',standardize = False)
round(sum(np.abs(df['y']-df['b'])),2)
1-11 min-max 표준화
# min-max스케일링 기준 상하위 5% 구하기
# 주어진 데이터에서 'f5'컬럼을 min-max 스케일 변환한 후, 상위 5%와 하위 5% 값의 합을 구하시오
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['f5_scaled'] = scaler.fit_transform(df[['f5']])
df['f5_scaled_2'] = df['f5'].transform(lambda x: ((x-x.min())/(x.max - x.min)))
print(df.head())
lower = df['f5_scaled'].quantile(0.05)
upper = df['f5_sclaed'].quantile(0.95)
print(lower+upper)
2025/06/14(토)
1-12 head() / tail()
# 주어진 데이터에서 상위 10개 국가의 접종률 평균과 하위 10개 국가의 접종률
# 평균을 구하고, 그 차이를 구해보세요
# (단, 100%가 넘는 접종률 제거, 소수 첫째자리까지 출력)
import pandas as pd
import numpy as np
df = pd.read_csv("../input/covid-vaccination-vs-death/covid-vaccination-vs-death_ratio.csv")
print(df.head())
print(df.info())
# 비율이므로 100이 넘어가는 오류 값 제거
df = df[df['ratio']<= 100]
# Series를 reset_index를 통해 DataFrame으로 변경
target = df.groupyby('country')['ratio'].max().reset_index()
answer = target.sort_values(by='ratio', ascending = False)
top_10 = answer.head(10)['ratio'].mean()
dowm_10 = answer.tail(10)['ratio'].mean()
print(top_10 - down_10)
1-13 상관 관계 구하기 .corr() - 나와 나 행 삭제하기
import pandas as pd
import numpy as np
# 데이터 불러오기
df = pd.read_csv("../input/red-wine-quality-cortez-et-al-2009/winequality-red.csv")
df.head()
# 맨마지막 행은 quality-quality 상관 관계이므로 제외
df.corr()[:-1] # 맨마지막 행 삭제
df_corr = df_corr.reset_index()
print(df_corr)
corr_max = df_corr['quality'].abs().max()
corr_min = df_corr['quality'].abs().min()
# 코드 복잡하니 콘솔창에서 부호 찾아서 해결함 (시험에서도 가능)
print(corr_max,corr_min)
round(corr_max + corr_min, 2)
1-14 groupby([ ‘A’ , ‘B’ ])
ex)city와 f4를 기준으로 f5의 평균값을 구한 다음
# city와 f4를 기준으로 f5의 평균값을 구한 다음,
# f5를 기준으로 상위 7개 값을 모두 더해 출력하시오 (소수점 둘째자리까지 출력)
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
df.head()
# groupby index 2개 가능
df = df.groupby(['city','f4'])['f5'].mean().reset_index()
print(df)
answer = df.sort_values(by= 'f5',ascending = False).head(7)
round(sum(answer['f5']),2)
1-15 상위 20개 슬라이싱 & 조건
# 주어진 데이터 셋에서 age컬럼 상위 20개의 데이터를 구한 다음
# f1의 결측치를 중앙값으로 채운다. f4가 ISFJ와 f5가 20 이상인
import pandas as pd
# 데이터 불러오기
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
print(df.head())
# Age 기준 상위 20개
df = df.sort_values(by = 'age', ascending = False).head(20)
# 결측치 중앙값으로 처리
df['f1'] = df['f1'].fillna(df['f1'].median())
# 조건에 해당하는 값의 평균
df.loc[ (df['f4']=='ISFJ') & (df['f5']>=20)]['f1'].mean()
1-16 분산 .var()
# 주어진 데이터 셋에서 f2가 0값인 데이터를 age를 기준으로 오름차순 정렬하고
# 앞에서 부터 20개의 데이터를 추출한 후
# f1 결측치(최소값)를 채우기 전과 후의 분산 차이를 계산하시오
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
df = df[df['f2']==0].sort_values(by='age',ascending=True)
df = df.head(20)
# 분산 .var
var1 = df['f1'].var()
df['f1'] = df['f1'].fillna(df['f1'].min())
var2 = df['f1'].var()
round(var1 - var2 , 2) # 38.44
1-17 시계열1 - dt.year
# 2022년 5월 Sales의 중앙값을 구하여라
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic2.csv")
# Date 날짜형식으로 변경 후 Year Month 컬럼 추가
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df = df[( df['Year'] == 2022 ) &( df['Month'] == 5)]
df['Sales'].median()
2025/06/15(일)
1-18 시계열2 - dt.dayofweek - 월화수목금(012345)
# 주어진 데이터에서 2022년 5월 주말과 평일의 sales컬럼 평균값 차이를 절대값으로 구하시오
# (소수점 둘째자리까지 출력, 반올림)
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic2.csv", parse_dates=['Date'])
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
# dayofweek
df['Day'] = df['Date'].dt.dayofweek
df = df[( df['Year'] == 2022 )&( df['month'] == 5 )]
# dayofweek - 0~6
weekend_df = df[df['Day]'>=5]
weekday_df = df[df['Day']<=4]
weekend = weekend_df['Sales'].mean()
weekday = weekday_df['Sales'].mean()
print(round(weekend - weekday),1)
1-19 시계열3 - df.loc[조건,열] = df.loc[조건,열] * 0.8
# 주어진 데이터에서 2022년 월별 Sales 합계 중 가장 큰 금액과
# 2023년 월별 Sales 합계 중 가장 큰 금액의 차이를 절대값으로 구하시오.
# 단 Events컬럼이 '1'인경우 80%의 Salse값만 반영함 (최종값은 소수점 반올림 후 정수 출력)
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic2.csv")
# DateTime 형식으로 변경
df['Date'] = pd.to_datetime(df['Date'])
# 날짜 관련 컬럼 추가
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day
df['dayofweek'] = df['Date'].dt.dayofweek
# Events == 1 인 데이터 80% 반영을 위한 컬럼 추가
df['Sales2'] = df['Sales'].copy()
# 80% 반영 시 뒤에도 조건 데이터에 0.8 / df['Sales2'] * 0.8 로 하면 반영되지 않음
df.loc[df['Events']==1 , 'Sales2'] = df.loc[df['Events']==1 , 'Sales2'] * 0.8
df_2022 = df[df['year'] == 2022]
df_2023 = df[df['year'] == 2023]
max_2022 = df_2022.groupby('month')['Sales2'].sum().max()
max_2023 = df_2023.groupby('month')['Sales2'].sum().max()
round(abs(max_2022 - max_2023))
2025/06/16(월)
1-20 데이터 병합 pd.merge (left , right, how = ‘left’, on = ‘열이름’)
# basic1 데이터와 basic3 데이터를 basic1의 'f4'값을 기준으로 병합하고,
# 병합한 데이터에서 r2결측치를 제거한다음, 앞에서 부터 20개 데이터를 선택하고
#'f2'컬럼 합을 구하시오
# 라이브러리 및 데이터 로드
import pandas as pd
b1 = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
b3 = pd.read_csv("../input/bigdatacertificationkr/basic3.csv")
# 데이터 병합
df = pd.merge(left = b1, right= b3, how= 'left', on= 'f4')
# 결츠기 처리
print(df.isnull().sum())
print(df.shape) # (100,10)
df = df.dropna[subset = ['r2']]
print(df.shape) # (83,10)
df = df.reset_index()
# 앞에서 부터 20개 데이터를 선택하고 'f2'컬럼 합
df.head[20]['f2'].sum()
1-21 구간 나누기 - 등급 pq.qcut(df[’열이름’], q=3)
# 주어진 데이터 중 'age'컬럼 이상치를 제거하고,
# 동일한 개수로 나이 순으로 3그룹으로 나눈 뒤 각 그룹의 중앙값을 더하시오
# (이상치는 음수(0포함), 소수점 값)
import pandas as pd
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
# age 이상치 처리 (음수, 소수점 제거)
print('기존 데이터 shape', df.shape) #(100, 9)
df = df[df['age'] > 0]
df = df[df['age'] - np.floor(df['age']) == 0]
print('이상치 처리 후 shape', df.shape) #(91, 9)
# age 3개의 등급으로 나누기 - pd.qcut(df['age'], q=3)
df['range'] = pd.qcut(df['age'], q=3, labels=['g1','g2','g3'])
print(df)
print(df['range'].value_counts)
g1_med = df[df['range'] == 'g1']['age'].median()
g2_med = df[df['range'] == 'g2']['age'].median()
g3_med = df[df['range'] == 'g3']['age'].median()
print(g1_med + g2_med + g3_med)
1-22 시계열4 - 주간 매출합 df.resample(’W’) * Date를 set_index()
# 주어진 데이터(basic2.csv)에서 주 단위 Sales의 합계를 구하고,
# 가장 큰 값을 가진 주와 작은 값을 가진 주의 차이를 구하시오(절대값)
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic2.csv")
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date') # df.resample('W') 전 필수
df_w = df.resample('W').sum()
max_sales = df_w['Sales'].max()
min_sales = df_w['Sales'].min()
print(max_sales - min_sales)
1-23 중복제거 drop_duplicates(subset = [’age’])
# f1의 결측치를 채운 후 age 컬럼의 중복 제거 전과 후의 'f1' 중앙값 차이를 구하시오
# 결측치는 'f1' 데이터에서 큰 값 순으로 정렬했을 때 10번째에 위치한 값으로 채운다.
# 중복 데이터 발생시 뒤에 나오는 데이터를 삭제함 - 최종 결과값은 절대값으로 출력
import pandas as pd
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.tail()
# f1 결측치 처리
top10 = df['f1'].sort_values(ascending = False).iloc[9] #88.0
df['f1'] = df['f1'].fillna(top10)
# 중복 제거 전 중앙값
result1 = df['f1'].median()
# age 컬럼 중복 제거
print(df.shape) # (100,8)
df = df.drop_duplicates(subset=['age'])
print(df.shape) # (71, 8)
# 중복 제거 후 중앙값
result2 = df['f1'].median()
# 절댓값 차이
abs(result1 - result2)
2025/06/17(화)
1-24 한 행씩 내리기 df.shift(1)
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic2.csv")
# EDA
df.isnull().sum()
df.head()
# 이전 날짜의 PV를 오늘의 previous_PV로 - 시차 컬럼 만들기
df['previous_PV'] = df['PV'].shift(1)
# 맨 앞행 결측치는 뒷 값으로 채우기 *ffill - 앞의 값으로 채워넣기 front | back
df['previous_PV'] = df['previous_PV'].fillna(method = 'bfill')
# 조건에 맞는 1일 이전 PV의 합
df = df[(df['Events']==1)&(df['Sales']<=1000000)]
result = df['previous_PV'].sum()
print(result)
1-25 str 함수 - df[’mbti’].str[0] == ‘E’
https://www.kaggle.com/code/agileteam/t1-25-str-slicing
# T1-25. basic1 데이터에서 f4가 E로 시작하면서 부산에 살고 20대인 사람은 몇 명일까요?
import pandas as pd
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
df = df[(df['f4'].str[0] == 'E') & (df['city'] == '부산')]
df = df[df['age'].between(20,29)]
len(df)
1-26 str.contains() | str.replace(’ ‘ ,’)
https://www.kaggle.com/code/agileteam/t1-26-str-contains
# T1-26. menu컬럼에 "라떼" 키워드가 있는 데이터의 수는?
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/payment.csv")
# 오곡 라떼, 오곡라떼 - 통일을 위해 띄어쓰기 제거
df['menu'] = df['menu'].str.replace(' ','')
result = df['menu'].str.contains('라떼').sum()
print(result)
1-27 str.replace | map( { ‘a’: 1, ‘b’: 2 … })
https://www.kaggle.com/code/agileteam/t1-27-str-contains-replace
# T1-27. 바닐라라떼 5점, 카페라떼 3점, 아메리카노 2점, 나머지 0점이다 총 메뉴의 점수를 더한 값은?
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/payment.csv")
# 카페 라떼 , 카페라떼 - 띄어쓰기 제거
df['menu'] = df['menu'].str.replace(' ','')
# map을 이용하여 score 점수 항목 생성
df['score'] = df['menu'].map({'바닐라라떼': 5, '카페라떼': 3, '아메리카노': 2})
# 나머지는 0으로 처리
df['score'] = df['score'].fillna(0)
df['score'].sum()
1-28 조건에 맞는 값 - 13시 이전 주문건 수 상위 1일 날짜
https://www.kaggle.com/code/agileteam/t1-28-value-counts-index
# T1-28. 시간(hour)이 13시 이전(13시 포함하지 않음) 데이터 중
# 가장 많은 결제가 이루어진 날짜(date)는? (date 컬럼과 동일한 양식으로 출력)
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/payment.csv")
df.head()
# 13시 이전 주문 건수를 세서 제일 위 값 출력
df[df['hour']<13]['date'].value_counts().index[0]
# +) 주문건 수가 아닌 결제 금액이 가장 많은 날을 구해야 한다면
df2 = df[df['hour']<13]
df3 = df2.groupby(['date'])['price'].sum()
df3.sort_values(ascending=False).index[0]
1-29 pd.to_datetime( df[' '], format= '%Y%m%d' )
https://www.kaggle.com/code/agileteam/t1-29-datetime-format
# 12월인 데이터 수를 구하여라
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/payment.csv")
df.info()
#df['date'] - int54 ex) 20221224 원래 데이터 형식
df['date'] = pd.to_datetime(df['date'], format= '%Y%m%d')
df['month'] = df['date'].dt.month
sum(df['month'] == 12) # 11
1-30 - 29번 심화
https://www.kaggle.com/code/agileteam/t1-30-datetime-percent
# 1-30. 12월 25일 결제 금액(price)은 12월 총 결제금액의 몇 %인가? (정수로 출력)
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/payment.csv")
df['date'] = pd.to_datetime(df['date'], format= 'Y%m%d%')
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df_12 = df[df['month']==12]
df_12_25 = df_12[df['day']==25]
print(round( df_12_25['price'].sum() /df_12['price'].sum() * 100))
2025/06/18(수)
1-31 pd.melt( df, id_vars=[’Name’] )
https://www.kaggle.com/code/agileteam/t1-31-melt
# 1-31. 수학, 영어, 국어 점수 중 사람과 과목에 상관없이 가장 상위 점수 5개를 모두 더하고 출력하시오.
import pandas as pd
df = pd.DataFrame({'Name': {0: '김딴짓', 1: '박분기', 2: '이퇴근'},
'수학': {0: 90, 1: 93, 2: 85},
'영어': {0: 92, 1: 84, 2: 86},
'국어': {0: 91, 1: 94, 2: 83},})
df = pd.melt(df, id_vars=['Name'])
df['value'].sort_values(ascending = False).head(5).sum() #460
1-32 pd.melt( df, id_vars=[’Name’] , value_vars=[’수학’ , ’영어’])
https://www.kaggle.com/code/agileteam/t1-33-melt2
import pandas as pd
df = pd.DataFrame({'Name': {0: '김딴짓', 1: '박분기', 2: '이퇴근'},
'수학': {0: 90, 1: 93, 2: 85},
'영어': {0: 92, 1: 84, 2: 86},
'국어': {0: 91, 1: 94, 2: 83},})
df = pd.melt(df,id_vars=['Name'], value_vars = ['수학','영어'])
df = df[df['value'] >= 90]
int(df['value'].mean())
1-33 하위 4문제
https://www.kaggle.com/code/agileteam/t1-33-timedelta-py
import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/website.csv")
# 1. 세션 지속 기간을 분으로 계산하고 가장 긴 지속 시간을 출력하시오 (반올림 후 총 분만 출력)
# object 형식 날짜 형식으로 바꾸기
df['StartTime'] = pd.to_datetime(df['StartTime'])
df['EndTime'] = pd.to_datetime(df['EndTime'])
# 세션 지속기간 구한 뒤 분으로 표시하기
df['StayTime'] = df['EndTime'] - df['StartTime']
df['StayTime'] = df['StayTime'].dt.total_seconds()/60
print(df['StayTime'].max()) # 300
#2. 가장 많이 머무른 Page를 찾고 그 페이지의 머문 평균 시간을 구하시오 (반올림 후 총 시간만 출력)
top_page = df['Page'].value_counts().index[0]
result = df['StayTime'][df['Page']== top_page].mean()
round(result/60) #3
# 3. 사용자들이 가장 활발히 활동하는 시간대(예: 새벽, 오전, 오후, 저녁)를 분석하세요.
# 이를 위해 하루를 4개의 시간대로 나누고 각 시간대별로 가장 많이 시작된 세션의 수를 계산하고,
# 그 중에 가장 많은 세션 수를 출력하시오
def time_cut(hour):
if 0 <= hour < 6:
return '새벽'
elif 6<= hour < 12:
return '오전'
elif 12<= hour < 18:
return '오후'
elif 18<= hour < 24:
return '저녁'
else :
return '에러'
df['time_slot'] = df['StartTime'].dt.hour.apply(time_cut)
df['time_slot'].value_counts().index[0] # 새벽
df['time_slot'].value_counts().iloc[0] #2447
# 4. user가 가장 많이 접속 했던 날짜를 출력하시오. (예, 2023-02-17)
# 시간 까지 존재하는 datetime 에서 dt.date를 활용하면 date만 이용 가능
result = df['StartTime'].dt.date.value_counts().index[0]
result
# result.strftime('%Y-%m-%d') - 해당 형식으로 나오나 시험에선 몰라도 됨
'데이터 관련 > 빅데이터 분석기사' 카테고리의 다른 글
[실기] 빅데이터 분석기사 python - pandas 100제 문제 (1) | 2025.06.24 |
---|---|
[자격증] 빅데이터 분석기사 필기 요약정리(pdf 파일 첨부) (1) | 2025.06.14 |