머신러닝 & 딥러닝

4. [지도학습] 회귀분석 (Regression) (1)

김초송 2023. 3. 22. 16:31

단순회귀분석

  • 회귀분석 : 수치 예측
  • 특정 변수(독립변수)가 다른 변수(종속변수)에 어떤 영향을 미치는지를 수학적 모형으로 설명, 예측하는 기법
  • 선형회귀분석
H(W, b) = Wx + b
W : 기울기
b : 절편
  • 최소제곱법으로 W, b 를 구함
    최소제곱법(최소자승법) : 잔차(관측값과 예측값의 차이) 의 제곱의 합이 최소화하는 직선을 찾는 방법
W = cov(x, y) / var(x)
기울기 = x 와 y 의 공분산 / x 의 분산
  • 분산 : 데이터의 퍼짐 정도
b = - Wx + y
   = - W * mean(x) + mean(y)
  • 결정계수로 성능 확인
    결정계수 : 회귀모델이 해당 데이터를 얼마나 잘 설명하는지에 대한 0 에서 1 사이의 값. 
    1에 가까울수록 좋은 모델

 

결정계수 (R-squared)

  • 데이터에 대한 회귀모델의 설명력을 나타내는 척도
  • 0 ~ 1 사이의 값
  • 1에 가까울 수록 데이터를 잘 설명하는 회귀모델
  • 조정된 결정계수 (Adjusted R_squared)
    : 파생변수가 너무 많을 경우 결정계수는 올라가지만 모델 복잡 -> 이런 단점을 보안하기 위한 척도
      Multiple R-squared 과 차이가 작아야 좋은 모형

 

R 로 단순회귀분석 구현

reg <- read.csv("C:/Data/simple_hg.csv")
reg

# 1. 데이터 시각화
plot(input ~ cost, data=reg, pch=21, col='blue', bg='blue', cex=2)

# 2. 단순회귀 모델 생성
model <- lm(input ~ cost, data=reg2)
model

abline(model, col='red', cex=2, lwd=3)
title('y = 2.186 * x + 62.929')

# 3. 종속변수 예측
predict(model, newdata=data.frame(cost=26))
  • lm ( 종속변수 ~ 독립변수, data=데이터프레임명 )
  • lwd=3 : 실선
# model 결과
Call:
lm(formula = input ~ cost, data = reg2)

Coefficients:
(Intercept)         cost  
     62.929        2.186  # 절편, 기울기

# 결과 : 예상 매출액
       1 
119.7779

 

파이썬으로 단순회귀분석 구현

0. 패키지 설치
1. 데이터 로드
2. 독립변수, 종속변수 지정
3. 산포도 그래프 
4. 단순 회귀 방정식 시각화
5. 단순회귀 모델 생성
6. 모델 훈련
7. 기울기와 절편 
8. 모델 예측

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

reg = pd.read_csv("C:/Data/simple_hg.csv")
reg

x = reg[['cost']] # 광고비 
y = reg[['input']] # 매출액

plt.scatter(x, y, color='red')
sns.regplot(x='cost', y='input', data=reg2, color='green',
            scatter=False, fit_reg=True, ci=0)
plt.show()

from sklearn.linear_model import LinearRegression

model = LinearRegression()

model.fit(x, y)

model.predict(np.array(26).reshape(1, 1))

다중회귀분석

  • 독립변수가 2개 이상이고 종속변수가 1개인 선형회귀분석
  • 기울기가 여러 개
y = a1 * x1 + a2 * x2 + ... + b

 

R 로 다중회귀분석 구현

# 1. 데이터 로드
challenger <- read.csv("C:/Data/graph/challenger.csv")
challenger

# 2. 다중회귀 모델 생성
model <- lm(distress_ct ~ ., data=challenger)
model

# 3. 회귀분석 결과 해석
model2 <- lm(distress_ct ~ temperature, data=challenger)
model2

predict(model2, newdata = data.frame(temperature=c(30, 60, 70))) # 화씨 30 / 60 / 70 도 일 때 O형 링 파손 예측 갯수
# model 결과
Call:
lm(formula = distress_ct ~ ., data = challenger)

Coefficients: # 결정계수
         (Intercept)           temperature  field_check_pressure  
            3.527093             -0.051386              0.001757  
          flight_num  
            0.014293
  • distress_ct : O형 링 부품의 파손 수
    temperature : 기온
    field_check_pressure : 압력
    flight_num : 비행기 번호 (작을 수록 노후화)
  • distress_ct -> 종속변수
    나머지 -> 독립변수 : 독립변수들 중 어떤 변수의 기울기가 가장 큰지 알아내야 함
  • lm( 종속변수 ~ 독립변수, data=데이터프레임)
    . = 모든 컬럼
  • Coefficients : 결정계수
    Intercept : 절편
  • 가장 영향력이 컸던 독립변수를 가지고 단순회귀 분석 실행
