RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (60) N
    • Study Note (25) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (14) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)
    • 맛집 (0)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/통계

[의료 통계] 내 BMI가 1 오르면 혈압은 얼마나 오를까? (Python vs R 선형회귀 완벽 비교)

2025. 12. 12. 17:41

의료 데이터를 분석하다 보면 가장 궁금한 것은 "인과관계"입니다. "체중이 늘면 정말 혈압이 오를까?", "남녀 간에 차이가 있을까?"

 

오늘은 가상의 환자 데이터를 이용해 이 질문을 통계적으로 검증해보고, 대표적인 분석 도구인 Python과 R의 결과를 비교해 보겠습니다. 또한, 이 분석의 핵심인 선형회귀(OLS)의 원리와 역사까지 한 번에 정리합니다.

 

1. 오늘의 핵심 개념: 선형회귀와 OLS

분석에 앞서, 우리가 사용할 무기가 무엇인지 알아야겠죠?

1) 선형회귀 (Linear Regression)

원인($X$, 독립변수)과 결과($Y$, 종속변수) 사이의 관계를 직선으로 그어 예측하는 방법입니다.

 

가설: "BMI($X$)가 증가하면 수축기 혈압($Y$)도 비례해서 증가할 것이다."

2) OLS (Ordinary Least Squares, 최소자승법)

그렇다면 수많은 점들 사이에서 "가장 완벽한 선"은 어떻게 그을까요?

점들과 선 사이의 오차(Error)를 제곱해서 더한 값이 최소가 되도록 선을 긋는 수학적 방법입니다. 이것이 바로 선형회귀의 계산 원리입니다.

3) TMI: 갈톤(Galton)이 누구야?

이 모든 개념의 시초는 19세기 영국의 프랜시스 골턴(Francis Galton)입니다. 그는 부모와 자식의 키를 연구하다가, 키가 큰 부모의 자식은 평균으로 작아지려 하고, 작은 부모의 자식은 커지려 하는 "평균으로의 회귀(Regression to the Mean)" 현상을 발견했습니다. 이것이 '회귀분석'이라는 이름의 유래입니다.

 

2. 실험 데이터 준비 (Scenario)

가상의 환자 8명의 데이터를 생성했습니다.

  • 독립변수($X$): BMI (체질량지수), 성별 (M/F)
  • 종속변수($Y$): SBP (수축기 혈압)
# 데이터 예시
BMI: [20, 22, 24, 18, 19, 28, 27, 25]
SBP: [115, 118, 125, 110, 112, 135, 130, 128]
Gender: [M, F, M, F, M, F, M, F]

 

3. 분석 수행 및 결과 비교: Python vs R

같은 데이터로 두 언어에서 분석을 돌려보았습니다. 결과가 어떻게 다를까요?

1) Python (statsmodels) 결과

  • 분석 모델: 다중 선형회귀 (SBP ~ BMI + Gender)
# 더미 변수 처리 및 분석 (Statsmodels Formula API 사용 시 자동 처리 가능)
import statsmodels.formula.api as smf

# C(Gender): Gender를 범주형(Categorical)으로 인식하라는 명령
model_dummy = smf.ols('SBP ~ BMI + C(Gender)', data=df).fit()

print(model_dummy.summary())

 

[Python 결과 요약]

항목 값 (Estimate) P-value (유의확률) 해석
Intercept  65.6893 0.000 기저 혈압
BMI 2.4360 0.000 매우 유의함
Gender (M) 0.4230 0.649 유의하지 않음

 

2) R (lm) 결과

  • 분석 모델: lm(sbp ~ bmi + gender, data=df)
# 1. 데이터 생성
bmi <- c(20, 22, 24, 18, 19, 28, 27, 25)
sbp <- c(115, 118, 125, 110, 112, 135, 130, 128)
gender <- factor(c("M", "F", "M", "F", "M", "F", "M", "F"))
df <- data.frame(bmi, sbp, gender)

