두 변수간의 관련성을 구하기 위해서 보편적으로 이용됨
R = x와 y가 함께 변하는 정도 / X와 Y가 따로 변하는 정도
R값은 X와 Y가 완전 동일하면 +1
전혀 다르면 0
반대 방향으로 완전히 동일하면 -1을 가진다
결정계수는 r^2으로 계산하며 이것은 x로부터 y를 예측할 수 있는 정도를 의미한다.
r = 0.7 ~ 1.0 사이라면 강한 양의 상관관계
r = 0.3 ~ 0.7 사이라면 뚜렸한 양의 상관관계
r = 0.1 ~ 0.3 사이라면 약한 양의 상관관계
r = -0.1 ~ 0.1 사이라면 상관관계가 거의 없다
상관계수를 계산할 때는 피어슨 상관 계수를 많이 사용한다.
분모에 X,Y가 따로 변하는 정도가 들어가고, 분자에 X,Y가 함께 변하는 정도가 들어간다.
그래서 값이 -1 부터 1 사이의 값이 나오는데 완전히 똑같으면 +1이고 (X가 1 증가하면 Y도 1 증가한다) 전혀 다르면 0이다.
(반대 방향으로 완전히 같으면 -1이다.)
(예를들어 X가 1 증가했는데 Y가 -1 감소해버리는것)
x <- c(0,1,4,9,16)
y <- c(1,2,3,4)
z <- c(0,5,7,9)
## [1] "mean(x): 6"
## [1] "mean(y): 2.5"
## [1] "mean(z): 5.25"
0에 가까울 수록 상관관계가 낮음
절대값 1에 가까울수록 상관관계가 높음
x <- c(0,1,4,9,16)
y <- c(1,2,3,4)
z <- c(0,5,7,9)
cor(x,y,method = "person")
cor(y,z,method = "person")
cor(x,z,methond="person")
x <- c(0,1,4,9)
y <- c(1,2,3,4)
z <- c(0,5,7,9)
cor(x,y, method="pearson")
## [1] 0.9583148
cor(y,z, method="pearson")
## [1] 0.9693631
cor(x,z, method="pearson")
## [1] 0.8648892
#계산2
y <- c(1,2,3,4)
z <- c(0,5,7,9)
cor(y,z,method = "pearson")
cor(y,z,method = "spearman")
y <- c(1,2,3,4)
z <- c(0,5,7,9)
cor(y,z, method="pearson")
## [1] 0.9693631
cor(y,z, method="spearman")
## [1] 1
담배값 인상 전의 월별 매출액 자료와 인상 후의 월별 매출액 자료를 조사하여 상관분석을 하면 담배값의 인상이 미치는 영향을 분석할 수 있다.
귀무가설 : 담배값 인상과 흡연과 상관관계가 없다.
대립가설 : 담배값 인상과 흡연과 상관관계가 있다.
#인상전 흡연량 자료
x <- c(70,72,62,64,71,76,0,65,74,72)
#인상 후 흡연량 자료
y <- c(70,74,65,68,72,74,61,66,76,75)
#상관관계를 비교해 보자.
cor.test(x,y,method="pearson")
##
## Pearson's product-moment correlation
##
## data: x and y
## t = 3.4455, df = 8, p-value = 0.008752
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2791495 0.9434286
## sample estimates:
## cor
## 0.7729264
# p-value = 0.008752 < 0.05 => 귀무가설 기각. 대립가설 채택
# cor(상관계수) 0.7729264 (양의 상관관계) 1에 가까우니깐 x,y는 강한 양의 상관관계를 가지고 있다.
# 결론 : 담배값 인상 전후의 판매량이 차이가 있다. 즉, 흡연과 상관관계가 있다.
##회귀분석
독립변수가 한 단위 증가할 때 종속변수에 미치는 영향을 측정하기 위한 측정 통계적 예측 모형
가) 단순 선형 회귀분석 - 1개의 독립변수 사용
나) 다중회귀분석 - 여러개의 독립변수 사용
– 분석을 위한 주제 결정
예)
라는 주제를 설정하고 독립변수와 종속변수 선정을 해야 한다. 또한 교육시간이 1시간이늘어나면 업무능력이 늘어난다.
독립변수 : 교육시간, 놀이시간
종속변수 : 업무능력, 두뇌발달
귀무가설 : 교육시간이 업무 능력 점수에 영향을 주지 않는다. (차이가 없다)
대립가설 : 교육시간이 업무 능력 점수에 영향을 준다. (차이가 있다.)
데이터 수집을 한 이후에는 데이터중에서 특이하거나 이상한 데이터를 제거하고, 회귀분석 모델을 적용하여 데이터 분석을 진행한다.
결과 해석에 중요한 수치 : p-value
p-value가 0.05보다 작으면 대립가설 채택.
상관계수(결정계수 Rvalue)가 0~1사이의 값을 가지며 0.65 ~ 0.7 이상이어야 좋은 회귀모형이라고 할 수 있음.
#단순회귀분석 실습 1
# 20명의 신장과 체중 데이터가 있다.
height <- c(179,166,175,172,173,167,169,172,172,179,161,174,166,176,182,175,177,167,176,177)
weight <- c(113,84,99,103,102,83,85,113,84,99,51,90,77,112,150,128,133,85,112,85)
plot(height,weight)
# 산점도만 봐도 양의 상관관계이다.
#이것을 단순회귀분석 모델로 생성한다.
#체중 = 기울기 x 신장(키) + 절편
#lm 함수에 집어 넣어서 모델을 만들어 본다.
#lm 리니어모델? 회귀분석을 만드는 함수이다.
#~ 연산자 오른쪽이 독립변수이다. 왼쪽이 종속변수
#lm( 종속변수 ~ 독립변수)
#키가 커지면 (독립변수) - 체중이 얼마나 영향을 받느냐 (종속변수)
model <- lm(weight ~ height)
# 절편(Intercept) : -478.816
# 기울기(height) : 3.347
model
##
## Call:
## lm(formula = weight ~ height)
##
## Coefficients:
## (Intercept) height
## -478.816 3.347
#모델을 만들어 보니 기울기랑 절편이란 값이 나오게 되고
# 키가 180인 사람의 체중 예측 (공식 : 회귀식) 에 값을 집어 넣게 되면
# 값을 예측할 수 있게 된다.
model$coefficients[[1]] #절편을 말한다.
## [1] -478.8161
model$coefficients[[2]] # 모델의 기울기를 말한다.
## [1] 3.347126
#공식을 대입하면 체중을 예측하기 위한 공식
#체중 = 기울기 x 신장(키) + 절편
# 180은 키가 된다.
# 즉, 키가 180인 사람의 체중을 예측하면 값이 나온다.
model$coefficients[[2]]*180 + model$coefficients[[1]]
## [1] 123.6667
#이것을 상관계수로 계산을 해보니까
#0.8정도 나오는데 상당히 관계가 깊다.
#모델을 요약해보자.
summary(model)
##
## Call:
## lm(formula = weight ~ height)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.625 -8.216 1.722 6.381 21.069
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -478.8161 102.1782 -4.686 0.000184 ***
## height 3.3471 0.5912 5.661 2.27e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.79 on 18 degrees of freedom
## Multiple R-squared: 0.6404, Adjusted R-squared: 0.6204
## F-statistic: 32.05 on 1 and 18 DF, p-value: 2.271e-05
# p-value : 0.217e-0.05가 0.05보다 작다. 이 모델은 통계적으로 95%신뢰수준하에서 유의한 것이다.
# 대립가설이 채택되어 신장과 체중은 관계가 있다.
# 즉, 키가 크면 체중도 늘어난다.
# 얼마만큼 모델을 설명할 수 있는가?
# Adjusted R-Squared : 0.6204 조정된 값
plot(height,weight)
#모델에 따른 회귀선을 그림
abline(model)
-상관분석
1.상관관계가 있는지 : 상관계수
-회귀분석
1.키가 한 단위 증가할 때 체중이 어느정도 영향을 받는가? 2.평균키와 몸무게, 회귀선을 그리기 3.분석결과 요약 : 유의한지 아닌지, 정확도는 어떻게 되는지를 분석한다 4.예측결과 보기
# 회귀분석
model <- lm(weight ~ height)
model
##
## Call:
## lm(formula = weight ~ height)
##
## Coefficients:
## (Intercept) height
## -478.816 3.347
summary(model)
##
## Call:
## lm(formula = weight ~ height)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.625 -8.216 1.722 6.381 21.069
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -478.8161 102.1782 -4.686 0.000184 ***
## height 3.3471 0.5912 5.661 2.27e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.79 on 18 degrees of freedom
## Multiple R-squared: 0.6404, Adjusted R-squared: 0.6204
## F-statistic: 32.05 on 1 and 18 DF, p-value: 2.271e-05
# 체중에 대한 히스토그램Z
hist(weight)
# 키가 한 단위 증가할 때 체중이 어느 정도 영향을 받는가?
model$coefficients[[2]]
## [1] 3.347126
# 평균키와 몸무게, 회귀선을 그리기
mean(height)
## [1] 172.75
mean(weight)
## [1] 99.4
plot(height,weight)
abline(model)
# 분석결과 요약 : 유의한지 아닌지, 정확도는 어떻게 되는지를 분석한다.
# 예츨걸과 보기 ....
# lm() 메서드 : 선형회귀
# dist ~ speed : 종속변수 ~ 독립변수 , data : 적용할 데이터
(m <- lm(dist ~ speed, cars))
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Coefficients:
## (Intercept) speed
## -17.579 3.932
# dist : -17.579 + 3.932 x speed(기울기) + e (주행 속도와 제동거리간에 관계 간단한 모델)
cars
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
## 7 10 18
## 8 10 26
## 9 10 34
## 10 11 17
## 11 11 28
## 12 12 14
## 13 12 20
## 14 12 24
## 15 12 28
## 16 13 26
## 17 13 34
## 18 13 34
## 19 13 46
## 20 14 26
## 21 14 36
## 22 14 60
## 23 14 80
## 24 15 20
## 25 15 26
## 26 15 54
## 27 16 32
## 28 16 40
## 29 17 32
## 30 17 40
## 31 17 50
## 32 18 42
## 33 18 56
## 34 18 76
## 35 18 84
## 36 19 36
## 37 19 46
## 38 19 68
## 39 20 32
## 40 20 48
## 41 20 52
## 42 20 56
## 43 20 64
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
coef(m)
## (Intercept) speed
## -17.579095 3.932409
fitted(m)[1:4] # 모델이 데이터에 적합한 값을 출력
## 1 2 3 4
## -1.849460 -1.849460 9.947766 9.947766
residuals(m)[1:4] # 잔차(residuals) : 모델로부터 예측한 값과 실제 사이의 차이
## 1 2 3 4
## 3.849460 11.849460 -5.947766 12.052234
# 가장 적합한 값과 잔차의 합을 구하면 실제 데이터의 값과 같다
fitted(m)[1:4] + residuals(m)[1:4]
## 1 2 3 4
## 2 10 4 22
cars$dist[1:4]
## [1] 2 10 4 22
# 주행속도가 3,5일때 거리구하기
(m$coefficients[2]*5 + m$coefficients[1])
## speed
## 2.082949
(m$coefficients[2]*3 + m$coefficients[1])
## speed
## -5.781869
# R에 내장된 데이터셋 목록
# data()
# 데이터셋에 대한 도움말
# help(데이터셋 이름)
# 많은 데이터 셋 중에서 attitude 라는 데이터 셋을 가지고 연습을 해보자
#help(attitude)
head(attitude)
## rating complaints privileges learning raises critical advance
## 1 43 51 30 39 61 92 45
## 2 63 64 51 54 63 73 47
## 3 71 70 68 69 76 86 48
## 4 61 63 45 47 54 84 35
## 5 81 78 56 66 71 83 47
## 6 43 55 49 44 54 49 34
tail(attitude)
## rating complaints privileges learning raises critical advance
## 25 63 54 42 48 66 75 33
## 26 66 77 66 63 88 76 72
## 27 78 75 58 74 80 78 49
## 28 48 57 44 45 51 83 38
## 29 85 85 71 71 77 74 55
## 30 82 82 39 59 64 78 39
# 이중에 종속변수가 rating 입니다.
# 다중 회귀모델 생성
# lm(종속변수 - 독립변수, data=데이터셋)
# . 종속변수를 제외한 모든 변수들, 독립변수로 취급
# rating 이라는것이 우리가 구하려는 변수이다.
# .을 찍으면 나머지 모두를 말한다. 종속변수를 빼고 모든 변수들을 다 집어넣어서 분석을 하게 된다.
model <- lm(rating ~. , data = attitude)
# model <- lm(rating ~ complaints+privileges+learning+raises+critical+advance,data=attitude)
# 회귀모델 요약
# 서머리를 하니까 Coefficients : 각 항목별 평가치가 나오게 된다.
# Pr(>|t|) p-value 값인데 보니까 0.000903 ***
# Signif는 의미를 보는 건데 0부터 순서대로 의미를 부여하는 표.
summary(model)
##
## Call:
## lm(formula = rating ~ ., data = attitude)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.9418 -4.3555 0.3158 5.5425 11.5990
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.78708 11.58926 0.931 0.361634
## complaints 0.61319 0.16098 3.809 0.000903 ***
## privileges -0.07305 0.13572 -0.538 0.595594
## learning 0.32033 0.16852 1.901 0.069925 .
## raises 0.08173 0.22148 0.369 0.715480
## critical 0.03838 0.14700 0.261 0.796334
## advance -0.21706 0.17821 -1.218 0.235577
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.068 on 23 degrees of freedom
## Multiple R-squared: 0.7326, Adjusted R-squared: 0.6628
## F-statistic: 10.5 on 6 and 23 DF, p-value: 1.24e-05
# Adjusted R-squared : 0.6628 66%의 예측력
# p-value : 1.24e-05 < 0.05 95% 신뢰수준하에서 이 모델은 유의하다.
# 변수를 좀 줄이기 위해서 step란 함수를 쓰는데
# direction = "backward" => 기여도가 낮은 항목을 제거해서 마지막에 의미있는 변수를 도출
# direction = "forward" =>
# 기여도가 낮은 변수들을 제거하여 회귀모델의 예측력을 높임
reduced <- step(model, direction="backward")
## Start: AIC=123.36
## rating ~ complaints + privileges + learning + raises + critical +
## advance
##
## Df Sum of Sq RSS AIC
## - critical 1 3.41 1152.4 121.45
## - raises 1 6.80 1155.8 121.54
## - privileges 1 14.47 1163.5 121.74
## - advance 1 74.11 1223.1 123.24
## <none> 1149.0 123.36
## - learning 1 180.50 1329.5 125.74
## - complaints 1 724.80 1873.8 136.04
##
## Step: AIC=121.45
## rating ~ complaints + privileges + learning + raises + advance
##
## Df Sum of Sq RSS AIC
## - raises 1 10.61 1163.0 119.73
## - privileges 1 14.16 1166.6 119.82
## - advance 1 71.27 1223.7 121.25
## <none> 1152.4 121.45
## - learning 1 177.74 1330.1 123.75
## - complaints 1 724.70 1877.1 134.09
##
## Step: AIC=119.73
## rating ~ complaints + privileges + learning + advance
##
## Df Sum of Sq RSS AIC
## - privileges 1 16.10 1179.1 118.14
## - advance 1 61.60 1224.6 119.28
## <none> 1163.0 119.73
## - learning 1 197.03 1360.0 122.42
## - complaints 1 1165.94 2328.9 138.56
##
## Step: AIC=118.14
## rating ~ complaints + learning + advance
##
## Df Sum of Sq RSS AIC
## - advance 1 75.54 1254.7 118.00
## <none> 1179.1 118.14
## - learning 1 186.12 1365.2 120.54
## - complaints 1 1259.91 2439.0 137.94
##
## Step: AIC=118
## rating ~ complaints + learning
##
## Df Sum of Sq RSS AIC
## <none> 1254.7 118.00
## - learning 1 114.73 1369.4 118.63
## - complaints 1 1370.91 2625.6 138.16
summary(reduced)
##
## Call:
## lm(formula = rating ~ complaints + learning, data = attitude)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.5568 -5.7331 0.6701 6.5341 10.3610
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.8709 7.0612 1.398 0.174
## complaints 0.6435 0.1185 5.432 9.57e-06 ***
## learning 0.2112 0.1344 1.571 0.128
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.817 on 27 degrees of freedom
## Multiple R-squared: 0.708, Adjusted R-squared: 0.6864
## F-statistic: 32.74 on 2 and 27 DF, p-value: 6.058e-08
# 최종적으로 complaints, learning 2개의 변수 외에는 제거함
# p-value : 6.058e-08 < 0.05 보다 작으므로 이 회귀모델은 통계적으로 유의하다.
# 모델의 예측력이 68%fh gidtkdehla
# 모델 설명력 모델 정리하기 전과 비교 했을 때
# 제거한 후 보니까 기여도도 올라갔다.
##로지스틱 회귀분석
둘중에 하나가 분류되는 것이다.
0 ~ 1 사이로 결과가 나오는데, 이분법인 분류 문제를 푸는데 많이 사용한다.
0.5 밑이면 0으로, 0.5 이상이면 1로 이분법으로 문제를 풀 때 사용한다.
#iris 데이터 로딩
data(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
tail(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
#help(iris)
# iris 데이터는 품종이 3개이다.
# 로지스틱 회귀분석은 2개중에 하나만 판별하는 것인데, 3개라서 2개로 축소하였다.
# -> setosa,versicolor 2가지만 진행
#로지스틱 회귀분석은 예측값이 0 또는 1의 두개 분류인 경우에 사용한다.
d <- subset(iris, Species =="setosa" | Species=="versicolor")
head(d)
## 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
#특성
levels(d$Species)
## [1] "setosa" "versicolor" "virginica"
# Species 컬럼에 새로 범주 수준이 정해지도록 다시한번 factor() 함수로 처리해서 Factor가 2개 요소로 감소시킨다.
d$Species <- factor(d$Species)
str(d)
## 'data.frame': 100 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 2 levels "setosa","versicolor": 1 1 1 1 1 1 1 1 1 1 ...
#특성 재확인
levels(d$Species)
## [1] "setosa" "versicolor"
Training Set, Test Set 샘플링
# 데이터를 7:3으로 구분한다.
# 과거 데이터는 잘 맞추는데 예측은 못한다.
# 그래서 과적합을 피하기 위해서 8:2, 7:3으로 나누어서 데이터를 구분한다.
# sample을 사용해서 랜덤 샘플링이 되도록 했다.
samp <- c(sample(1:50,35) , sample(51:100,35))
# 학습용과 검증용 데이터 셋으로 각각 저장한다
train_set <- d[samp,]
# -가 붙은 것은 samp를 제외한 나머지란 것이다.
test_set <- d[-samp,]
# dim 확인
dim(train_set)
## [1] 70 5
dim(test_set)
## [1] 30 5
# 로지스틱 회귀분석 모델을 생성해서 바로 출력한다.
# 데이터 셋 : 학습용 데이터 셋
# family = binomial => 2분류 모델을 이용
# Species ~. => 품종을 예측하는 것이고 나머지 4개 변수
# #꽃받침 2, 꽃잎 2 => 4
(m <- glm(Species ~. , data = train_set, family = binomial))
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
##
## Call: glm(formula = Species ~ ., family = binomial, data = train_set)
##
## Coefficients:
## (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
## 11.749 -11.796 -5.648 19.273 19.317
##
## Degrees of Freedom: 69 Total (i.e. Null); 65 Residual
## Null Deviance: 97.04
## Residual Deviance: 7.306e-10 AIC: 10
# 0 또는 1을 예측하는 모델을 학습시킨다.
fitted(m)[c(1:5,51:55)]
## 38 16 46 37 10
## 2.220446e-16 2.220446e-16 2.445974e-13 2.220446e-16 2.220446e-16
## 69 88 93 78 66
## 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00
# 1 ~ 5 행 0, 51 ~ 55행 1로 잘 예측이 됨.
# 앞에는 행 번호, 뒤에가 맨 끝에 e-16은 제로에 가까운 값
# 기준이 0.5 작으면 0, 0.5보다 크면 1이다
#즉, 1과 0으로 분류되는 것을 알 수 있다.
# f란 변수에 저장
f <- fitted(m)
# 품종만 출력
# train_set$Species
# 정수로 변경, 분류를 0,1
as.numeric(train_set$Species) -1
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [36] 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
# 0, 1로 예측이 됨
ifelse(f > 5, 1, 0) == as.numeric(train_set$Species)-1
## 38 16 46 37 10 8 44 26 43 48 41 42
## TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 32 45 28 19 7 12 15 20 29 11 21 1
## TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 13 34 33 25 27 24 36 31 9 47 49 92
## TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## 70 82 59 64 76 62 79 73 85 87 56 63
## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 58 54 69 88 93 78 66 90 81 86 71 75
## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 65 89 74 67 52 77 61 91 97 72
## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#분류가 잘 되면 True, 일치하지 않으면 False
데이터의 정확도 구하기
# 학습용 데이터의 정확도
# 0.5보다 크면 1, 아니면 0으로 해서 비교해서보니 True
is_collect <- (ifelse(f > 5, 1, 0) == as.numeric(train_set$Species) -1)
# 전체 70건에 대해서 모두 올바르게 예측함
sum(is_collect)
## [1] 35
sum(is_collect) * 100 / NROW(is_collect)
## [1] 50
# 새로운 데이터에 대한 예측
# 모델에다가 새로운 데이터셋을 저장하는데 검증용 데이터 셋을 집어 넣는다.
# predict 함수는 예측하는 함수이다.
# type = "responce" 0 ~ 1 사이의 결과값
pre <- predict(m,newdata = test_set[,], type = "response")
is_correct <- (ifelse(pre > .5, 1,0) == as.numeric(test_set$Species)-1)
#전체 70건에 대하여 모두 올바르게 예측함
sum(is_correct)
## [1] 30
# 맞으면 True/False가 넘어오게 되는데 다 맞았다.
sum(is_correct) * 100 / NROW(is_correct)
## [1] 100
#로지스틱 회귀 모델에 넣으니까 상당히 잘 맞게 분류가 된 것을 볼 수 있다.
##다항 로지스틱 회귀분석
library(nnet)
## Warning: package 'nnet' was built under R version 3.5.3
# 다항 로지스틱 회귀분석
# 분류가 0,1이 아니라 붗꽃 데이터는 분류가 3개이다
# 예측하고자 하는 분류가 0,1 두개가 아니라 여러개인 경우
# 다항 로지스틱 회귀분석 사용
# 7:3 데이터 셋
# 데이터를 샘플링하는데 150개인데 50개씩 하나의 품종씩으로 되어있다
# 랜덤샘플링이니까 샘플링 번호가 행의 번호가 섞이겠고
samp <- c(sample(1:50,35),sample(51:100,35),sample(101:150,35))
#그중에서 samp 쉼표 앞에는 행이고 그 행에 해당되는 데이터만 뽑아서 학습용 데이터로 저장하겠다.
iris.train <- iris[samp,]
# samp만 뺀 나머지 행만 검증용 데이터로 저장한 것이다
iris.test <- iris[-samp,]
#multinom : 다항로지스틱 , 는 나머지 모든 독립 변수들
model <- multinom(Species ~ . , data=iris.train)
## # weights: 18 (10 variable)
## initial value 115.354290
## iter 10 value 12.605038
## iter 20 value 5.323217
## iter 30 value 5.052236
## iter 40 value 4.885369
## iter 50 value 4.878057
## iter 60 value 4.870536
## iter 70 value 4.869172
## iter 80 value 4.868639
## final value 4.868614
## converged
#모델이 학습용 데이터를 어떻게 분류하고 있는 지를 확인
# 학습을 시키고 그중에 몇개를 출력해봄
head(fitted(model))
## setosa versicolor virginica
## 32 0.9999998 2.142573e-07 1.075807e-28
## 43 0.9999986 1.391489e-06 6.918149e-29
## 37 1.0000000 1.244545e-08 2.696549e-32
## 15 1.0000000 5.707346e-12 1.678572e-37
## 3 0.9999989 1.125874e-06 4.001696e-29
## 13 0.9999570 4.299502e-05 2.263422e-27
tail(fitted(model))
## setosa versicolor virginica
## 102 5.959383e-14 1.059299e-03 0.9989407
## 145 3.437223e-16 9.824750e-08 0.9999999
## 139 1.332568e-08 3.128297e-01 0.6871703
## 115 4.236843e-16 8.326964e-07 0.9999992
## 132 3.446354e-13 8.355320e-05 0.9999164
## 135 2.828269e-15 3.458432e-02 0.9654157
#모델을 만들 때는 학습용
#모델을 검증할 때는 검증용을 넣는다
#모델의 정확도 평가
#예측값
pred <- predict(model,iris.test)
#pred
#이제 실제 데이터(iris.test$Species)와 예측값 pred
table(iris.test$Species,pred)
## pred
## setosa versicolor virginica
## setosa 15 0 0
## versicolor 0 14 1
## virginica 0 0 15
#mean : 성능
mean(iris.test$Species == pred)
## [1] 0.9777778