说英雄谁是英雄之光荣三国

This post was kindly contributed by 数据科学与R语言 - go there to comment and to read the full post.


本文的缘起是知乎的这一篇文章,老马这位三国历史专家让大家都知道了有这么一份三国志游戏数据的存在。这份数据很容易从网上找到,而本人只关心三国志四的各人物数据,为什么呢,因为只玩过三国志四嘛。游戏是多年前玩的,如今来玩玩数据吧。下面的问题主要围绕一个焦点,谁是三国志四中文武兼资第一人。


网上下载的数据是一个Excel表格,整理之后只取了三国志四的部分,去除了分值为0的人物,整理后数据你可以从这里下载。整个数据有454名人物,包括了六个变量,分别为人物'名字','统率','武力','智力','政治','魅力'。我们可以使用plyr包中的arrange函数找到各指标分别对应的前十名。不出意外,武神关二爷获得统率第一,人中吕布获得武力第一,诸葛亮获得智力第一,张昭获得政治第一,而会哭的刘备获得魅力第一,晕!
arrange(data,desc(tongshuai))[1:10,]
arrange(data,desc(wuli))[1:10,]
arrange(data,desc(zhili))[1:10,]
arrange(data,desc(zhengzhi))[1:10,]
arrange(data,desc(meili))[1:10,]
 
由于每个人物对应多个指标,我们需要一个综合指标来比较,最简单的,上PCA。
prinModel <- prcomp(x=data[,2:6],
retx=TRUE,
center=TRUE,
scale=TRUE)
 
prinModel$rotation[,1:2,drop=F]
summary(prinModel)
 
对数据进行主成份分析,发现前两个主成份的累积方差贡献率达到88%,还不错,第一PC以智力和政治为主,达到50%贡献率,第二PC以武力和统率为主,达到30%贡献率。那么第一主成份可以认为是文韬因素,第二主成份可以认为是武略因素。好的,下面可以根据两个主成份得分列出文韬前十和武略。

# 武略榜
data$name[order(prinModel$x[,2],decreasing=T)][1:10]
[1] "關羽" "趙雲" "曹操" "孫策" "孫堅" "黃忠"
[7] "周瑜" "陸遜" "夏侯惇" "姜維"
# 文韬榜
data$name[order(prinModel$x[,1],decreasing=T)][1:10]
[1] "郭嘉" "張紘" "張昭" "諸葛亮" "荀彧" "諸葛瑾"
[7] "荀攸" "曹植" "魯肅" "馬良"
 
下面要将这两个主成分合为一个综合指标,采用加权平均方法,权重是方差贡献率,大致上0.6*文韬+0.4*武略,下面就取出兼资文武之名将前十名,当当当当,他们是:
final <- prinModel$x[,1]*0.6 + prinModel$x[,2]*0.4
data$name[order(final,decreasing=T)][1:10]
 
[1] "諸葛亮" "曹操" "周瑜" "陸遜" "司馬懿" "趙雲"
[7] "魯肅" "姜維" "龐統" "徐庶"
 
看来在三国志的游戏数据中,诸葛亮是最强人物啊。最后来看看蜀国五虎排序,通常民间排序是关张赵马黄,这种序列显然没有考虑到智力因素问题啊,下面我们用前面的评价体系来为五虎重新排序。
shu5 <- c('趙雲','馬超','張飛','關羽','黃忠')
data.frame(round(prinModel$x[data$name %in% shu5,1:2],2),
final=round(final[data$name %in% shu5],2),
name=data$name[data$name%in% shu5])
 
PC1 PC2 final name
437 -1.51 2.22 -0.02 馬超
488 -2.65 1.31 -1.07 張飛
658 0.59 2.92 1.52 黃忠
741 1.68 3.31 2.34 趙雲
922 1.20 3.48 2.12 關羽
 
从上面这个表格可以看到,根据游戏数据正确的排序应该是赵关黄马张,赵云君,我看好你啊。我们还可以看看五虎将在群雄中的位置,将PC1和PC2做散点图如下,这张图中处于右上角的就是文韬武略兼备的人才。
library(ggplot2)
ggdata <- data.frame(prinModel$x[,1:2],name=data$name)
p <- ggplot(ggdata,aes(PC1,PC2))+
geom_point(size=3,alpha=0.5)+
geom_text(data=subset(ggdata,name %in% shu5),
aes(label=name))+
labs(x='文韬',y='武略')+
theme_bw()
print(p)


 
最后还可以用雷达图看这五虎的技能值


使用PCA来进行综合指标评价不一定是最好的方法,各位有什么好主意,请不吝赐教。