본문 바로가기
자격증/빅데이터 분석 기사

빅분기 실기 작업형 1유형 50제: CSV 2개와 주피터 노트북

by char_lie 2026. 9. 10.
반응형

빅분기 실기 1·2·3유형 연습 모음집 보기 →

이 블로그에서 다루는 자격증 내용은 모두의 문제집에서도 학습할 수 있습니다.

모두의 문제집에서 학습하기 →

실습 파일 다운로드

CSV 2개 + 주피터 노트북 ZIP 다운로드

파일 화면 오른쪽 위의 다운로드 버튼을 누르면 ZIP 파일을 받을 수 있습니다.

ZIP에는 CSV 2개와 주피터 노트북 1개가 들어 있습니다. 압축을 풀고 bigbungi-type1-50.ipynb를 여세요. data 폴더는 노트북과 같은 위치에 둡니다.

노트북의 첫 셀로 파일을 확인한 뒤, 각 문제의 코드 셀에서 풀이를 작성하세요. 블로그와 노트북의 문제 번호는 같습니다.

employees.csv — 직원 데이터 · 문제 01~24

문제 01. 정보 항목 수

직원 데이터의 전체 열 수를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 01 정답·파이썬 풀이 보기

정답: 10

풀이의 핵심: 결측값이 있는 열도 정보 항목에 포함된다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.shape[1]
print(int(answer))

문제 02. 전체 결측 셀 수

직원 데이터의 모든 열을 대상으로 결측 셀 수의 합계를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 02 정답·파이썬 풀이 보기

정답: 148

풀이의 핵심: 결측 행 개수가 아니라 결측 셀 개수이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.isna().sum().sum()
print(int(answer))

문제 03. 결측값이 있는 직원

어느 열이든 결측값이 하나 이상 있는 직원 행 수를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 03 정답·파이썬 풀이 보기

정답: 106

풀이의 핵심: 한 행에 결측이 여러 개 있어도 직원은 한 명이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.isna().any(axis=1).sum()
print(int(answer))

문제 04. 보상 정보가 모두 있는 직원

salary와 bonus가 모두 결측이 아닌 직원만 남겼을 때 행 수를 구하시오. 다른 열의 결측값은 무시한다.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 04 정답·파이썬 풀이 보기

정답: 109

풀이의 핵심: 모든 열을 대상으로 제거하면 다른 결과가 된다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.dropna(subset=['salary', 'bonus']).shape[0]
print(int(answer))

문제 05. 결측률이 높은 열 수

전체 직원 수를 분모로 한 열별 결측률이 15%를 초과하는 열의 개수를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 05 정답·파이썬 풀이 보기

정답: 2

풀이의 핵심: 15% 초과이며 15% 이상이 아니다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = (df.isna().mean() > 0.15).sum()
print(int(answer))

문제 06. 완전한 행의 만족도

어느 열에도 결측값이 없는 행만 남긴 뒤 satisfaction 평균을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 06 정답·파이썬 풀이 보기

정답: 2.9190

풀이의 핵심: 평균 계산 전에 행 전체의 완전성을 확인한다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.dropna()['satisfaction'].mean()
print(f'{answer:.4f}')

문제 07. 보너스 결측을 0으로

bonus 결측값을 0으로 채운 뒤 전체 직원의 bonus 평균을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 07 정답·파이썬 풀이 보기

정답: 652.1538

풀이의 핵심: 결측을 제외한 평균과 대체 후 전체 평균은 다르다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df['bonus'].fillna(0).mean()
print(f'{answer:.4f}')

문제 08. 연봉의 평균 대체 후 중앙값

결측이 아닌 전체 salary의 평균으로 salary 결측값을 채운 뒤, 전체 salary의 중앙값을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 08 정답·파이썬 풀이 보기

정답: 5828.0435

풀이의 핵심: 원래 존재하던 연봉은 바꾸지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

s = df['salary']
answer = s.fillna(s.mean()).median()
print(f'{answer:.4f}')

문제 09. 평가등급의 최빈값 대체

