귀퉁이 서재

DATA - 22. 로지스틱 회귀(Logistic Regression) 본문

데이터 분석

DATA - 22. 로지스틱 회귀(Logistic Regression)

Baek Kyun Shin 2019. 5. 6. 18:02

이번 챕터에서는 로지스틱 회귀에 대해 알아보겠습니다. 이전 챕터까지 배웠던 단순 선형 회귀, 다중 선형 회귀에서는 독립 변수가 양적 데이터 혹은 범주형 데이터이고, 종속 변수가 양적 데이터였습니다. 이번엔 종속 변수가 범주형 데이터일 때의 회귀 모델에 대해 알아보겠습니다. 종속 변수가 범주형 데이터이며 이진형(binary)일 때를 로지스틱 회귀라 합니다. 위키피디아 정의를 가져와 봤습니다.

로지스틱 회귀(logistic regression)는 D.R.Cox가 1958년에 제안한 확률 모델로서 독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는 데 사용되는 통계 기법이다. 로지스틱 회귀의 목적은 일반적인 회귀 분석의 목표와 동일하게 종속 변수와 독립 변수 간의 관계를 구체적인 함수로 나타내어 향후 예측 모델에 사용하는 것이다. 이는 독립 변수의 선형 결합으로 종속 변수를 설명한다는 관점에서는 선형 회귀 분석과 유사하다. 하지만 로지스틱 회귀는 선형 회귀 분석과는 다르게 종속 변수가 범주형 데이터를 대상으로 하며, 입력 데이터가 주어졌을 때 해당 데이터의 결과가 특정 분류로 나뉘기 때문에 일종의 분류 (classification) 기법으로도 볼 수 있다. 흔히 로지스틱 회귀는 종속변수가 이진형(binary) 문제(즉, 유효한 범주의 개수가 두 개인 경우)를 지칭할 때 사용된다. 이외에, 두 개 이상의 범주를 가지는 문제가 대상인 경우엔 다항 로지스틱 회귀 (multinomial logistic regression) 또는 분화 로지스틱 회귀 (polytomous logistic regression)라고 하고 복수의 범주이면서 순서가 존재하면 서수 로지스틱 회귀 (ordinal logistic regression)라고 한다. 로지스틱 회귀 분석은 의료, 통신, 데이터마이닝과 같은 다양한 분야에서 분류 및 예측을 위한 모델로서 폭넓게 사용되고 있다.

(Reference1)

로지스틱 회귀의 예로는, 성적 등을 기반으로 어떤 대학에 합격할지 불합격할지, 환자의 건강 상태를 기반으로 특정 질병이 있는지 없는지 등이 있습니다. 독립 변수로는 양적 데이터, 범주형 데이터 모두 사용이 가능하지만 종속 변수는 binary인 범주형 데이터입니다. (합격 or 불합격, 양성 or 음성)

출처: Udacity

p : 성공 확률 (대학에 합격할 확률, 특정 질병이 있을 확률 등)

p/(1-p) : 오즈 (odds) - 성공 확률이 실패 확률보다 몇 배 더 높은가를 나타내는 비율

오즈가 1보다 크면 성공 확률이 실패 확률보다 높다는 뜻이고, 1보다 작으면 성공 확률이 실패 확률보다 작다는 뜻입니다.

(ex. 카지노에서 오즈가 1/4이라면 5번 게임을 해서 1번은 이기고, 4번은 진다는 뜻입니다.)

출처: Udacity

성공 확률 p에 대한 그래프는 시그모이드(Sigmoid) 함수를 그립니다. 시그모이드 함수의 특징은 0부터 1까지의 값을 갖는다는 것입니다. 즉, 성공 확률 p가 0부터 1 사이의 값입니다. 여기서 x 축은 회귀식 전체입니다. 수식을 보면 항상 증명해보고 싶은 욕구가 있어서 자필로 쓴 것을 그대로 올립니다.

로지스틱 회귀 실습

본 실습은 GRE 점수, GPA, Prestige를 기반으로 UCLA 대학에 합격할 수 있는지 없는지 여부를 판별하는 실습입니다. 사용할 변수는 다음과 같습니다.

