subindev 님의 블로그

[실기] 빅데이터 분석기사 작업 1유형(35문제) 본문

데이터 관련/빅데이터 분석기사

[실기] 빅데이터 분석기사 작업 1유형(35문제)

subindev 2025. 6. 24. 18:49

캐글 놀이터 작업 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') - 해당 형식으로 나오나 시험에선 몰라도 됨