본문 바로가기
학습노트/통계

[통계학습] 회귀와 예측(1)

by kime2 2024. 6. 3.

범위 : 4.1 단순선형회귀 ~ 4.4 회귀에서의 요인변수

 

4.1 단순성형회귀

  • 응답변수(반응변수) : 예측하고자 하는 변수(Y, 종속변수)
  • 독립변수 : 응답치를 예측하기 위해 사용되는 변수( X, 예측변수,픽처속성)
  • 레코드 : 한 특정 경우게 대한 입력과 출력을 답고 있는 벡터( 행)
  • 절편 : 회귀직선의 절편, X축이 0일때 Y값 -> 회귀식의 b0
  • 회귀계수(regression coefficient) : 회귀직선의 기울기 -> 회귀식의 b1
  • 적합값 (fitted value) : 회귀직선으로 부터 얻은 추정치(예측값)
  • 잔차(residual) : 관측값과 적합값의 차이 (오차)
  • 최소제곱 : 잔차의 제곱합을 최소화하여 회귀를 피팅하는 방법
  • lm (limear model) :선형모델

 

4.1.1 회귀식

단순선형회귀를 통해 X가 얼만큼 변하면 Y가 어느정도 변화하는지 추정 가능

회귀식

 

< 노동자들이 면진에 노출된 연수와 폐활량(peer)관계 >

import pandas as pd
url = 'https://raw.githubusercontent.com/gedeck/practical-statistics-for-data-scientists/master/data/LungDisease.csv'
lung = pd.read_csv(url)

import sklearn
from sklearn.linear_model import LinearRegression

# 독립변수, 종속변수의 넘파이 배열
predicions = lung['Exposure'].values.reshape(-1,1) # 2차원 배열
outcome = lung['PEFR'].values
model = LinearRegression() #모델생성
model.fit(predicions,outcome) #모델학습

print(f'intercept : {model.intercept_:.3f}') # 절편
print(f'coefficient exposure: {model.coef_[0]:.3f}' ) # 기울기

 

  • intercept : 424.583
  • coefficient exposure: -4.185

> 단순 회귀식 : PEFR  = exposure*(-4.185) + 424.583

 

즉, 노동자가 면진에 노출되는 연수가 1씩 증가할 때마다 폐활량은 -4.185의 비율로 줄어든다

 

4.1.2 적합값(예측값)과 잔차(오차)  

모든 데이터가 정확한 회귀식에 반영되지 않기 때문에 오차항 e반영

e = 실제값Y - 예측값Y^

 

<잔차 계산하기>

fitted = model.predict(lung[['Exposure']])
residuals = lung['PEFR'] - fitted

 

4.1.3. 최소제곱법 RSS

회귀선 -> 잔차들을 제곱한 값들을 합을 최소화 하는 선

* 많이 사용되는 이유 : 편의성!

 

🎈 주요개념

  • 회귀방적식은 응답변수 Y와 예측변수 X간의 관계를 선형함수로 모델링한다
  • 회귀모형은 적합값과 잔차, 즉 반응에 대한 예측과 예측 오차를 산출한다
  • 회귀모형은 일반적으로 최소제곱법을 이용해 피팅한다
  • 회귀는 예측과 설명 모두에 사용된다

 

 

 

 

4.2 다중선형회귀

예측변수가 여러개 일때 수식 -> 선형!

  • 제곱근평균재곱오차(RMSE : root mean squares error) : 회귀시 평균제곱오차의 제곱근, 회귀모형을 평가하는 게 가장 널리 사용되는 측정 지표
  • 잔차표준오차(RSE: residual standard error) : 평균제곱오차와 동일하지만 자유도에 따라 보정된 값
  • R제곱 : 0에서 1까지 모델에 의해 설명된 분산의 비율 (결정계수)
  • t 통계량 : 계수의 표준오차로 나눈 예측변수의 계수, 모델에서 변수의 중요도를 비교하는 기준
  • 가중회귀 : 다른 가중치를 가진 레코드를 회귀하는 방법

< 회귀분석의 유의성 검정 절차 >

  1. 회귀 모델 선정
    • 독립/종속변수 파악
  2. 데이터 경향성 확인
    • 독립변수와 종속변수 간 산점도 분석 및 상관관계 분석을 이용하여 선형성 확인
  3. 회귀계수 추정
    • 최소제곱법
    • 최대가능도법
    • 적률추정법
  4. 회귀계수 유의성 확인
    • t검정을 이용해 회귀계수의 유의성 확인
    • 독립변수 간 다중공산성 확인
    • 종석변수에 영향을 주는 독립변수 선택 및 해석
  5. 회귀식 적합성 확인
    • 모델적합성 확인 : 분산분석의 F검정
    • 모델설명력 확인 : 결정계수(R^2)
    • 데이터의 모델 적합성 확인 : 회귀분석의 기본가정 (정규성, 등분산성, 독립성)
  6. 회귀식의 영향력 진단

 

 

