본문 바로가기
멋쟁이사자처럼 AI스쿨

통계 특강5

by 헬푸밍 2023. 3. 2.

종속변수에 따른 지도학습의 구분

 

회기분석

종속변수가 연속

예측값-실제값으로 정확성을 계싼

 

분류분석

종속변수가 범주형

예측의 정확성을 다른 방식으로 계산

 

이렇게 구분된다!

 

그러면 파이썬으로 회기분석을 진행해보자!

 

데이터는 car데이터로 하자!

import pandas as pd
df = pd.read_excel('data/car.xlsx')

 

주로 최소제곱법으로 구하기 때문에... ols를 import해준다!

from statsmodels.formula.api import ols  # ols:최소제곱법
m = ols('price ~ mileage', df).fit()
m.summary()

Intercept가 1258.7668이고 절편에 해당한다...

즉, 주행거리 0km일 때 1258만원임을 의미한다!

mileage는 -0.0052이고 기울기에 해당하며...

1만km마다 52만원 꼴로 가격이 떨어짐을 의미한다!

 

여기서 귀무가설은 기울기=0(여기서는 mileage = 0)이다!

p < 0.05이므로 귀무가설 기각해서 기울기는 다르다!

 

regplot으로 산점도와 함께 예측 모형을 넣어보면...

sns.regplot(x='mileage', y='price', data=df);

이렇다!

 

만약 마일리지만 가지고 가격을 예측하고 싶으면...

new_df = pd.DataFrame({'mileage': [10000, 20000]})
new_df

이렇게 10000키로, 20000키로 탄 데이터를 만들어 준뒤!

 

이렇게 m.predict()에 넣어주면...

m.predict(new_df)

가격을 예측할 수 있다!

 

그럼 예측을 잘했는지는 어떻게 판단할까?

 

R제곱으로 판단한다!

R제곱이 1에 가까울수록 모형의 설명력이 높고 0에 가까울수록 설명력이 낮다!

 

여기서는 R제곱이 0.457이기 떄문에

주행거리가 가격의 분산 45.7%를 설명한다고 말할 수 있다!

 

또 R제곱은 피어슨 상관계수의 제곱과 같은데...

pg.corr(df['mileage'], df['price'])

실제로 r = -0.67616을 제곱해보면...

r제곱의 값이 나오게 된다!

 

 

이번엔 speed데이터로 모델을 만들어보자!

speed = pd.read_excel('data/speed.xlsx')
speed

속도와 제동거리의 데이터이다!

 

속도를 독립변수, 제동거리를 종속변수로 제동거리를 예측하는 모델을 만들어보면...

m_speed = ols('dist ~ speed', speed).fit()
m_speed.summary()

이렇게 나온다!

 

여기서 귀무가설은 speed=0인데 p < 0.05이므로... speed는 0이아니고...

결과적으로 기울기는 다르다!

R제곱은... 0.651이므로 스피드는 제동거리의 분산의 65%를 설명한다!

 

그리고 스피드가 10일때 제동거리를 예측하면...

m_speed.predict(pd.DataFrame({'speed':[10]}))

21.7정도이다!

 

 

이번엔 다중회기분석을 해보자!

마일리지랑 년도로 가격을 예측해보는 다중회기분석을 진행해보자!

m = ols('price ~ mileage + year', df).fit()
m.summary()

여기서 귀무가설은 마일리지와 연도의 기울기가 0이다!

2개의 p값이 모두 0.05보다 작으므로 귀무가설 기각!

즉, 기울기가 0이 아니다!

그리고 R제곱이 0.749로 설명력이 올라갔음을 볼 수 있다!

 

또 기울기가 따로 회기분석을 할때 기울기의 절대값이 감소한 것을 볼 수 있다!

(원래 마일리지만 했을 때는 기울기 -0.0052, 다중회기분석에서는 -0.0023)

(year도 마찬가지로 기울기의 절댓값이 줄었다!)

이것은 마일리지와 연도가 서로 완벽한 독립이 아니기 때문에...

마일리지만 가지고 회기분석을 하면 연도의 영향도 간접적으로 반영이 된 것이다!

그리하여 연도와 마일리지를 같이 반영하여...

서로의 기울기에 영향이 간접 반영이 되지 않도록 하는 것을 통계적 통계라고 한다

 

 

그럼 다중회기분석에서 독립변수 단위가 다른데 종속변수에 대한 영향력은 뭐가 더 셀까?

그것을 알기 위해 표준화를 사용한다!(단위를 제거)

표준화를 하면 평균은 0, 표준편차는 1이 된다!

 

