기초통계

상관과 회귀 : 회귀분석

2022. 9. 5. 14:21

 

상관과 회귀 : 회귀분석


  KEYWORD  

지도학습

예측

회귀분석, 분류분석

잔차

최소제곱법

R제곱과 피어슨 상관계수

더미코딩

범주 설정하기


지도학습

독립변수 x를 이용해서 종속변수 y를 예측하는 것

독립변수
independent variable
종속변수
dependent variable
예측의 바탕이 되는 정보, 인과관계에서 원인, 입력값 예측의 대상, 인과관계에서 결과, 출력값

 

통계에서 '예측'이란?

어떤 값에 대한 추론을 의미함 (시간적인 의미는 아님)

지도학습에서 예측은 변수들 사이의 패턴을 파악해서 한 변수로 다른 변수를 추론하는 것

시계열 분석 등에서 하는 미래에 대한 예측은 forecasting.

 

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

회귀분석
regression
분류분석
classification
•   종속변수가 연속형
•   (예측값 – 실제값) 으로 정확성을 계산

예) 가격, 크기, 선호도 예측
•   종속변수가 범주형
•   예측의 정확성을 다른 방식으로 계산


 

선형 모형

•  𝑦^ : 𝑦의 예측치
•   𝑥  : 독립변수
•   𝑤 : 가중치 또는 기울기
•   𝑏  : 절편(𝑥  =  0 일 때, y의 예측치)

 


회귀분석 예시

> 피부암 사망률

독립변수(x) : 위도

종속변수(y) : 천만명당 사망자 수

독립변수(x) : 위도

> 적도(x=0)에서는 1000만명당 389.2명이 사망할 것으로 예측된다.


 

잔차 residual

: 실제값(y) 과 예측값(y^) 의 차이

 

· 잔차분산 : 잔차를 제곱해서 평균을 낸 것

   cf. 분산 : 편차 (실제값과 평균의 차이) 제곱의 평균

  잔차분산이 크다 → 예측이 잘 맞지 않음
  잔차분산이 작다 → 예측이 잘 맞음

 

최소제곱법 Ordinary Least Squares

: 잔차 분산이 최소가 되게 하는 w, b등 계수를 추정

 

가장 널리 사용되는 추정방법으로

분산의 계산에 제곱이 들어가므로 최소'제곱'법이라고 한다.

 


  Python 에서 '회귀분석'  

from   statsmodels.formula.api   import   ols

 

> 분석 및 결과

종속변수(y) 와 독립변수(x) 의 형식으로 관계식을 표현

m = ols('종속변수(y) ~ 독립변수(x)', data = '데이터  ').fit()

m .summary()

from statsmodels.formula.api import ols

# 분석
m = ols('price ~ mileage', date = df).fit()

# 결과
m.summary()

회귀계수 추정 결과

 

price    =   −0.052   × mileage   +   1258.7668

 

                                                          추정치         표준오차        검정통계량        p-value                                신뢰구간



절편

mileage의
기울기

표준오차와 검정통계량은 p-value를 구하기 위한 것이므로 직접 해석할 필요가 없다.

 

p-value > (귀무가설) 절편이 0이다.                   

                (귀무가설) 기울기가 0이다.
                  기울기 신뢰구간이 -0.006 ~ -0.005 이므로 p-value는 볼 필요가 없다.


 

회귀계수 가설 검정

귀무가설 : 모집단에서 회귀계수 = 0

가설검정 신뢰구간
유의하지 않음 - ~ +
유의함 (p < α ) - ~ - 또는 + ~ +

 

예측

새로운 데이터 만들기

모형에 입력해서 예측하기 m.predict( )

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

df = pd.read_excel("car.xlsx")

m = ols('price ~ mileage', df).fit()    # 회귀분석
m.summary()

> R-squared : 주행거리가 분산의 45.7% 를 설명한다.

 

m = ols('price ~ mileage', df).fit()    # 회귀분석

# 새로운 데이터 만들기
new_df = pd.DataFrame({'mileage':[10000, 20000]})

# 모형에 입력하여 예측하기
m.predict(new_df)

> 모델 예측에 따라 price 예측값이 나오게 된다.

import seaborn as sns
sns.regplot(x='mileage', y ='price', data=df)

m2 = ols('price ~ other_car_damage', df).fit()
m2.summary()

 


 

R 제곱 R sqaured

회귀 분석에서 예측의 정확성을 알기 쉽게 판단할 수 있게 만든 지표 (0~1)

잔차분산 = ( y - y*) , 분산 = (실제-평균)

해석하기 >

0 분석결과가 y의 예측에 도움이 안됨
1 y를 완벽하게 정확히 예측할 수 있음

· R²이 0이 되는 경우?

 

(잔차분산 / 분산 ) = 1 일때,

 즉 잔차분산 = 분산

 이것은 (실제값-예측값) = (실제값-평균)