admit: 이항 변수(binary variable)로 합격(admit = 1), 불합격(admit = 0)으로 나뉨
gre: GRE(Graduate Record Examination) 점수
gpa: GPA (Grade Point Average) 학점 평균
prestige: 출신 고등학교입니다. (prestige = 1이면 가장 좋은 학교이고, prestige = 4이면 가장 안 좋은 학교)

gre, gpa, prestige가 독립변수이고, admit이 종속변수입니다. 또한 gre와 gpa는 양적 데이터이며, prestige는 범주형 데이터입니다. admit는 binary 범주형 데이터입니다. 따라서 로지스틱 회귀를 해야 합니다.

데이터 셋은 제 깃헙에서 받을 수 있습니다.

import numpy as np
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv("admissions.csv")
df.head()

우선, 범주형 독립 변수인 prestige를 원-핫 인코딩 처리해보겠습니다.

df[['prest_1', 'prest_2', 'prest_3','prest_4',]] = pd.get_dummies(df['prestige'])
df.head()

이제, intercept를 추가하고, Logit 함수를 이용해 로지스틱 회귀 결과를 구해보겠습니다. (다중 선형 회귀에서는 OLS를 썼지만 로지스틱 회귀에서는 Logit을 씁니다.) prest_1을 baseline로 잡았기 때문에 drop 했습니다.

df['intercept'] = 1

logit_mod = sm.Logit(df['admit'], df[['intercept','gre', 'gpa', 'prest_2', 'prest_3', 'prest_4']])
results = logit_mod.fit()
results.summary()

우선, 로지스틱 회귀를 한 모든 계수가 admit과의 관계에 있어 통계적으로 유의합니다. p-value가 0.05보다 작기 때문입니다. 로지스틱 회귀는 다중 선형 회귀와 다르게 계수(coef)에 지수 변환을 해줘야 합니다. 지수 변환을 해준다는 의미는 exponential 함수를 취한다는 말입니다.

np.exp(results.params)

다른 모든 변수가 동일하다고 할 때, GPA가 1점 증가함에 따라 admit 확률이 2.18배 증가합니다. 또한, 어떤 사람이 prestige 4인 고등학교를 졸업했다면, prestige 1인 고등학교를 졸업한 것에 비해 입학 확률이 0.21배가 됩니다. np.exp(results.params)에 역수를 취하면 prestige 간 관계를 보다 명확히 파악할 수 있습니다.

1/np.exp(results.params)

np.exp(results.params)에 역수를 취한 결과를 기반으로 다시 해석해 보겠습니다. prestige 1인 고등학교를 졸업했다면 prestige 4인 고등학교를 졸업한 것에 비해 입학 확률이 4.73배 높아집니다. prestige 3에 비해서는 3.81배, prestige 2에 비해서는 1.97배 높아집니다. 범주형 데이터는 이런 식으로 해석할 수 있습니다.

반면, 양적 데이터(수치형 데이터)는 다중 선형 회귀에 동일하게 해석합니다. 물론 exponential 함수는 취해줘야 합니다. gpa가 1점 오를 때마다 2.18배 입학 확률이 높아진다고 해석할 수 있습니다.

Reference

Reference1 : 위키피디아 (로지스틱 회귀)

