이 블로그에서 다루는 자격증 내용은 모두의 문제집에서도 학습할 수 있습니다.
실습 파일 다운로드
파일 화면 오른쪽 위의 다운로드 버튼을 누르면 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))
'자격증 > 빅데이터 분석 기사' 카테고리의 다른 글
| 빅분기 실기 작업형 3유형 연습문제 8제: CSV와 주피터 노트북 (0) | 2026.09.15 |
|---|---|
| 빅분기 실기 작업형 2유형 연습문제 5제: CSV와 주피터 노트북 (1) | 2026.09.11 |
| 빅데이터분석기사 필기 정리: 1~4과목 핵심 개념 20개 글 모음 (0) | 2026.08.24 |
| 빅데이터분석기사 필기 데이터 시각화·결과 활용 정리: 차트 선택·모형 운영 (1) | 2023.04.07 |
| 빅데이터분석기사 필기 교차검증·가설검정 정리: 과적합·규제·최적화 (0) | 2023.04.07 |
댓글