제공된 데이터는 백화점 고객이 1년간 상품을 구매한 속성 데이터이다.
제공된 학습용 데이터(data/customer_train.csv)를 이용하여 백화점 구매 고객의 성별을 예측하는 모델을 개발하고, 개발한 모델에 기반하여 평가용 데이터(data/customer_test.csv)에 적용하여 얻은 성별 예측 결과를 아래 【제출 형식】에 따라 CSV 파일로 생성하여 제출하시오.
【제출 형식】
㉠ CSV 파일명 : result.csv (파일명에 디렉토리:폴더 지정불가)
㉡ 예측 성별 칼럼명 : pred
㉢ 제출 칼럼 수 : pred 칼럼 1개
㉣ 평가용 데이터 개수와 예측 결과 데이터 개수 일치 : 2,482개


제2회 빅데이터분석기사 실기 안내의 첨부파일 중 [Dataset] 작업형 제2유형.zip 파일 내 X_train.csv와 y_train.csv를 합쳐 customer_train.csv로, X_test.csv를 customer_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))
🔗 제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())