반응형

/*******************************************************************************************************************
-- 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) 학습데이터와 검정데이터 분류
# ------------------------------
= 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.510)
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

product_sales.csv

weather.csv

product_sales.csv


반응형

+ Recent posts