grade 결측값을 결측이 아닌 grade의 최빈값으로 채운 뒤 grade가 B인 직원 수를 구하시오. 최빈값이 여러 개면 알파벳순으로 가장 앞선 값을 사용한다.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 09 정답·파이썬 풀이 보기

정답: 43

풀이의 핵심: 범주형 결측값도 수치형과 같은 fillna로 채울 수 있다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

m = df['grade'].mode().sort_values().iloc[0]
answer = df['grade'].fillna(m).eq('B').sum()
print(int(answer))

문제 10. 평균 대체 전후 표준편차 차이

결측이 아닌 satisfaction의 표본 표준편차를 A라 한다. 결측을 그 열의 전체 평균으로 채운 후 표본 표준편차를 B라 할 때 A-B를 구하시오. 모두 ddof=1을 사용한다.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 10 정답·파이썬 풀이 보기

정답: 0.0890

풀이의 핵심: 대체 전후 관측값 수가 다르며 뺄셈 순서를 바꾸지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

s = df['satisfaction']
answer = s.std(ddof=1) - s.fillna(s.mean()).std(ddof=1)
print(f'{answer:.4f}')

문제 11. 앞 구간의 기준값 적용

원래 파일의 첫 60행에서 결측이 아닌 salary의 중앙값을 구한다. 그 값으로 전체 파일의 salary 결측값을 채운 뒤, 마지막 40행의 salary 평균을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 11 정답·파이썬 풀이 보기

정답: 5815.2500

풀이의 핵심: 전체 중앙값이나 마지막 구간 중앙값을 사용하지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

m = df.iloc[:60]['salary'].median()
s = df['salary'].fillna(m)
answer = s.iloc[-40:].mean()
print(f'{answer:.4f}')

문제 12. 부서별 유효한 만족도 최소 개수

department별로 결측이 아닌 satisfaction 개수를 계산한다. 그 개수들 중 최솟값을 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 12 정답·파이썬 풀이 보기

정답: 27

풀이의 핵심: size는 결측과 무관한 전체 행 수라서 요구와 다르다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

answer = df.groupby('department')['satisfaction'].count().min()
print(int(answer))

문제 13. 부서별 연봉 범위 합

department별로 유효한 salary의 최댓값-최솟값을 계산한다. 부서별 범위들을 모두 더하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 13 정답·파이썬 풀이 보기

정답: 20085

풀이의 핵심: 결측 연봉은 최댓값·최솟값 계산에서 제외한다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

g = df.groupby('department')['salary'].agg(['max', 'min'])
answer = (g['max'] - g['min']).sum()
print(int(answer))

문제 14. 부서 평균으로 연봉 결측 대체

salary 결측값을 해당 department의 유효한 salary 평균으로 채운다. 대체 후 전체 salary의 표본 표준편차(ddof=1)를 구하시오. 모든 부서에는 유효 연봉이 있다.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 14 정답·파이썬 풀이 보기

정답: 1490.2924

풀이의 핵심: 전체 평균으로 한 번에 채우지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

m = df.groupby('department')['salary'].transform('mean')
answer = df['salary'].fillna(m).std(ddof=1)
print(f'{answer:.4f}')

문제 15. 부서 내 연봉 순위 구간

salary 결측 행을 제외한다. department별 salary 내림차순 순위를 method="dense"로 계산한다. 순위가 2 또는 3인 직원의 employee_id 합계를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 15 정답·파이썬 풀이 보기

정답: 16643

풀이의 핵심: 그룹별 고유 연봉의 두 번째·세 번째 수준을 선택한다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

df = df.dropna(subset=['salary'])
r = df.groupby('department')['salary'].rank(method='dense', ascending=False)
answer = df.loc[r.isin([2, 3]), 'employee_id'].sum()
print(int(answer))

문제 16. 부서 내 보너스 결측률

department별 bonus 결측률을 %로 계산한다. 가장 높은 부서의 결측률을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 16 정답·파이썬 풀이 보기

정답: 23.5294

풀이의 핵심: 분모는 각 부서의 전체 직원 수이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

df['missing'] = df['bonus'].isna()
answer = df.groupby('department')['missing'].mean().max() * 100
print(f'{answer:.4f}')

문제 17. 부서·지점 피벗의 평균 합

