HOME
home
About
home

로지스트 회귀분석

1. 로지스틱 회귀분석(Logistic Regression)의 기본 개념

1.
이진 분류
종속변수가 0/1, 예/아니오, 성공/실패 등의 두 범주 중 하나를 취할 때 사용
예: 환자의 질병 유무(유/무), 고객의 구매 여부(구매/미구매), 학생의 합격 여부(합격/불합격) 등
2.
선형회귀와의 차이
선형회귀()는 종속변수가 연속형일 때 사용
y=β0+β1x+y = \beta_0 + \beta_1 x + \dots
로지스틱 회귀는 종속변수가 0/1 범주형이므로, 예측값이 0~1 확률로 해석되도록 로짓함수(logit function)를 적용
3.
결과해석
회귀계수()가 오즈(odds)에 대한 영향을 나타내므로, = 오즈비(odds ratio, OR)로 해석
β\beta
exp⁡(β)\exp(\beta)
예: → = X가 1 증가할 때, 사건 발생 오즈가 약 1.65배 증가
β1=0.5\beta_1 = 0.5
exp⁡(0.5)≈1.65\exp(0.5) \approx 1.65

2. 로지스틱 회귀의 수학적 배경

2.1 로짓(로그오즈) 함수

로짓(p)=log(p1p)\text{로짓}(p) = \log\left(\frac{p}{1 - p}\right)
pp: 특정 사건이 일어날 확률
p1−p\frac{p}{1 - p} = 오즈(odds)
로지스틱 회귀에서는 를 독립변수의 선형결합으로 표현
log⁡(p1−p)\log\left(\frac{p}{1 - p}\right)
log⁡(p1−p)=β0+β1x1+⋯+βkxk\log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 x_1 + \dots + \beta_k x_k
이를 지수 형태로 재정리하면,
p=11+exp⁡(−(β0+β1x1+⋯+βkxk))p = \frac{1}{1 + \exp(-(\beta_0 + \beta_1 x_1 + \dots + \beta_k x_k)) }
즉, 종속변수(결과)가 발생할 확률 pp가 시그모이드 곡선 형태로 나타납니다.

2.2 오즈(odds)와 오즈비(OR, Odds Ratio)

오즈(odds): 확률 를 실패확률(또는 1-)로 나눈 값
pp
pp
예: 사건 발생 확률이 0.8이면, 오즈는 (발생이 미발생의 4배)
0.8/0.2=4.00.8 / 0.2 = 4.0
오즈비(odds ratio): 한 단위(또는 집단) 차이에 따른 오즈 변화 비율
exp⁡(βi)\exp(\beta_i): 독립변수 가 1 증가(또는 특정 범주에 해당)할 때, 오즈가 몇 배 변하는지
xix_i

3. 로지스틱 회귀의 가정

1.
독립성(Independence)
각 샘플(관측값)은 서로 독립적으로 추출
2.
종속변수는 이진(또는 다항) 범주형
기본 이진 로지스틱 회귀는 0/1로 명확하게 구분 가능해야 함
3.
선형성(Linear relationship with logit)
독립변수와 가 선형적인 관계를 가져야 한다는 가정(주로 연속형 독립변수)
log⁡(p1−p)\log(\frac{p}{1-p})
4.
큰 표본 크기
로지스틱 회귀는 최대우도추정(ML) 방식을 사용하므로, 표본 크기가 작으면 추정에 불안정성이 커짐
(일반 선형회귀처럼 “정규성”이나 “등분산성” 가정은 직접적으로 요구되지 않습니다.)

4. 모델 적합 및 평가 지표

4.1 모형 적합도 지표

1.
2 Log Likelihood (-2LL)
최대우도추정에서 얻은 로그우도를 비교하기 위한 지표
값이 작을수록 모델 적합도가 높은 편
2.
AIC (Akaike Information Criterion), BIC (Bayesian Information Criterion)
모델 복잡도(독립변수 수)가 증가할수록 패널티를 부여
AIC/BIC가 작을수록 좋은 모델로 평가
3.
Hosmer-Lemeshow test
예측 확률과 실제 관측 결과의 적합도를 검정
p-값이 너무 작으면(유의하면) 모델 적합이 좋지 않다는 뜻

