Data Description

大家小時候都打過三國志,我們搜集了150個武將,讓我們來看看根據決策樹的法則,到底要被稱為將軍或軍師級的人物,應該具備什麼特質?

1.設定所需的函式庫(libraries)以及載入資料

install.packages("dplyr")
install.packages("ggplot2")
install.packages("rpart")
install.packages("rpart.plot")
install.packages("tree")
library(dplyr)
library(ggplot2)
library(rpart)
library(rpart.plot)
library(tree)

setwd("/media/hsusir/DATA/Rdata Practice/09Algorithm/Three_Kingdoms/")
dat1 <- read.csv("./Three-UTF8-1.csv",header=TRUE, sep=",")

2.基本敘述性統計

nrow(dat1)
## [1] 150
head(dat1)
##     名稱 序列號碼 統御 武力 智慧 政治 魅力 忠誠 國別 出身 身份
## 1 夏侯惇        1   94   96   62   56   78   99    1    1 將軍
## 2   許褚        2   83   97   26   16   68   89    1    1 將軍
## 3   荀攸        3   60   38   94   91   80   86    1    1 軍師
## 4   荀彧        4   64   35   97   90   84   80    1    1 軍師
## 5   張郃        5   88   93   61   54   62   85    1    1 將軍
## 6   程昱        6   82   25   91   80   74   89    1    1 軍師
dat1[sample(1:nrow(dat1),20),]
##       名稱 序列號碼 統御 武力 智慧 政治 魅力 忠誠 國別 出身 身份
## 90    丁奉       90   68   80   64   72   71   79    3    1 武官
## 24    鄧艾       24   93   85   93   81   75   82    1    1 將軍
## 27    華歆       27   26   45   66   75   32   80    1    1 文官
## 127   曹丕      127   90   85   64   80   80   30    1    2 將軍
## 105   黃祖      105   60   68   50   27   32   85    5    1 武官
## 115   李肅      115   38   54   67   68   41   74    6    1 文官
## 94    文醜       94   85   96   20   12   57   87    4    1 將軍
## 133   劉表      133   70   65   69   74   68   85    5    3 文官
## 81    呂範       81   26   30   71   76   74   78    3    1 文官
## 99    沮授       99   78   53   87   88   80   93    4    1 軍師
## 47    關羽       47  100  104   82   65   96  100    2    1 將軍
## 22    曹真       22   79   71   61   50   72   91    1    1 將軍
## 6     程昱        6   82   25   91   80   74   89    1    1 軍師
## 19    郭嘉       19   42   27   99   92   89   92    1    1 軍師
## 18  夏侯楙       18   26   47   32   40   25   80    1    1 武官
## 39    楊修       39   32   26   93   83   50   70    1    1 軍師
## 50    趙雲       50   96  107   85   80   95   96    2    1 將軍
## 82    凌統       82   70   81   58   56   62   87    3    1 將軍
## 21    曹植       21   20   14   89   75   82   75    1    1 文官
## 53    簡雍       53   39   39   70   76   77   85    2    1 文官
summary(dat1)
##       名稱        序列號碼           統御             武力       
##  丁奉   :  1   Min.   :  1.00   Min.   : 19.00   Min.   : 13.00  
##  于禁   :  1   1st Qu.: 38.25   1st Qu.: 56.00   1st Qu.: 45.00  
##  公孫度 :  1   Median : 75.50   Median : 72.00   Median : 68.50  
##  公孫瓚 :  1   Mean   : 75.50   Mean   : 67.56   Mean   : 64.79  
##  典韋   :  1   3rd Qu.:112.75   3rd Qu.: 83.00   3rd Qu.: 84.00  
##  凌統   :  1   Max.   :150.00   Max.   :100.00   Max.   :107.00  
##  (Other):144                                                     
##       智慧             政治             魅力            忠誠       
##  Min.   : 17.00   Min.   : 12.00   Min.   :10.00   Min.   :  0.00  
##  1st Qu.: 54.25   1st Qu.: 46.25   1st Qu.:56.00   1st Qu.: 75.00  
##  Median : 68.50   Median : 67.50   Median :70.00   Median : 84.50  
##  Mean   : 67.27   Mean   : 62.44   Mean   :67.54   Mean   : 80.17  
##  3rd Qu.: 84.00   3rd Qu.: 81.75   3rd Qu.:81.75   3rd Qu.: 89.75  
##  Max.   :100.00   Max.   :102.00   Max.   :99.00   Max.   :100.00  
##                                                                    
##       國別            出身         身份   
##  Min.   :1.000   Min.   :1.000   將軍:58  
##  1st Qu.:1.000   1st Qu.:1.000   文官:44  
##  Median :2.000   Median :1.000   武官:19  
##  Mean   :3.127   Mean   :1.253   軍師:29  
##  3rd Qu.:5.000   3rd Qu.:1.000            
##  Max.   :7.000   Max.   :3.000            
## 

3.三國 Disicion Tree

fit1 <- rpart(身份~武力+政治+統御+智慧+魅力,data=dat1)
#fit1 <- tree(身份~武力+政治+統御+智慧+魅力,data=dat1)
prp(fit1,col=2,box.col="lightgray",shadow.col="gray")

4.計算混淆矩陣

result = rpart( 身份~武力+政治+統御+智慧+魅力, data=dat1)
Y = dat1$身份
Ypred = predict(result, type="class")

t = table(Y, Ypred)   ## 同時顯示 t 的內容
cat("預測正確率= ", sum(diag(t))/sum(t), "\n" )
## 預測正確率=  0.8933333

5.Confusion Matrix Function

confmatrix = function(Y,Ypred)
{
   
  tab = table(Y,Ypredict=Ypred)  
  print(tab)
  p = sum(diag(t))/sum(t)*100
  cat("\n\n預測正確率 = ",p,"% \n")
}

confmatrix(dat1$身份, Ypred)
##       Ypredict
## Y      將軍 文官 武官 軍師
##   將軍   58    0    0    0
##   文官    4   36    3    1
##   武官    3    0   16    0
##   軍師    2    3    0   24
## 
## 
## 預測正確率 =  89.33333 %