department를 행, branch를 열, 유효 salary 평균을 값으로 하는 피벗 테이블을 만든다. central 열의 부서별 평균들을 더하시오. 셀 계산에서는 결측 salary를 제외한다.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 17 정답·파이썬 풀이 보기

정답: 24472.4952

풀이의 핵심: 지점 전체 연봉의 합이나 평균이 아니라 부서 평균들의 합이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

p = df.pivot_table(index='department', columns='branch', values='salary', aggfunc='mean')
answer = p['central'].sum()
print(f'{answer:.4f}')

문제 18. 결측 대체 후 상위 연봉 집단

salary가 결측인 직원을 먼저 제외한다. 남은 자료에서 bonus 결측을 해당 department의 유효 bonus 중앙값으로 채운다. 총보상=salary+bonus를 만들고 총보상 내림차순, employee_id 오름차순으로 정렬한다. 상위 12명의 satisfaction 평균을 구하되 satisfaction 결측은 평균 계산에서 제외한다.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 18 정답·파이썬 풀이 보기

정답: 2.7940

풀이의 핵심: 행 제거 → 그룹 대체 → 정렬 → 선택 → 평균 순서가 중요하다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

df = df.dropna(subset=['salary']).copy()
m = df.groupby('department')['bonus'].transform('median')
df['bonus'] = df['bonus'].fillna(m)
df['total'] = df['salary'] + df['bonus']
x = df.sort_values(['total', 'employee_id'], ascending=[False, True]).head(12)
answer = x['satisfaction'].mean()
print(f'{answer:.4f}')

문제 19. 연봉 결측률이 낮은 부서만 선택

원자료에서 department별 salary 결측률이 15% 이하인 부서만 선택한다. 선택 자료의 salary 결측을 선택 자료 전체의 유효 salary 중앙값으로 채운 후 전체 salary 합계를 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 19 정답·파이썬 풀이 보기

정답: 707541.5000

풀이의 핵심: 선택 자료 전체 중앙값으로 채우며 부서별 중앙값은 쓰지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

rate = df['salary'].isna().groupby(df['department']).transform('mean')
x = df.loc[rate <= 0.15].copy()
answer = x['salary'].fillna(x['salary'].median()).sum()
print(f'{answer:.4f}')

문제 20. 만족도 결측 대체와 지점별 인원

satisfaction 결측값을 해당 branch의 유효 satisfaction 중앙값으로 채운다. 채운 satisfaction이 4 이상이고 remote_days가 2 이상인 직원의 수를 department별로 구한 뒤, 부서별 수 중 최댓값을 구하시오. remote_days 결측은 조건 불만족으로 처리한다.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 20 정답·파이썬 풀이 보기

정답: 6

풀이의 핵심: 서로 다른 두 그룹 기준을 혼동하지 않는다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

m = df.groupby('branch')['satisfaction'].transform('median')
s = df['satisfaction'].fillna(m)
x = df.loc[s.ge(4) & df['remote_days'].ge(2)]
answer = x.groupby('department').size().max()
print(int(answer))

문제 21. 결측 대체 후 하위 연봉 비중

salary 결측을 전체 유효 salary 평균으로 채운다. 대체 후 salary의 0.2 분위수를 선형 보간으로 구한다. 그 값 이하인 직원의 salary 합계를 전체 대체 후 salary 합계로 나누고 100을 곱하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 21 정답·파이썬 풀이 보기

정답: 13.2431

풀이의 핵심: 분모는 선택 집단이 아니라 모든 직원의 대체 후 연봉 합이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

s = df['salary'].fillna(df['salary'].mean())
q = s.quantile(0.2)
answer = s.loc[s <= q].sum() / s.sum() * 100
print(f'{answer:.4f}')

문제 22. 연봉·보너스 동시 결측과 순서 대체

salary와 bonus가 모두 결측인 행을 제거한다. 남은 자료에서 salary 결측은 전체 유효 salary 중앙값으로, bonus 결측은 0으로 채운다. (salary+bonus)/salary가 1.2를 초과하는 직원들의 employee_id 합계를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 22 정답·파이썬 풀이 보기

정답: 64532