4.2 예측 성능 지표

1.
정분류율(Accuracy)
예측 확률 0.5를 기준으로 1/0을 분류했을 때, 실제와 일치하는 비율
데이터가 편향된 경우(예: 90%가 0)에는 한계가 있음
2.
민감도(Sensitivity) / 특이도(Specificity)
민감도: 실제 1 중에서 예측도 1이 얼마나 맞췄는가 (TP / (TP+FN))
특이도: 실제 0 중에서 예측도 0이 얼마나 맞췄는가 (TN / (TN+FP))
3.
ROC 곡선 & AUC (Area Under the Curve)
다양한 분류 임계값(threshold)에 대한 민감도 vs 1-특이도 곡선을 그림
AUC가 1에 가까울수록 분류 성능이 우수

5. 로지스틱 회귀 절차

1.
데이터 수집 & 전처리
종속변수(0/1), 독립변수(연속형·범주형) 준비
범주형 독립변수는 더미변수/원핫인코딩 필요
2.
모델 적합(훈련)
최빈값 추정(OLS가 아니라 최대우도추정, MLE을 활용)
3.
결과 해석
회귀계수()와 p-값, 신뢰구간
β\beta
exp⁡(β)\exp(\beta) = **오즈비(OR)**로 해석
예: → OR ≈ 1.35 → 독립변수 이 1 증가할 때 사건 발생 오즈가 1.35배
β1=0.3\beta_1 = 0.3
x1x_1
4.
모델 평가
Hosmer-Lemeshow, AIC/BIC, -2LL 등 모형 적합도 지표
예측 성능(Accuracy, ROC-AUC 등)
5.
진단
다중공선성(Variance Inflation Factor, VIF) 확인
이상치/영향점 등 점검

6. Python 코드 예시

아래 예시는 statsmodelsscikit-learn을 사용한 단순 로지스틱 회귀 예시입니다. 이후 확장(다중 로지스틱)에서도 비슷한 방법으로 진행하되, 독립변수만 여러 개로 늘리면 됩니다.
import numpy as np import pandas as pd import statsmodels.api as sm import statsmodels.formula.api as smf from sklearn.metrics import confusion_matrix, classification_report, roc_curve, roc_auc_score import matplotlib.pyplot as plt # ------------------------------------------------- # 1) 예시 데이터 생성 # ------------------------------------------------- # 예: 나이(age)가 증가할수록 질병 발생 여부(disease=1) 가능성이 증가하는 상황 np.random.seed(42) N = 100 age = np.random.randint(20, 70, size=N) # 질병 발생 확률은 age가 클수록 높게 설정(단순 가정) p = 1 / (1 + np.exp(-(age - 45)/8)) # sigmoid 형태 disease = np.random.binomial(n=1, p=p, size=N) df = pd.DataFrame({'age': age, 'disease': disease}) # ------------------------------------------------- # 2) 단순 로지스틱 회귀 (statsmodels) # ------------------------------------------------- # formula: disease ~ age # link function이 로짓(기본 설정)인 glm, 혹은 logit 사용 model = smf.logit('disease ~ age', data=df).fit() print(model.summary()) # ------------------------------------------------- # 3) 예측 # ------------------------------------------------- df['pred_prob'] = model.predict(df[['age']]) # threshold=0.5로 분류 df['pred_label'] = (df['pred_prob'] >= 0.5).astype(int) # 혼동행렬(confusion matrix) cm = confusion_matrix(df['disease'], df['pred_label']) print("\n== Confusion Matrix ==") print(cm) # 분류 성능 report = classification_report(df['disease'], df['pred_label']) print("\n== Classification Report ==") print(report) # ------------------------------------------------- # 4) ROC 곡선 & AUC # ------------------------------------------------- fpr, tpr, thresholds = roc_curve(df['disease'], df['pred_prob']) auc_score = roc_auc_score(df['disease'], df['pred_prob']) print(f"AUC: {auc_score:.3f}") plt.figure(figsize=(6,6)) plt.plot(fpr, tpr, label=f'ROC curve (AUC = {auc_score:.2f})') plt.plot([0,1],[0,1],'r--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend() plt.show()
Python
복사

