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

빅분기 실기 작업형 2유형 연습문제 5제: CSV와 주피터 노트북

by char_lie 2026. 9. 11.
반응형

 

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

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

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

빅분기 실기 작업형 2유형 5제, CSV와 주피터 노트북 제공
bigbungi-type2-5-practice.zip
0.20MB

빅데이터분석기사(빅분기) 실기 작업형 2유형을 연습할 수 있는 5문제입니다. 각 문제의 학습 데이터로 모델을 만들고, 평가 데이터의 예측값을 제출용 CSV로 저장합니다.

첨부 ZIP에 문제별 train.csv·test.csv와 주피터 노트북을 함께 담았습니다. 압축을 풀면 problem-01부터 problem-05까지 5개 폴더가 나옵니다. 풀 문제의 폴더에서 노트북을 열고 위에서부터 실행하세요. 각 폴더에서 실습하면 제출 파일 result.csv가 서로 덮어써지지 않습니다.

노트북에는 문제, 변수 설명, 데이터 불러오기 코드와 풀이 작성 칸이 들어 있습니다. 참고 풀이는 각 문제 아래의 참고 풀이 보기를 눌러 확인할 수 있습니다.

문제 01. 설비 고장 발생 여부 예측

제공된 데이터는 설비 점검 기록과 점검 후 7일 이내 고장 발생 여부이다. 학습용 데이터(train.csv)를 활용하여 향후 7일 이내 고장 발생 여부(failure)를 예측하는 모형을 개발하고, 평가용 데이터(test.csv)에 적용하시오. 예측 결과는 아래의 유의 사항과 제출 형식을 준수하여 CSV 파일로 생성하는 코드를 작성하시오.

유의 사항

  • 예측 결과는 F1 (양성 1) 평가지표로 평가합니다.
  • 모형과 초매개변수 조합을 비교하여 평가에 적합한 모형을 선택하시오.

제출 형식

항목 조건
파일명 result.csv
열 이름 / 열 수 pred / 1개
행 수 600개
예측값 0 또는 1의 클래스 값
행 순서 test.csv의 원래 행 순서
저장 조건 인덱스와 record_id 열 제외 · UTF-8 · 현재 작업 폴더에 저장

제공 데이터

압축을 푼 뒤 problem-01 폴더의 노트북을 엽니다. 목표변수는 failure (0=미발생, 1=발생)이며, test.csv에는 포함되어 있지 않습니다.

구분 경로 행 × 열
학습 data/T2_002/train.csv 1,800 × 10
평가 data/T2_002/test.csv 600 × 9
변수 의미
record_id 레코드 고유번호
machine_age_years 설비 사용 연수 (년)
vibration 진동 크기 (임의 측정 단위)
temperature_c 점검 시 온도 (°C)
operating_hours 전날 가동 시간 (시간)
days_since_maintenance 최근 정비 후 경과일 (일)
load_pct 가동 부하율 (%)
machine_model 설비 모델 (A, B, C)
shift 점검 근무조 (day, night)
failure 향후 7일 이내 고장 발생 여부 (0=미발생, 1=발생)
문제 01 참고 풀이 보기

양성 클래스 1의 F1을 계산합니다. record_id를 제외하고, 학습 구간에서 계산한 결측값 대체 기준을 검증·평가 데이터에도 적용합니다.

아래 코드는 비교를 시작할 때 사용할 수 있는 참고 모델입니다. 출력되는 검증 점수는 학습 데이터를 나눈 검증 구간의 결과이며, 최종 평가 데이터의 점수를 뜻하지 않습니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score

# 1. 데이터 불러오기와 확인
train = pd.read_csv("data/T2_002/train.csv")
test = pd.read_csv("data/T2_002/test.csv")
print(train.shape, test.shape)
print(train.isna().sum())

# 2. 목표변수와 입력변수 분리
X = train.drop(columns=["failure", "record_id"])
y = train["failure"]
X_test = test.drop(columns=["record_id"])

# 3. 학습·검증 데이터 나누기
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

# 4. 결측값 처리와 원-핫 인코딩
# 중앙값은 X_train에서 구하고, 검증·평가 데이터에도 같은 값을 적용합니다.
fill_values = X_train.select_dtypes(include="number").median().fillna(0)
X_train = pd.get_dummies(X_train.fillna(fill_values).fillna("missing"))
X_valid = pd.get_dummies(X_valid.fillna(fill_values).fillna("missing"))
X_test = pd.get_dummies(X_test.fillna(fill_values).fillna("missing"))
# X_train과 동일한 열 이름·순서로 맞춥니다.
X_valid = X_valid.reindex(columns=X_train.columns, fill_value=0)
X_test = X_test.reindex(columns=X_train.columns, fill_value=0)

