利用python分析权力的游戏五王之战数据
Posted 人走茶会凉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用python分析权力的游戏五王之战数据相关的知识,希望对你有一定的参考价值。
本身是个美剧迷,其中权力的游戏是我最爱的美剧之一,所以我通过kaggle下载了数据集并进行分析。数据名称解释如下:
name: 战争的名称,字符变量。
year: 战争发生的年份,数值变量。
battle_number: 本数据中的unique id,对应每一场独立的战役,数值变量。
attacker_king: 攻击方的国王,"/"表示了国王的更换。例如:"Joffrey/Tommen Baratheon"意味着Tomen Baratheon继承了Joffrey的王位,分类变量。
defender_king: 防守方的国王,分类变量。
attacker_1: 攻击方将领,字符变量。
attacker_2: 攻击方将领,字符变量。
attacker_3: 攻击方将领,字符变量。
attacker_4: 攻击方将领,字符变量。
defender_1: 防守方将领,字符变量。
defender_2: 防守方将领,字符变量。
defender_3: 防守方将领,字符变量。
defender_4: 防守方将领,字符变量。
attacker_outcome: 从攻击方角度来看的战争结果,分别有:win, loss, draw,分类变量。
battle_type: 战争的类别。pitched_battle: 双方军队在一个地点相遇并战斗,这也是最基本的战争类别;ambush: 以隐身或诡计为主要攻击手段的战争;siege: 阵地战;razing: 对未设防位置的攻击。分类变量。
major_death: 是否有重要人物的死亡,二进制变量。
major_capture: 是否有重要人物的被捕,二进制变量。
attacker_size: 攻击方力量的大小,并未对骑兵、步兵等士兵种类有所区分,数值变量。
defender_size: 防守方力量的大小,并未对骑兵、步兵等士兵种类有所区分,数值变量。
attacker_commander: 攻击方的主要指挥官。指挥官的名字中并没有包含头衔,不同的指挥官名字用逗号隔开,字符变量。
defender_commander: 防守方的主要指挥官。指挥官的名字中并没有包含头衔,不同的指挥官名字用逗号隔开,字符变量。
summer: 战争是否发生于夏天,二进制变量。
location: 战争发生的地点,字符变量。
region: 战争发生的地域,包括:Beyond the Wall, The North, The Iron Islands, The Riverlands, The Vale of Arryn, The Westerlands, The Crownlands, The Reach, The Stormlands, Dorne,分类变量。
note: 注释,字符变量。
首先我们先提出问题:
1.每个国王攻击方式
2.每年死亡或被俘的重要人物
3.每个区域死亡或被俘的重要人物人数
4.战争结果是否与兵力多少有关系
1 导入包
# TO DO: load pacakges
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
1 收集数据
# TO DO: load the dataset df = pd.read_csv(\'battles.csv\') df.columns
1.1 查看数据类型
df.info()
df.describe()
收集和查看完数据,我们要对数据进行整理了
二 数据整理
2.1 首先备份数据
# 备份
df1 = df.copy()
通过观察数据我们发现以下错误:
质量错误:
1.defender3 and defender4 都是 NaN,并且他们的类型为float。
2.部分数据丢失,解决丢失问题。
3. year与battle_number 类型错误
# 去除\'attacker_2\', \'attacker_3\', \'attacker_4\', \'defender_2\', \'defender_3\', \'defender_4\', \'note\'列 data_game_clean = data_game_clean.drop([\'attacker_2\', \'attacker_3\', \'attacker_4\', \'defender_2\', \'defender_3\', \'defender_4\', \'note\'], axis=1)
data_game_clean[\'attacker_king\'] = data_game_clean[\'attacker_king\'].astype(\'category\')
data_game_clean[\'defender_king\'] = data_game_clean[\'defender_king\'].astype(\'category\')
data_game_clean[\'battle_type\'] = data_game_clean[\'battle_type\'].astype(\'category\')
data_game_clean[\'region\'] = data_game_clean[\'region\'].astype(\'category\')
# year与battle_number 类型错误,需要把int转换成object data_game_clean[\'year\'] = data_game_clean[\'year\'].astype(\'object\') data_game_clean[\'battle_number\'] = data_game_clean[\'battle_number\'].astype(\'object\')
# 检查是否有重复值 sum(data_game_clean.duplicated())
查看结果
data_game_clean.attacker_outcome.head()
# 检查是否有重复值 sum(df1.duplicated())
数据探索分析
每个国王攻击次数
data_game_clean[\'attacker_king\'].value_counts().plot(kind=\'barh\',rot=45) plt.show()
从图中看出第一的是Joffrey/Tommen Baratheon作为进攻方进行了14场战斗,主要原因是各个领主不承认Joffrey的合法地位,因为Joffrey是瑟曦和他弟弟的孩子,身体中淌着兰尼斯特家族的血,为了让各领主承认其合法地位,所以进行了大量战斗。第二个是Robb Stark,因为其父亲被害开始复仇之战。
每个国王攻击方式
sns.set(style="darkgrid") sns.countplot(y=\'battle_type\', hue=\'attacker_king\', data = df1) plt.legend(bbox_to_anchor=(1.05, 1)) plt.show()
这场战斗分为四种类型,分别为遭遇战、伏击战、围城战、razing(不懂这个意思),可以看出Joffrey/Tommen Baratheon的14场战争中有6场遭遇战、3场伏击战和5场围城战,而史塔克是10场战争中有5场伏击战和3场遭遇战和2场围城战,能够看出Joffrey/Tommen Baratheon更喜欢遭遇战,而史塔克更喜欢伏击战。还能够看出只有Stannis Baratheon进行过razing。
每个区域死亡或被俘的重要人物人数
#去除major_death major_capture的空值 df0 = data_game_clean.dropna(subset = [\'major_death\', \'major_capture\']) #给每个区域分组并计算major_death major_capture的和 data = df0.groupby(\'region\').sum()[[\'major_death\', \'major_capture\']] data
#将region计数,并转化为表格与data合并
p = pd.concat([data, df0.region.value_counts().to_frame()], axis = 1)
#排序 p = p.sort_values(\'region\', ascending = False)
#作图 p.plot.barh() plt.xlabel(\'count\') plt.title(\'attacker_outcome_size\')
可以看出在The Riverlands发生的战争最多,死亡和被俘的人物也最多,而血色婚礼也发生在此,史塔克家族在这里伤亡惨重。北境虽然发生的战争多,但死亡的重要人物少。
战争结果是否与兵力多少有关系
# 去除\'attacker_size\', \'defender_size\',\'attacker_outcome\'3列空值 df2 = data_game_clean.dropna(subset = [\'attacker_size\', \'defender_size\',\'attacker_outcome\']) # 计算进攻与防御的兵力差值 df3 = df2.attacker_size - df2.defender_size #将其转化为dataframe df3 = df3.to_frame(name=\'size\') #将这一列合并至df1表格中 result = pd.concat([df2,df3],join=\'outer\',axis=1) result.info()
sns.lmplot(x = \'attacker_size\', y = \'defender_size\', hue=\'attacker_outcome\', fit_reg=False,data = data_game)
战争结果是否与兵力多少没有关系,只有2场战争是在兵力取得优势的情况下胜利的,其他都是以少胜多,因为战争有很多不可预测性,不是人多就能打赢战争的。
attackers = df_data_game_clean.attacker_king.map(lambda x:str(x).split(",")) empty_array = [] for i in attackers: empty_array = np.append(empty_array, i)
from wordcloud import WordCloud cloud = WordCloud(width=1440, height=1080, relative_scaling=0.5, stopwords=[\'battle\']).generate(" ".join(empty_array)) plt.figure(figsize=(20, 15)) plt.imshow(cloud) plt.axis(\'off\') plt.show()
可以看到offrey/Tommen Baratheon被提及的更多,而Euron Greyjoy被提及的最少。
得出结论
结论:
1.每个国王攻击方式:可以看出Joffrey/Tommen Baratheon的14场战争中有6场遭遇战、3场伏击战和5场围城战,而史塔克是10场战争中有5场伏击战和3场遭遇战和2场围城战,能够看出Joffrey/Tommen Baratheon更喜欢遭遇战,而史塔克更喜欢伏击战。还能够看出只有Stannis Baratheon进行过razing。
2.每年死亡或被俘的重要人物:299年发生的战争被俘和死亡的重要人物最多,可能和发生的战争次数有关,因为299年发生的战争次数最多。
3.每个区域死亡或被俘的重要人物人数:可以看出在The Riverlands发生的战争最多,死亡和被俘的人物也最多,而血色婚礼也发生在此,史塔克家族在这里伤亡惨重。北境虽然发生的战争多,但死亡的重要人物少。
4.战争结果是否与兵力多少有关系:战争结果是否与兵力多少没有关系,只有2场战争是在兵力取得优势的情况下胜利的,其他都是以少胜多,因为战争有很多不可预测性,不是人多就能打赢战争的。
5.可以看到offrey/Tommen Baratheon被提及的更多,而Euron Greyjoy被提及的最少。
以上是关于利用python分析权力的游戏五王之战数据的主要内容,如果未能解决你的问题,请参考以下文章