풀이의 핵심: 분모가 연봉이고 분자는 총보상이다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

df = df.dropna(subset=['salary', 'bonus'], how='all').copy()
s = df['salary'].fillna(df['salary'].median())
b = df['bonus'].fillna(0)
answer = df.loc[(s + b) / s > 1.2, 'employee_id'].sum()
print(int(answer))

문제 23. 원본 기준 상위 연봉 보정

salary가 결측인 행을 제외하고 salary 내림차순, employee_id 오름차순으로 정렬한다. 앞 8행의 salary를 정렬 결과 9번째 행의 원래 salary로 바꾼다. 이 자료의 branch별 salary 평균 중 최댓값에서 최솟값을 뺀 값을 구하시오.

사용 파일: employees.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 23 정답·파이썬 풀이 보기

정답: 579.6304

풀이의 핵심: 지점별로 상위 8행을 바꾸는 것이 아니라 전체 상위 8행을 바꾼다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

df = df.dropna(subset=['salary'])
x = df.sort_values(['salary', 'employee_id'], ascending=[False, True]).copy()
v = x.iloc[8]['salary']
x.loc[x.index[:8], 'salary'] = v
s = x.groupby('branch')['salary'].mean()
answer = s.max() - s.min()
print(f'{answer:.4f}')

문제 24. 결측을 채운 뒤 달라진 순위

원래 bonus가 결측인 행을 표시해 둔다. 해당 department의 유효 bonus 평균으로 결측을 채운다. 대체 후 부서별 bonus 내림차순 method="min" 순위를 구한다. 원래 bonus가 결측이었고 대체 후 순위가 20 이하인 직원 수를 구하시오.

사용 파일: employees.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 24 정답·파이썬 풀이 보기

정답: 24

풀이의 핵심: 대체된 값이 동점 집단을 만들므로 순위 방식을 고정한다.

import pandas as pd

df = pd.read_csv('data/employees.csv')

missing = df['bonus'].isna()
df['bonus'] = df['bonus'].fillna(df.groupby('department')['bonus'].transform('mean'))
r = df.groupby('department')['bonus'].rank(method='min', ascending=False)
answer = (missing & r.le(20)).sum()
print(int(answer))
반응형

orders.csv — 주문 데이터 · 문제 25~50

문제 25. 마지막 열두 주문의 금액

파일의 마지막 12개 행에 있는 amount의 합계를 구하시오. 주문 상태를 제한하거나 정렬하지 않는다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 25 정답·파이썬 풀이 보기

정답: 1008500

풀이의 핵심: 마지막 주문일이 아니라 파일의 마지막 위치를 뜻한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df.tail(12)['amount'].sum()
print(int(answer))

문제 26. 서로 다른 고객 수

주문 데이터에 등장하는 서로 다른 customer_id의 개수를 구하시오. 모든 주문 상태를 포함한다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 26 정답·파이썬 풀이 보기

정답: 133

풀이의 핵심: 주문 건수와 고객 수를 구분한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df['customer_id'].nunique()
print(int(answer))

문제 27. 취소를 제외한 온라인 주문

status가 cancelled가 아니고 channel이 app 또는 web인 주문의 amount 합계를 구하시오. returned 상태는 포함한다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 27 정답·파이썬 풀이 보기

정답: 12843800

풀이의 핵심: 취소 제외를 결제 완료만 선택하는 것으로 해석하지 않는다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

mask = df['status'].ne('cancelled') & df['channel'].isin(['app', 'web'])
answer = df.loc[mask, 'amount'].sum()
print(int(answer))

문제 28. 상위 일곱 주문의 합

amount 내림차순, amount가 같으면 order_id 오름차순으로 정렬한 후 첫 7행의 amount 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 28 정답·파이썬 풀이 보기

정답: 1355900

풀이의 핵심: 상위 N개는 파일의 처음 N개와 다르다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.sort_values(['amount', 'order_id'], ascending=[False, True])
answer = x.head(7)['amount'].sum()
print(int(answer))

문제 29. 추가 반복 주문 수

customer_id가 앞선 행에 이미 등장한 경우를 중복 행으로 본다. 각 고객의 첫 등장 행은 제외하고 중복으로 판정되는 행 수를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 29 정답·파이썬 풀이 보기

