SW/R

R : 로지스틱 회귀 ( 개념 및 예제 )

얇은생각 2019. 3. 12. 12:30
반응형

로지스틱 회귀

일반적인 회귀 문제에서는 종속변수가 수치데이터(양적 자료)입니다. 즉, 예측 해야 할 종속 변수가 수치데이터가 아닌 범주형 데이터 (Yes or No) 일 때를 로지스틱 회귀라고 한다. 또, 범주나 그룹을 예측하는 문제를 ‘분류(classification)’ 문제 라고 합니다.



실습 : iris 품종 예측

먼저 iris 품종을 예측하기 위해 회귀식을 구하겠습니다. 

head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# 종속변수가 숫자형 이어야 함. 범주형 변수를 숫자로 변환
mod3 <- glm(as.integer(Species) ~., data= iris)
summary(mod3)

# Call:
# glm(formula = as.integer(Species) ~ ., data = iris)

# Deviance Residuals:
# Min 1Q Median 3Q Max
# -0.59215 -0.15368 0.01268 0.11089 0.55077

# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 1.18650 0.20484 5.792 4.15e-08 ***
# Sepal.Length -0.11191 0.05765 -1.941 0.0542 .
# Sepal.Width -0.04008 0.05969 -0.671 0.5030
# Petal.Length 0.22865 0.05685 4.022 9.26e-05 ***
# Petal.Width 0.60925 0.09446 6.450 1.56e-09 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# (Dispersion parameter for gaussian family taken to be 0.04800419)

# Null deviance: 100.0000 on 149 degrees of freedom
# Residual deviance: 6.9606 on 145 degrees of freedom
# AIC: -22.874

# Number of Fisher Scoring iterations: 2



그 다음 데이터의 품종을 예측해보겠습니다. pred 값이 1에 가까우므로  (setosa)로 판단할 수 있습니다. 

pred <- 1.18650 + 5.1*(-0.11191)+
3.5*(-0.04008)+
1.4*0.22865+
0.2*0.60925
pred
# [1] 0.917439

pred <- 1.18650 + 5.1*(-0.11191)+
3.5*(-0.04008)+
1.4*0.22865+
0.2*0.60925
pred
# [1] 0.917439



이번에는 함수를 이용해서 품종을 예측해보겠습니다. model, predict() 함수를 이용합니다.

unknown <- data.frame(rbind(c(5.1, 3.5, 1.4, 0.2)))
names(unknown) <- names(iris)[1:4]
unknown
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1 5.1 3.5 1.4 0.2

mod3

# Call: glm(formula = as.integer(Species) ~ ., data = iris)

# Coefficients:
# (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1.18650 -0.11191 -0.04008 0.22865 0.60925

# Degrees of Freedom: 149 Total (i.e. Null); 145 Residual
# Null Deviance:     100
# Residual Deviance: 6.961  AIC: -22.87

pred <- predict(mod3, unknown)
pred
# 1
# 0.9174506



여러 개의 데이터를 예측하면 어떨까요? 다양한 데이터의 품종을 예측해보겠습니다. 

test <- iris[,1:4]
pred <- predict(mod3, test)
pred
# 1 2 3 4 5 6 7 8 9
# 0.9174506 0.9598716 0.9513723 1.0122999 0.9246333 1.0582910 1.0383367 0.9555137 1.0198324
# 10 11 12 13 14 15 16 17 18
# 0.9178029 0.8987275 1.0007593 0.9101369 0.8974964 0.7733478 0.9589505 0.9668330 0.9783758
pred <- round(pred,0) # find nearest integer
pred
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
# 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1



얼마나 정확히 예측했을까요? 기존 데이터와 비교해보겠습니다. 정확도가 약 97프로 정도로 높은 수준을 나타냅니다. 

pred == as.integer(iris[,5])
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

acc <- mean(pred == as.integer(iris[,5]))
acc
# [1] 0.9733333



로지스틱 회귀의 경우에도 종속 변수가 숫자여야 합니다. 따라서 문자형으로 되어 있는 범주데이터는 숫자(1,2,3,..)로 변환한후 작업을 해야 합니다. 범주형 데이터가 factor이면 as.integer() 함수를 통해 쉽게 숫자로 바꿀수 있습니다. 아래 예제를 참고하세요.

class(iris$Species)
# [1] "factor"
iris$Species
# [1] setosa setosa setosa setosa setosa setosa setosa
# [8] setosa setosa setosa setosa setosa setosa setosa
# [15] setosa setosa setosa setosa setosa setosa setosa
# [22] setosa setosa setosa setosa setosa setosa setosa
as.integer(iris$Species)
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# [43] 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# [85] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
# [127] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3


반응형