冰与火之歌-五王之战(优达数据分析进阶项目)

五王之战分析 - 冰与火之歌

简介

五王之战(War of the Five Kings)是著名严肃奇幻小说《冰与火之歌》中的著名内战。这是一场规模空前、波及七大王国的内乱。顾名思义,前后共有五人在战争中称王:乔佛里、史坦尼斯、蓝礼均声称自己是铁王座的合法继承人。除此之外,罗柏·史塔克被北境众封臣推选为北境之王,巴隆·葛雷乔伊亦再度掀起独立大旗,欲摆脱铁王座的统治,自称为铁群岛之王。

本数据集(battles.csv)包含了五王之战期间的战争,它是所有战斗的大集合。该数据是Kaggle中Game of Thrones的一部分。

数据中的变量含义解释:

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: 注释,字符变量。

项目完成指南

本项目中的数据分析流程已经给出,但代码将完全由你自己进行书写,如果你无法完成本项目,说明你目前的能力并不足以完成 数据分析(进阶)纳米学位,建议先进行 数据分析(入门)纳米学位的学习,掌握进阶课程的先修知识。

对于数据分析过程的记录也是数据分析报告的一个重要部分,你可以自己在需要的位置插入Markdown cell,记录你在数据分析中的关键步骤和推理过程。比如:数据有什么样的特点,统计数据的含义是什么,你从可视化中可以得出什么结论,下一步分析是什么,为什么执行这种分析。如果你无法做到这一点,你也无法通过本项目。

小贴士: 像这样的引用部分旨在为学员提供实用指导,帮助学员了解并使用 Jupyter notebook

提出问题

在此项目中,你将以一名数据分析师的身份执行数据的探索性分析。你将了解数据分析过程的基本流程。在你分析数据之前,请先思考几个你需要理解的关于这些战斗的问题,例如,哪一个区域发生了最多的战争?哪一个国王获得了最多的胜利?战争的胜利与否受那些关键因素的影响?

问题:请写下你感兴趣的问题,请确保这些问题能够由现有的数据进行回答。
(为了确保学习的效果,请确保你的数据分析报告中能够包含2幅可视化和1个相关性分析。)

答案:1.那个区域发生的战争最多;
2.哪个国王胜利的次数最多;
3.战争的胜利与否受哪些关键因素的影响。

在提出了问题之后,我们将开始导入数据,并对数据进行探索性分析,来回答上面提出的问题。

小贴士: 双击上框,文本就会发生变化,所有格式都会被清除,以便你编辑该文本块。该文本块是用 Markdown编写的,该语言使用纯文本语法,能用页眉、链接、斜体等来规范文本格式。在纳米学位课程中,你也会用到 Markdown。编辑后,可使用 Shift + EnterShift + Return 运行上该框,使其呈现出编辑好的文本格式。

数据评估和清理

小贴士: 运行代码框的方法与编辑上方的 Markdown 框的格式类似,你只需点击代码框,按下键盘快捷键 Shift + EnterShift + Return ,或者你也可先选择代码框,然后点击工具栏的 运行 按钮来运行代码。运行代码框时,相应单元左侧的信息会出现星号,即 In [*]:,若代码执行完毕,星号则会变为某个数字,如 In [1]。如果代码运行后有输出结果,输出将会以 Out [1]: 的形式出现,其中的数字将与 “In” 中的数字相对应。