코드 해석

1.
데이터 생성
age(20~69세 사이 임의)와 disease(0/1)를 만듦. 나이가 높을수록 질병 확률을 높게 설정한 간단한 시뮬레이션.
2.
로지스틱 회귀 모형 적합
smf.logit(또는 smf.glm(..., family=sm.families.Binomial())) 사용
.fit()model.summary()로 계수, p-value, 로그우도, AIC 등 결과 확인
3.
예측값 계산
model.predict(...)로 예측 확률 출력
0.5 기준으로 분류 레이블(0/1)을 할당
4.
혼동행렬 및 성능 지표
confusion_matrix, classification_report로 정확도, 정밀도, 재현율, f1-score 등 확인
5.
ROC & AUC
다양한 threshold에 대한 FPR vs TPR 곡선을 그리고, 면적(AUC) 계산
AUC가 0.5~1 사이며, 1에 가까울수록 우수한 분류 모델

7. 다중 로지스틱 회귀

독립변수가 여러 개인 경우(연속형, 범주형 섞여 있음)에도 접근 방식은 동일합니다. 예:
model_multi = smf.logit("disease ~ age + sex + blood_pressure", data=df).fit() print(model_multi.summary())
Python
복사
범주형 변수(sex, 등)를 다룰 때는 자동으로 더미변수가 만들어지거나, pd.get_dummies() 등을 사용해 처리해야 합니다.
모델 평가, 변수 해석, 오즈비 계산은 단순 로지스틱과 동일합니다.

8. 결과 해석 및 보고 시 주의사항

1.
오즈비(OR)
exp⁡(β)\exp(\beta): 독립변수 1단위 변화에 따른 사건 발생 오즈가 몇 배 변하는지
해석 시 “확률이 ~배 증가”가 아니라 “오즈가 ~배”임을 명확히 구분
2.
유의성 검정
회귀계수의 p-value가 유의수준(0.05)보다 작으면, 해당 변수가 종속변수에 통계적으로 유의한 영향을 준다고 해석
단, 상호작용 변수를 포함했을 경우 해석에 주의
3.
모형 적합 지표
AIC, -2LL, Hosmer-Lemeshow 등 여러 지표를 종합적으로 확인
4.
예측 성능
정확도(Accuracy)에만 의존하지 말고, ROC-AUC, 민감도/특이도, 정밀도/재현율 등을 함께 확인
5.
다중공선성
독립변수가 여러 개일 때, VIF(Variance Inflation Factor) 확인하여 공선성이 심하지 않은지 점검
6.
적절한 표본 크기
독립변수 수에 비해 충분한 표본 확보가 권장됨(예: 분류 클래스별 10~15 * 독립변수 수 이상)

9. 요약

로지스틱 회귀분석은 종속변수가 이진형(0/1)일 때, 독립변수와의 관계를 분석하고 사건 발생 확률을 예측할 수 있는 강력한 통계 기법입니다.
log⁡(p1−p)\log(\frac{p}{1-p}) = 형태로, 선형회귀와 달리 출력이 확률(0~1 범위)이 되도록 변환합니다.
β0+β1x1+⋯+βkxk\beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k
결과 해석 시, 를 통해 “오즈비”를 확인하고, p-value와 신뢰구간, 모형 적합 지표, 예측 성능(ROC-AUC 등)을 종합적으로 평가합니다.
exp⁡(β)\exp(\beta)
Python 구현은 statsmodels 또는 scikit-learn을 사용하며, 실제 분석에서는 변수선택, 이상치 처리, 교차검증, 과적합 방지 등 좀 더 정교한 절차를 거칩니다.
이러한 일련의 과정과 핵심 개념을 이해하면, 실무 또는 연구에서 이진 분류 문제를 다룰 때 로지스틱 회귀분석을 효과적으로 적용할 수 있습니다.