Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 이것이 코딩테스트다
- ADsP
- IRIS
- Google ML Bootcamp
- pytorch
- Python
- 시각화
- 데이터 전처리
- 머신러닝
- 자격증
- 코딩테스트
- 회귀분석
- sklearn
- ML
- pandas
- scikit learn
- 통계
- 태블로
- 데이터 분석
- matplotlib
- 데이터분석준전문가
- Deep Learning Specialization
- 딥러닝
- r
- 파이썬
- SQL
- 이코테
- tableau
- SQLD
- 데이터분석
Archives
- Today
- Total
함께하는 데이터 분석
[R] 로지스틱 회귀 & LDA 본문
오늘은 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 |