상관과 회귀

예측 분석의 기본이 되는 상관과 회귀의 개념을 알아봅니다


수강중

15. 로지스틱 회귀(분석)

  • IRLS(Iteratively Reweightes Least Square)방법을 사용
  • glm(generalized linear regression)함수를 사용
  • 실습 데이터 다운

자료 불러오기

dat <- read.csv('binary.csv')
head(dat)
  admit gre gpa  rank
1 0     380 3.61 3   
2 1     660 3.67 3   
3 1     800 4.00 1   
4 1     640 3.19 4   
5 0     520 2.93 4   
6 1     760 3.00 2   
  • 4개의 변수
  • admit을 예측해볼 것임
  • admit: 대학 합격 여부
  • gre: 영어 시험
  • gpa: 학점
  • rank: 전반적인 평가

학습 자료와 평가 자료 나누기

train_dat <- dat[1:300,]
test_dat <- dat[301:400,]
  • 3:1로 나눔

하나의 독립 변수로 모델 생성

  • gre로 대학 합격 여부 예측

원래는 family = 'binomial(link = logit)' 이렇게 적어야 하지만 binomial에서는 로지스틱 분석이 default 값이라 'binomial'만 적어도 괜찮음

res <- glm(admit ~ gre, data = train_dat, family = 'binomial')
res
Call:  glm(formula = admit ~ gre, family = "binomial", data = train_dat)

Coefficients:
(Intercept)          gre  
  -3.434660     0.004349  

