함께하는 데이터 분석

[R] 로지스틱 회귀 & LDA 본문

학회 세션/비어플

[R] 로지스틱 회귀 & LDA

JEONGHEON 2022. 3. 26. 21:14

오늘은 R코드를 통해 간단한 예시로

 

로지스틱 회귀분석과 LDA를 알아보겠습니다.

 

자료는 R패키지인 ISLR에서 Smarket 데이터를 이용하겠습니다.

 

Smarket 데이터는 2001년부터 2005년까지의 1250일에 걸친

 

S&P500 주가지수 수익률을 나타낸 데이터입니다.

 

변수 설명

Year 연도(2001년 ~ 2005년)
Lag1 ~Lag5 해당 날짜 1~5일 전의 수익률
Volume 해당 날짜 전날에 거래된 주식 수(단위 : 10억 주)
Today 당일의 수익률
Direction 당일 주가 지수 상승 / 하락 여부(UP / DOWN)

 

데이터 불러오기

library(ISLR)

stocks <- Smarket
names(stocks)
>>> [1] "Year"      "Lag1"      "Lag2"      "Lag3"     
    [5] "Lag4"      "Lag5"      "Volume"    "Today"    
    [9] "Direction"

 

데이터 구조

str(stocks)
>>> 'data.frame':	1250 obs. of  9 variables:
     $ Year     : num  2001 2001 2001 2001 2001 ...
     $ Lag1     : num  0.381 0.959 1.032 -0.623 0.614 ...
     $ Lag2     : num  -0.192 0.381 0.959 1.032 -0.623 ...
     $ Lag3     : num  -2.624 -0.192 0.381 0.959 1.032 ...
     $ Lag4     : num  -1.055 -2.624 -0.192 0.381 0.959 ...
     $ Lag5     : num  5.01 -1.055 -2.624 -0.192 0.381 ...
     $ Volume   : num  1.19 1.3 1.41 1.28 1.21 ...
     $ Today    : num  0.959 1.032 -0.623 0.614 0.213 ...
     $ Direction: Factor w/ 2 levels "Down","Up": 2 2 1 2 2 2 1 2 2 2 ...
     
head(stocks)
>>>   Year   Lag1   Lag2   Lag3   Lag4   Lag5 Volume  Today Direction
    1 2001  0.381 -0.192 -2.624 -1.055  5.010 1.1913  0.959        Up
    2 2001  0.959  0.381 -0.192 -2.624 -1.055 1.2965  1.032        Up
    3 2001  1.032  0.959  0.381 -0.192 -2.624 1.4112 -0.623      Down
    4 2001 -0.623  1.032  0.959  0.381 -0.192 1.2760  0.614        Up
    5 2001  0.614 -0.623  1.032  0.959  0.381 1.2057  0.213        Up
    6 2001  0.213  0.614 -0.623  1.032  0.959 1.3491  1.392        Up

summary(stocks)
>>>       Year           Lag1                Lag2                Lag3                Lag4          
     Min.   :2001   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000  
     1st Qu.:2002   1st Qu.:-0.639500   1st Qu.:-0.639500   1st Qu.:-0.640000   1st Qu.:-0.640000  
     Median :2003   Median : 0.039000   Median : 0.039000   Median : 0.038500   Median : 0.038500  
     Mean   :2003   Mean   : 0.003834   Mean   : 0.003919   Mean   : 0.001716   Mean   : 0.001636  
     3rd Qu.:2004   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750  
     Max.   :2005   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000  
          Lag5              Volume           Today           Direction 
     Min.   :-4.92200   Min.   :0.3561   Min.   :-4.922000   Down:602  
     1st Qu.:-0.64000   1st Qu.:1.2574   1st Qu.:-0.639500   Up  :648  
     Median : 0.03850   Median :1.4229   Median : 0.038500             
     Mean   : 0.00561   Mean   :1.4783   Mean   : 0.003138             
     3rd Qu.: 0.59700   3rd Qu.:1.6417   3rd Qu.: 0.596750             
     Max.   : 5.73300   Max.   :3.1525   Max.   : 5.733000

 

설명변수 히스토그램

par(mfrow=c(3,3))

for (i in 1:8) {
  hist(stocks[,i], xlab = colnames(stocks)[i], 
       main = paste("Histogram of" , colnames(stocks)[i]))
}

 

로지스틱 회귀모델 적합