# 1. 데이터 로드
insurance <- read.csv("C:/Data/graph/insurance.csv")
insurance

# 2. 결측치 확인
colSums(is.na(insurance))

# 3. 정규분포 형태인지 확인
hist(insurance$expenses)

# 4. 독립변수들끼리 상관관계 분석
cor(insurance[, c("age", "bmi", "children", "expenses")])

# 5. 다중회귀 분석 모델 생성
in_model <- lm(expenses ~ ., data=insurance)
in_model

# 6. 결과 해석
# 7. 결정계수 확인
summary(in_model)
# in_model 결과
Call:
lm(formula = expenses ~ ., data = insurance)

Coefficients:
    (Intercept)              age          sexmale              bmi         children  
       -11941.6            256.8           -131.4            339.3            475.7  
      smokeryes  regionnorthwest  regionsoutheast  regionsouthwest  
        23847.5           -352.8          -1035.6           -959.3    
        
# summary 결과
Call:
lm(formula = expenses ~ ., data = insurance)

Residuals:
     Min       1Q   Median       3Q      Max 
-11302.7  -2850.9   -979.6   1383.9  29981.7 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)     -11941.6      987.8 -12.089  < 2e-16 ***
age                256.8       11.9  21.586  < 2e-16 ***
sexmale           -131.3      332.9  -0.395 0.693255    
bmi                339.3       28.6  11.864  < 2e-16 ***
children           475.7      137.8   3.452 0.000574 ***
smokeryes        23847.5      413.1  57.723  < 2e-16 ***
regionnorthwest   -352.8      476.3  -0.741 0.458976    
regionsoutheast  -1035.6      478.7  -2.163 0.030685 *  
regionsouthwest   -959.3      477.9  -2.007 0.044921 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6062 on 1329 degrees of freedom
Multiple R-squared:  0.7509,	Adjusted R-squared:  0.7494 
F-statistic: 500.9 on 8 and 1329 DF,  p-value: < 2.2e-16
  • 독립변수 : 성별, 나이, 비만지수, 부양가족수, 흡연여부, 사는 지역
    종속변수 : 의료비
  • 상관관계 분석 : 서로 얼마나 상관있는지
    회귀 분석 : 특정 변수가 다른 변수에 얼마나 영향을 끼치는지 
  • 다중공선성 : 독립변수들끼리 서로 강한 상관관계를 보이는 현상
    다중공선성이 있으면 그 변수 중 하나의 영향력이 상대적으로 약해짐 -> 오류 해석
  • cor(insurance[, c("age", "bmi", "children", "expenses")]) 
    : 수치형 데이터인 변수들의 상관관계 분석
  • age : 나이가 한 살씩 증기할 수록 평균적으로 의료비 256.8 달러 증가
    smokeryes : 비흡연자에 비해 평균적으로 의료비 23847.5 달러 증가 (dummy 변수)
  • * : p value 값이 아주 작음 -> 대립가설을 채택할 만큼 근거가 있음
  • 결정 계수 : 0.9 이상으로 올려야 함
Multiple R-squared:  0.7509
# 8. 성능 개선
insurance$bmi30 <- ifelse(insurance$bmi >= 30, 1, 0)
in_model2 <- lm(expenses ~ ., data=insurance)
summary(in_model2)

insurance$bmi30_smokeryes <- ifelse(insurance$smoker=='yes' & insurance$bmi30==1, 1, 0)
in_model3 <- lm(expenses ~ ., data=insurance)
summary(in_model3)
  • 개선 방법 1
    비만 여부에 대한 컬럼 추가
  • 개선 방법 2
    비만과 흡연 여부에 대한 컬럼 추가
Multiple R-squared:  0.8639

오차와 잔차의 차이

  • 오차 : 모집단 전체에서 실제값과 회귀선의 예측값과의 차이
  • 잔차 : 표본에서 관측값(실제값)과 회귀선의 예측값과의 차이

선형회귀분석의 기본적인 가정 5가지

  1. 선형선 : 독립변수와 종속변수가 선형적
  2. 잔차 정규성 : 잔차의 기댓값은 정규분포 형태
  3. 잔차 독립성 : 잔차는 서로 독립적
  4. 잔차 등분산성 : 잔차들의 분산이 일정
  5. 다중공선성 : 다중회귀분석에서 3개 이상의 독립변수들 간의 상관관계가 없어야 함

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.