# 5. 모델 학습과 검증
model = RandomForestClassifier(n_estimators=100, random_state=42, class_weight="balanced")

model.fit(X_train, y_train)
valid_pred = model.predict(X_valid)

score = f1_score(y_valid, valid_pred, pos_label=1, zero_division=0)
print("검증 F1 (양성 1):", score)

# 6. 전체 학습 데이터로 다시 학습하고 평가 데이터 예측
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])

model.fit(X_full, y_full)
pred = model.predict(X_test)


# 7. 제출 파일 저장
result = pd.DataFrame({"pred": pred})
result.to_csv("result.csv", index=False)
print(result.head())
print(result.shape)

문제 02. 온라인 구매 전환 확률 예측

제공된 데이터는 온라인 쇼핑 세션의 행동 정보와 해당 세션 종료 전 구매 여부이다. 학습용 데이터(train.csv)를 활용하여 세션 종료 전 구매 여부(purchased)를 예측하는 모형을 개발하고, 평가용 데이터(test.csv)에 적용하시오. 예측 결과는 아래의 유의 사항과 제출 형식을 준수하여 CSV 파일로 생성하는 코드를 작성하시오.

유의 사항

  • 예측 결과는 ROC-AUC (양성 1의 확률) 평가지표로 평가합니다.
  • 모형과 초매개변수 조합을 비교하여 평가에 적합한 모형을 선택하시오.

제출 형식

항목 조건
파일명 result.csv
열 이름 / 열 수 pred / 1개
행 수 600개
예측값 purchased=1의 확률 (0 이상 1 이하)
행 순서 test.csv의 원래 행 순서
저장 조건 인덱스와 record_id 열 제외 · UTF-8 · 현재 작업 폴더에 저장

제공 데이터

압축을 푼 뒤 problem-02 폴더의 노트북을 엽니다. 목표변수는 purchased (0=미구매, 1=구매)이며, test.csv에는 포함되어 있지 않습니다.

구분 경로 행 × 열
학습 data/T2_003/train.csv 1,800 × 10
평가 data/T2_003/test.csv 600 × 9
변수 의미
record_id 레코드 고유번호
page_views 예측 시점까지 페이지 조회 수 (회)
cart_items 예측 시점의 장바구니 상품 수 (개)
past_orders 현재 세션 이전 완료 주문 수 (건)
elapsed_seconds 예측 시점까지 세션 경과 시간 (초)
offered_discount_pct 예측 시점에 제공된 할인율 (%)
device 기기 유형 (mobile, desktop, tablet)
channel 유입 경로 (search, direct, social, email)
membership 회원 등급 (basic, silver, gold)
purchased 세션 종료 전 구매 여부 (0=미구매, 1=구매)
문제 02 참고 풀이 보기

ROC-AUC는 구매 여부를 0과 1로 확정한 값이 아니라 purchased=1의 확률로 계산합니다. 제출 파일에도 predict_proba로 구한 구매 확률을 넣습니다.

아래 코드는 비교를 시작할 때 사용할 수 있는 참고 모델입니다. 출력되는 검증 점수는 학습 데이터를 나눈 검증 구간의 결과이며, 최종 평가 데이터의 점수를 뜻하지 않습니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score

# 1. 데이터 불러오기와 확인
train = pd.read_csv("data/T2_003/train.csv")
test = pd.read_csv("data/T2_003/test.csv")
print(train.shape, test.shape)
print(train.isna().sum())

# 2. 목표변수와 입력변수 분리
X = train.drop(columns=["purchased", "record_id"])
y = train["purchased"]
X_test = test.drop(columns=["record_id"])

# 3. 학습·검증 데이터 나누기
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

# 4. 결측값 처리와 원-핫 인코딩
# 중앙값은 X_train에서 구하고, 검증·평가 데이터에도 같은 값을 적용합니다.
fill_values = X_train.select_dtypes(include="number").median().fillna(0)
X_train = pd.get_dummies(X_train.fillna(fill_values).fillna("missing"))
X_valid = pd.get_dummies(X_valid.fillna(fill_values).fillna("missing"))
X_test = pd.get_dummies(X_test.fillna(fill_values).fillna("missing"))
# X_train과 동일한 열 이름·순서로 맞춥니다.
X_valid = X_valid.reindex(columns=X_train.columns, fill_value=0)
X_test = X_test.reindex(columns=X_train.columns, fill_value=0)