8 Comments
  • 프로필사진 부축 2019.12.01 02:18 odds ratio의 정의가 잘못되어 있는 것 같습니다.
    p/(1-p) 는 odds 이고
    odds ratio 는 odds 값의 비로써 odds(p1)/odds(p2) 라고 알고 있습니다.
  • 프로필사진 Baek Kyun Shin 2019.12.29 23:15 신고 부축님 의견 감사합니다! 말씀하신대로 p/(1-p)은 odds ratio가 아니라 odds가 맞습니다. 수정해놨습니다. 감사합니다 ^^
  • 프로필사진 taewonyy 2021.02.09 11:34 혹시 마지막의 1/_의 코드는 어떻게 활용한것인지 여쭤봐도 될까요..? result.params을 지수함수화 시켜주어 출력하는것까진 다 잘 따라왔는데 1/_는 어떤 개념인지를 전혀 모르겠네요ㅠㅠ

    그리고 마지막 부분에 범주형 데이터는 이런식으로 해석을 한다는 부분에서 이런식이라는게 1/_라는 것을 활용해서라는 뜻인거죠?
  • 프로필사진 Baek Kyun Shin 2021.02.10 16:21 신고 안녕하세요.

    1) 언더바(_)에는 이전에 출력했던 값이 저장돼 있습니다.
    그렇기 때문에 1/_는 1/np.exp(results.params)와 같은 뜻입니다. np.exp(results.params)의 역수라고 보시면 됩니다 ^^ 혼선이 없게 본문 코드도 수정했습니다.

    2) 제가 명확히 표현을 못했나보네요. '이런 식'은 'prestige 1인 고등학교를 졸업했다면 prestige 4인 고등학교를 졸업한 것에 비해 입학 확률이 4.73배 높아진다는 뜻입니다. prestige 3에 비해서는 3.81배, prestige 2에 비해서는 1.97배 높아집니다.'을 뜻합니다.
    prestige는 범주형 데이터입니다. 이 글에서는 범주형 데이터와 타깃 값(여기서는 admit) 간 관계를 어떻게 해석하는지에 관해 설명했습니다. 범주형 데이터를 원-핫 인코딩한 뒤 Logit 함수로 로지스틱 회귀 결과를 구했습니다. 회귀 결과를 기반으로 prestige 간 관계를 살펴봤습니다. 그 결과가 "prestige 1인 고등학교를 졸업했다면 prestige 4인 고등학교를 졸업한 것에 비해 입학 확률이 4.73배 높아진다는 뜻입니다. prestige 3에 비해서는 3.81배, prestige 2에 비해서는 1.97배 높아집니다."입니다.

    "이런 식"을 길게 설명해봤습니다. 이 글을 쓸 당시 휘리릭 쓰다보니 혼선의 여지가 있었겠네요. 질문해주셔서 감사드립니다.
  • 프로필사진 후후 2021.11.10 10:43 안녕하세요!! 귀퉁이서재님의 포스팅으로 공부하고 있는 학생입니다!!
    궁금한 것이 생겨서 여쭤봐도 될런지요!!
    1) intercept을 1로 넣어주는 이유는 단순히 결과를 보기 위해서일까요? (1일 때에는 영향을 미치지 않는다 등의..이유..같은..?)
    2) 마지막 회귀계수를 지수 변환을 이용하여 해석할 때 intercept 의 회귀계수는 따로 해석을 하지 않아도 될까요?
    (Ex. 또한, 어떤 사람이 prestige 4인 고등학교를 졸업했다면, prestige 1인 고등학교를 졸업한 것에 비해 입학 확률이 0.21배가 됩니다.)
  • 프로필사진 Baek Kyun Shin 2021.11.11 23:25 신고 제 포스팅으로 공부해주신다니 감사드립니다.
    1) intercept를 넣어준 이유는 따로 없는 것 같습니다. 해석을 보면 지수변환한 계수를 보면 0.02입니다. 즉 intercept가 변하더라도 입학확률에는 거의 변함이 없다는 말입니다. intercept가 1로 똑같기 때문이죠. 그저 아무 의미 없는 변수를 추가해서 결과를 보기 위함입니다.
    2) intercept는 의미 없는 값이므로 따로 해석할 필요가 없습니다.
    저도 워낙 오래 전에 학습한 내용이라 기억이 좀 가물가물하네요 ^^ 혹시 틀린 내용이 있다면 댓글 남겨주세요~
  • 프로필사진 익명 2022.04.20 02:46 비밀댓글입니다
  • 프로필사진 Baek Kyun Shin 2022.04.20 08:06 신고 안녕하세요! 방문해주셔서 감사합니다.
    말씀하신 내용 중 B가 무엇을 뜻하는 건지요? 회귀계수를 뜻하는 건가요? 그리고 odds와 odds ratio는 다른 개념인데 odds ratio를 뜻하신 건지요?
    만약 B가 회귀계수를 뜻한다면, 본문에서 설명드렸듯이 B를 exponential해준 뒤 독립변수와 종속변수와의 관계를 설명할 수 있습니다.
댓글쓰기 폼