< 택시 데이터를 통해 팁 예측하기>

1. 회귀 모델 선정 : 수치형변수를 통해 TIP예측

import seaborn as sns
taxi = sns.load_dataset('taxis')

# 범주형데이터를 원-핫인코딩으로 수치형으로 바꾸기
taxi['yellow'] = pd.get_dummies(taxi['color'], drop_first = True)
taxi['credit card'] = pd.get_dummies(taxi['payment'], drop_first = True)

# 종속, 독립변수 구분
predictors = ['passengers','distance','fare','tolls', 'yellow', 'credit card'] #팁(종속변수)을 제외한 숫자형 데이터
outcomes = 'tip'

2.  데이터 경향성 확인

X = ['passengers','distance','fare','tolls', 'yellow', 'credit card', 'tip']
sns.pairplot(taxi[X], diag_kind='hist')

팁-거리, 요금 사이에 선형관계가 보임

단, 요금과 거리에서만 상관관계가 확인 됨

 

3. 회귀계수 추정

taxi_lm = LinearRegression() # 모델생성
taxi_lm.fit(taxi[predictors], taxi[outcomes]) # 모델학습

print(f'intercept:{taxi_lm.intercept_:.3f}')
print('coefficients:')
for name, coef in zip(predictors, taxi_lm.coef_):
    print(f'{name}:{coef}')
  • intercept:-1.828 > 절편
  • coefficients: > 회귀계수
  • passengers:0.006
  • distance:-0.045
  • fare:0.088
  • tolls:0.303
  • yellow:1.094
  • credit card:2.470

4. 회귀계수의 유의성검정 (OLS : Ordinary Leat Square)

https://velog.io/@tnsida315/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-%EA%B2%B0%EA%B3%BC%ED%95%B4%EC%84%9D

import statsmodels.api as sm

#boolean형 데이터 수치화 -> summary()오류
taxi[['yellow','credit card']] = taxi[['yellow','credit card']].astype('int')
model = sm.OLS(taxi[outcomes], taxi[predictors].assign(const =1))
results = model.fit()
print(results.summary())

1. p-value

passanger외 변수들은 모두 유의수준 0.05보다 작으므로 회귀식의 설명력이 있다  

t-통계량 = 회귀계수 추정값 / 회귀계수 표준오차

 

2. F-statistic

F-통계량에 대한 p-value는 유의수준 0.05보다 작으므로 모델 전체가 통계적으로 유의미하다

 

4.2.2 모형평가

제곱근평균제곱오차 > 모델에 대한 정확도 측정

잔차표준오차 (차이점: 자유도 활용)

fitted = taxi_lm.predict(taxi[predictors])
RMSE = np.sqrt(mean_squared_error(taxi[outcomes], fitted))
# mean_squared_error = 실제값(taxi[outcomes]) 과 예측값(fitted)의 평균제곱오차(MSE) 구하기
# np.sqrt 제곱근 구하기

r2 = r2_score(taxi[outcomes], fitted)

print(f'RMSE:{RMSE:.0f}')
print(f'r2: {r2:.4f}')

 

  • RMSE : 2
  • r2(결젱계수) : 0.2613

 

 

 

4.2.3 교차타당성 검사 

 

다중교차타당성 검사 절차

폴드 : 훈련을 위한 샘플과 홀드아웃 샘플로 데이터를 나누는 것

  1. 1/k의 데이터를 홀드아웃 샘플을 따로 떼어놓는다
  2. 남아있는 데이터로 모델을 훈련시킨다
  3. 모델을 1/k 홀드아웃에 적용하고 필ㅇ한 모델평가 지표를 기록한다
  4. 데이터의 첫번째 1/k를 복원하고 다음 1/k을 따로 보관한다
  5. 2~3단계를 반복한다
  6. 모든 레코드가 홀드아웃 샘플로 사용될 때까지 반복한다
  7. 모델평가 지표들을 평균과 같은 방식으로 결합한다

4.2.4 모형 선택 및 단계적 회귀

 

오컴의 면도칼

변수를 추가할수록 학습데이터에 해당 RMSE는 감소하고 R^2은 증가한다

 

수정회귀계수

n = 레코드수, p = 모델의 변수 개수

 

수정R제곱을 최대로 하는 모델을 찾는 방법

1. 전진선택 : 예측변수(독립변수)없이 시작하여 각 단계에서 R^2에 가장 큰 기여도를 갖는 예측변수를 하나씩 추가하고 기여도가 통계쩍으로 더 유의미 하지 않을 때 중지