정답: 227

풀이의 핵심: 고객의 주문이 k건이면 k-1행이 중복으로 계산된다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df.duplicated(subset=['customer_id'], keep='first').sum()
print(int(answer))

문제 30. 반복 주문 고객의 모든 주문

주문이 2건 이상인 고객에게 속한 주문 행 수를 구하시오. 해당 고객의 첫 번째 주문도 포함한다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 30 정답·파이썬 풀이 보기

정답: 329

풀이의 핵심: 중복의 추가분이 아니라 반복 고객의 전체 주문을 센다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df.duplicated(subset=['customer_id'], keep=False).sum()
print(int(answer))

문제 31. 고객별 마지막 파일 행

원래 파일 순서에서 customer_id별 마지막 등장 행 하나만 남긴다. 남은 행들의 amount 합계를 구하시오. 날짜로 정렬하지 않는다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 31 정답·파이썬 풀이 보기

정답: 9081300

풀이의 핵심: 파일상 마지막과 시간상 최근은 서로 다를 수 있다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df.drop_duplicates('customer_id', keep='last')['amount'].sum()
print(int(answer))

문제 32. 가장 이른 결제 주문의 수량

paid 주문만 남긴 후 order_date 오름차순, order_id 오름차순으로 정렬한다. 첫 15행의 quantity 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 32 정답·파이썬 풀이 보기

정답: 45

풀이의 핵심: YYYY-MM-DD 형식의 날짜는 이 데이터에서 문자열 정렬과 날짜순 정렬이 일치한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.loc[df['status'].eq('paid')].sort_values(['order_date', 'order_id'])
answer = x.head(15)['quantity'].sum()
print(int(answer))

문제 33. 결제 금액의 변동계수

paid 주문 amount의 표본 표준편차를 평균으로 나눈 뒤 100을 곱한 변동계수(%)를 구하시오. 표준편차는 ddof=1을 사용한다.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 33 정답·파이썬 풀이 보기

정답: 72.7408

풀이의 핵심: 추론통계가 아니라 주어진 공식으로 기술통계량을 계산한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

s = df.loc[df['status'].eq('paid'), 'amount']
answer = s.std(ddof=1) / s.mean() * 100
print(f'{answer:.4f}')

문제 34. 양 끝 구간을 잘라낸 평균

amount 오름차순, order_id 오름차순으로 정렬한다. 앞 18행과 뒤 18행을 제거한 후 남은 amount 평균을 구하시오. 분위수 경계 필터링으로 대체하지 않는다.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 34 정답·파이썬 풀이 보기

정답: 64234.2593

풀이의 핵심: 분위수와 같은 값이 중복되어도 제거 행 수는 고정이다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.sort_values(['amount', 'order_id'])
answer = x.iloc[18:-18]['amount'].mean()
print(f'{answer:.4f}')

문제 35. 할인율이 큰 주문

할인 전 금액을 quantity×unit_price로 정의하고 할인율=discount/할인 전 금액×100으로 계산한다. 할인율이 3% 이상인 주문의 quantity 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 35 정답·파이썬 풀이 보기

정답: 24

풀이의 핵심: 백분율과 0~1 비율을 구분한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

r = df['discount'] / (df['quantity'] * df['unit_price']) * 100
answer = df.loc[r >= 3, 'quantity'].sum()
print(int(answer))

문제 36. 합계가 1인 비중 변환

paid 주문만 남긴 후 각 주문의 amount를 paid 주문의 전체 amount 합계로 나누어 비중을 계산한다. 비중이 0.01을 초과하는 주문들의 비중 합계에 100을 곱한 값을 구하시오.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 36 정답·파이썬 풀이 보기

정답: 6.4937

풀이의 핵심: 부분집합의 금액으로 비중을 다시 계산하지 않는다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

s = df.loc[df['status'].eq('paid'), 'amount']
r = s / s.sum()
answer = r[r > 0.01].sum() * 100
print(f'{answer:.4f}')

문제 37. 2월 결제 주문금액

order_date를 날짜로 변환한다. 2025년 2월의 paid 주문 amount 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 37 정답·파이썬 풀이 보기

