본문 바로가기
생활 정보/IT 정보

파이썬 데이터분석 로지스틱회귀분석

by 스파이더재벌 2019. 2. 28.

목차

    728x90
    반응형
    728x170

    로지스틱회귀분석을 통해 분류예측분석과 독립변수가 종속변수여부에 어떤 영향을 미치고 있는지 알아보도록 하겠습니다.

    개요
    이변량 종속변수(집단1 또는 0)인 경우에는 일반적인 선형회귀분석이 적합하지 않다. 이변량 종속변수라는 특성이 있어도 사용할 수 있는 분석이 로지스틱회귀분석이다. 로지스틱회귀분석이란 양적인 독립변수들과 범주형 혹은 명목형인 이변량 종속변수(집단1 또는 0)에 대해 속할 범주를 추정하는 분류예측을 위한 분석을 말한다. 예를 들어,

    합격과 불합격 중 합격일 확률이 있다. 불합격 집단과 비교해 그런 결과가 나오게 된 이유가 무엇인가, 그 요인이 얼마나 영향을 주었는가를 파악하는 분석이다.  두개의 집단으로 분류하는 경우 로지스틱 회귀분석을 이항 로지스틱 회귀분석, 3개 이상의 다수 집단으로 분류하기 위한 로지스틱 회귀분석을 다항 로지스틱회귀분석 이라고한다. 일반적으로 로지스틱회귀분석이라고하면 이항로지스틱회귀분석을 의미한다. 최대우도법을 이용해서 계수를 추정한다.

     

    로지스틱 회귀분석의 개념

    이항로지스틱 회귀분석이란 종속변수의 범주 수가 2개일 경우를 말한다. 예를 들어, 종속변수가 결혼여부(기혼, 미혼)일 경우에는 이항로지스틱 회귀분석이 적합할 것이다. 일반적인 로지스틱 회귀모형은 다음과 같다.

     

    로지스틱 회귀분석은 선형함수가 아닌 로짓함수를 사용하여 진행한다. 그렇기 때문에 로지스틱 회귀분석의 모형은 목표집단에 속할 확률과 그렇지 않을 확률의 비율에 자연로그를 취한 값을 출력함으로써 분류예측을 수행한다. 로지스틱 회귀분석의 독립변수와 종속변수와의 관계는 비선형 S자의 형태를 띈다. S자 이기때문에 선형회귀곡선의 해석처럼 일정한 변화는 알 수 없다S자라는 특성 때문에 로지스틱 회귀분석은 로지스틱 회귀곡선 상에서 분류 기준 값(cut-off value)을 설정하고 목표집단에 속할 확률이 분류기준값보다 큰 경우 집단1(목표집단), 분류 기준값보다 작은경우 집단0으로 분류하는 분석이다.

     

    확률, 오즈, 로짓의 개념

    로지스틱 회귀분석이 어떻게 로짓함수를 사용하여 분석을 진행하게 됐는지 다음 일련의 개념들을 살펴보도록 하자.

    먼저, 확률이다. 종속변수가 범주형일 경우에 대학교 합격여부를 합격과 불합격으로 나눌 수 있다. 합격과 불합격이 확률상으로는 1 0 두가지만 존재한다는 뜻이다. , 구간이 0~1사이에 존재하며 다음의 식으로 표현할 수 있다.

     

    이 말인 즉슨, 수능성적이 높아질수록 대학교 합격이 얼마나 달라질지 하나의 선만으로는 파악이 불가능하다는 뜻이다. 만약 수능점수별로 대학교 합격을 비율로 그려본다면S자 모형이 나타날 것이다. 이 그래프는 종속변수의 범주형 형태를 확률 값으로 나타낸 그래프일 것이다. S자 이며 수능점수 증가에 따라 대학 합격 가능성을 설명 또는 예측이 가능한 그래프이다. 그러나 이러한 곡선 관계는 3차식이라는 문제가 있다. 3차식은 이해하기 매우 복잡하고 모델의 일반화가 어렵다. 따라서 우리는 이러한 관계식을 더 쉽게 해석 할 수 있게 간결하게 만들어야 할 필요성이 있다. 이를 해결할 수 있는 방법이 오즈이다. 오즈에 대해서 알아보도록 하자.

     

    종속변수를 확률로 변환하여 사용하는 경우에는 문제가 발생할 수 있기 때문에 오즈의 개념이 생겼다. 종속변수를 구간별 비율 또는 확률로 삼아서는 올바른 추정결과를 얻기가 어렵기 때문이다. 오즈는 자료 변환과정을 말한다. 확률은 전체대비 발생건수인 반면에 오즈는 발생하지 않는 건수 대비 발생건수를 말한다. , 오즈는 다음의 식을 갖는다.

     

    따라서 오즈의 구간은 0부터 무한대까지이며 음수가 나타나지 않는다. 이 또한 확률과 마찬가지로 비선형적 관계이기 때문에 간단하고 명확한 모델을 얻기가 힘들다는 문제가 있다. 그렇기 때문에 나타난 개념이 오즈비이다.

     

    오즈비는 다른 집단 간에 발생할 확률의 비를 의미한다. , 독립변수가 분류 결정에 미치는 영향의 정도를 계량화 하는데 사용한다. 로지스틱회귀분석에서는 오즈비로 계산을 하는데 그 이유는 다음과 같다. 첫번째, 수리적 관점에서 비율 혹은 확률은 0 1사이의 값만 존재하지만 오즈로 계산하게되면 0에서 무한대 값이된다. 종속변수의 범위가 마이너스 무한대에서 무한대로 실수 전체 구간으로 확대됨으로써 회귀모델로 추정하는 것이 가능해진다. 두번째, 더욱 현실적인 결과로 해석된다는 장점이 있다. 로지스틱 회귀분석의 목적은 종속변수의 두 범주 중 어떤 특정 범주에 속할 확률 또는 가능성을 파악하는 것이다. 그런 결과가 나오게 된 이유가 무엇인지 얼마나 영향을 주었는지 등을 파악할 수 있다. 오즈비가 1보다 크면 독립변수가 종속변수에 양의 방향으로 영향을 미친다는 뜻을 의미한다. 따라서, 다른 집단과의 비교값인 오즈비가 더욱 타당한의미를 가진다. 확률과 오즈에서 나타나는 문제 모두 해결 가능함에 따라 1차식의 관계가 도출될 수 있고 선형관계로 모델 추정이 쉽게 때문에 로지스틱 회귀분석에서는 오즈비를 사용한다.

     

    오즈로 구한 종속변수도 회귀모델에 적용하기에는 완전치 않다. 그 이유는 구간이 0과 무한대 사이이기때문에 음수가 존재하지 않고 비선형적 관계로 나타나기 때문이다. 따라서, 오즈에 자연로그를 취하여 자료를 변환해야한다. 로그변환을 하게 되면 자료가 선형적으로 안정화되면서 음수와 양수 전체 구간에 무한대가지 존재하게 된다. 이것이 로짓이다.

     

    로지스틱 회귀분석 실습

    N대학교의 대학원 입학처는 본교 대학원에 입학 하는 학생이 어떠한 특성을 가지는지 파악하고 대학원에 입학할 가능성이 있는 수험생을 예측하고자한다.

    대학원입시점수와 학점을 이용해서 합격여부에 어떤 영향이 있는지, 어떤고객이 합격확률이 높은지 확인해보자. 두가지로 분류하는 이항로지스틱 회귀분석을 실습하기위해 데이터를 불러온다. 

     

    import pandas as pd import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split data = pd.read_csv('/Users/lee/Desktop/admit.csv', engine='python', encoding='CP949') data.head() 
    Out[19]:
      합격여부 입시점수 학점
    0 0 380 3.61
    1 1 660 3.67
    2 1 800 4.00
    3 1 640 3.19
    4 0 520 2.93

    독립변수와 종속변수를 지정해주고 훈련용 데이터와 검증용 데이터를 7:3으로 분할해준다.

     

    x = data[['입시점수', '학점']]  #변수 지정 y = data[['합격여부']]
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
     

    from sklearn.linear_model import LogisticRegression log = LogisticRegression() #로지스틱 회귀분석 시행 log.fit(x_train, y_train) #모델의 정확도 확인 print('학습용 데이터셋 정확도 : %.2f' % log1.score(x_train, y_train)) print('검증용 데이터셋 정확도 : %.2f' % log1.score(x_test, y_test))

    학습용 데이터셋 정확도 : 0.68 검증용 데이터셋 정확도 : 0.68

    로지스틱 회귀분석을 사용하기 위한 기본 구조는 LogisticRegression(C=1.0, class_weight=Nonerandom_state=None)이다. C값의 기본값은 1.0이다. 오류 강도를 정하는 매개 변수이다. 작은 C값은 제약이 큰 모델을 만들고 각 데이터 포인트의 영향력이 작아지게한다. , 데이터가 다른 경계면에 분류되었음에도 별다른 제약없이 경계가 그려지며 C값이 커지면 각 포인트들이 결정 경계에 큰 영향을 준다. (C값을 변경하고 싶으면 LogisticRegression(C=100) 이렇게 사용할 수 있다.)

     

    Class_weight은 가중치를 말하는데 기본값은 1이다. Random_state는 난수 생성 프로그램을 사용할 때 사용한다. 기본값은 없다. 우리가 사용한 코드에는 모든파라미터 값을 기본으로 넣은 LogisticRegression()으로 모델을 만들었다.

    학습용 데이터셋 정확도가 0.68나오고 검증용 데이터셋 정확도 또한 0.68로나왔다. 조금 자세한 평가를 위해 classification_report 모듈을 이용하였다. 모듈은 모형 성능평가를 위한 모듈로 정밀도(precision), 재현율(recall),F1-score, support 구해준다.

     

    from sklearn.metrics import classification_report y_pred=log.predict(x_test) print(classification_report(y_test, y_pred)) 

     

     
                 precision    recall  f1-score   support            0       0.68      1.00      0.81        82           1       0.00      0.00      0.00        38  avg / total       0.47      0.68      0.55       120

    이 모델의 정밀도의 수치는 0.47, 재현율의 수치는 0.68로 나타났다.

     

    이제 모델의 회귀계수와 오즈비를 구해 독립변수가 분류 결정에 미치는 영향의 정도를 알아보기 위해 다른 방식의 로지스틱회귀분석을 진행해보자. logit이란 변수에 합격여부를 종속변수로 하는 데이터를 넣고, 앞서 넣은 독립변수 x값도 입력한 뒤 적합 시켜준다.

    import statsmodels.api as sm logit = sm.Logit(data[['합격여부']],x) #로지스틱 회귀분석 시행 result = logit.fit() 
     
    Optimization terminated successfully.          Current function value: 0.629448          Iterations 5
    result.summary2() 
    Out[25]:
    Model: Logit No. Iterations: 5.0000
    Dependent Variable: 합격여부 Pseudo R-squared: -0.007
    Date: 2019-02-28 13:31 AIC: 507.5584
    No. Observations: 400 BIC: 515.5414
    Df Model: 1 Log-Likelihood: -251.78
    Df Residuals: 398 LL-Null: -249.99
    Converged: 1.0000 Scale: 1.0000
      Coef. Std.Err. z P>|z| [0.025 0.975]
    입시점수 0.0016 0.0010 1.5825 0.1135 -0.0004 0.0035
    학점 -0.4823 0.1752 -2.7522 0.0059 -0.8257 -0.1388

    각 회귀계수가 합격여부에 어떻게 영향을 미치는지 확인해보자. 먼저, 유의확률을 본다. 학점 변수만 유의수준 99%에서 종속변수에 영향을 주는 유의한 변수임을 알 수 있다. 입시점수를 제외하고 계속해서 해석을 진행한다.

     

    편회귀계수값의 부호를 통해 종속변수에 미치는 영향의 방향을 파악할 수 있다. 편회귀계수의 값이 양수라면 합격여부가 '1'일 확률이 높아진다는 뜻이다. 반대로 음수라면 합격여부의 값이 '0'일 확률이 높아진다는 뜻이다. 따라서 모형의 회귀계수 분석결과는 다음과 같다. 학점이 낮을수록 합격확률이 높다. 통계량에 나와있는 편회귀계수의 값 자체만으로는 각 변수들이 종속변수에 얼마나 영향을 주는지는 파악할 수 없다. 종속변수에 미치는 정도는 오즈비를 통해 파악할 수 있다.

    다음과 같은 코드를 작성해서 오즈비를 구해보자.

    np.exp(result.params) 
    Out[26]:
    입시점수    1.001563 학점      0.617389 dtype: float64

    오즈비가 1을 기준으로 큰지 작은지를 파악하여 종속변수에 미치는 영향의 방향을 파악할 수 있다. 독립변수가 두개 이상 있을 때는 다른 독립변수를 일정한 값으로 고정한 경우의 오즈비로 해석된다. 아무런 관계없을 때 오즈비는 1이다. 1에서 멀리 떨어질수록 종속변수와의 관계가 강하다는 뜻이다. , 종속변수 여부에 큰 영향을 준다는 뜻이다.  오즈비는 1을 기준으로 영향을 판단하므로, 오즈비가 10인 경우와 0.1인 경우는 종속변수에 영향을 주는 강도가 같다. 입시점수 변수의 경우, 극도로 1에 가까운 값으로 나타난다. 따라서, 입시점수는 합격여부에 별다른 영향을 주지않았음(관계 없음)을 알 수 있다. 반면, 학점의 경우는 각 오즈비가 0.611과 떨어져있으므로 합격여부에 영향을 미쳤음을 알 수 있다.

     

    독립변수가 수치형일 경우 또 다르게 오즈비해석을 할 수 있다. 학점1단위 증가하면 합격할 확률이 0.61배 증가한다는 뜻으로도 해석할 수 있다. 따라서, 대학원입학에는 입시점수보다 학점이 중요한 것을 알 수 있었다.

    728x90
    반응형
    그리드형