2. 후진제거 :전체 모델로 시작해서 모든 예측변수가 통계적으로 유의미한 모델이 될 때까지, 통계적으로 유의미하지 않는 예측 변수들을 제거

3. 벌점회귀 : 개별 모델 집합들을 면시적으로 검색하는 대신 모델 적합 방정식에 많은 변수(파라미터)에 대해 모델에 불이익을 주는 제약 조건을 추가(예측변수를 제거하기 보다는 크기감소 및 0으로 만들어 적용) -> 능형회귀, 라소

 

4.2.5 가중회귀

유용성

서로 다른 관측치를 다른 정밀도로 측정했을 때, 역분산 가중치를 얻을 수 있다 -> 분산이 높을수록 가중치가 낮다

가중치 변수가 집계된 데이터의 각 행이 나타내는 원본 관측치의 수를 인코딩하도록, 행이 여러 경우를 의마하는 데이터를 분석할 수 있다.

 

 

 

🎈 주요개념

  • 다중선형회귀모형은 한 종속변수 Y와 여러개의 독립변수 간의 상관관계를 나타낸다
  • 모델을 평가하는 가장 중요한 지표는 제곱근평균제곱오차(RMSE)와 R^2이다
  • 계수들의 평균오차는 모델에 대한 변수 기여도와 신뢰도를 측정하는 데 사용된다
  • 단계적 회귀 모델을 만드는 데 필요한 변수들을 자동으로 결정하는 방법이다
  • 가중회귀는 방정식을 피팅할 때 레코드별로 가중치를 주기 위해 사용한다

 

4.3 회귀를 이용한 예측

데이터과학, 회귀의 목적은 예측

  • 예측구간 prediction interval :개별 예측값 주위의 불확실 구간
  • 외삽법 extrapolation :모델링에 사용된 데이터 범위를 벗어난 부분까지 모델을 확장하는 것

🎈 주요개념

  • 데이터범위를 벗어나는 외삽은 오류를 유발할 수 있다
  • 신뢰구간은 회귀계수 주변의 불확실성을 정량화한다
  • 예측구간은 개별 예측값의 불확실성을 정량화한다
  • R을 포함한 대부분의 소프트웨어는 수식을 사용하여 예측/신뢰구간을 기본 또는 지정된 출력으로 생성한다
  • 예측 및 신뢰구간 생성을 위해 수식 대신 부트스트랩을 사용할 수도 있다

4.4 회귀에서의 요인변수

  • 가변수 dummy variable : 회귀나 다른 모델에서 요인 데이터를 사용하기 위해 0과 1의 이진변수로 부호화한 변수
  • 기준분호화 reference coding : (통계학자들이 많이 사용하는 분호화) 한 요인을 기준으로하고 다른 요인들이 이 기준에 따라 빅할 수 있도록 함
  • 원핫인코딩 : 머신러닝 분야에서 많이 사용되는 부호화, 모든 요인수준이 계속 유지된다(다중선형회귀에는 부적합)
  • 편차 부호화 : 기준수준과는 반대로 전체 평균에 대해 각 수준을 비교하는 부호화방법

 

4.4.1 가변수 선택

 

< taxi의 범주형 변수를 사용해서 팁 예측하기 >

predictors_c = ['color','payment'] # 번주형 변수 2개
x = pd.get_dummies(taxi[predictors_c], drop_first = True) # 다중공산성을 위해 1개씩 제거
taxi_lm_factor = LinearRegression() #모델생성
taxi_lm_factor.fit(x,taxi[outcomes]) # 모델학습

print(f'intercept : {taxi_lm_factor.intercept_:.3f}')
print('Corfficients:')
for name, coef in zip(x.columns, taxi_lm_factor.coef_):
    print(f'{name}:{coef:.3f}')

 

intercept : -0.785
Corfficients:
color_yellow:1.004
payment_credit card:2.689

 

pd.get_dummies(taxi[predictors_c]).head()
pd.get_dummies(taxi[predictors_c], drop_first=True)

 

4.4.2 다수의 수준을 갖는 요인 변수들

-> 요소를 일부 통합하는 방법

 

4.4.3 순서가 있는 요인변수

 

🎈 주요개념

  • 요인변수는 회귀를 위해 수치형 변수로 변환해야 한다
  • 요인변수를 p개의 개별값으로 인코딩하기 위한 가장 흔한 방법은 p-1개의 가변수를 만들어 사용하는 것
  • 다수의 수준을 갖는 요인변수의 경우, 더 적은 수의 수준을 갖는 변수가 되도록 수준들을 통합해야 한다
  • 순서를 갖는 요인변수의 경우, 수치형 변수로 변환하여 사용할 수 있다