[빅데이터분석기사] 실기 체험 제2유형 풀이

amure·2025년 6월 18일

빅데이터분석기사

목록 보기
2/3
post-thumbnail

문제 수정 전

문제

제공된 데이터는 백화점 고객이 1년간 상품을 구매한 속성 데이터이다.
제공된 학습용 데이터(data/customer_train.csv)를 이용하여 백화점 구매 고객의 성별을 예측하는 모델을 개발하고, 개발한 모델에 기반하여 평가용 데이터(data/customer_test.csv)에 적용하여 얻은 성별 예측 결과를 아래 【제출 형식】에 따라 CSV 파일로 생성하여 제출하시오.

  • 예측 결과는 ROC-AUC 평가지표에 따라 평가함.
  • 성능이 우수한 예측 모델을 구축하기 위해서는 데이터 정제, Feature Engineering, 하이퍼 파라미터(hyper parameter) 최적화, 모델 비교 등이 필요할 수 있음. 다만, 과적합에 유의하여야 함.

【제출 형식】
㉠ CSV 파일명 : result.csv (파일명에 디렉토리:폴더 지정불가)
㉡ 예측 성별 칼럼명 : pred
㉢ 제출 칼럼 수 : pred 칼럼 1개
㉣ 평가용 데이터 개수와 예측 결과 데이터 개수 일치 : 2,482개

데이터

제2회 빅데이터분석기사 실기 안내의 첨부파일 중 [Dataset] 작업형 제2유형.zip 파일 내 X_train.csvy_train.csv를 합쳐 customer_train.csv로, X_test.csvcustomer_test.csv로 사용합니다.

X_train.csv의 'cust_id'를 '회원ID'로, '내점일수'를 '방문일수'로, '내점당구매건수'를 '방문당구매건수'로 변경합니다.

X_test.csv의 'cust_id'를 '회원ID'로, '내점일수'를 '방문일수'로, '내점당구매건수'를 '방문당구매건수'로 변경합니다.

y_train.csv의 'cust_id'를 '회원ID'로, 'gender'를 '성별'로 변경합니다.

# 1. 문제 정의 
# 평가: roc-auc
# target: 성별
# 제출 파일: result.csv (컬럼 1개 pred, 확률)

# 2. 라이브러리 및 데이터 불러오기
import pandas as pd

X_train = pd.read_csv("X_train.csv")
y_train = pd.read_csv("y_train.csv")
X_test = pd.read_csv("X_test.csv")

train = pd.merge(X_train, y_train, on='회원ID', how='left')
test = X_test

# 3. 탐색적 데이터 분석(EDA)
print('===== 데이터 크기 =====')
print(f'Train Shape: {train.shape}')
print(f'Test Shape: {test.shape}')

print('\n===== 데이터 샘플 =====')
print(train.head())

pd.set_option('display.max_columns', None)

print('\n===== 데이터 정보(자료형) =====')
print(train.info())

print('\n===== 수치형 컬럼 분포 확인 =====')
pd.set_option('display.float_format', '{:.2f}'.format)
print(train.describe())
print('\n')
print(test.describe())

print('\n===== 범주형 컬럼 분포 확인 =====')
print(train.describe(include='O'))
print('\n')
print(test.describe(include='O'))

print('\n===== 범주형 카테고리 확인 =====')
a = set(train['주구매상품'])
b = set(test['주구매상품'])

print(f'train에만 있는 컬럼: {a - b}')
print(f'test에만 있는 컬럼: {b - a}')

print('\n===== train 결측치 수 =====')
print(train.isnull().sum())

print('\n===== test 결측치 수 =====')
print(test.isnull().sum())

print('\n===== target 빈도 =====')
print(train['성별'].value_counts())

# 4. 데이터 전처리
target = train.pop('성별')

# 결측치 처리
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
cols = ['주구매상품', '주구매지점']

for col in cols:
    le = LabelEncoder()
    train[col] = le.fit_transform(train[col])
    test[col] = le.transform(test[col])

# 5. 검증 데이터 분할
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=0)

print('\n===== 분할된 데이터 크기 =====')
print(X_train.shape, X_val.shape, y_train.shape, y_val.shape)

# 6. 머신러닝 학습 및 평가
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state=0)
rf.fit(X_train, y_train)
pred = rf.predict_proba(X_val)

from sklearn.metrics import roc_auc_score
roc_auc = roc_auc_score(y_val, pred[:,1])
print(f'\nROC-AUC: {roc_auc}')
print('\n')

# 7. 예측 및 결과 파일 생성
pred = rf.predict_proba(test)
submit = pd.DataFrame({'pred': pred[:,1]})
submit.to_csv('result.csv', index=False)

print(pd.read_csv('result.csv').head(3))

ROC-AUC: 0.6150188336494536


문제 수정 후

문제

🔗 제2유형 문제

# 1. 문제 정의
# 평가: rmse
# target: 총구매액
# 제출 파일: result.csv (컬럼 1개 pred)

# 2. 라이브러리 및 데이터 불러오기
import pandas as pd

train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# 3. 탐색적 데이터 분석(EDA)
print('===== 데이터 크기 =====')
print(f'Train Shape: {train.shape}')
print(f'Test Shape: {test.shape}')

print('\n===== 데이터 정보(자료형) =====')
print(train.info())

print('\n===== train 결측치 수 =====')
print(train.isnull().sum())

print('\n===== test 결측치 수 =====')
print(test.isnull().sum())

print('\n===== 수치형 컬럼 분포 확인 =====')
print(train.describe(exclude='object'))
print('\n')
print(test.describe(exclude='object'))

print('\n===== 범주형 컬럼 분포 확인 =====')
print(train.describe(include='O'))
print('\n')
print(test.describe(include='O'))

print('\n===== 범주형 카테고리 확인 =====')
a = set(train['주구매상품'])
b = set(test['주구매상품'])

print(f'train에만 있는 컬럼: {a - b}')
print(f'test에만 있는 컬럼: {b - a}')

print('\n===== target 분포 =====')
print(train['총구매액'].describe())

# 4. 데이터 전처리
target = train.pop('총구매액')

# 결측치 대체(수치형, 평균)
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
cols = ['주구매상품', '주구매지점']

for col in cols:
	le = LabelEncoder()
	train[col] = le.fit_transform(train[col])
	test[col] = le.transform(test[col])

# 5. 검증 데이터 분할
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=0)

print('\n===== 분할된 데이터 크기 =====')
print(X_train.shape, X_val.shape, y_train.shape, y_val.shape)

# 6. 머신러닝 학습 및 평가
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=0)
rf.fit(X_train, y_train)
pred = rf.predict(X_val)

from sklearn.metrics import root_mean_squared_error
rmse = root_mean_squared_error(y_val, pred)
print(f'\nRMSE: {rmse}')
print('\n')

# 7. 예측 및 결과 파일 생성
pred = rf.predict(test)
submit = pd.DataFrame({'pred': pred})
submit.to_csv('result.csv', index=False)

print(pd.read_csv('result.csv').head())

RMSE: 807.8000371227841

profile
꿈을 찾고 이루기 위한 여정을 기록합니다

0개의 댓글