그럼 단위를 제거해서 모델을 만들어보자!

m = ols('price ~ scale(mileage) + scale(year)', df).fit()
m.summary()

year의 기울기 절대값이 더 크므로 year가 가격의 분산을 더 많이 설명한다고 말할 수 있다!

 

표준화를 일반적으로 많이 사용하지만...

순위를 사용할 수 있고 min_max scaling(정규화)등.. 도 쓴다!

 

순위를 사용한 경우!

m = ols('price ~ mileage.rank() + year.rank()', df).fit()
m.summary()

역시 year가 더 높은 비율로 가격의 분산을 설명한다!

등수로 바꾸는 것의 장점은 너무 튀는 숫자가 있을 때 완화시켜주지만...

단점은 원래 값을 알 수 없다는 것이다!

또 하나의 단점은 1동보다 잘하거나, 꼴등보다 못하면 예측이 힘들다!

 

min_max scaling으로도 해보면!

m = ols('price ~ I((mileage-2287)/307713) + I((year-2006)/12)', df).fit()
m.summary()

역시 year가 더 설명력이 강하다!

min_max scaling은 극단값이 있을 때 약하다는 단점이있다!

 

이번에는 iq데이터로 다중회기분석을 해보자!

iq = pd.read_excel('data/iqsize.xlsx')
iq

이런 데이터이고...

PIQ는 동작성 지능, Brain은 두뇌의 크기, Height는 키, Weight는 몸무게를 나타낸다!

 

키와 몸무게를 독립변수로 동작성지능을 종속변수로 하는 모형1을 만들어보면...

m_piq1 = ols('PIQ ~ Height + Weight', iq).fit()
m_piq1.summary()

키의 기울기, 몸무게의 기울기의 p값 모두 0.05보다 크므로 기울기가 다르다는 결론을 내릴 수 없다!

결론을 유보한다!

 

이번에는 이 모형에 Brain 독립변수를 추가해서 모형2를 만들어보자!

m_piq2 = ols('PIQ ~ Height + Weight + Brain', iq).fit()
m_piq2.summary()

키, 브레인 기울기의  p값만 0.05보다 작으므로 이 두 변수만 기울기가 0이 아니라고 볼 수 있다!

 

여기서 알 수 있는 점은 브레인의 통제 여부에 따라 키에 대한 해석이 달라질 수 있다는 것이다!

브레인을 독립변수로 추가하면 키 기울기의 p값이 작아져 iq와 관련이 있어진다!

 

또 다른 변수가 같을 때 키가 클 수록 동작성 지능은 내려간다고 결론 내릴 수 있다!

 

 

앞에서는 독립변수가 연속형일 때를 다뤘다!

 

이번엔 독립변수가 범주형일 경우를 보자!(더미코딩)

 

모델로 가격을 예측하는 모델을 보자!

m = ols('price ~ model', df).fit()
m.summary()

회기모형은 가격 = 833 + 80*model[T.K3]가 된다!

여기서 T.K3는 K3를 1로 하고 Avante를 0으로 한다는 소리이다!

기울기(model[T.K3])가 의미하는 것은 K3의 평균가격이 아반떼의 평균가격 보다 얼마나 더 비싸냐 하는 것이다!

회기모형에서 x=0일 때가 아반떼 가격(y절편) x=1일 때가 K3 가격(y절편 + 기울기)이다!

귀무가설은 기울기=0 즉, 아반떼와 K3의 평균가격이 같다는 것이다!

p > 0.05라서 귀무가설 기각을 못한다!

따라서 결론유보이다!

 

그런데 앞에서 t검정을 했을 때는 평균의 차이가 있다고 나왔는데 여기서는 차이가 없다고 나온다!

분산에 대한 보정이 없어서 그런 건데...

회기분석에서 더미코딩을 하면 t검정에서 분산에 대한 보정(저절로해줌)을 안 한 경우와 결과가 똑같다!

 

결국 포함 관계를 보면 회기분석 ⊂ 분산분석 ⊂ t검정 이다!

 

이번에는 주행거리를 통제해보자!

m = ols('price ~ mileage + model', df).fit()
m.summary()

주행거리를 통제하면 가격차이가 22만원으로 줄어드는데...

 

실제로 K3와 Avante의 주행거리 평균을 보면...

df.groupby('model').agg({'mileage':'mean'})

아반떼가 주행거리가 더 높아서... 가격차이가 더 많이 났던 것이다!

 

산모의 흡연 여부와 임신기간에 따른 신생아 무게 데이터를 보자!

bs = pd.read_excel('data/birthsmokers.xlsx')
bs.head()

