반응형
/*******************************************************************************************************************
-- Title : [R3.3] 예측분석 - 다중공선성, 선형 회귀분석 및 로지스틱 회귀분석
-- Reference : hrd-net
-- Key word : R 다중공선성 multicolinearity vif cor result.lm summary lm pred resid residuals shapiro.test
logistic regression predict 혼돈 matrix 분류정확도 시그모이드 회귀모델 glm 선형 회귀 분석
잔차 등분산성 회귀 방정식 linear model
*******************************************************************************************************************/
-- Chart
-- R
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | # ************************************************ # -- 1. 다중공선성(Multicolinearity) # ************************************************ # - 독립변수 간의 강한 상관관계로 인해서 회귀분석의 결과를 신뢰할 수 없는 현상 # - 생년월일과 나이를 독립변수로 갖는 경우 # - 해결방안 : 강한 상관관계를 갖는 독립변수 제거 # ------------------------------ # -- (1) 다중공선성 문제 확인 # ------------------------------ install.packages("car") library(car) fit = lm(formula=Sepal.Length ~ Sepal.Width+Petal.Length+Petal.Width, data=iris) vif(fit) sqrt(vif(fit))>2 # root(VIF)가 2 이상인 것은 다중공선성 문제 의심 # ------------------------------ # -- (2) iris 변수 간의 상관계수 구하기 # ------------------------------ cor(iris[,-5]) # 변수간의 상관계수 보기(Species 제외) # x변수들끼리 계수값이 높을 수도 있다. -> 해당 변수 제거(모형 수정) = Petal.Width # ------------------------------ # -- (3) 학습데이터와 검정데이터 분류 # ------------------------------ x = sample(1:nrow(iris), 0.7*nrow(iris)) # 전체중 70%만 추출 train = iris[x, ] # 학습데이터 추출 test = iris[-x, ] # 검정데이터 추출 # ------------------------------ # -- (4) Petal.Width 변수를 제거한 후 회귀분석 # ------------------------------ result.lm = lm(formula=Sepal.Length ~ Sepal.Width + Petal.Length, data=train) result.lm summary(result.lm) # ------------------------------ # -- (5) 회귀방정식 적용 상품 구매 금액 예측 # ------------------------------ # 방문횟수, 구매횟수, 평균구매액 변수를 대상으로 # 다음과 같이 다중회귀 분석을 이용하여 총구매금액을 예측하시오. # # <조건1> 변수 모델링 # y변수 : tot_price(총구매금액) # x변수 : visit_count(방문횟수), buy_count(구매횟수), avg_price(평균구매액) # # <조건2> train/test 데이터 셋 생성(7:3 비율) # # -- 데이터셋 가져오기 result = read.csv("D:\\RProject\\Rwork\\Part-IV\\product_sales.csv", header=T) head(result) # 데이터 셋 확인 # -- 단계1 : train/test 데이터 셋 생성(7:3 비율) - sample()함수 이용 idx = sample(1:nrow(result), 0.7*nrow(result)) train = result[idx, ] # 훈련 데이터 test = result[-idx, ] # 검정 데이터 # -- 단계2 : 다중회귀모델 생성 및 계수값 보기 - lm()함수 이용 model = lm(tot_price ~visit_count+buy_count+avg_price, data = train) # -- 단계3: 회귀분석 결과 해석 - summary()함수 이용 summary(model) # -- 단계4: 회귀방정식을 적용하여 total값 예측 - predict()함수 이용 model # 2.7193 -0.4398 0.4375 0.6241 # -- 회귀방정식 total=2.7193+(-0.4398)*visit_count+0.4375*buy_count+0.6241*avg_price # 왜 에러가 날까? pred = predict(model, test) cor(pred, test$tot_price) # 0.893091 # ************************************************ # -- 2. 선형회귀분석 절차(전제조건) # ************************************************ # 1. 변수 모델링 : y ~ x1 + x2 + xn # 2. 회귀모델 생성 # 3. 잔차(오차) 분석 # 1) 독립성과 등분산성 검정 # 2) 잔차의 정규성 검정 # 4. 다중공선성 검사 # 5. 회귀모델 생성/ 평가 names(iris) # ------------------------------ # -- 1. 변수 모델링 : y:Sepal.Length = x:Sepal.Width,Petal.Length,Petal.Width # ------------------------------ formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width # ------------------------------ # -- 2. 회귀모델 생성 # ------------------------------ model = lm(formula = formula, data=iris) model # ------------------------------ # -- 3. 잔차(오차) 분석 # ------------------------------ # -- (1) 독립성과 등분산성 검정 # 독립성 검정 install.packages('lmtest') library(lmtest) dwtest(model) # DW = 2.0604 -> 2 ~ 4 # 등분산성 검정 plot(model, which = 1) # -- (2) 잔차 정규성 검정 attributes(model) # coefficients(계수), residuals(잔차), fitted.values(적합값) names(model) # "coefficients" "residuals" res = resid(model) # 잔차 추출 res = residuals(model) # 귀무가설 : 정규분포와 차이가 없다. shapiro.test(res) # 정규성 검정 - p-value = 0.9349 # ------------------------------ # -- 4. 다중공선성 검사 # ------------------------------ library(car) sqrt(vif(model)) > 2 # TRUE # ------------------------------ # -- 5. 모델 생성/평가 # ------------------------------ formula = Sepal.Length ~ Sepal.Width + Petal.Length model = lm(formula = formula, data=iris) summary(model) # 모델 평가 # ************************************************ # -- 3. 로지스틱 회귀분석(Logistic Regression) # ************************************************ # 목적 : 일반 회귀분석과 동일하게 종속변수와 독립변수 간의 관계를 나타내어 # 향후 예측 모델을 생성하는데 있다. # 차이점 : 종속변수가 범주형 데이터를 대상으로 하며 입력 데이터가 주어졌을 때 # 해당 데이터의결과가 특정 분류로 나눠지기 때문에 분류분석 방법으로 분류된다. # 유형 : 이항형(종속변수가 2개 범주-Yes/No), 다항형(종속변수가 3개 이상 범주-iris 꽃 종류) # 분야 : 의료, 통신, 기타 데이터마이닝 # 선형회귀분석 vs 로지스틱 회귀분석 # 1. 로지스틱 회귀분석 결과는 0과 1로 나타난다.(이항형) # 2. 정규분포 대신에 이항분포를 따른다. # 3. 로직스틱 모형 적용 : 변수[-무한대, +무한대] -> 변수[0,1]사이에 있도록 하는 모형 # -> 로짓변환 : 출력범위를 [0,1]로 조정 # 4. 종속변수가 2개 이상인 경우 더미변수(dummy variable)로 변환하여 0과 1를 갖도록한다. # 예) 혈액형 A인 경우 -> [1,0,0,0] # ------------------------------ # -- 단계1. 데이터 가져오기 # ------------------------------ weather = read.csv("D:\\RProject\\Rwork\\Part-IV\\weather.csv", header=TRUE, stringsAsFactors = F) dim(weather) # 366 15 head(weather) str(weather) # -- chr 칼럼, Date, RainToday 칼럼 제거 weather_df = weather[, c(-1, -6, -8, -14)] dim(weather_df) # 366 11 # -- RainTomorrow 칼럼 -> 로지스틱 회귀분석 결과(0,1)에 맞게 더미변수 생성 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) # ------------------------------ # -- 단계2. 데이터 셈플링 # ------------------------------ idx = sample(1:nrow(weather_df), nrow(weather_df)*0.7) train = weather_df[idx, ] test = weather_df[-idx, ] # ------------------------------ # -- 단계3. 로직스틱 회귀모델 생성 # glm(y ~ 나머지(.), date = dataset) # ------------------------------ weater_model = glm(RainTomorrow ~ ., data = train, family = 'binomial') weater_model summary(weater_model) # ------------------------------ # -- 단계4. 로직스틱 회귀모델 예측치 생성 # type="response" : 0 ~ 1 확률값으로 예측 # ------------------------------ pred = predict(weater_model, newdata=test, type="response") pred # -- 시그모이드 함수 cpred = ifelse(pred >= 0.5, 1, 0) table(cpred) # 0 1 #96 12 # -- 혼돈 matrix 분류정확도 table(cpred, test$RainTomorrow) #cpred 0 1 # 0 87 9 # 1 5 7 (87+7) / nrow(test) # 0.8545455 -> 85% | cs |
-- Files
반응형