변수의 변형
- 선형 모형은 독립변수와 종속변수의 선형적 관계를 가정한다는 한계
- 독립변수를 비선형 변환하면 이 한계를 일부 극복할 수 있음
- 예시: ,
- Python은 관계식에 수학 함수를 사용하면 자동으로 변수 변환
왜도
- 데이터 분포의 비대칭 정도.
Negative Skew
: 왼쪽 꼬리 김 (- 방향 치우침). 평균 < 중간값 < 최빈값.Positive Skew
: 오른쪽 꼬리 김 (+ 방향 치우침). 최빈값 < 중간값 < 평균.
- 값 해석 (절대값 기준):
0
: 좌우 대칭.|0.5|
: 중간 정도 치우침.|1|
: 극단적 치우침.
예시: 중고차 주행거리 분포
- 히스토그램: 오른쪽 꼬리 긴 형태 보임.
import seaborn as sns
df = pd.read_excel('car.xlsx')
sns.histplot(x='mileage', data=df)
- 왜도 계산:
df['mileage'].skew()
결과 > 1.04 → + 방향 매우 치우침.
로그 함수
- 오른쪽 위로 갈 수록 완만해지는 형태
- 가로축에서 1, 10, 100이 세로축에서 같은 간격(예: 0, 1, 2)
- 데이터에 적용하면 오른쪽을 왼쪽으로 끌어당기는 효과
- 독립변수에 오른쪽으로 크게 떨어져 있는 값이 있는 경우(예: 소득), 로그 함수를 적용해주면 간격을 일정하게 만들어 줄 수 있음
Python 회귀분석과 산점도
회귀분석 (R제곱은 0.457)
ols('price ~ mileage', df).fit().summary()
산점도
sns.lmplot(x='mileage', y='price', data=df)
Python 로그 함수 적용
회귀분석 (R제곱: 0.479)
import numpy as np
ols('price ~ np.log(mileage)', df).fit().summary()
산점도
df['log_mileage'] = np.log(df['mileage'])
sns.lmplot(x='log_mileage', y='price', data=df)
Box-Cox 변환
로그 변환의 일반화
일 때는 로그 함수와 같음
from scipy.stats import boxcox
df['mileage_tr'], lambd = boxcox(df.mileage)
lambd
회귀분석 (R제곱: 0.498)
ols('price ~ mileage_tr', df).fit().summary()
히스토그램
sns.histplot(x='mileage_tr', data=df)
산점도
sns.lmplot(x='mileage_tr', y='price', data=df)
변환 함수의 시각화
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()