# TO DO: load pacakges
import pandas as pd
import numpy as np
% matplotlib inline
# TO DO: load the dataset
df = pd.read_csv("battles.csv")
# 将折叠的数据展开
pd.set_option('display.max_columns',None)
# 展开数据前五行进行观察
df.head()
nameyearbattle_numberattacker_kingdefender_kingattacker_1attacker_2attacker_3attacker_4defender_1defender_2defender_3defender_4attacker_outcomebattle_typemajor_deathmajor_captureattacker_sizedefender_sizeattacker_commanderdefender_commandersummerlocationregionnote
0Battle of the Golden Tooth2981Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNTullyNaNNaNNaNwinpitched battle1.00.015000.04000.0Jaime LannisterClement Piper, Vance1.0Golden ToothThe WesterlandsNaN
1Battle at the Mummer's Ford2982Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNBaratheonNaNNaNNaNwinambush1.00.0NaN120.0Gregor CleganeBeric Dondarrion1.0Mummer's FordThe RiverlandsNaN
2Battle of Riverrun2983Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNTullyNaNNaNNaNwinpitched battle0.01.015000.010000.0Jaime Lannister, Andros BraxEdmure Tully, Tytos Blackwood1.0RiverrunThe RiverlandsNaN
3Battle of the Green Fork2984Robb StarkJoffrey/Tommen BaratheonStarkNaNNaNNaNLannisterNaNNaNNaNlosspitched battle1.01.018000.020000.0Roose Bolton, Wylis Manderly, Medger Cerwyn, H...Tywin Lannister, Gregor Clegane, Kevan Lannist...1.0Green ForkThe RiverlandsNaN
4Battle of the Whispering Wood2985Robb StarkJoffrey/Tommen BaratheonStarkTullyNaNNaNLannisterNaNNaNNaNwinambush1.01.01875.06000.0Robb Stark, Brynden TullyJaime Lannister1.0Whispering WoodThe RiverlandsNaN
# 查看数据集结构
df.shape
(38, 25)
# TO DO: check the dataset general info
# 查看数据是否有缺失值
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 38 entries, 0 to 37
Data columns (total 25 columns):
name                  38 non-null object
year                  38 non-null int64
battle_number         38 non-null int64
attacker_king         36 non-null object
defender_king         35 non-null object
attacker_1            38 non-null object
attacker_2            10 non-null object
attacker_3            3 non-null object
attacker_4            2 non-null object
defender_1            37 non-null object
defender_2            2 non-null object
defender_3            0 non-null float64
defender_4            0 non-null float64
attacker_outcome      37 non-null object
battle_type           37 non-null object
major_death           37 non-null float64
major_capture         37 non-null float64
attacker_size         24 non-null float64
defender_size         19 non-null float64
attacker_commander    37 non-null object
defender_commander    28 non-null object
summer                37 non-null float64
location              37 non-null object
region                38 non-null object
note                  5 non-null object
dtypes: float64(7), int64(2), object(16)
memory usage: 7.5+ KB
## defender_3,defender_4,这两个字段全是空值,没有保留的必要,将其删除
df.drop(["defender_3","defender_4"],axis = 1,inplace= True)
## attacker_king 列,有两行是空值,去掉空值
df["attacker_king"].dropna(inplace = True)
# TO DO: clean the data (optional: only there are problems)
## fill the missing data
#df.fillna(df.mean(),inplace=True)
#df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 38 entries, 0 to 37
Data columns (total 23 columns):
name                  38 non-null object
year                  38 non-null int64
battle_number         38 non-null int64
attacker_king         36 non-null object
defender_king         35 non-null object
attacker_1            38 non-null object
attacker_2            10 non-null object
attacker_3            3 non-null object
attacker_4            2 non-null object
defender_1            37 non-null object
defender_2            2 non-null object
attacker_outcome      37 non-null object
battle_type           37 non-null object
major_death           38 non-null float64
major_capture         38 non-null float64
attacker_size         38 non-null float64
defender_size         38 non-null float64
attacker_commander    37 non-null object
defender_commander    28 non-null object
summer                38 non-null float64
location              37 non-null object
region                38 non-null object
note                  5 non-null object
dtypes: float64(5), int64(2), object(16)
memory usage: 6.9+ KB
## check the duplicated data
sum(df.name.duplicated())
0

数据探索分析

