빅데이터분석기사 실기 10회 제2유형 체험 환경 문제를 풀어보고, 예시 답안과 결과를 살펴봅니다.
[ Contents ]
1. 문제 분석
구름EDU - 모두를 위한 맞춤형 IT교육
구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/
edu.goorm.io
10회 실기시험 2유형 체험 문제는 '회귀'가 나왔습니다. 백화점 고객의 1년간 상품 구매 기록을 학습해서, 총구매액을 예측하는 모델을 만들어야 합니다. 평가 지표는 RMSE였습니다.
2. 데이터 전처리
import pandas as pd
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")
# 1. 데이터 전처리
# print(train.info()) # 환불금액 1200개 (결측치 2300개)
# print(train.describe())
# print(test.info()) # 환불금액 867개 (결측치 1615개)
x_train = train.drop(columns=['회원ID', '총구매액'])
y = train['총구매액']
x_test = test.drop(columns=['회원ID'])
# print(x_train.shape, y.shape, x_test.shape) # (3500, 8) (3500,) (2482, 8)
x_train['환불금액'] = x_train['환불금액'].fillna(0);
x_test['환불금액'] = x_test['환불금액'].fillna(0);
# print(x_train.isna().sum())
# print(x_test.isna().sum())
데이터 전처리 과정에서는 불필요한 칼럼 제거 및 결측치 처리를 해줍니다. 회원ID와 같은 고유값은 제거하여 불필요하게 복잡도를 높이지 않습니다. 물론 순차적으로 회원 ID가 쌓이고, ID 크기에 따라 회원 연수 관계가 드러나는 경우 유효한 데이터가 될 수도 있지만... 대체로 빼는 게 좋습니다.
결측치는 환불금액에만 있었고, null 값은 환불이 없다는 것으로 추정하여 환불액을 0으로 대체했습니다.
[Pandas] 데이터셋의 결측치를 구하고 처리하는 방법 (isnull, dropna, fillna)
판다스에서 데이터셋의 결측치를 구하고 이를 처리하는 방법을 알아봅니다. 또한 결측치란 무엇이고, 이에 대한 처리가 왜 중요한지도 알아봅니다. [ Contents ] 1. 결측치(missing value) 비어있거나
star7sss.tistory.com
3. 라벨 인코딩
# 2. 라벨 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
x_train['주구매상품'] = le.fit_transform(x_train['주구매상품'])
x_test['주구매상품'] = le.transform(x_test['주구매상품'])
x_train['주구매지점'] = le.fit_transform(x_train['주구매지점'])
x_test['주구매지점'] = le.transform(x_test['주구매지점'])
랜덤포레스트 모델을 쓸 예정이기 때문에, 별도의 스케일링은 진행하지 않았습니다.
범주형 데이터에 대해서만 라벨 인코딩을 해줍니다. get_dummies를 이용해서 간단히 원핫 인코딩을 해줘도 됩니다.
4. 데이터 분리
# 3. 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x_train, y, test_size=0.1)
# print(x_train.shape, x_val.shape, y_train.shape, y_val.shape)
validation 테스트를 위해서 데이터를 9:1로 분리합니다.
학습 데이터가 많지 않기 때문에, 테스트 생략하고 전부 학습시켜도 무방하지만... 그러면 잘못 학습된 경우를 잡아내지 못하므로 10% 정도만 할애합니다.
5. 모델 학습 및 검증
# 4. 모델 학습 및 검증
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(x_train, y_train)
val_pred = rf.predict(x_val)
모델학습은 회귀 문제이므로 RandomForestRegressor를 사용해줍니다.
6. 평가
# 5. 평가
from sklearn.metrics import root_mean_squared_error, r2_score
rmse = root_mean_squared_error(y_val, val_pred)
r2 = r2_score(y_val, val_pred)
print(rmse, r2) # 642.0873784646759 0.8244547361779538
평가는 문제에서 제시한 RMSE 지표를 사용하되, 직관적인 성능 파악을 위해 R2 스코어도 구해줍니다.
RMSE는 오차제곱합의 근호를 씌운 지표로, 낮을 수록 성능이 좋습니다. 반대로 R2 스코어는 0과 1 사이를 가지며, 1에 가까울수록 좋은 성능입니다.
7. 결과 제출 및 확인
# 6. 결과 제출
y_pred = rf.predict(x_test)
result = pd.DataFrame(y_pred, columns=['pred'])
result.to_csv('result.csv', index=False)
# 7. 결과 확인
result = pd.read_csv('result.csv')
print(result)
테스트 데이터를 학습된 모델로 예측하고, 그 결과를 저장합니다.
8. 전체 코드
import pandas as pd
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")
# 1. 데이터 전처리
# print(train.info()) # 환불금액 1200개 (결측치 2300개)
# print(train.describe())
# print(test.info()) # 환불금액 867개 (결측치 1615개)
x_train = train.drop(columns=['회원ID', '총구매액'])
y = train['총구매액']
x_test = test.drop(columns=['회원ID'])
# print(x_train.shape, y.shape, x_test.shape) # (3500, 8) (3500,) (2482, 8)
x_train['환불금액'] = x_train['환불금액'].fillna(0);
x_test['환불금액'] = x_test['환불금액'].fillna(0);
# print(x_train.isna().sum())
# print(x_test.isna().sum())
# 2. 라벨 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
x_train['주구매상품'] = le.fit_transform(x_train['주구매상품'])
x_test['주구매상품'] = le.transform(x_test['주구매상품'])
x_train['주구매지점'] = le.fit_transform(x_train['주구매지점'])
x_test['주구매지점'] = le.transform(x_test['주구매지점'])
# 3. 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x_train, y, test_size=0.1)
# print(x_train.shape, x_val.shape, y_train.shape, y_val.shape)
# 4. 모델 학습 및 검증
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(x_train, y_train)
val_pred = rf.predict(x_val)
# 5. 평가
from sklearn.metrics import root_mean_squared_error, r2_score
rmse = root_mean_squared_error(y_val, val_pred)
r2 = r2_score(y_val, val_pred)
print(rmse, r2) # 642.0873784646759 0.8244547361779538
# 6. 결과 제출
y_pred = rf.predict(x_test)
result = pd.DataFrame(y_pred, columns=['pred'])
result.to_csv('result.csv', index=False)
# 7. 결과 확인
result = pd.read_csv('result.csv')
print(result)

'Data Engineering' 카테고리의 다른 글
| [빅데이터분석기사 실기 10회] 테스트 체험 환경 제2유형 풀이 (원핫 인코딩 이용) (1) | 2025.06.15 |
|---|---|
| [빅데이터분석기사 실기 10회] 테스트 체험 환경 제3유형 통계 분석 정답 및 해설 (0) | 2025.06.14 |
| [빅데이터분석기사 실기 10회] 테스트 체험 환경 제1유형 데이터 분석 정답 및 해설 (0) | 2025.06.14 |
| [데이터] 암묵지와 형식지, 4단계 지식전환단계 (공통화, 표출화, 연결화, 내면화) (0) | 2025.03.27 |
| [데이터] DIKW피라미드의 정의와 구체적인 예시 알아보기 (0) | 2025.03.25 |
댓글