상관분석

두 변수간의 관련성을 구하기 위해서 보편적으로 이용됨

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. 교육시간이 직원의 업무 수행에 영향을 주는가?
  2. 놀이시간이 아이의 두뇌 발달에 영향을 주는가?

라는 주제를 설정하고 독립변수와 종속변수 선정을 해야 한다. 또한 교육시간이 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
# 모델 설명력 모델 정리하기 전과 비교 했을 때
# 제거한 후 보니까 기여도도 올라갔다.

##로지스틱 회귀분석

  1. 둘중에 하나가 분류되는 것이다.

  2. 0 ~ 1 사이로 결과가 나오는데, 이분법인 분류 문제를 푸는데 많이 사용한다.

  3. 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