# 2. 선형회귀 모델링 (OLS)
# R은 lm 함수 하나로 해결됨 (자동으로 더미변수 생성)
model <- lm(sbp ~ bmi + gender, data=df)

# 3. 결과 확인
summary(model)

 

[R 결과 요약]

항목 값 (Estimate) P-value (유의확률) 해석
(Intercept) 66.1123 <0.01 기저 혈압
bmi 2.4360 <0.01 매우 유의함
genderM -0.4230 0.649 유의하지 않음
Residual standard error: 1.228 on 5 degrees of freedom
Multiple R-squared:  0.9871,	Adjusted R-squared:  0.982 
F-statistic: 191.6 on 2 and 5 DF,  p-value: 1.883e-05

4. 결과 해석 (의료 데이터 분석가의 시선)

Python과 R의 결과가 거의 일치하는 것을 볼 수 있습니다. (절편의 미세한 차이는 '여성'을 0으로 보느냐 1로 보느냐의 기준 차이일 뿐, 핵심 결과는 같습니다.)

① BMI의 영향력 

  • 해석: "BMI가 1 단위 증가할 때마다, 수축기 혈압은 약 2.44 mmHg씩 상승한다."
  • 통계적 의미: P-value가 0.0000067로 0.05보다 훨씬 작습니다. 즉, BMI가 혈압을 올린다는 것은 통계적으로 확실한 사실입니다.

② 성별의 영향력 (Gender P-value: 0.649)

  • 해석: P-value가 0.05보다 큽니다. 이는 "이 데이터 안에서는 성별에 따른 혈압 차이가 통계적으로 의미가 없다(우연일 수 있다)"는 뜻입니다.
  • 결론: 굳이 모델에 성별을 넣을 필요 없이, BMI만으로도 충분히 설명이 가능합니다.

③ 모델의 설명력 (R-squared: 0.987)

  • 이 모델은 혈압 변화의 98.7%를 설명할 수 있습니다. (가상 데이터라 매우 높게 나왔지만, 실제 임상 데이터에서는 0.3~0.5만 나와도 훌륭한 수준입니다.)

5. 시각화 (R Plot)

R을 이용해 그린 그래프를 보면 더 명확합니다.

  • 파란 점(남자)과 빨간 점(여자)이 섞여 있지만, 검은색 회귀선(BMI 추세선) 하나가 모든 점을 아주 잘 관통하고 있습니다.
  • 즉, 성별과 상관없이 살이 찌면 혈압이 오른다는 경향성이 뚜렷합니다.

 

결론 및 요약

  1. 도구: Python과 R, 어느 것을 써도 결과인 기울기(2.436)는 똑같이 나온다.
  2. 임상적 결론: 이 환자군에서 BMI 증가는 고혈압의 확실한 위험 인자이다. (1당 2.44mmHg 상승)
  3. 변수 선택: 성별은 혈압에 영향을 주지 못했으므로, 다음 분석에서는 제거해도 좋다.

 

'Study Note > 통계' 카테고리의 다른 글

회귀모형의 진단: 잔차, 레버리지, 그리고 쿡의 거리  (0) 2025.12.15
선형회귀모형의 진단과 선별 (T검정, F검정, AIC, VIF)  (0) 2025.12.15
선형회귀 Part 2: 최소자승법(OLS)과 더미변수 완벽 정리  (0) 2025.12.12
[머신러닝 기초] 숫자를 예측하는 가장 강력한 직선, 선형회귀(Linear Regression) 완벽 해부  (0) 2025.12.10
[머신러닝 기초] 통계 예측 모형과 지도학습  (0) 2025.12.10
    'Study Note/통계' 카테고리의 다른 글
    • 회귀모형의 진단: 잔차, 레버리지, 그리고 쿡의 거리
    • 선형회귀모형의 진단과 선별 (T검정, F검정, AIC, VIF)
    • 선형회귀 Part 2: 최소자승법(OLS)과 더미변수 완벽 정리
    • [머신러닝 기초] 숫자를 예측하는 가장 강력한 직선, 선형회귀(Linear Regression) 완벽 해부
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바