노센스와 함께하는 데이터 분석

데이터과학자, '현장에서 바로 써먹는' 시리즈 저자

(파이썬) 데이터 분석 실습

(파이썬) 빅데이터분석기사 실기 작업형2 체험하기 코드

노센스 2022. 6. 6. 21:26

파이썬 책 집필을 마치고, 책 내용을 이용해서 빅데이터분석기사 실기 작업형2 체험하기 코드를 한 번 만들어 보았습니다.

 

해당 코드는 예전에 제가 R로 작성했던 것과 언어만 다를뿐 거의 동일하며 auc는 0.82~0.83 수준으로 R을 이용했을 때 보다 다소 높게 나타났습니다.

 

오버샘플링(Over Sampling)이 성능 향상에 가장 큰 영향을 미쳤으나 R의 경우는 시험환경에서 Caret 패키지를 제공해 오버샘플링을 쉽게 할 수 있었는데  파이썬의 경우 imblearn 패키지를 제공해주지 않아 해당 패키지 없이 단순히 랜덤 오버 샘플링을 판다스(pandas)를 이용해 구현했습니다.

 

전체적인 순서는 아래와 같습니다.

 

1. 결측치 및 이상치 처리, 파생변수 생성

2. 랜덤오버샘플링

3. 분포변환(Standard Scaling)

4. 학습-검증 데이터 분할(8:2)

5. 모델링(RandomForest, 별도 하이퍼파라미터 설정하지 않음)

6. 성능평가

7. 예측값 생성 및 파일저장

 

공부하시는데 도움이 되길 바랍니다. 감사합니다.

# 출력을 원하실 경우 print() 함수 활용
# 예시) print(df.head())

# getcwd(), chdir() 등 작업 폴더 설정 불필요
# 파일 경로 상 내부 드라이브 경로(C: 등) 접근 불가

# 데이터 파일 읽기 예제
import pandas as pd
X_test = pd.read_csv("data/X_test.csv")
X_train = pd.read_csv("data/X_train.csv")
y_train = pd.read_csv("data/y_train.csv")

# train 데이터셋 하나로 병합 
train = pd.merge(X_train, y_train, on = 'cust_id')

# train 데이터셋 결측치 처리 및 이상치 변환, 파생변수 생성 
train = train.fillna(0)
train.loc[train['총구매액'] < 0, '총구매액'] = 0
train.loc[train['최대구매액'] < 0, '최대구매액'] = 0
train['최초구매액'] = train['총구매액'] + train['환불금액']
train['최대구매액비율'] = train['최대구매액']/train['최초구매액']
train['환불금액비율'] = train['환불금액']/train['최초구매액']

# test 데이터셋 결측치 처리 및 이상치 변환, 파생변수 생성 
X_test = X_test.fillna(0)
X_test.loc[X_test['총구매액'] < 0, '총구매액'] = 0
X_test.loc[X_test['최대구매액'] < 0, '최대구매액'] = 0
X_test['최초구매액'] = X_test['총구매액'] + X_test['환불금액']
X_test['최대구매액비율'] = X_test['최대구매액']/X_test['최초구매액']
X_test['환불금액비율'] = X_test['환불금액']/X_test['최초구매액']

# gender 열 데이터 불균형 확인
g_zero = train.loc[train['gender'] == 0, ['cust_id']].count()[0]
g_one = train.loc[train['gender'] == 1, ['cust_id']].count()[0]

# 데이터 불균형 차이 저장
diff = g_zero - g_one 

# train 데이터셋에서 gender가 1인 대상만 별도 데이터셋 구성
train_one = train.loc[train['gender'] == 1]

# 데이터 불균형 차이 만큼 비복원 랜덤 샘플링해서 별도 데이터셋 구성
train_one_rs = train_one.sample(n=diff, random_state = 7)

# 랜덤 샘플링한 대상과 기존 train 데이터셋을 행을 기준으로 합침
# 랜덤 오버샘플링
train_os = pd.concat([train, train_one_rs])

# 문자 타입 변수 제외 별도 데이터셋(다차원배열 타입) 구축
tr_x = train_os.iloc[:,[1,2,3,6,7,8,9,11,12,13]].values
tr_y = train_os.iloc[:,10].values
te_x = X_test.iloc[:,[1,2,3,6,7,8,9,10,11,12]].values

# Standard Scaling을 위한 함수 불러오기 및 스케일러 생성
from sklearn.preprocessing import StandardScaler
ss = StandardScaler().fit(tr_x)

# train 데이터셋 Standard Scaling 실시
tr_x_ss = ss.transform(tr_x)

# test 데이터셋 Standard Scaling 실시
te_x_ss = ss.transform(te_x)

# test 데이터셋 학습 및 검증용으로 8:2 분할
from sklearn.model_selection import train_test_split
x_tr, x_val, y_tr, y_val = train_test_split(tr_x_ss, tr_y, test_size=0.2, random_state = 7)

# 랜덤 포레스트 함수 불러오기 및 학습실시
from sklearn.ensemble import RandomForestClassifier
model_rf = RandomForestClassifier().fit(x_tr, y_tr)

# 램덤 포레스트 함수 이용 train 검증용 데이터셋 예측값 생성
y_val_pred = model_rf.predict(x_val)

# 램덤 포레스트 함수 이용 train 검증용 데이터셋 예측확률 생성
y_val_prob = model_rf.predict_proba(x_val)

# 예측확률에서 필요한 값만 가져오기
y_val_prob = y_val_prob[:,1]

# auc 출력을 위해 roc_curve 함수 불러오기 및 값 생성
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_val, y_val_prob)

# auc 출력
from sklearn.metrics import auc
print(auc(fpr, tpr))

# 램덤 포레스트 함수 이용 test 데이터셋 예측값 생성 및 데이터프레임 변환
te_y_pred = model_rf.predict(te_x_ss)
gender = pd.DataFrame(te_y_pred, columns = ['gender'])

# 기존 X_test 데이터셋의 cust_id와 생성된 예측값을 합친 데이터프레임 생성
result = pd.concat([X_test.cust_id, gender], axis = 1)

# csv 파일 저장
pd.DataFrame(result).to_csv('003000000.csv', index=False)