glm.fit <- glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume, data = stocks, family=binomial)
summary(glm.fit)
>>> Call:
    glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + 
        Volume, family = binomial, data = stocks)

    Deviance Residuals: 
       Min      1Q  Median      3Q     Max  
    -1.446  -1.203   1.065   1.145   1.326  

    Coefficients:
                 Estimate Std. Error z value Pr(>|z|)
    (Intercept) -0.126000   0.240736  -0.523    0.601
    Lag1        -0.073074   0.050167  -1.457    0.145
    Lag2        -0.042301   0.050086  -0.845    0.398
    Lag3         0.011085   0.049939   0.222    0.824
    Lag4         0.009359   0.049974   0.187    0.851
    Lag5         0.010313   0.049511   0.208    0.835
    Volume       0.135441   0.158360   0.855    0.392

    (Dispersion parameter for binomial family taken to be 1)

        Null deviance: 1731.2  on 1249  degrees of freedom
    Residual deviance: 1727.6  on 1243  degrees of freedom
    AIC: 1741.6

    Number of Fisher Scoring iterations: 3

선형 회귀분석 때는 lm을 사용했는데 로지스틱은 glm을 사용합니다.

 

generalized linear model의 약자로

 

로지스틱 회귀분석을 이용하려면 family인자에 binomial을 넣어줘야 합니다.

 

설명변수가 통계적으로 유의한 지를 알아볼 때 유의수준 알파를 0.05라 할 때

 

p-value인 유의확률이 알파보다 작아야 하는데

 

Lag1, Lag2, Volume을 제외한 나머지 변수는 유의하지 않습니다.

 

따라서 Lag1, Lag2, Volume 변수만으로 새로 진행하겠습니다.

glm.fit1 <- glm(Direction~Lag1+Lag2+Volume, data=stocks, family=binomial)

 

로지스틱 회귀모델 확률

glm.probs <- predict(glm.fit1, type='response')

predict 함수에서 type인자에 'response'를 넣으면 로지스틱 회귀 확률을 구해줍니다.

 

1/2를 기준으로 로지스틱 회귀 모델 예측값 결정

glm.pred <- rep('Down', 1250)
glm.pred[glm.probs>0.5] <- 'Up'

 

정오분류표

tab <- table(glm.pred, stocks$Direction)
tab
>>> glm.pred Down  Up
        Down  147 131
        Up    455 517

        
# 정분류율 = accuracy (147+517)/1250
sum(tab[row(tab) == col(tab)])/sum(tab)
>>> 0.5312

Accuracy가 53%로 상당히 떨어진다는 것을 알 수 있죠.

 


 

LDA 모델 접합

library(MASS)

lda.fit <- lda(Direction~Lag1+Lag2+Volume, data=stocks)
lda.fit
>>> Call:
    lda(Direction ~ Lag1 + Lag2 + Volume, data = stocks)

    Prior probabilities of groups:
      Down     Up 
    0.4816 0.5184 

    Group means:
                Lag1        Lag2   Volume
    Down  0.05068605  0.03229734 1.469728
    Up   -0.03969136 -0.02244444 1.486273

    Coefficients of linear discriminants:
                  LD1
    Lag1   -0.6925718
    Lag2   -0.4043435
    Volume  1.2459411

LDA는 MASS 패키지를 통해 사용할 수 있습니다.

 

로지스틱 회귀모형이랑 똑같이 Lag1, Lag2, Volume만 이용했습니다.

 

반응변수 Y 예측

lda.pred <- predict(lda.fit)
lda.class <- lda.pred$class
head(lda.class)
>>> [1] Up   Down Down Up   Up   Up

 

정오분류표

tab1 <- table(lda.class, stocks$Direction)
tab1
>>> lda.class Down  Up
         Down  147 129
         Up    455 519

# 정분류율 = accuracy (147+519)/1250
sum(tab1[row(tab1) == col(tab1)])/sum(tab1)
>>> [1] 0.5328

LDA 모형도 Accuracy가 53%로 별반 차이가 없다는 것을 알 수 있습니다.

 

다른 데이터를 이용하여 로지스틱과 LDA를 이용해보시면 좋을 것 같습니다!


Copyright

 

- 비어플 빅데이터 학회

'학회 세션 > 비어플' 카테고리의 다른 글

[Python] 규제 회귀 모델  (0) 2022.04.02
규제 회귀 모델  (0) 2022.04.02
[Classification] LDA(선형 판별분석)  (0) 2022.03.26
[Python] IMAGE(2D data) AUGMENTATION  (0) 2022.03.24
[R] 데이터 불균형 해소  (0) 2022.03.20