본문 바로가기

데이터분석/Python

[범주형 자료분석]다중 로지스틱 회귀분석 예제- Personal Loan data - (1) in python

참고) 로지스틱 회귀분석 개념, 예측식, 회귀계수 해석 방법 - [범주형 자료분석]로지스틱회귀분석(Logistic regression)

https://topo314.tistory.com/65

 

[범주형 자료분석]로지스틱회귀분석(Logistic regression)

1. 로지스틱 회귀분석(Logostic regression)이란 2. 로지스틱 회귀계수 해석 1. 로지스틱 회귀분석(Logostic regression)이란 -2개의 카테고리를 가지는 이항(binary) 형태(ex. yes/no)의 출력변수(Y)를 예측할 때..

topo314.tistory.com

 

 

 

Personal loan 데이터를 통해 개인의 대출 여부를 예측하는 다중 로지스틱 회귀분석을 진행하겠습니다. 우선, 필요한 라이브러리들을 불러오고, 분석할 데이터를 불러옵니다. 14개의 변수, 2500개의 행으로 이루어진 데이터이고 출력변수(Y)는 personal loan입니다.

 

import os
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve
import statsmodels.api as sm
import matplotlib.pyplot as plt
import itertools
ploan = pd.read_csv("./data/Personal Loan.csv")
ploan.head()


	ID	Age	Experience	Income	ZIP Code	Family	CCAvg	Education	Mortgage	Personal Loan	Securities Account	CD Account	Online	CreditCard
0	1	25	1	49	91107	4	1.6	1	0	0	1	0	0	0
1	2	45	19	34	90089	3	1.5	1	0	0	1	0	0	0
2	3	39	15	11	94720	1	1.0	1	0	0	0	0	0	0
3	4	35	9	100	94112	1	2.7	2	0	0	0	0	0	0
4	5	35	8	45	91330	4	1.0	2	0	0	0	0	0	1

 

개인 대출 데이터의 각 변수에 대한 설명입니다.

Experience: 경력
Income: 수입
Famliy: 가족단위
CCAvg: 월 카드사용량 
Education: 교육수준(1: undergrad; 2, Graduate; 3; Advance )
Mortgage: 가계대출
Securities account: 유가증권계좌유무
CD account: 양도예금증서 계좌 유무
Online: 온라인계좌유무
CreidtCard: 신용카드유무 

 

 

id와 zip code는 의미 없는 고유번호이기 때문에 제거한 후, 분석을 위해 상수항을 추가합니다.

 

ploan_processed = ploan.dropna().drop(['ID', 'ZIP Code'], axis=1, inplace=False)
ploan_processed = sm.add_constant(ploan_processed, has_constant="add") #상수항 추가

 

 

데이터 분리

모형 적합을 위하여 설명변수(X)와 타겟변수(Y)를 분리하고, 학습 데이터와 평가 데이터도 분리합니다. 이때, Y는 대출여부로 0과 1을 갖습니다. train data와 test data를 7:3의 비율로 각각 1750개, 750개로 나눕니다.

 

# X, Y 분리
feature_columns = ploan_processed.columns.difference(['Personal Loan'])
X = ploan_processed[feature_columns]
y = ploan_processed['Personal Loan']

# 학습, 평가 데이터 분리
train_x, test_x, train_y, test_y = train_test_split(X, y, stratify=y,train_size=0.7,test_size=0.3,random_state=314)
print(train_x.shape, test_x.shape, train_y.shape, test_y.shape)


(1750, 12) (750, 12) (1750,) (750,)

 

 

로지스틱 회귀모형 모델링

분리한 학습용 데이터로 로지스틱 회귀모형을 적합합니다. logit 함수를 이용하여 학습용 타겟변수(Y)와 설명변수(X)를 넣고 모델을 적합한 뒤 뉴턴 방법을 이용해 결과를 출력합니다.

 

#모형 적합
model = sm.Logit(train_y, train_x)
results = model.fit(method="newton")


Optimization terminated successfully.
         Current function value: 0.134216
         Iterations 9

 

summary 함수를 이용하여 모형적합 결과를 확인합니다. Mortgage(가계대출) 변수의 회귀계수가 0에 가깝고 p값이 매우 크고, 나머지 변수들은 대체로 p값이 작아 유의한 것으로 보이므로 mortgage 변수의 제거를 고려해볼 수 있습니다.

results.summary()


Logit Regression Results
Dep. Variable:	Personal Loan	No. Observations:	1750
Model:	Logit	Df Residuals:	1738
Method:	MLE	Df Model:	11
Date:	Tue, 08 Mar 2022	Pseudo R-squ.:	0.6030
Time:	13:49:35	Log-Likelihood:	-229.35
converged:	True	LL-Null:	-577.63
Covariance Type:	nonrobust	LLR p-value:	2.927e-142
coef	std err	z	P>|z|	[0.025	0.975]
Age	0.0245	0.102	0.240	0.810	-0.175	0.224
CCAvg	0.0985	0.063	1.562	0.118	-0.025	0.222
CD Account	4.3726	0.568	7.703	0.000	3.260	5.485
CreditCard	-1.2374	0.337	-3.667	0.000	-1.899	-0.576
Education	1.5203	0.190	7.999	0.000	1.148	1.893
Experience	-0.0070	0.102	-0.069	0.945	-0.206	0.192
Family	0.7579	0.128	5.914	0.000	0.507	1.009
Income	0.0547	0.004	12.659	0.000	0.046	0.063
Mortgage	-0.0001	0.001	-0.144	0.885	-0.002	0.002
Online	-0.4407	0.263	-1.674	0.094	-0.957	0.075
Securities Account	-1.8520	0.561	-3.299	0.001	-2.952	-0.752
const	-13.9203	2.773	-5.021	0.000	-19.354	-8.486

 

 