Degrees of Freedom: 299 Total (i.e. Null);  298 Residual
Null Deviance:	    369.8 
Residual Deviance: 354.5 	AIC: 358.5
summary(res)
Call:
glm(formula = admit ~ gre, family = "binomial", data = train_dat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1963  -0.8838  -0.7066   1.2802   1.9307  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.434660   0.718177  -4.782 1.73e-06 ***
gre          0.004349   0.001153   3.773 0.000162 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 369.84  on 299  degrees of freedom
Residual deviance: 354.52  on 298  degrees of freedom
AIC: 358.52

Number of Fisher Scoring iterations: 4
  • 회귀 계수의 p값이 0.05보다 작아 유의미함
  • 따라서 gre 변수는 대학 합격 여부를 잘 설명하는 변수임
coef(res)
 (Intercept)          gre 
-3.434659571  0.004348629 

지수를 취해서 해석하는 것이 더 용이함

  • 지수를 취한 gre 점수가 1보다 크다는 것은 gre 점수가 올라가면 대학 합격할 확률도 올라간다는 뜻
  • 따라서 gre 점수가 1점 증가할 때마다 대학 합격할 확률의 Odds이 1.004배 증가한다는 뜻
  • gre 점수가 500점이었을 때 대학 합격,불합격 비율이 1:1이었다면 501점이 되면 1.004:1이 됨
exp(coef(res))
(Intercept)         gre 
 0.03223638  1.00435810 

독립 변수 여러개로 모델 생성

res.all <- glm(admit ~ ., data = train_dat, family = 'binomial')
res.all
Call:  glm(formula = admit ~ ., family = "binomial", data = train_dat)

Coefficients:
(Intercept)          gre          gpa         rank  
  -4.035600     0.003081     0.852738    -0.642303  

Degrees of Freedom: 299 Total (i.e. Null);  296 Residual
Null Deviance:	    369.8 
Residual Deviance: 329.3 	AIC: 337.3
summary(res.all)
Call:
glm(formula = admit ~ ., family = "binomial", data = train_dat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6983  -0.8580  -0.5868   1.0876   2.3188  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -4.035600   1.372309  -2.941  0.00327 ** 
gre          0.003081   0.001284   2.400  0.01642 *  
gpa          0.852738   0.395707   2.155  0.03116 *  
rank        -0.642303   0.149878  -4.286 1.82e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 369.84  on 299  degrees of freedom
Residual deviance: 329.33  on 296  degrees of freedom
AIC: 337.33

Number of Fisher Scoring iterations: 4
  • 회귀 계수들이 전부 유의미함
exp(coef(res.all))
(Intercept)         gre         gpa        rank 
 0.01767507  1.00308583  2.34606200  0.52607949 
  • gre가 1 오를 때마다 대학 합격할 확률의 Odds가 1.003배 오름
  • gpa가 1 오를 때마다 대학 합격할 확률의 Odds가 2.346배 오름
  • rank가 1 오를 때마다 대학 합격할 확률이 떨어짐
    • rank는 1일수록, 즉 작을수록 좋음
    • 따라서 rank의 1, 2, 3, 4를 연속된 숫자가 아닌 factor로 변경하는 과정이 필요함

rank를 factor로 바꾸고 모델 생성

res.rankfac <- glm(admit ~ gre + gpa + factor(rank), data = train_dat, family = 'binomial')
summary(res.rankfac)
Call:
glm(formula = admit ~ gre + gpa + factor(rank), family = "binomial", 
    data = train_dat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.7271  -0.8321  -0.5912   1.0683   2.2115  

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)   -4.878669   1.416349  -3.445 0.000572 ***
gre            0.003021   0.001288   2.346 0.018976 *  
gpa            0.931616   0.406099   2.294 0.021787 *  
factor(rank)2 -0.624799   0.377784  -1.654 0.098157 .  
factor(rank)3 -1.543449   0.412667  -3.740 0.000184 ***
factor(rank)4 -1.684816   0.487353  -3.457 0.000546 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 369.84  on 299  degrees of freedom
Residual deviance: 328.02  on 294  degrees of freedom
AIC: 340.02

Number of Fisher Scoring iterations: 4
exp(coef(res.rankfac))
  • factor(rank)2: rank가 1이었다가 2로 변했을 때
    • 합격 확률의 Odds가 0.5배가 되어 합격할 확률이 약 1/3배가 됨
  • factor(rank)3: rank가 1이었다가 3로 변했을 때
  • factor(rank)4: rank가 1이었다가 4로 변했을 때
  • 셋 다 1보다 작음
  • 즉 1일 때보다 2, 3, 4일 때 합격할 확률이 더 떨어짐

rank를 1등급과 비1등급(2, 3, 4)으로 나누어 모델 생성

res.rankcol <- glm(admit ~ gre + gpa + I(rank == 1), data = train_dat, family = 'binomial')
exp(coef(res.rankcol))
     (Intercept)              gre              gpa I(rank == 1)TRUE 
      0.00376662       1.00321882       2.16364593       3.12336111 
  • 2, 3, 4등급을 받았을 때에 비해 1등급을 받았을 때의 합격할 확률의 Odds가 큼
  • 만약 내가 2, 3, 4등급 중 하나여서 합격할 확률이 1:1이었는데 1등급이 되었다면 합격하 확률이 3:1이 됨

모델 비교

anova(res.rankfac, res.rankcol, test = 'Chisq')
  Resid. Df Resid. Dev Df Deviance  Pr(>Chi)   
1 294       328.0247   NA        NA          NA
2 296       338.6643   -2 -10.63956 0.004893828
  • 에러를 더 줄여주는 res.rankfac 모델이 더 좋음
  • anova함수는 원래 있던 회귀 계수에서 몇 개만 더 추가되는 경우에만 분석이 가능함
  • 서로 없는 변수를 가진 모델끼리는 비교 불가능
    • admit ~ gre + gpa
    • admit ~ gre + rank
    • 위 두 개는 비교가 불가능함

예측하기

pred <- predict(res.rankfac, test_dat, type = 'response')
pred
       301        302        303        304        305        306        307 
0.37851335 0.25452664 0.20414563 0.56425896 0.04224594 0.16965621 0.42696424 
       308        309        310        311        312        313        314 
0.38190553 0.27761728 0.08974290 0.26814757 0.47732794 0.28572480 0.16906013 
       315        316        317        318        319        320        321 
  • 각 학생의 합격률을 반환

기준을 잡아 그 값보다 크면 합격 작으면 불합격 처리

pred <- ifelse(pred > 0.5, 1, 0)

얼마나 맞췄는지 cross table을 그려 확인

table(test_dat$admit, pred)
   pred
     0  1
  0 57  8
  1 25 10
  • 불합격 인원 65명 중 57명은 불합격이라 잘 예측, 나머지 8명은 합격이라 예측
  • 합격 인원 35명 중 10명은 합격이라 잘 예측, 나머지 25명은 불합격이라 잘못 예측
  • 67% 정확도