logo

I-function

실습 데이터

중고차 데이터 car.xlsx를 불러와 회귀 모형을 적합함.

import pandas as pd
from statsmodels.formula.api import ols

df_car = pd.read_excel("car.xlsx")
df_car.head()

I 함수

  • 관계식의 +, *, ** 등은 모형 항을 구성하는 특별한 문법
  • I()로 감싸면 괄호 안의 식을 산술 연산으로 계산
  • 다음 모형은 두 손해액의 합을 하나의 독립변수로 사용
combined_damage_model = ols(
    "price ~ I(my_car_damage + other_car_damage)",
    data=df_car,
).fit()
combined_damage_model.summary()

실행 결과는 다음과 같음.

price=941.29772.123×105(my_car_damage+other_car_damage)
  • 합산 손해액의 회귀계수: 2.123×105, p<.001
  • 결정계수: R2=0.155
  • 두 손해액을 먼저 더하므로 두 변수에 동일한 회귀계수가 적용됨

두 손해액의 회귀계수를 따로 추정하면 다음과 같음.

separate_damage_model = ols(
    "price ~ my_car_damage + other_car_damage",
    data=df_car,
).fit()
separate_damage_model.summary()
price=968.98664.120×105my_car_damage1.094×105other_car_damage
  • my_car_damage: p<.001
  • other_car_damage: p=.007
  • 결정계수: R2=0.197
  • 두 손해액과 가격의 관계가 서로 다를 수 있도록 허용한 모형

제동거리 데이터

speed.xlsx의 속도(speed)와 제동거리(dist)를 사용함.

  • speed: 자동차 속도, mph
  • dist: 정지할 때까지의 제동거리, ft
sp = pd.read_excel("speed.xlsx")
sp.head()

2차항의 추가

  • 다음과 같은 2차 모형을 관계식으로 만들 수 있음
y=w2x2+w1x+b
  • 거듭제곱에는 **를 사용
ols("y ~ I(x**2) + x", data=df).fit()

관계식에서 x2I(x**2)로 표현함. 먼저 속도의 선형항을 사용한 모형을 적합함.

linear_speed_model = ols("dist ~ speed", data=sp).fit()
linear_speed_model.summary()
dist=17.5791+3.9324speed
  • speed의 회귀계수: 3.9324, p<.001
  • 결정계수: R2=0.6511, 수정 R2=0.6438
  • AIC: 417.16

다음 모형은 선형항을 제외하고 속도의 2차항만 사용함.

squared_speed_model = ols(
    "dist ~ I(speed ** 2)",
    data=sp,
).fit()
squared_speed_model.summary()
dist=8.8600+0.1290speed2
  • 2차항의 회귀계수: 0.1290, p<.001
  • 결정계수: R2=0.6659, 수정 R2=0.6589
  • AIC: 414.99
  • 이 표본에서는 2차항만 사용한 모형의 R2가 더 높고 AIC가 더 낮음
  • dist ~ I(speed ** 2)는 선형항을 포함하지 않는 모형임

절편이 없는 모형

관계식에 0 +를 추가하면 절편을 제외함. 먼저 선형항만 사용한 모형을 적합함.

no_intercept_linear_model = ols(
    "dist ~ 0 + speed",
    data=sp,
).fit()
no_intercept_linear_model.summary()
dist=2.9091speed
  • speed의 회귀계수: 2.9091, p<.001
  • 비중심 결정계수: Runcentered2=0.8963
  • 수정 비중심 결정계수: 0.8942
  • AIC: 421.75

다음 모형은 절편을 제외하고 선형항과 2차항을 함께 사용함.

no_intercept_quadratic_model = ols(
    "dist ~ 0 + I(speed ** 2) + speed",
    data=sp,
).fit()
no_intercept_quadratic_model.summary()
dist=1.2390speed+0.0901speed2
  • speed의 회귀계수: 1.2390, p=.032
  • 2차항의 회귀계수: 0.0901, p=.004
  • 비중심 결정계수: Runcentered2=0.9133
  • 수정 비중심 결정계수: 0.9097
  • AIC: 414.80
  • 두 무절편 모형 중 선형항과 2차항을 함께 사용한 모형의 적합도가 더 높음

절편이 있는 모형의 결정계수는 다음과 같음.

R2=1i(yiyˉ)2i(yiy^i)2

statsmodels는 절편이 없는 모형에서 비중심 결정계수를 출력함.

Runcentered2=1iyi2i(yiy^i)2

절편이 있는 모형의 결정계수와 비중심 결정계수는 기준이 다르므로 직접 비교하지 않음. 같은 비중심 결정계수를 사용하는 두 무절편 모형끼리는 비교 가능.

절편의 기준점 이동

절편은 독립변수가 0일 때의 예측치임. year에서 2010을 빼면 2010년을 새로운 기준점으로 설정 가능.

year_model = ols("price ~ year", data=df_car).fit()
centered_year_model = ols(
    "price ~ I(year - 2010)",
    data=df_car,
).fit()
centered_year_model.summary()
  • 원래 모형의 절편: 213508.6444
  • 기준점 이동 후 절편: 505.0926
  • 두 모형의 기울기: 106.4745
  • 두 모형의 결정계수: R2=0.6871
  • 기준점 이동 후 절편은 2010년 차량의 예측 가격
  • 기울기, 적합값, 잔차, 결정계수는 변하지 않음

퀴즈

문제 1 / 2맞음: 0힌트: 0틀림: 0채점중: 0남음: 2

I 함수를 사용하는 이유로 가장 적절한 것은?

  • 관계식 안에서 덧셈, 곱셈, 거듭제곱 같은 계산을 의도대로 적용하기 위해
  • 회귀분석 결과표를 이미지로 저장하기 위해
  • 모든 결측값을 자동으로 제거하기 위해
  • 모형의 독립변수를 무조건 하나만 남기기 위해

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.