체험 제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()) | print(test.info()) |
> <class 'pandas.core.frame.dataframe'></class 'pandas.core.frame.dataframe'> RangeIndex: 3500 entries, 0 to 3499 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 회원ID 3500 non-null int64 1 총구매액 3500 non-null int64 2 최대구매액 3500 non-null int64 3 환불금액 1205 non-null float64 4 주구매상품 3500 non-null object 5 주구매지점 3500 non-null object 6 방문일수 3500 non-null int64 7 방문당구매건수 3500 non-null float64 8 주말방문비율 3500 non-null float64 9 구매주기 3500 non-null int64 10 성별 3500 non-null int64 dtypes: float64(3), int64(6), object(2) memory usage: 300.9+ KB None |
<class 'pandas.core.frame.dataframe'></class 'pandas.core.frame.dataframe'> RangeIndex: 2482 entries, 0 to 2481 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 회원ID 2482 non-null int64 1 총구매액 2482 non-null int64 2 최대구매액 2482 non-null int64 3 환불금액 871 non-null float64 4 주구매상품 2482 non-null object 5 주구매지점 2482 non-null object 6 방문일수 2482 non-null int64 7 방문당구매건수 2482 non-null float64 8 주말방문비율 2482 non-null float64 9 구매주기 2482 non-null int64 dtypes: float64(3), int64(5), object(2) memory usage: 194.0+ KB None |
#2. 전처리
X 훈련셋, Y 성별 셋, train / test set 분리
X_train = train.drop(['회원ID','성별'], axis =1)
y = train['성별']
X_test = test.drop(['회원ID'], axis =1)
print(X_train.shape, y.shape, X_test.shape)
> (3500, 9) (3500,) (2482, 9)
print(X_train.info()) | print(y.info()) | print(X_test.info()) |
<class 'pandas.core.frame.dataframe'></class 'pandas.core.frame.dataframe'> RangeIndex: 3500 entries, 0 to 3499 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 총구매액 3500 non-null int64 1 최대구매액 3500 non-null int64 2 환불금액 1205 non-null float64 3 주구매상품 3500 non-null object 4 주구매지점 3500 non-null object 5 방문일수 3500 non-null int64 6 방문당구매건수 3500 non-null float64 7 주말방문비율 3500 non-null float64 8 구매주기 3500 non-null int64 dtypes: float64(3), int64(4), object(2) memory usage: 246.2+ KB None |
<class 'pandas.core.series.series'></class 'pandas.core.series.series'> RangeIndex: 3500 entries, 0 to 3499 Series name: 성별 Non-Null Count Dtype -------------- ----- 3500 non-null int64 dtypes: int64(1) memory usage: 27.5 KB None |
<class 'pandas.core.frame.dataframe'></class 'pandas.core.frame.dataframe'> RangeIndex: 2482 entries, 0 to 2481 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 총구매액 2482 non-null int64 1 최대구매액 2482 non-null int64 2 환불금액 871 non-null float64 3 주구매상품 2482 non-null object 4 주구매지점 2482 non-null object 5 방문일수 2482 non-null int64 6 방문당구매건수 2482 non-null float64 7 주말방문비율 2482 non-null float64 8 구매주기 2482 non-null int64 dtypes: float64(3), int64(4), object(2) memory usage: 174.6+ KB None |
#결측치 처리
print(X_train.isna().sum()) | print(X_test.isna().sum()) |
총구매액 0 최대구매액 0 환불금액 2295 주구매상품 0 주구매지점 0 방문일수 0 방문당구매건수 0 주말방문비율 0 구매주기 0 dtype: int64 |
총구매액 0 최대구매액 0 환불금액 1611 주구매상품 0 주구매지점 0 방문일수 0 방문당구매건수 0 주말방문비율 0 구매주기 0 dtype: int64 |
# X_train 데이터의 '환불금액' 열에서 결측값을 0으로 채움
X_train['환불금액'] = X_train['환불금액'].fillna(0)
# X_test 데이터의 '환불금액' 열에서 결측값을 0으로 채움
X_test['환불금액'] = X_test['환불금액'].fillna(0)
print(X_train.isna().sum()) | print(X_test.isna().sum()) |
총구매액 0 최대구매액 0 환불금액 0 주구매상품 0 주구매지점 0 방문일수 0 방문당구매건수 0 주말방문비율 0 구매주기 0 dtype: int64 |
총구매액 0 최대구매액 0 환불금액 0 주구매상품 0 주구매지점 0 방문일수 0 방문당구매건수 0 주말방문비율 0 구매주기 0 dtype: int64 |
#수치형 변수 스케일링
help(StandardScaler) |
| Examples | -------- | >>> from sklearn.preprocessing import StandardScaler | >>> data = [[0, 0], [0, 0], [1, 1], [1, 1]] | >>> scaler = StandardScaler() | >>> print(scaler.fit(data)) | StandardScaler() | >>> print(scaler.mean_) | [0.5 0.5] | >>> print(scaler.transform(data)) | [[-1. -1.] | [-1. -1.] | [ 1. 1.] | [ 1. 1.]] | >>> print(scaler.transform([[2, 2]])) | [[3. 3.]] |
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
num_columns = X_train.select_dtypes(exclude='object').columns
X_train[num_columns] = scaler.fit_transform(X_train[num_columns])
X_test[num_columns] = scaler.transform(X_test[num_columns])
print(X_train.info())
print(X_test.info())
#4 범주형 변수 인코딩
train 범주, test 범주 비교 // 주구매상품, 주구매지점
print(set(X_train['주구매상품']) - set(X_test['주구매상품'])) print(set(X_test['주구매상품']) - set(X_train['주구매상품'])) print(set(X_train['주구매지점']) - set(X_test['주구매지점'])) print(set(X_test['주구매지점']) - set(X_train['주구매지점'])) |
{'소형가전'} set() set() set() |
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
# '주구매상품' 열을 레이블 인코딩하여 학습 데이터와 테스트 데이터에서 문자열 값을 숫자로 변환
X_train['주구매상품'] = encoder.fit_transform(X_train['주구매상품'])
X_test['주구매상품'] = encoder.transform(X_test['주구매상품'])
# '주구매지점' 열을 레이블 인코딩하여 학습 데이터와 테스트 데이터에서 문자열 값을 숫자로 변환
X_train['주구매지점'] = encoder.fit_transform(X_train['주구매지점'])
X_test['주구매지점'] = encoder.transform(X_test['주구매지점'])
#5 데이터 분리
# 학습 데이터(X_train)와 레이블(y)를 학습용 데이터와 검증용 데이터로 분할
# test_size=0.2는 데이터의 20%를 검증용으로 사용하고, stratify=y는 레이블 비율을 유지하도록 설정
X_train, X_val, y_train, y_val = train_test_split(X_train, y, test_size=0.2, stratify=y)
print(X_tarin.shape, X_val.shape, y_train.shape, y_val.shape) |
(2800, 9) (700, 9) (2800,) (700,) |
#6 모델 학습 및 검증
from sklearn.ensemble import RandomForestClassifier
# 모델 초기화
model = RandomForestClassifier()
# 모델 학습
model.fit(X_train, y_train)
# 검증 데이터에 대한 예측
y_val_pred = model.predict(X_val)
#7 평가
from sklearn.metrics import roc_auc_score, accuracy_score
# ROC-AUC 점수를 계산하여 auc_score 변수에 저장
auc_score = roc_auc_score(y_val, y_val_pred)
# 정확도 점수를 계산하여 acc 변수에 저장 (오타 수정: accuracy_score 사용)
acc = accuracy_score(y_val, y_val_pred)
print(auc_score, acc) |
0.570433564486518 0.63 |
# 테스트 데이터에 대한 예측을 수행
y_pred = model.predict(X_test)
# 예측 결과를 DataFrame으로 변환하고 'pred'라는 열 이름 지정
result = pd.DataFrame(y_pred, columns=['pred'])
# 결과를 'result.csv' 파일로 저장 (오타 수정: index=False)
result.to_csv('result.csv', index=False)
# 저장한 'result.csv' 파일을 다시 읽어와 reuslt 변수에 저장 (오타 수정: result로 변경)
result = pd.read_csv('result.csv')
# 결과 출력
print(result)
pred 0 1 1 0 2 0 3 0 4 1 ... ... 2477 1 2478 0 2479 1 2480 0 2481 1 [2482 rows x 1 columns |
'도전기 > 빅분기' 카테고리의 다른 글
009_빅분기 실기 시험 환경 업데이트 정보 (0) | 2024.11.24 |
---|---|
003_제3유형_구름 기반 실습 (0) | 2024.11.12 |
001_1유형_test (0) | 2024.10.09 |
002_빅데이터분석기사 실기_단기간_합격_준비 (1) | 2024.10.02 |
000_빅데이터 분석기사_필기_합격수기_ADP비교 (0) | 2024.09.22 |