정답: 5056400

풀이의 핵심: 날짜 조건과 일반 문자열 조건을 함께 적용한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

d = pd.to_datetime(df['order_date'])
mask = d.dt.year.eq(2025) & d.dt.month.eq(2) & df['status'].eq('paid')
answer = df.loc[mask, 'amount'].sum()
print(int(answer))

문제 38. 양 끝을 포함한 날짜 구간

order_date가 2025-01-15 이상 2025-02-10 이하인 주문의 quantity 합계를 구하시오. 모든 주문 상태를 포함한다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 38 정답·파이썬 풀이 보기

정답: 391

풀이의 핵심: 정확한 시작일과 종료일을 포함한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

d = pd.to_datetime(df['order_date'])
answer = df.loc[d.between('2025-01-15', '2025-02-10'), 'quantity'].sum()
print(int(answer))

문제 39. 기록이 존재하는 주문일 수

paid 주문만 대상으로 서로 다른 order_date의 개수를 구하시오. 같은 날짜에 여러 주문이 있어도 하루로 센다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 39 정답·파이썬 풀이 보기

정답: 86

풀이의 핵심: 첫날과 마지막날의 차이가 아니라 실제 등장한 날짜 수이다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

d = pd.to_datetime(df.loc[df['status'].eq('paid'), 'order_date'])
answer = d.nunique()
print(int(answer))

문제 40. 마지막 열흘의 주문

전체 주문의 최대 order_date를 기준일로 한다. 기준일을 포함해 직전 9일, 즉 총 10일 구간에 해당하는 주문 수를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 40 정답·파이썬 풀이 보기

정답: 37

풀이의 핵심: 기준일에서 10일을 빼면 포함되는 날짜 수가 11일이 된다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

d = pd.to_datetime(df['order_date'])
end = d.max()
start = end - pd.Timedelta(days=9)
answer = d.between(start, end).sum()
print(int(answer))

문제 41. 매장별 결제금액 최대

paid 주문만 남기고 store_id별 amount 합계를 계산한다. 매장별 합계 중 최댓값을 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 41 정답·파이썬 풀이 보기

정답: 2761000

풀이의 핵심: 개별 주문금액의 최대와 매장 합계의 최대를 구분한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

answer = df.loc[df['status'].eq('paid')].groupby('store_id')['amount'].sum().max()
print(int(answer))

문제 42. 고객 다양성이 큰 매장

store_id별 서로 다른 customer_id의 수를 구한다. 이 수가 40 이상인 매장의 개수를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 42 정답·파이썬 풀이 보기

정답: 4

풀이의 핵심: 같은 고객의 반복 주문은 한 명으로 센다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

s = df.groupby('store_id')['customer_id'].nunique()
answer = s.ge(40).sum()
print(int(answer))

문제 43. 매장별 결제 주문건수의 중앙값

store_id별 paid 주문건수를 구하고 8개 매장의 주문건수 중앙값을 구하시오. paid 주문이 없는 매장은 0건으로 처리한다.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 43 정답·파이썬 풀이 보기

정답: 33.0000

풀이의 핵심: 빈 집단을 누락하지 않고 0건으로 포함한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

s = df.loc[df['status'].eq('paid')].groupby('store_id').size().reindex(range(1, 9), fill_value=0)
answer = s.median()
print(f'{answer:.4f}')

문제 44. 매장 내 큰 주문의 수량

paid 주문만 남긴다. 각 주문 amount를 해당 store_id의 paid amount 합계로 나눈다. 이 비율이 0.08 이상인 주문의 quantity 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 44 정답·파이썬 풀이 보기

정답: 54

풀이의 핵심: paid 필터를 분자와 분모에 동일하게 적용한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.loc[df['status'].eq('paid')].copy()
r = x['amount'] / x.groupby('store_id')['amount'].transform('sum')
answer = x.loc[r >= 0.08, 'quantity'].sum()
print(int(answer))

문제 45. 주문 경로별 취소 비율 차이

channel별 전체 주문 중 cancelled 주문 비율을 %로 계산한다. 가장 높은 비율에서 가장 낮은 비율을 뺀 퍼센트포인트 차이를 구하시오.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 45 정답·파이썬 풀이 보기