로지스틱 회귀계수 해석

로지스틱 모형의 회귀계수는 logit에 대한 해석만 가능하므로, 더 쉬운 해석을 위해 추정된 회귀계수에 exponential을 취합니다. 추정 회귀계수에 지수를 취했으므로 '(다른 설명변수들이 고정되어있을 때) X가 한단위 증가하면 대출할 오즈(:성공 확률/실패 확률)가 ~배로 증가/감소한다'고 해석이 가능합니다. 따라서, CD account가 1인 경우(양도예금증서 계좌가 있는 경우)의 대출 오즈는 0인 경우(계좌가 없는 경우)의 대출 오즈의 49.337배로 더 높고, Credit Card가 1인 경우(신용카드가 있는 경우)의 대출 오즈는 0인 경우(없는 경우)의 대출 오즈의 0.26배로 감소한다고 해석할 수 있습니다.

 

np.exp(results.params)


Age                    0.924160
CCAvg                  1.107223
CD Account            49.337027
CreditCard             0.259601
Education              4.314014
Experience             1.098492
Family                 2.446251
Income                 1.050963
Mortgage               1.000046
Online                 0.609064
Securities Account     0.270270
const                  0.000018
dtype: float64

 

 

로지스틱 회귀모형의 결과 예측

위에서 적합한 로지스틱 회귀모형에 검증용 데이터(test data)를 넣어 y_hat을 구합니다. 이때, 타겟변수(출력변수)의 예측값이이 확률로 나오므로 0, 1로 예측하기 함수를 정의하여 사용합니다.

 

#예측확률
pred_y = results.predict(test_x)
pred_y


1155    0.001265
1829    0.021350
469     0.000482
370     0.001964
1641    0.973285
          ...   
1614    0.039040
2039    0.005099
131     0.987936
173     0.001054
2311    0.167414
Length: 750, dtype: float64

 

예측값이 임계값(threshold)보다 크면 Y를 1로, 그렇지 않으면 0으로 예측하는 cut_off함수를 정의합니다. 이 임계값에 따라 성능이 바뀌는데, 여기서는 임계값으로 0.5를 사용했습니다. 정의한 cut_off 함수에 위에서 계산한 예측값을 넣어 Y를 0, 1로 변환합니다.

 

def cut_off(y,threshold=0.5):
    Y = y.copy() # copy함수를 사용하여 이전의 y값이 변화지 않게 함
    Y[Y>threshold]=1
    Y[Y<=threshold]=0
    return(Y.astype(int))

pred_Y = cut_off(pred_y,0.5)
pred_Y


1155    0
1829    0
469     0
370     0
1641    1
       ..
1614    0
2039    0
131     1
173     0
2311    0
Length: 750, dtype: int32

 

참고) 임계값에 따른 성능지표 비교

더보기

임계값을 0부터 1까지 0.1단위로 나누어 각각의 정확도(accuracy)를 계산한 결과, 이 경우에 임계값이 0.5~0.6일때 성능이 가장 좋은것을 확인할 수 있습니다.

threshold = np.arange(0,1,0.1) #0~1까지 0.1간격으로
table = pd.DataFrame(columns=['ACC'])
for i in threshold:
    pred_Y = cut_off(pred_y,i)
    cfmat = confusion_matrix(test_y, pred_Y)
    table.loc[i] = acc(cfmat)
table.index.name='threshold'
table.columns.name='performance'
table


performance	ACC
threshold	
0.0	0.102667
0.1	0.880000
0.2	0.908000
0.3	0.932000
0.4	0.945333
0.5	0.954667
0.6	0.950667
0.7	0.942667
0.8	0.936000
0.9	0.929333

 

혼동행렬(confusion matrix)를 계산한 후 정확도(accuracy)를 계산하여 성능을 확인합니다. 정확도가 0.955로 높은 값이 나왔습니다. 

 

cfmat = confusion_matrix(test_y, pred_Y) #혼동행렬 계산
(cfmat[0,0]+cfmat[1,1])/(cfmat[0,0]+cfmat[0,1]+cfmat[1,0]+cfmat[1,1]) #정확도


0.9546666666666667

 

ROC 커브와 AUC를 계산한 결과, 마찬가지로 높은 성능을 보입니다.

 

#ROC curve
fpr, tpr, thresholds = metrics.roc_curve(test_y, pred_y, pos_label=1)
plt.plot(fpr,tpr)

#AUC
auc = np.trapz(tpr,fpr)
print('AUC:', auc)


AUC: 0.9463923891858513

 

ROC 커브

 

참고) 정확도 계산 공식, ROC 커브 AUC 개념 - [회귀분석, 머신러닝]회귀모델의 성능지표, 머신러닝 모델의 성능 지표

https://topo314.tistory.com/60

 

[회귀분석, 머신러닝]회귀모델의 성능지표, 머신러닝 모델의 성능 지표

회귀 모델의 성능지표(학습 data안에서 사용) 1. 결정계수(R^2) 2. Adjusted R^2 3. AIC(Akaike information criterion) 4. BIC(Bayes information criterion) 머신러닝에서 사용하는 모델의 성능 지표 1. MSE(Mea..

topo314.tistory.com