포트폴리오

R - weather.csv 비올 확률 계산

leegunho 2022. 6. 28. 09:58

weather.csv
0.02MB

install.packages("backports")
library(backports)
install_github('https://github.com/cran/car')
library(car)
library(lmtest)
library(ROCR)
library(ResourceSelection)

#모델링 과정에서 훈련 데이터가 계속 바뀌는것 을 방지하기 위해 시드값 고정 
set.seed(1234)
setwd("C:/RWork/RStudio")
# R은 데이터 프레임 형태로 값을 받아올 떄 문자형 변수를 Factor
# 로 자동 변경하기에 오류발생 위험. 
# 따라서, stringsAsFactors = F 로 하여 문자형 변수가 문자 타입을 string으로 유지 
weather_df = read.csv("weather.csv", stringsAsFactors = F)
head(weather_df)
# 더미생성을 지정해주지 않으면 predict()함수에서 오류발생 
weather_df <- weather_df[ , c(-1, -6, -8, -14)]

#종속변수의 YES/NO를 1/0 으로 바꾼후 문자형을 -> 실수형(double) 로 변경 
#내일비? 내일 비가올것이다 Yes, NO를 숫자로.
weather_df$RainTomorrow[weather_df$RainTomorrow == 'Yes'] <- 1
weather_df$RainTomorrow[weather_df$RainTomorrow == 'No'] <- 0
weather_df$RainTomorrow <- as.numeric(weather_df$RainTomorrow)
head(weather_df)

#학습 데이터와 검정 데이터 생성  train 70%, test 30%
idx <- sample(1:nrow(weather_df), nrow(weather_df) * 0.7)
train <- weather_df[idx, ]
test <- weather_df[-idx, ]

# family = 'binomial' (종속변수가 이항형일떄 지정하는 속성)
weather_model <- glm(RainTomorrow ~ ., data = train, family = 'binomial',
                     na.action = na.omit)
#z-Value는 추정값, p-Value = Pr(>|z|)
#추정값 = Estimate 표준오차 = Std. Error
#추정값, 표준오차, p-value 가 일반적으로 0.05 이하면 해당 변수가 통계적으로
#유의하다고 볼 수 있음 
summary(weather_model)

#p-value 값이 0.05보다 크면 적합한 모형이라 볼수있음 
hoslem.test(weather_model$y, fitted(weather_model))

# type = "response"(pred에 예측치 0~1 사이의 값을 넣도록 합니다)
# 1에 가까울수록 비올 확률이 높다
#pred 값이 0.05 이상이면1, 이하면 0 으로 설정했으니 이것을 기반으로 분류 정확도 계산  
pred <- predict(weather_model, newdata = test, type = "response")
pred
result_pred <- ifelse(pred >= 0.5, 1, 0)
result_pred
# 0을 0이라 한 값이 82개
# 0을 1이라 한 값이 11개
# 1을 0이라 한 값이 4개
# 1을 1이라 한 값이 11개
table(result_pred)
table(result_pred, test$RainTomorrow)
(82+11) / (82+11+4+11) #0.8611111