이렇게 흡연 여부가 범주형이다!

 

한번 흡연을 독립변수로하고 무게를 종속변수로 하는 회기모형을 만들면...

m_bs1 = ols('Wgt ~ Smoke', bs).fit()
m_bs1.summary()

p값이 0.05보다 커서 임신기간에 차이가 없을 것이라는 귀무가설을 기각을 못한다!\

즉, 산모 흡연 여부에 따라 임신기간에 차이가 있다고 말할 수 없다!

 

임신기간도 넣어서 모델을 만들어보자!

m_bs2 = ols('Wgt ~ Smoke + Gest', bs).fit()
m_bs2.summary()

여기서는 Smoke[T.yes]의 p값이 0.05보다 작기 때문에 Smoke여부에 따라 신생아 무게가 차이가 있다!

흡연을 하면 신생아 무게가 244g정도 적은 것을 볼 수 있다!

 

왜 이런결과가 나올까?

실제로 흡연자와 비흡연자의 임신기간 평균을 내보면...

bs.groupby('Smoke').agg({'Gest':'mean'})

이렇게 흡연자의 임신기간의 평균이 1주정도 길다!

 

결과를 해석해 보면...

임신 기간을 통제했을 때, 동일 시점을 기준으로 하면 신생아 체중에 차이가 있다!

그러나 흡연자의 경우에는 임신 기간이 평균적으로 1주 정도 길어지기 때문에...

임신 기간을 통제하지 않으면 결과적으로 신생아 체중에는 큰 차이가 없게 된다!

요정도...이다

 

이번에는 우을증 치료 데이터를 보자!

dp = pd.read_excel('data/depression.xlsx')
dp.head()

TRT: 치료제(A, B, C) , y: 치료 효과, age: 나이

각 컬럼은 이렇다!

 

각 치료제에 따른 치료효과를 독립변수로 하고 치료 효과를 종속변수로 하는 모델을 만들면...

m_dp = ols('y ~ TRT', dp).fit()
m_dp.summary()

이렇다!

 

수식을 만들어보면...

y = 62.3333 -10.4167 TRT[B] -11.0833 TRT[C] 인데...

A, B, C를 각각 이해해보면...

A: 62.3333 -10.4167 0 -11.0833 0 = 62.3333

 

B: 62.3333 -10.4167 1 -11.0833 0 = 62.3333 -10.4167 = 51.9166 (통계적 유의, p < 0.05)

B는 A보다 치료효과 떨어짐

 

C: 62.3333 -10.4167 0 -11.0833 1 = 62.3333 -11.0833 = 51.25 (통계적 유의, p < 0.05)

C도 A보다 치료효과 떨어짐

 

이렇다!

 

그러면 분산분석에서도 3가지 이상의 범주에 대해 가설검정을 했는데 무엇이 다를까...?

 

일단 포함관계는 회귀분석 ⊃ 분산분석 ⊃ t 검정 이런 순이다!

회귀분석 Prob(F-Statistic)이라고 나오는 것이 분산분석의 p와 같다!

회귀분석은 이분산을 보정하기가 좀 복잡하다는 문제가 있지만...

분산분석에서는 welch_anova로 이분산을 보정한다!

분산분석의 사후분석에서는 모든 집단을 서로 비교하고...

회귀분석에서는 기준(reference)하고만 비교한다!

분산분석에서는 사후분석을 할 때 오류의 가능성을 줄이기 위해서 p-값을 보정해서 사용을 하고...

회귀분석에서는 보정 하지 않는다!... 따라서 회귀분석에서 유의하게 나온 것은 좀 과장일 가능성이 있다!

회기분석은 예측이나 통계적 통제를 주로 하고, 부가적으로 가설검정도 하고 싶을 때 사용하고...

분산분석은 가설검정을 정확하게 하고 싶고, 예측이나 통계적 통제는 관심이 없을 때 사용한다!(실험적 통제가 필요)

 

마지막으로, 범주가 2개일 때는 기준(reference)을 바꿔도 분석결과에 차이가 없고...

 

3개 이상인 경우에는...

m_dp_c = ols('y ~ C(TRT, Treatment("C"))', dp).fit()
m_dp_c.summary()

 

이런 식으로 기준을 C로 할 수 있다!

'멋쟁이사자처럼 AI스쿨' 카테고리의 다른 글

과제3 심화?  (0) 2023.03.05
멋쟁이사자처럼 AI스쿨 11주차 회고  (0) 2023.03.02
통계 특강4  (2) 2023.03.01
통계 특강3  (2) 2023.03.01
통계 특강2  (2) 2023.03.01

댓글