eungjukim / 2018_SMU_Bigdata_Analysis_for_Management

18년도 2학기 상명대학교 경영빅데이터분석 팀 프로젝트입니다.
2 stars 0 forks source link

로지스틱 회귀분석 #8

Open eungjukim opened 5 years ago

eungjukim commented 5 years ago

회귀분석 결과 결정계수의 값이 0.32로 유의미한 결과가 나왔으나, 여전히 부족한 수치라고 생각했습니다. 그래서 더 좋은 분석을 할 수는 없을까 생각하다가, 회귀분석이 아니라 로지스틱 회귀분석을 시도해보면 어떨까 하는 생각이 들었습니다. 로지스틱 회귀분석은 회귀분석과는 다르게 종속변수의 값이 0 또는 1이어야 합니다. 그래서 고객의 평점을 4점을 기준으로 그 이상이면 만족(1), 그 미만이면 불만족(0)으로 변환하여 로지스틱 회귀분석을 진행하고자 합니다.

eungjukim commented 5 years ago

로지스틱 회귀분석 코드입니다.

#logistic regression
satisfaction = pd.read_csv("satisfaction.csv")
satisfaction = satisfaction.drop(["review_score"],1)
satisfaction = satisfaction.dropna()
satisfaction

# logistic regression
cols = satisfaction.columns[1:17] # cols : 독립변수
logit = sm.Logit(satisfaction['satisfaction'], satisfaction[cols]) # satisfaction : 종속변수

# fit the model
result = logit.fit() 

print(result.summary()) # 분석결과 출력

from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
#데이터 분할
X_train, X_test, y_train, y_test = train_test_split(satisfaction[cols], 
satisfaction['satisfaction'], test_size=0.3, random_state=0)
logreg = LogisticRegression()

logreg.fit(X_train, y_train)

y_pred = logreg.predict(X_test)

print('Accuracy of logistic regression classifier on test set: {:.2f}'.
format(logreg.score(X_test, y_test)))

#혼동행렬 생성
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
logit_roc_auc = roc_auc_score(y_test, logreg.predict(X_test))
fpr, tpr, thresholds = roc_curve(y_test, logreg.predict_proba(X_test)[:,1])
plt.figure()
plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.savefig('Log_ROC')
plt.show()

참고한 사이트 : https://3months.tistory.com/28 [Deep Play]

참고한 사이트 : https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8

eungjukim commented 5 years ago

로지스틱 회귀분석 결과 화면입니다. image

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) Accuracy of logistic regression classifier on test set: 0.87 [[13971 2843] [ 1561 16041]] precision recall f1-score support

       0       0.90      0.83      0.86     16814
       1       0.85      0.91      0.88     17602

micro avg 0.87 0.87 0.87 34416 macro avg 0.87 0.87 0.87 34416 weighted avg 0.87 0.87 0.87 34416 image

eungjukim commented 5 years ago

로지스틱 회귀분석 모델의 성능(f1 score)이 0.86 정도로 이전의 다중회귀분석 모델의 성능보다 훨씬 좋아졌습니다.

eungjukim commented 5 years ago

이전의 모델에서 실수가 있었습니다. 모델의 독립변수 중 product_height_cm 항목의 p-value가 0.5 이상으로 유의미하지 않았습니다. 그래서 이를 제외하고 다시 모델을 생성했습니다. 아래는 코드입니다.

#logistic regression
satisfaction = pd.read_csv("satisfaction.csv")
satisfaction = satisfaction.drop(["review_score"],1)
satisfaction = satisfaction.drop(["product_height_cm"],1)
satisfaction = satisfaction.dropna()
satisfaction

# logistic regression
cols = satisfaction.columns[1:16] # train_cols는 설명 변수
logit = sm.Logit(satisfaction['satisfaction'], satisfaction[cols]) # Survived는 목적 변수

# fit the model
result = logit.fit() 

print(result.summary()) # 분석결과 출력

from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(satisfaction[cols], satisfaction['satisfaction'], 
test_size=0.3, random_state=0)
logreg = LogisticRegression()

logreg.fit(X_train, y_train)

y_pred = logreg.predict(X_test)

print('Accuracy of logistic regression classifier on test set: {:.2f}'.
format(logreg.score(X_test, y_test)))

from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
logit_roc_auc = roc_auc_score(y_test, logreg.predict(X_test))
fpr, tpr, thresholds = roc_curve(y_test, logreg.predict_proba(X_test)[:,1])
plt.figure()
plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.savefig('Log_ROC')
plt.show()

출처: https://3months.tistory.com/28 [Deep Play]

출처 : https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8

eungjukim commented 5 years ago

로지스틱 회귀분석 결과 화면입니다. image Accuracy of logistic regression classifier on test set: 0.87 precision recall f1-score support

       0       0.91      0.83      0.87     16814
       1       0.85      0.92      0.88     17602

micro avg 0.87 0.87 0.87 34416 macro avg 0.88 0.87 0.87 34416 weighted avg 0.88 0.87 0.87 34416 image image

eungjukim commented 5 years ago

유의미하지 않았던 변수를 제거하니 모델의 설명력도 약간 증가하였네요. 혹시라도 제가 실수한 부분이 존재할 수도 있으니, @yooninna @pyj5485 @qkswkrje @euro95 조원 분들은 발견하시면 알려주세요!

eungjukim commented 5 years ago

k-fold 교차검증 코드 및 결과 화면입니다.

#k-fold 교차검증
from sklearn.model_selection import cross_val_score
scores = cross_val_score(logreg, satisfaction, satisfaction['satisfaction'], cv=10)
print("교차 검증 점수: {}".format(scores))
print("교차 검증 평균 점수: {:.2f}".format(scores.mean()))

image