# In exploratory data analysis, please make sure of using statistics and visualizations
## 统计各个区域的战争次数
df["region"].value_counts().plot(kind = "bar",colors = ["r","gray","gray","gray","gray","gray","gray"])
C:\Users\15004\Anaconda3\lib\site-packages\pandas\plotting\_core.py:194: UserWarning: 'colors' is being deprecated. Please use 'color'instead of 'colors'
  warnings.warn(("'colors' is being deprecated. Please use 'color'"





<matplotlib.axes._subplots.AxesSubplot at 0x1dae9de3b00>

在这里插入图片描述

在数据的探索性分析中,请确保你对数据分析中的关键步骤和推理过程进行了记录。你可以自己插入code cell和markdown cell来组织你的报告。

#for i, v in enumerate(df.columns):
  #  print(i, v)
## 为了节省运行时间,我们选择“attacker_king”,"attacker_outcome"与"battle_type"字段进行统计
df[["attacker_king","attacker_outcome","battle_type"]]
attacker_kingattacker_outcomebattle_type
0Joffrey/Tommen Baratheonwinpitched battle
1Joffrey/Tommen Baratheonwinambush
2Joffrey/Tommen Baratheonwinpitched battle
3Robb Starklosspitched battle
4Robb Starkwinambush
5Robb Starkwinambush
6Joffrey/Tommen Baratheonwinpitched battle
7Balon/Euron Greyjoywinpitched battle
8Balon/Euron Greyjoywinsiege
9Balon/Euron Greyjoywinambush
10Robb Starkwinpitched battle
11Balon/Euron Greyjoywinambush
12Balon/Euron Greyjoywinsiege
13Joffrey/Tommen Baratheonwinambush
14Robb Starkwinambush
15Stannis Baratheonwinsiege
16Joffrey/Tommen Baratheonlosspitched battle
17Robb Starkwinambush
18Robb Starkwinambush
19Stannis Baratheonlosspitched battle
20Robb Starkwinsiege
21Robb Starklosspitched battle
22NaNwinpitched battle
23Joffrey/Tommen Baratheonwinpitched battle
24Joffrey/Tommen Baratheonwinpitched battle
25Joffrey/Tommen Baratheonwinambush
26Robb Starkwinsiege
27Stannis Baratheonlosssiege
28Joffrey/Tommen Baratheonwinsiege
29NaNwinrazing
30Stannis Baratheonwinpitched battle
31Balon/Euron Greyjoywinpitched battle
32Balon/Euron Greyjoywinrazing
33Joffrey/Tommen Baratheonwinsiege
34Joffrey/Tommen Baratheonwinsiege
35Joffrey/Tommen Baratheonwinsiege
36Joffrey/Tommen Baratheonwinsiege
37Stannis BaratheonNaNNaN
## 从攻击方角度将,对不同国王胜利次数进行统计
df.groupby("attacker_king").attacker_outcome.value_counts().unstack().plot(kind="bar")
<matplotlib.axes._subplots.AxesSubplot at 0x1dae9dc8a90>

在这里插入图片描述

## 对于运用不同的作战方式而获胜的次数进行统计
df.groupby("battle_type").attacker_outcome.value_counts().unstack().plot(kind="bar")
<matplotlib.axes._subplots.AxesSubplot at 0x1dae9eab898>

在这里插入图片描述

得出结论

问题:上面的分析能够回答你提出的问题?通过这些分析你能够得出哪些结论?

答案:1.从数据探索第一阶段得出的数据,可以看出,在The Riverlands地区发生的战争次数最多。 2.从攻击方的角度来讲,Joffrey/Tommen Baratheon(Tomen Baratheon继承了Joffrey的王位)获胜次数最多。 3.从战争类型来看,采用ambusy与siege类型的战役获胜次数要多于其他两种。从现有数据量来看的话,在战争中运用这两种类型获胜的可能行要更大。是否采用这两种类型,与能否获胜有一定的相关性。

反思

问题:在你的分析和总结过程中是否存在逻辑严谨。是否有改进的空间? 你可以从下面的一些角度进行思考:

  1. 数据集是否完整,包含所有想要分析的数据?
  2. 在对数据进行处理的时候,你的操作(例如删除/填充缺失值)是否可能影响结论?
  3. 是否还有其他变量(本数据中没有)能够对你的分析有帮助?
  4. 在得出结论时,你是否混淆了相关性和因果性?

答案:1.现有数据量不是很完整。 2.由于统计需要,对attacker_king列中的空值进行了2行删除操作,对结论的影响很小。 3.在思考有战争获胜有关的因素时,如果能再加一点天气的因素在里边就更完美了。 4.没有混淆相关性与因果性,在未通过统计学验证及机器学习的支持下,只能初步得出:是否采用ambusy与siege类型,与能否获胜有一定的相关性。

恭喜你完成了此项目!这只是数据分析过程的一个样本:从生成问题、整理数据、探索数据到得出结论。在数据分析(进阶)纳米学位中,你将会学到更多高级的数据分析方法和技术,如果你感兴趣的话,我们鼓励你继续学习后续的课程,掌握更多的数据分析的高级技能!

若想与他人分享我们的分析结果,除了向他们提供 jupyter Notebook (.ipynb) 文件的副本外,我们还可以将 Notebook 输出导出为一种甚至那些未安装 Python 的人都能打开的形式。从左上方的“文件”菜单,前往“下载为”子菜单。然后你可以选择一个可以更普遍查看的格式,例如 HTML (.html) 。你可能需要额外软件包或软件来执行这些导出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值