# 5. 모델 학습과 검증
model = RandomForestClassifier(n_estimators=100, random_state=42)

model.fit(X_train, y_train)
# 이 데이터의 클래스 순서는 [0, 1]이며, 두 번째 열이 구매(1) 확률입니다.
valid_pred = model.predict_proba(X_valid)[:, 1]

score = roc_auc_score(y_valid, valid_pred)
print("검증 ROC-AUC (양성 1의 확률):", score)

# 6. 전체 학습 데이터로 다시 학습하고 평가 데이터 예측
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])

model.fit(X_full, y_full)
pred = model.predict_proba(X_test)[:, 1]


# 7. 제출 파일 저장
result = pd.DataFrame({"pred": pred})
result.to_csv("result.csv", index=False)
print(result.head())
print(result.shape)

문제 03. 농산물 품질 등급 분류

제공된 데이터는 농산물 검사 기록과 품질 등급이다. 학습용 데이터(train.csv)를 활용하여 농산물 품질 등급(quality_grade)를 예측하는 모형을 개발하고, 평가용 데이터(test.csv)에 적용하시오. 예측 결과는 아래의 유의 사항과 제출 형식을 준수하여 CSV 파일로 생성하는 코드를 작성하시오.

유의 사항

  • 예측 결과는 Macro F1 평가지표로 평가합니다.
  • 모형과 초매개변수 조합을 비교하여 평가에 적합한 모형을 선택하시오.

제출 형식

항목 조건
파일명 result.csv
열 이름 / 열 수 pred / 1개
행 수 500개
예측값 basic, standard, premium 중 하나의 영문 등급명
행 순서 test.csv의 원래 행 순서
저장 조건 인덱스와 record_id 열 제외 · UTF-8 · 현재 작업 폴더에 저장

제공 데이터

압축을 푼 뒤 problem-03 폴더의 노트북을 엽니다. 목표변수는 quality_grade (basic / standard / premium)이며, test.csv에는 포함되어 있지 않습니다.

구분 경로 행 × 열
학습 data/T2_004/train.csv 1,500 × 9
평가 data/T2_004/test.csv 500 × 8
변수 의미
record_id 레코드 고유번호
sugar_brix 당도 측정값 (Brix)
firmness 경도 측정값 (임의 측정 단위)
defect_pct 표면 결점 비율 (%)
weight_g 중량 (g)
storage_days 보관 경과일 (일)
variety 품종 코드 (A, B, C)
region 생산 권역 (north, central, south)
quality_grade 농산물 품질 등급 (basic / standard / premium)
문제 03 참고 풀이 보기

Macro F1은 각 등급의 F1을 동일한 비중으로 평균합니다. 제출할 때 숫자 코드로 바꾸지 않고 basic, standard, premium 등급명을 그대로 저장합니다.

아래 코드는 비교를 시작할 때 사용할 수 있는 참고 모델입니다. 출력되는 검증 점수는 학습 데이터를 나눈 검증 구간의 결과이며, 최종 평가 데이터의 점수를 뜻하지 않습니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score

# 1. 데이터 불러오기와 확인
train = pd.read_csv("data/T2_004/train.csv")
test = pd.read_csv("data/T2_004/test.csv")
print(train.shape, test.shape)
print(train.isna().sum())

# 2. 목표변수와 입력변수 분리
X = train.drop(columns=["quality_grade", "record_id"])
y = train["quality_grade"]
X_test = test.drop(columns=["record_id"])

# 3. 학습·검증 데이터 나누기
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

# 4. 결측값 처리와 원-핫 인코딩
# 중앙값은 X_train에서 구하고, 검증·평가 데이터에도 같은 값을 적용합니다.
fill_values = X_train.select_dtypes(include="number").median().fillna(0)
X_train = pd.get_dummies(X_train.fillna(fill_values).fillna("missing"))
X_valid = pd.get_dummies(X_valid.fillna(fill_values).fillna("missing"))
X_test = pd.get_dummies(X_test.fillna(fill_values).fillna("missing"))
# X_train과 동일한 열 이름·순서로 맞춥니다.
X_valid = X_valid.reindex(columns=X_train.columns, fill_value=0)
X_test = X_test.reindex(columns=X_train.columns, fill_value=0)

# 5. 모델 학습과 검증
model = RandomForestClassifier(n_estimators=100, random_state=42)

model.fit(X_train, y_train)
valid_pred = model.predict(X_valid)

score = f1_score(y_valid, valid_pred, average="macro", zero_division=0)
print("검증 Macro F1:", score)

# 6. 전체 학습 데이터로 다시 학습하고 평가 데이터 예측
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])