> 평균으로 밖에 예측하지 못할 때, 잔차분산이 분산과 같아진다.

 

 

 < R제곱 읽는 법 >

"모형이 종속변수의 분산의 ~%  를 설명한다"

예: R제곱 = 0.3 → "분산의 30%를 설명한다"

 

•  R제곱은 TSS(분산)에 비해 RSS가 얼마나 작아졌는지를 나타냄
•  TSS와 RSS는 모두 평균, 또는 예측에 대한 변산성(불확실성)
•  변산성이 줄어들었다 → 불확실성이 줄어들었다 → 설명이 되었다.

 

> R 제곱이 너무 낮게 나오면 다른 변수로 분산을 해보는 것이 좋다.


R제곱과 피어슨 상관계수

단순회귀분석(독립변수가 1개인 회귀분석)의 경우

 

회귀분석의 R제곱 = 독립변수와 종속변수의 피어슨 상관계수의 제곱

 

예시) 자동차 마일리지와 가격의 상관계수

import pandas as pd
import pingouin as pg

car = pd.read_excel('car.xlsx')
pg.corr(car.mileage, car.price)

(-0.67616)² = 0.4571923456


 

독립변수가 ' 범주형 '인 경우

 

예) 독립변수가 '차종' 일 경우 가격 예측

from statsmodels.formula.api import ols

m_model = ols('price ~ model', data=car).fit()
m_model.summary()

R&sup2; 0.011

 

범주형 변수는 기울기를 곱할 수 없다.

연속 변수로 변환해서 모형에 투입 한다.

여러가지  방법이 있는데 가장 많이 사용하는 것은 더미코딩(Jamovi, R, Pythom은 자동으로 가능)


 

더미코딩 Dummy coding

범주형 변수에 범주가 k개 있을 경우 (k-1)개의 더미 변수를 대신 투입

 

•  범주 중에 하나를 기준 범주로 지정
   - 기본적으로 ABC 순으로 먼저 나오는 것이 기준 범주 (변경 가능)

 

•  기준 범주를 제외한 범주들은 범주별로 더미 변수를 하나씩 가짐

범주가 2개 인 경우 범주가 3개 인 경우
ols('price ~ model', df).fit().summary() dep = pd.read_excel('depression.xlsx') 
ols('y ~ TRT', dep).fit().summary()
• ABC 순으로 Avante가 기준
 - K3의 더미 변수 추가
 - 0 = No, 1 = Yes로 이해
•  ABC 순으로 A가 기준
• B와 C의 더미 변수 추가
• 0 = No, 1 = Yes로 이해

•  Avante 예상 가격:  833만원
•  K3        예상 가격:  833+80 =913만원

•  A(기준)의 치료효과                              : 62.3333
•  B의 치료효과: 62.3333 – 10.4167 = 51.9166
•  C의 치료효과: 62.3333 – 11.0833 = 51.2500
p-val = 0.082로 0.05보다 큼
즉 귀무가설을 기각할 수 없다.
'k3가 Avante와 가격이 차이가 없다'를 기각 못함
 

 

> 예측에서 신뢰구간은 사용하지 않는다.

 


선형 회귀분석과 분산분석

'분산 분석'은 선형 회귀분석의 특수한 경우,

분산 분석은
· 서로 다른 두 개의 선형회귀분석의
성능 비교에 응용할 수 있으며
· 독립변수가 카테고리 변수인 경우 각 카테고리 값에 따른 영향을 정량적으로 분석하는데도 사용된다
.

> 선형 회귀 분석의 F 검정그 p 값을 보면, 분산분석과 같다.

pg.anova(dep, dv='y', between='TRT')


범주 목록 보기

기준 범주는 분석 전에 정해야 한다.

unique 함수를 사용하면 변수에서 범주의 목록을 확인 할 수 있다.

기준 범주는 더미 변수가 없으므로, 범주 목록에서 확인한다.


  Python 에서 더미변수 다루기 

 

•  변수 model을 명시적으로 범주형 변수로 지정하기
    (변수가 수치형인 경우에만 필요)
  ols('price ~ C(model)', car).fit().summary()

 

•  변수 model의 기준 범주를 K3로 지정하기
  ols(' price ~ C(x, Treatment("K3"))', car).fit().summary()

ols('price ~ C(model, Treatment("K3"))', car).fit().summary()

> 기준이 K3로 바뀐것을 볼 수 있다. ( intercept = 913.8116) 

 

기준 범주 바꿔주기

•  [dep 데이터/ 종속변수 3개] 변수 model의 기준 범주를 'C'로 지정하기
  ols(' price ~ C(x, Treatment("C"))', dep).fit().summary()

# 범주가 세개일때
from statsmodels.formula.api import ols
import pandas as pd

dep = pd.read_excel("depression.xlsx")
m = ols('y ~ C(TRT, Treatment("C"))', dep).fit()
m.summary()