05단계 · 3유형 — 검정과 해석
선형 회귀 — 계수와 R²
`ols` 로 회귀식을 세우고 계수·p-value·R² 를 읽는다.
먼저 알아볼게요
코드로 이동 ↓선형 회귀는 "종속변수 = 상수 + 계수₁×독립변수₁ + 계수₂×독립변수₂ ..." 모양을 데이터에 맞춘다.
statsmodels 의 수식 표기가 실기에서 가장 짧다: ols("종속 ~ 독립1 + 독립2", data=df).fit(). 물결표 ~ 왼쪽이 맞히려는 것, 오른쪽이 설명하는 것이다.
.params 는 계수다. 나이 의 계수가 0.4649 라면 "모형에 같이 넣은 다른 변수를 고정했을 때, 나이가 1 늘면 콜레스테롤이 평균 0.4649 만큼 높다" 는 연관을 말한다. 나이를 올리면 콜레스테롤이 오른다는 인과가 아니다. Intercept 는 상수항이다.
.pvalues 는 계수마다 "이 계수가 사실은 0 이 아닐까" 를 검정한 결과다. 0.05 보다 작으면 그 변수는 유의하다고 본다. (m.pvalues < 0.05).sum() 으로 유의한 항의 개수를 셀 수 있다 — 실기에서 자주 묻는 형태다. 다만 이 p-value 는 오차가 서로 독립이고 분산이 일정하며 정규분포를 따른다는 모형 가정이 맞을 때의 이야기다.
.rsquared 는 R² 다. 상수항이 있는 이 모형을 학습에 쓴 바로 그 데이터에 대해 재면 0~1 사이 값이 나오고, 모형이 종속변수의 변동을 얼마나 설명하는지를 뜻한다. 새 데이터에 대한 예측력이나 인과관계를 말하는 값이 아니며, 낮다고 틀린 모델도 아니다 — 사람의 건강 지표처럼 원래 잘 안 설명되는 데이터도 많다. .summary() 로 전체 표를 볼 수 있지만, 답으로 옮길 값은 필요한 것만 골라 자리수를 고정해 출력한다.
import pandas as pd
from statsmodels.formula.api import ols
df = pd.read_csv("health.csv")
m = ols("몸무게 ~ 키", data=df).fit()
print(m.params.round(4))
print(round(float(m.rsquared), 4))ols("종속 ~ 독립들", data=df).fit() 뒤에 .params·.pvalues·.rsquared. 유의한 항 개수는 (pvalues < 0.05).sum().
health.csv 에서 콜레스테롤 을 나이 와 몸무게 로 설명하는 회귀식을 세워 ① 계수(소수 4) ② p-value(소수 6) ③ R²(소수 4) ④ p-value 가 0.05 미만인 항의 개수(이 과제는 상수항 포함)를 출력하세요.
제공 파일 1개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
성별,나이,키,몸무게,콜레스테롤,식단,운동,진단 여,27,167,79,203.3,C,예,0 남,73,176,77,235.1,A,아니오,0 남,74,168,57,229.0,B,아니오,1 여,50,159,60,251.0,C,아니오,0 여,71,161,46,201.6,C,예,0 남,70,182,82,189.1,C,예,0 여,47,161,59,240.0,C,아니오,1 남,52,179,73,197.5,A,예,0 남,57,176,74,207.0,A,예,0 남,65,167,51,185.8,A,예,0 여,25,165,49,202.1,B,아니오,0 남,59,169,59,205.3,B,아니오,0 여,26,164,58,201.2,B,아니오,0 남,38,166,65,193.3,C,아니오,0 남,58,170,60,199.0,A,아니오,1 여,55,160,66,191.8,C,아니오,0 여,37,160,69,234.6,C,아니오,0 여,50,161,65,204.2,B,예,0 남,59,172,50,228.9,C,예,0 남,64,168,61,196.7,A,아니오,1 남,60,178,73,208.7,B,예,0 남,38,168,71,183.0,A,예,0 여,42,159,53,204.0,A,예,0 여,45,164,55,183.2,A,예,0 여,37,157,72,212.6,B,아니오,0 남,38,171,66,200.9,A,아니오,0 남,25,164,55,213.1,C,아니오,0 여,37,166,64,178.7,A,아니오,0 남,37,173,79,197.4,C,예,0 남,42,177,75,262.3,C,아니오,1 남,49,173,64,161.1,C,예,0 여,39,158,64,187.9,A,아니오,0 남,58,171,68,225.6,A,아니오,0 여,29,167,71,176.7,A,예,0 남,46,179,71,222.7,B,아니오,0 여,39,161,48,158.9,C,예,0 남,60,168,60,175.7,B,아니오,0 여,42,169,58,181.6,B,예,0 여,49,155,50,221.8,C,예,0 여,60,156,51,252.5,A,아니오,0 남,29,174,74,213.5,C,아니오,0 여,34,164,57,172.4,A,아니오,0 여,69,155,40,188.8,A,아니오,0 여,59,165,56,211.3,B,아니오,0 여,71,161,46,188.6,A,아니오,1 남,25,174,66,168.0,A,예,0 여,35,147,31,180.7,C,예,0 여,73,155,54,211.2,C,아니오,0 여,48,159,63,191.7,A,예,0 남,30,167,69,166.0,A,아니오,0 여,36,168,58,158.9,A,아니오,0 남,25,162,68,202.5,B,예,0 여,52,166,60,155.4,C,예,0 여,51,161,62,196.7,A,예,0 여,33,163,57,169.2,A,아니오,0 남,52,177,68,217.5,A,아니오,0 남,51,172,65,204.7,C,예,0 남,38,172,79,201.2,B,예,0 남,67,181,79,238.9,C,아니오,0 남,50,170,62,186.9,C,예,0 여,55,155,67,214.7,B,예,0 여,38,166,63,188.7,B,예,0 남,35,177,80,149.7,A,예,0 여,73,167,60,220.7,C,예,0 남,37,173,57,157.1,B,아니오,0 여,42,157,51,190.2,A,예,0 여,60,160,61,180.4,A,아니오,0 남,49,176,71,208.3,C,예,0 남,27,168,64,198.4,B,예,0 여,47,165,53,183.3,A,예,0 여,38,147,37,210.2,B,예,0 남,34,171,63,207.8,C,예,0 여,74,166,59,190.5,C,예,1 여,61,160,52,190.7,C,아니오,0 여,57,162,70,195.5,C,아니오,0 여,37,166,63,164.6,A,예,0 여,32,153,53,202.9,B,아니오,0 남,74,169,66,219.7,C,아니오,0 남,62,178,67,207.1,A,아니오,0 남,56,175,75,177.0,A,아니오,0 남,46,170,57,139.4,B,예,0 남,32,180,84,191.4,B,아니오,0 남,26,172,61,177.9,A,예,0 남,53,171,76,195.3,A,예,0 남,51,167,53,188.8,C,예,0 남,39,178,75,204.0,A,예,0 여,73,158,53,189.1,B,아니오,0 남,59,171,53,193.8,C,예,0 남,46,167,77,200.4,C,예,0 여,42,159,63,205.1,C,아니오,0 남,53,175,62,138.0,C,예,0 남,71,176,66,210.3,B,예,1 남,35,175,73,196.1,A,아니오,0 남,32,158,48,199.7,B,예,0 여,73,155,61,182.1,B,예,0 남,69,180,72,192.8,B,예,0 남,56,161,59,168.3,A,예,0 남,57,190,75,193.9,C,예,0 여,63,162,56,192.5,B,아니오,0 남,74,175,76,211.0,A,예,0 남,39,178,89,210.9,A,아니오,0 여,67,160,55,202.4,C,예,0 남,64,172,55,206.3,B,예,0 여,52,165,75,209.5,B,아니오,0 남,66,172,70,215.0,C,아니오,0 남,67,177,84,187.1,A,예,0 남,39,183,75,180.3,C,예,0 여,71,162,61,199.0,B,예,0 남,56,168,72,210.1,A,아니오,0 여,25,158,42,172.7,C,예,0 여,64,147,50,177.1,B,예,0 남,26,180,74,201.2,A,아니오,0 여,36,162,55,215.4,C,아니오,0 남,70,175,73,212.7,B,아니오,1 여,73,164,53,197.3,A,예,0 여,31,154,45,192.5,B,아니오,0 여,29,159,51,147.9,A,아니오,0 여,66,162,46,202.9,C,아니오,0 남,51,181,95,179.2,A,예,0 남,50,174,59,181.2,A,아니오,0 남,50,160,65,187.8,B,예,0 여,72,175,65,216.2,A,아니오,1 남,69,171,68,192.1,B,아니오,0 남,52,177,78,185.5,C,예,0 남,70,169,83,206.2,A,예,0 여,37,159,50,177.4,C,예,0 남,67,162,60,235.3,C,아니오,0 여,42,158,56,224.3,B,예,0 여,59,154,36,214.2,B,예,0 남,30,170,68,163.8,B,예,0 남,73,168,61,218.5,C,예,0 남,57,157,57,191.5,B,예,0 남,52,166,59,225.2,C,아니오,0 여,26,159,63,181.1,A,아니오,1 남,35,177,75,200.6,A,아니오,0 여,29,155,41,132.1,A,예,0 여,60,162,64,244.1,C,예,0 여,55,159,55,222.1,B,아니오,1 남,62,181,67,214.9,C,예,0 남,64,171,64,215.4,B,아니오,0 남,56,176,72,227.0,C,아니오,0 여,36,163,46,183.5,C,아니오,0 여,48,155,46,201.9,C,예,0 여,67,163,44,156.1,A,예,0 남,27,176,71,167.5,A,예,0 여,64,158,48,198.1,C,아니오,0 남,46,167,66,170.4,B,아니오,0 여,39,159,65,208.6,C,아니오,0 남,52,167,55,191.7,B,예,0 여,45,155,60,205.7,B,예,0
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
from statsmodels.formula.api import ols
df = pd.read_csv("health.csv")
model = ols("콜레스테롤 ~ 나이 + 몸무게", data=df).fit()
print(model.params.round(4))
print(model.pvalues.round(6))
print(round(float(model.rsquared), 4))
print(int((model.pvalues < 0.05).sum()))