model.fit(X_full, y_full)
pred = model.predict(X_test)


# 7. 제출 파일 저장
result = pd.DataFrame({"pred": pred})
result.to_csv("result.csv", index=False)
print(result.head())
print(result.shape)
반응형

문제 04. 주택 월 임대료 예측

제공된 데이터는 보증금 조건이 동일한 주택의 특성과 월 임대료이다. 학습용 데이터(train.csv)를 활용하여 월 임대료(monthly_rent)를 예측하는 모형을 개발하고, 평가용 데이터(test.csv)에 적용하시오. 예측 결과는 아래의 유의 사항과 제출 형식을 준수하여 CSV 파일로 생성하는 코드를 작성하시오.

유의 사항

  • 예측 결과는 RMSE 평가지표로 평가합니다.
  • 모형과 초매개변수 조합을 비교하여 평가에 적합한 모형을 선택하시오.

제출 형식

항목 조건
파일명 result.csv
열 이름 / 열 수 pred / 1개
행 수 600개
예측값 월 임대료 (만원 단위의 실수)
행 순서 test.csv의 원래 행 순서
저장 조건 인덱스와 record_id 열 제외 · UTF-8 · 현재 작업 폴더에 저장

제공 데이터

압축을 푼 뒤 problem-04 폴더의 노트북을 엽니다. 목표변수는 monthly_rent (만원)이며, test.csv에는 포함되어 있지 않습니다.

구분 경로 행 × 열
학습 data/T2_006/train.csv 1,800 × 10
평가 data/T2_006/test.csv 600 × 9
변수 의미
record_id 레코드 고유번호
area_m2 전용 면적 (m²)
building_age 준공 후 경과 연수 (년)
floor 층수 (층)
walk_to_station_min 역까지 도보 시간 (분)
rooms 방 수 (개)
district 지역 코드 (A, B, C, D)
house_type 주택 유형 (apartment, villa, officetel)
renovated 수리 여부 (yes, no)
monthly_rent 월 임대료 (만원)
문제 04 참고 풀이 보기

RMSE는 실제값과 예측값의 제곱오차 평균에 제곱근을 적용합니다. 예측값은 만원 단위의 실수이며, 제출 전에 임의로 정수로 반올림하지 않습니다.

아래 코드는 비교를 시작할 때 사용할 수 있는 참고 모델입니다. 출력되는 검증 점수는 학습 데이터를 나눈 검증 구간의 결과이며, 최종 평가 데이터의 점수를 뜻하지 않습니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# 1. 데이터 불러오기와 확인
train = pd.read_csv("data/T2_006/train.csv")
test = pd.read_csv("data/T2_006/test.csv")
print(train.shape, test.shape)
print(train.isna().sum())

# 2. 목표변수와 입력변수 분리
X = train.drop(columns=["monthly_rent", "record_id"])
y = train["monthly_rent"]
X_test = test.drop(columns=["record_id"])

# 3. 학습·검증 데이터 나누기
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42
)

# 4. 결측값 처리와 원-핫 인코딩
# 중앙값은 X_train에서 구하고, 검증·평가 데이터에도 같은 값을 적용합니다.
fill_values = X_train.select_dtypes(include="number").median().fillna(0)
X_train = pd.get_dummies(X_train.fillna(fill_values).fillna("missing"))
X_valid = pd.get_dummies(X_valid.fillna(fill_values).fillna("missing"))
X_test = pd.get_dummies(X_test.fillna(fill_values).fillna("missing"))
# X_train과 동일한 열 이름·순서로 맞춥니다.
X_valid = X_valid.reindex(columns=X_train.columns, fill_value=0)
X_test = X_test.reindex(columns=X_train.columns, fill_value=0)

# 5. 모델 학습과 검증
model = RandomForestRegressor(n_estimators=100, random_state=42)

model.fit(X_train, y_train)
valid_pred = model.predict(X_valid)

score = np.sqrt(mean_squared_error(y_valid, valid_pred))
print("검증 RMSE:", score)

# 6. 전체 학습 데이터로 다시 학습하고 평가 데이터 예측
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])

model.fit(X_full, y_full)
pred = model.predict(X_test)


# 7. 제출 파일 저장
result = pd.DataFrame({"pred": pred})
result.to_csv("result.csv", index=False)
print(result.head())
print(result.shape)

문제 05. 시간대별 공유자전거 대여량 예측

