로지스틱 회귀
[수업 목표]
- 로지스틱 회귀가 이진 분류 문제를 다루는 통계적 모델임을 이해한다.
- 모형 추정 및 성능 평가 방법 학습합니다.
- 혼동행렬, 정확도, 정밀도, 재현율, F1 점수, ROC-AUC 등 분류 모델 성능 평가 지표를 활용할 수 있다.
- Python을 활용한 로지스틱 회귀 모델링
statsmodels와scikit-learn라이브러리를 사용하여 로지스틱 회귀 모델을 구성하고, 데이터를 분석한다. - 통계적 로지스틱 회귀와 머신러닝 로지스틱 회귀의 관점차이를 짚어봅니다.
로지스틱 회귀모델(Logistic Regression Model)
1. 로지스틱 회귀란?
로지스틱 회귀는 종속변수(결과 변수)가 범주형(특히 이항, 즉 0/1과 같은 두 가지 범주)일 때 사용되는 통계 기법입니다.
예를 들어 “구매한다/구매하지 않는다”, “합격/불합격”, “병이 있다/없다”와 같은 이진 분류 문제에서 종속변수를 예측하기 위해 사용됩니다.

- 왜 단순 선형회귀를 쓸 수 없을까?
- 선형회귀는 예측값이 연속적이며, 이진 분류 문제에서 0과 1 사이에 존재해야 할 확률(확률값은 0~1 범위)이라는 해석이 적절히 이루어지지 않습니다.
- 선형회귀로 0~1 사이 확률을 직접 예측하면 예측값이 0보다 작거나 1보다 크게 나올 수도 있어, 분류모형으로서 유효하지 않은 결과가 발생할 수 있습니다. 로지스틱 회귀는 이를 해결하기 위해 로짓 함수(logit function) 를 사용하여 확률을 0과 1 사이로 제한하는 방식으로 문제를 풀어냅니다.
2. 로짓 함수와 오즈(odds)는 무엇일까요?
(1) 오즈(odds)
- 어떤 사건이 일어날 확률을 라 할 때, 로 정의합니다.
- 사건이 일어날 확률 대비 일어나지 않을 확률의 비율을 나타냅니다.
(2) 로짓(logit) = 로그 오즈(log-odds)
- 로짓은 오즈를 로그 변환한 것이며, 다음과 같이 표현됩니다.
- 값은 −∞ 부터 +∞ 까지 자유롭게 변할 수 있으므로, 독립변수(설명변수)들을 선형 조합 형태로 표현하기 적합합니다.
3. 로지스틱 회귀모형 설정
로지스틱 회귀에서는 이진 종속변수 YY가 있을 때, 다음과 같은 모형을 가정합니다.
- 여기서 는 “종속변수가 1(사건 발생)이 될 확률”입니다.
- 는 추정해야 하는 회귀계수들입니다. 이 모형을 정리하면,
로 확률을 0과 1 사이로 제한하면서도 독립변수들과의 관계를 선형 형태로 다룰 수 있게 됩니다.
4. 모형 추정(최대우도추정, Maximum Likelihood Estimation)
선형회귀와 달리, 로지스틱 회귀에서는 잔차 제곱합(OLS)을 최소화하는 대신, 최대우도추정(MLE) 을 이용해 계수들을 추정합니다.
- 우도(Likelihood): 관측된 데이터를 얻을 확률을 나타낸 함수
- 최대우도추정: 우도를 최대로 하는 파라미터(계수) 값을 찾는 방법
통계 소프트웨어나 머신러닝 라이브러리는 내부적으로 수치적 최적화(예: 뉴턴-랩슨, 경사하강법 등) 방법을 통해 계수를 추정해줍니다.
💡 우도가 뭐지?? 확률 (Probability)
- 방향: 모수 → 데이터
- 조건: 모든 모수가 고정된 상태
- 의미: “이 확률분포에서 특정 데이터가 관찰될 가능성”
- 예시) 표준정규분포(μ=0, σ²=1)에서 X≤2일 확률은 0.97725 우도 (Likelihood)
- 방향: 데이터 → 모수
- 조건: 관측된 데이터가 고정된 상태
- 의미: “이 데이터가 관찰되었을 때, 특정 모수가 참일 가능성”
- 수식으로는: L(θ|x) = P(x|θ)
→ 깊은 수학적 이해를 요구합니다 ( 추후 공부하시길 권장 드립니다 ^^ )
5. 로지스틱 회귀 계수 해석
가 한 단위 증가할 때 로그오즈 가 만큼 증가한다고 해석합니다.
-
만약 가 0.5라면, 가 한 단위 증가할 때 로그오즈가 0.5만큼 증가합니다.
-
오즈 레벨에서 해석하고 싶다면, 가 한 단위 증가했을 때, 오즈가 몇 배나 되는가”를 보여줍니다.
- 예: 라면, 가 한 단위 증가할 때 “사건 발생 오즈”가 1.65배가 됩니다.
통계적 로지스틱 회귀에서는 각 계수에 대한 p-value, 신뢰구간, 유의성 검정 등을 이용해서 변수의 영향력을 해석하고 모델 적합성을 평가하는 과정을 강조합니다.
6. 가정 및 모델 적합도 평가
- 독립변수와 로그오즈(logit) 간의 선형성
- 로지스틱 회귀에서는 독립변수와 로그오즈가 선형 관계를 가진다고 가정합니다.
- 이를 위해 독립변수 변환(예: 다항식, 스플라인, 범주화)이 필요할 수도 있습니다.
- 독립성(Independence)
- 샘플들이 서로 독립적이어야 한다고 봅니다.
- 이분형 종속변수
- 종속변수는 0과 1 또는 이벤트 발생/미발생 형식의 두 범주로 구분되어야 합니다.
- 모형 적합도 평가
- 모델이 데이터를 얼마나 잘 설명하는지 평가하기 위해 로그우도(Likelihood), 카이제곱 검정, AIC, BIC 등을 볼 수 있습니다.
- 예측 성능 측면에서는 혼동행렬(confusion matrix), ROC 곡선, AUC, 정확도(accuracy) 등을 활용합니다.
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()
Optimization terminated successfully.
Current function value: 0.441244
Iterations 6
Logit Regression Results
==============================================================================
Dep. Variable: disease No. Observations: 100
Model: Logit Df Residuals: 98
Method: MLE Df Model: 1
Date: Mon, 20 Jan 2025 Pseudo R-squ.: 0.3618
Time: 18:29:07 Log-Likelihood: -44.124
converged: True LL-Null: -69.135
Covariance Type: nonrobust LLR p-value: 1.522e-12
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -5.9997 1.142 -5.254 0.000 -8.238 -3.762
age 0.1321 0.025 5.297 0.000 0.083 0.181
==============================================================================
== Confusion Matrix ==
[[46 7]
[12 35]]
== Classification Report ==
precision recall f1-score support
0 0.79 0.87 0.83 53
1 0.83 0.74 0.79 47
accuracy 0.81 100
macro avg 0.81 0.81 0.81 100
weighted avg 0.81 0.81 0.81 100AUC: 0.879
7. 머신러닝 로지스틱 회귀와의 관점 차이
통계적 로지스틱 회귀와 머신러닝(ML) 로지스틱 회귀가 본질적으로 같은 수학적 모델임에도 불구하고, 두 접근법 사이에는 다음과 같은 차이가 있습니다.
- 해석 vs. 예측
통계적 관점: 각 회귀계수(β)가 어떤 의미인지, 유의한 변수는 무엇이며, 신뢰구간과 p-value는 어떻게 되는지가 중요합니다. 즉, 해석과 가설검정이 주요 목적입니다.- 머신러닝 관점: 모델의 예측 성능(정확도, F1 점수 등)에 집중합니다. 계수 해석보다는 실제 예측 결과와 일반화 성능이 더 중요한 경우가 많습니다.
- 정규화(Regularization)
- 머신러닝에서는 과적합(overfitting)을 방지하고 모델의 일반화 성능을 높이기 위해, 로지스틱 회귀에 (Lasso) 또는 (Ridge) 정규화를 종종 적용합니다.
통계적 로지스틱 회귀에서는 기본적으로최대우도추정만 다루는 경우가 많지만, 최근에는 통계 분야에서도 정규화를 활용하는 연구가 늘어나고 있습니다.
- 모델 선택 및 튜닝
통계적 관점: 유의성 검정이나 단계적 회귀(Stepwise), AIC/BIC 등에 의존하여 변수를 선택합니다.- 머신러닝 관점: 교차검증(cross-validation)을 통해 성능이 좋은 하이퍼파라미터(정규화 계수 등)를 찾고, 피처 선택도 자동화하는 경향이 있습니다.
- 데이터 규모 및 적용 맥락
- 통계적 접근은 상대적으로 표본 크기가 크지 않은 상황에서도
모형 계수의 해석을 위해 적용됩니다. - 머신러닝 접근은 대규모 데이터셋, 고차원(변수가 많은) 데이터셋에서도 강력한 컴퓨팅 파워와 정규화 기법으로 모델을 훈련하고 예측 성능을 최대화합니다. 정리하자면, 수학적으로는 동일한 모델을 사용하지만, 해석과 예측이라는 두 가지 초점이 다르다고 볼 수 있습니다. 통계 분야에서는 인과적 해석, 변수 선택의 이론적 근거, 유의성 검정 등에 중점을 두는 반면, 머신러닝 분야에서는 예측 정확도 향상과 모델의 일반화 성능을 높이기 위한 기법들이 적극 활용됩니다. 추후, 머신러닝에 더 비중을 두어 학습권장드립니다.
로지스틱 회귀는 분류 문제를 다루는 데 있어 매우 기본이 되는 통계적 기법이자, 머신러닝에서도 자주 쓰이는 모델입니다.
-
통계적 로지스틱 회귀: 계수 해석, 모형 가정, 유의성 검정에 초점을 맞추어 데이터가 어떻게 결론을 이끌어내는지에 관심을 둡니다.
-
머신러닝 로지스틱 회귀: 예측 성능, 일반화, 정규화 등에 더 초점을 맞추며, 대규모 데이터 환경에서 효율적으로 사용됩니다. 두 관점 모두 로지스틱 회귀라는 동일한 기반을 공유하지만, 각 분야에서 요구하는 목표에 따라 모델링 과정과 해석 방식이 달라진다는 점을 기억하면 좋습니다.
-
1. 핵심 개념
로지스틱 회귀모델은 이진 분류를 위한 통계적 모델입니다. 종속 변수가 두 개의 범주(예: 예/아니오)를 가질 때 사용되며, 입력값에 대한 확률을 예측합니다.
2. 수학적 기초
2.1 시그모이드 함수
- 기본 식:
- 특징: 모든 입력값을 0~1 사이의 확률로 변환
- 입력값 z:
2.2 확률 예측
- 결정 경계: 확률이 0.5 이상이면 클래스 1, 미만이면 클래스 0
3. 통계학과 머신러닝의 차이점
3.1 통계학적 접근
- 목적: 변수 간 관계 해석과 가설 검정
- 특징: 엄격한 통계적 가정 필요
- 중점: 모델의 해석 가능성
3.2 머신러닝 접근
- 목적: 예측 정확도 최적화
- 특징: 유연한 데이터 처리와 정규화 기법 활용
- 중점: 모델의 일반화 성능
4. 모델 구축 프로세스
4.1 데이터 전처리
- 결측치 처리
- 특징 선택 및 변환
- 데이터 정규화/표준화
- 범주형 변수 인코딩
4.2 모델 학습 및 평가
- 데이터 분할: 학습/검증/테스트
- 모델 학습: 가중치(β) 최적화
- 성능 평가 지표:
- 정확도(Accuracy)
- 정밀도(Precision)
- 재현율(Recall)
- ROC-AUC
4.3 모델 최적화
- 특징 공학
- 정규화 적용(L1/L2)
- 하이퍼파라미터 튜닝
5. 실제 활용 분야
5.1 의료
- 질병 진단
- 환자 위험도 예측
5.2 금융
- 신용카드 부정 거래 탐지
- 대출 상환 가능성 예측
5.3 마케팅
- 고객 이탈 예측
- 구매 가능성 예측
6. 구현 도구
6.1 Python 라이브러리
- scikit-learn: 머신러닝 접근
- statsmodels: 통계적 접근
6.2 주요 함수 예시
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
7. 모델 해석 시 주의사항
- 100% 정확도는 비현실적
- 0.5 근처 확률값은 불확실성이 높음
- 새로운 데이터에 대한 일반화 능력 고려 필요
- 통계적 유의성과 실제적 유의성 구분
1. 기본 개념
- 정의: 이진 분류(예/아니오)를 위한 통계적 모델로, 종속 변수가 범주형일 때 사용
- 주요 용도:
- 제품 불량 여부 예측 (양품/불량)
- 고객 구매 가능성 예측 (구매/미구매)
- 기계 고장 예측 (정상/고장)
2. 작동 원리
- 기본 메커니즘:
- 독립 변수들의 선형 결합을 시그모이드 함수로 변환
- 0~1 사이의 확률값으로 출력
- 일반적으로 0.5를 기준으로 분류
- 수학적 원리:
- 시그모이드 함수 사용:
- 확률 예측 :
2.1. 시그모이드 함수
시그모이드 함수는 입력값을 0과 1 사이의 값으로 변환하는 S자 형태의 함수입니다.
입니다.
2.2. 확률 예측
로지스틱 회귀 모델은 주어진 입력 에 대해 특정 클래스(예: 클래스 1)에 속할 확률 을 다음과 같이 예측합니다.
2.3. 결정 경계
확률이 0.5 이상일 때 클래스 1, 그렇지 않을 때 클래스 0으로 분류하는 것이 일반적입니다.
4. 모델 평가 및 해석
- 주요 평가 지표:
- 정확도(Accuracy): 전체 예측 중 정확한 예측 비율
- 정밀도(Precision): 양성 예측의 정확도
- 재현율(Recall): 실제 양성 중 정확히 예측한 비율
- ROC 곡선 및 AUC: 모델의 전반적인 성능 평가
- 해석 시 주의사항:
- 100% 정확한 예측은 불가능
- 0.5 근처 확률은 불확실성이 높음
- 새로운 데이터에 대한 일반화 능력 고려 필요
4. 로지스틱 회귀의 활용 사례
- 의료 분야: 질병 진단 여부 예측 (예: 암 발생 가능성 예측)
- 마케팅: 고객 이탈 예측, 제품 구매 가능성 예측
- 금융: 신용 카드 부정 사용 감지, 대출 상환 여부 예측
- 사회과학: 투표 행동 예측, 범죄 발생 가능성 예측
5. 로지스틱 회귀 모델 구축 과정
5.1. 데이터 수집 및 전처리
- 데이터 수집: 예측하고자 하는 문제에 적합한 데이터를 수집합니다.
- 결측치 처리: 누락된 데이터를 처리합니다.
- 특징 선택 및 변환: 중요한 특징을 선택하고 필요에 따라 변환(정규화, 표준화 등)합니다.
- 범주형 변수 인코딩: 범주형 변수를 수치형으로 변환합니다 (예: 원-핫 인코딩).
통계에서 로지스틱 회귀, 머신러닝에서 로지스틱 회귀 어떤 차이점이 있나요?
1. 목적과 초점
- 통계학 로지스틱 회귀:
- 추론 및 해석: 변수 간의 관계를 이해하고, 각 독립 변수가 종속 변수에 미치는 영향을 해석하는 데 중점을 둡니다.
- 가설 검정: 변수의 유의성, 신뢰 구간 등을 통해 모델의 통계적 유의성을 평가합니다.
- 머신러닝 로지스틱 회귀:
- 예측 정확도: 주로 새로운 데이터에 대한 예측 성능을 최적화하는 데 초점을 맞춥니다.
- 모델의 일반화: 과적합을 방지하고, 다양한 데이터에 잘 일반화될 수 있는 모델을 구축하는 것이 중요합니다.
2. 모델의 복잡성 및 가정
- 통계학:
- 엄격한 가정: 독립 변수와 로그 오즈 간의 선형성, 다중 공선성의 부재, 오차의 독립성 등을 전제로 합니다.
- 모델 단순화: 해석의 용이성을 위해 종종 단순한 모델을 선호합니다.
- 머신러닝:
- 유연성: 보다 복잡한 데이터 구조를 다루기 위해 다양한 기법(예: 다항식 특성 추가, 상호작용 항 포함)을 활용할 수 있습니다.
- 가정 완화: 통계적 가정보다는 데이터 중심의 접근을 선호하며, 일부 가정을 완화할 수 있습니다.
3. 정규화 및 규제 (Regularization)
- 통계학:
- 전통적으로 정규화보다는 모델의 해석 가능성과 변수의 유의성에 중점을 둡니다.
- 머신러닝:
- 정규화 기법 사용: L1 (라쏘), L2 (릿지) 정규화 등을 통해 모델의 복잡성을 조절하고 과적합을 방지합니다.
- 특성 선택: 정규화를 통해 자동으로 중요하지 않은 변수를 제거하거나 가중치를 조정할 수 있습니다.
5.2. 모델 학습
- 로지스틱 회귀 모델 생성: 적절한 라이브러리(예: scikit-learn, statsmodels)를 사용하여 모델을 생성합니다.
- 모델 학습: 학습 데이터를 사용하여 모델을 학습시킵니다.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
5.3. 모델 평가
- 정확도(Accuracy): 전체 예측 중 맞춘 비율.
- 정밀도(Precision): 양성 예측 중 실제 양성의 비율.
- 재현율(Recall): 실제 양성 중 모델이 양성으로 예측한 비율.
- F1 스코어: 정밀도와 재현율의 조화 평균.
- ROC 곡선 및 AUC: 분류 성능을 평가하는 지표.
5.4. 모델 개선
- 특징 공학: 새로운 특징을 생성하거나 불필요한 특징을 제거합니다.
- 정규화: 과적합을 방지하기 위해 정규화 기법(L1, L2)을 적용합니다.
- 하이퍼파라미터 튜닝: 최적의 하이퍼파라미터를 찾기 위해 그리드 서치나 랜덤 서치를 사용합니다.
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()
📕 9. 요약
기본 개념을 짚어봅시다!
- 로지스틱 회귀분석은 종속변수가 이진형 (0/1) 일 때, 독립변수와의 관계를 분석하고 사건 발생 확률을 예측하는 데 유용합니다.
- 로짓 함수를 사용하여 출력값을 확률 (0~1 범위) 로 변환합니다.
- 결과 해석 시, exp(β) 를 통해 “오즈비” 를 확인하고, p-value, 신뢰구간, 모형 적합 지표, 예측 성능 (ROC-AUC 등) 을 종합적으로 평가합니다.
- Python 에서는
statsmodels또는scikit-learn을 사용하여 로지스틱 회귀분석을 수행할 수 있습니다.
실습 참고자료 : https://colab.research.google.com/drive/1bp6TR-vx8O3OnP7S5-NNddi1YFFZR9Jj?usp=sharing