정답: 4.2692

풀이의 핵심: 퍼센트포인트 차이는 두 비율을 직접 빼는 것이다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

df['cancel'] = df['status'].eq('cancelled')
s = df.groupby('channel')['cancel'].mean() * 100
answer = s.max() - s.min()
print(f'{answer:.4f}')

문제 46. 그룹 내 합계의 첫 절반 초과 주문

paid 주문만 남기고 store_id, order_date, order_id를 모두 오름차순으로 정렬한다. 매장별 amount 누적합이 해당 매장 paid amount 총합의 50%를 처음 초과하는 주문을 한 건씩 고른다. 선택된 주문들의 amount 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 46 정답·파이썬 풀이 보기

정답: 906300

풀이의 핵심: 전체 누적합이 아니라 매장별로 누적합을 초기화한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.loc[df['status'].eq('paid')].sort_values(['store_id', 'order_date', 'order_id']).copy()
x['cum'] = x.groupby('store_id')['amount'].cumsum()
total = x.groupby('store_id')['amount'].transform('sum')
answer = x.loc[x['cum'] > total * 0.5].groupby('store_id').head(1)['amount'].sum()
print(int(answer))

문제 47. 주문 경로별 상태 비중

channel을 행, status를 열로 하는 교차표를 만들고 각 행의 합이 1이 되도록 정규화한다. app 경로에서 returned 상태의 비율에 100을 곱한 값을 구하시오.

사용 파일: orders.csv

답안 형식: 소수점 이하 4자리의 수 1개. 최종 값만 f"{answer:.4f}" 형식으로 출력한다.

문제 47 정답·파이썬 풀이 보기

정답: 9.9174

풀이의 핵심: 전체 주문이 아니라 app 주문을 분모로 사용한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

p = pd.crosstab(df['channel'], df['status'], normalize='index')
answer = p.loc['app', 'returned'] * 100
print(f'{answer:.4f}')

문제 48. 매장·경로별 금액 피벗

store_id를 행, channel을 열, amount 합계를 값으로 하는 피벗 테이블을 만든다. store_id가 3이고 channel이 web인 셀의 값을 구하시오. 모든 상태를 포함한다.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 48 정답·파이썬 풀이 보기

정답: 604900

풀이의 핵심: pivot_table의 기본 평균 집계를 그대로 쓰면 안 된다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

p = df.pivot_table(index='store_id', columns='channel', values='amount', aggfunc='sum', fill_value=0)
answer = p.loc[3, 'web']
print(int(answer))

문제 49. 없는 조합을 0으로 채운 피벗

quantity가 6이고 amount가 120000 이상인 주문만 남긴다. store_id 1~8을 행, app/web/store를 열로 하여 주문건수 표를 만들고 없는 조합은 0으로 채운다. 24개 셀 중 0인 셀 수를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 49 정답·파이썬 풀이 보기

정답: 5

풀이의 핵심: 관측된 조합만 세는 것이 아니라 전체 8×3 조합을 확인한다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

x = df.loc[df['quantity'].eq(6) & df['amount'].ge(120000)]
p = pd.crosstab(x['store_id'], x['channel']).reindex(index=range(1, 9), columns=['app', 'web', 'store'], fill_value=0)
answer = p.eq(0).sum().sum()
print(int(answer))

문제 50. 월말 주문의 상위 매장

order_date가 해당 월의 마지막 날인 paid 주문만 남긴다. store_id별 amount 합계를 구해 가장 큰 합계를 구하시오.

사용 파일: orders.csv

답안 형식: 정수 1개. 단위나 천 단위 쉼표는 쓰지 않는다.

문제 50 정답·파이썬 풀이 보기

정답: 202200

풀이의 핵심: 모든 달을 31일로 고정하지 않는다.

import pandas as pd

df = pd.read_csv('data/orders.csv')

d = pd.to_datetime(df['order_date'])
x = df.loc[d.dt.is_month_end & df['status'].eq('paid')]
answer = x.groupby('store_id')['amount'].sum().max()
print(int(answer))
반응형

댓글