제공된 데이터는 시간대별 기상·대여소 조건과 공유자전거 대여량이다. 학습용 데이터(train.csv)를 활용하여 시간대별 대여량(rental_count)를 예측하는 모형을 개발하고, 평가용 데이터(test.csv)에 적용하시오. 예측 결과는 아래의 유의 사항과 제출 형식을 준수하여 CSV 파일로 생성하는 코드를 작성하시오.

유의 사항

  • 예측 결과는 RMSLE 평가지표로 평가합니다.
  • 모형과 초매개변수 조합을 비교하여 평가에 적합한 모형을 선택하시오.

제출 형식

항목 조건
파일명 result.csv
열 이름 / 열 수 pred / 1개
행 수 800개
예측값 대여량 (대 단위의 0 이상 실수)
행 순서 test.csv의 원래 행 순서
저장 조건 인덱스와 record_id 열 제외 · UTF-8 · 현재 작업 폴더에 저장

제공 데이터

압축을 푼 뒤 problem-05 폴더의 노트북을 엽니다. 목표변수는 rental_count (대)이며, test.csv에는 포함되어 있지 않습니다.

구분 경로 행 × 열
학습 data/T2_008/train.csv 2,400 × 9
평가 data/T2_008/test.csv 800 × 8
변수 의미
record_id 레코드 고유번호
timestamp 해당 시간대 시작 시각 (YYYY-MM-DD HH:MM:SS)
temperature_c 해당 시간대 기온 (°C)
humidity_pct 습도 (%)
wind_mps 풍속 (m/s)
rainfall_mm 강수량 (mm)
station_type 대여소 유형 (residential, business, park, university)
is_holiday 공휴일 여부 (yes, no)
rental_count 시간대별 대여량 (대)
문제 05 참고 풀이 보기

timestamp에서 월·요일·시간을 추출합니다. 대여량을 log1p로 변환해 학습하고, expm1로 원래 단위로 되돌린 뒤 0 미만의 값을 제거합니다. RMSLE에는 원래 단위의 예측값을 전달합니다.

아래 코드는 비교를 시작할 때 사용할 수 있는 참고 모델입니다. 출력되는 검증 점수는 학습 데이터를 나눈 검증 구간의 결과이며, 최종 평가 데이터의 점수를 뜻하지 않습니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_log_error

# 1. 데이터 불러오기와 확인
train = pd.read_csv("data/T2_008/train.csv")
test = pd.read_csv("data/T2_008/test.csv")
print(train.shape, test.shape)
print(train.isna().sum())

# 2. 목표변수와 입력변수 분리
X = train.drop(columns=["rental_count", "record_id"])
y = train["rental_count"]
X_test = test.drop(columns=["record_id"])

# 날짜 문자열에서 달과 요일을 추출합니다.
for frame in [X, X_test]:
    date = pd.to_datetime(frame["timestamp"], format="%Y-%m-%d %H:%M:%S")
    frame["month"] = date.dt.month
    frame["weekday"] = date.dt.dayofweek
    frame["hour"] = date.dt.hour
    frame.drop(columns=["timestamp"], inplace=True)

# 3. 학습·검증 데이터 나누기
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42
)

# 4. 결측값 처리와 원-핫 인코딩
# 중앙값은 X_train에서 구하고, 검증·평가 데이터에도 같은 값을 적용합니다.
fill_values = X_train.select_dtypes(include="number").median().fillna(0)
X_train = pd.get_dummies(X_train.fillna(fill_values).fillna("missing"))
X_valid = pd.get_dummies(X_valid.fillna(fill_values).fillna("missing"))
X_test = pd.get_dummies(X_test.fillna(fill_values).fillna("missing"))
# X_train과 동일한 열 이름·순서로 맞춥니다.
X_valid = X_valid.reindex(columns=X_train.columns, fill_value=0)
X_test = X_test.reindex(columns=X_train.columns, fill_value=0)

# 5. 모델 학습과 검증
model = RandomForestRegressor(n_estimators=100, random_state=42)

# 로그 단위로 학습한 뒤 예측값을 원래 단위로 되돌립니다.
model.fit(X_train, np.log1p(y_train))
valid_pred = np.expm1(model.predict(X_valid)).clip(0)

score = np.sqrt(mean_squared_log_error(y_valid, valid_pred))
print("검증 RMSLE:", score)

# 6. 전체 학습 데이터로 다시 학습하고 평가 데이터 예측
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])

model.fit(X_full, np.log1p(y_full))
pred = np.expm1(model.predict(X_test)).clip(0)


# 7. 제출 파일 저장
result = pd.DataFrame({"pred": pred})
result.to_csv("result.csv", index=False)
print(result.head())
print(result.shape)
반응형

댓글