본문 바로가기
도전기/빅분기

002_제2유형_구름 기반 실습

by Qookoo 2024. 11. 11.
반응형

체험 제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






반응형