R

R 기초 27 - 로지스틱 회귀분석(Logistic Regression) 예제

코딩탕탕 2022. 10. 27. 12:24

 

날씨 정보를 예측한다.

 

# Logistic regression으로 비 유무 예측하기
weather <- read.csv("https://raw.githubusercontent.com/pykwon/Test-datas-for-R/master/weather.csv")
head(weather, 3)
dim(weather)
str(weather)
colnames(weather)
weather_df <- weather[, c(-1, -6, -8, -14)]
dim(weather_df)
head(weather_df, 3)
unique(weather_df$RainTomorrow)

sum(is.na(weather_df))  # 5개의 결측값이 있다.
weather_df <- na.omit(weather_df) # 결측값을 없애버렸다.


# Raintomorrow 변수를 더미변수로 변환
weather_df$RainTomorrow[weather_df$RainTomorrow == 'Yes'] <- 1
weather_df$RainTomorrow[weather_df$RainTomorrow == 'No'] <- 0
unique(weather_df$RainTomorrow)
weather_df$RainTomorrow <- as.numeric(weather_df$RainTomorrow) # 숫자타입으로 변경
str(weather_df)

# 학습 / 검정 데이터 분리
set.seed(1)
idx <- sample(1:nrow(weather_df), nrow(weather_df) * 0.7)
train <- weather_df[idx, ]
test <- weather_df[-idx, ]

cat(dim(train), ' ', dim(test)) # 252 11   109 11

model <- glm(RainTomorrow ~ ., data = train, family = 'binomial') # train으로 테스트
model

summary(model)

# 예측 후 모델검증
pred <- predict(model, newdata = test, type = 'response')
head(pred, 20)
result_pred <- ifelse(pred > 0.5, 1, 0)
result_pred

# confusion matrix
t <- table(result_pred, test$RainTomorrow)
t
sum(diag(t)) / nrow(test) # Accuracy 0.8990826 (정확도)

# 모델 성능을 확인하기 위한 방법 중 ROC curve
install.packages("ROCR")
library(ROCR)

pr <- prediction(pred, test$RainTomorrow)
pr
prf <- performance(pr, measure = 'tpr', x.measure = 'fpr')
plot(prf)

# AUC (Area Under the ROC Curve)는 ROC curve의 밑면적을 말한다.
# 즉, 성능 평가에 있어서 수치적인 기준이 될 수 있는 값으로, 1에 가까울수록
# 그래프가 좌상단에 근접하게 되므로 좋은 모델이라고 할 수 있다.
auc <- performance(pr, measure = 'auc')
auc
auc <- auc@y.values
auc  # 0.8711844   good 수준


# 새 값으로 예측
new_data <- train[c(1:3), ]
new_data <- edit(new_data)
new_data

new_pred <- predict(model, newdata = new_data, type = 'response')
ifelse(new_pred > 0.5, '비옴', '안 옴')