변수 변형의 목적
- 선형 모형은 독립변수와 종속변수의 선형적 관계를 가정한다는 한계가 있음
- 독립변수를 비선형 변환하면 이 한계를 일부 극복할 수 있음
- Python은 관계식에 수학 함수를 사용하면 자동으로 변수 변환을 적용
z=logx
y=wz+b
왜도
- 왜도(skewness)는 데이터가 한쪽 방향으로 치우친 정도
- 해당 방향으로 극단치가 존재한다는 의미
- negative skew: 음의 방향으로 치우침
- positive skew: 양의 방향으로 치우침
- 왜도가 0이면 좌우대칭
- 절댓값이 0.5 정도이면 중간 정도 치우침
- 절댓값이 1을 넘으면 극단적으로 치우쳤다고 볼 수 있음

중고차 주행거리의 분포
- 중고차 주행거리(
mileage)는 오른쪽으로 긴 꼬리를 가지는 분포
- 왜도는 1.04보다 커서 양의 방향으로 매우 치우친 상태
import seaborn as sns
sns.histplot(x="mileage", data=df_car)
df_car["mileage"].skew()

로그 함수
- 로그 함수는 오른쪽 위로 갈수록 증가폭이 완만해지는 형태
- 가로축의 1, 10, 100이 로그축에서는 같은 간격으로 변환됨
- 데이터에 적용하면 오른쪽에 멀리 떨어져 있는 값을 왼쪽으로 끌어당기는 효과
- 독립변수가 오른쪽으로 크게 늘어진 경우, 예를 들어 소득처럼 큰 값이 드문 경우에 간격을 조정할 수 있음

Python 회귀분석과 산점도
- 원래 주행거리(
mileage)로 가격(price)을 예측하는 회귀분석
- 이 모형의 R2는 0.457
ols("price ~ mileage", df_car).fit().summary()
sns.lmplot(x="mileage", y="price", data=df_car)

Python 로그 함수 적용
- 주행거리에 로그 함수를 적용하면 R2가 0.479로 증가
- 오른쪽으로 긴 꼬리를 압축하여 가격과의 관계를 더 선형적으로 볼 수 있음
import numpy as np
ols("price ~ np.log(mileage)", df_car).fit().summary()
df_car["log_mileage"] = np.log(df_car["mileage"])
sns.lmplot(x="log_mileage", y="price", data=df_car)

Box-Cox 변환
- Box-Cox 변환은 로그 변환의 일반화
- λ=0일 때는 로그 함수와 같음
x(λ)=⎩⎨⎧λxλ−1,logx,λ=0λ=0
from scipy.stats import boxcox
df_car["mileage_tr"], lambd = boxcox(df_car.mileage)
lambd
ols("price ~ mileage_tr", df_car).fit().summary()
- Box-Cox 변환을 적용한 모형의 R2는 0.498
Box-Cox 변환 결과
sns.histplot(x="mileage_tr", data=df_car)
sns.lmplot(x="mileage_tr", y="price", data=df_car)


변환 함수의 시각화
import matplotlib.pyplot as plt
x = np.linspace(0, 100, 100)
y1 = boxcox(x, lambd)
plt.plot(x, y1, label="Box-Cox")
y2 = np.log(x)
plt.plot(x, y2, linestyle="dashed", label="Log")
plt.legend()

독립변수의 서열을 이용한 회귀분석
- 독립변수의 서열, 즉 등수가 1 변할 때 종속변수가 얼마나 변하는지 분석
- 스피어만 상관계수와 비슷한 논리
ols("price ~ mileage.rank()", df_car).fit().summary()
- 장점
- 표준화처럼 단위가 서로 다른 경우를 비교할 수 있음
- 로그 함수처럼 한쪽으로 늘어진 데이터를 고르게 맞춰줄 수 있음
- 단점
- 새로운 데이터는 기존 데이터의 등수에 맞춰 등수를 산정해야 함
- 예측할 때 기존 관찰 범위를 넘어서면 예측하기 어려움