欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/3/12 编程问答 63 豆豆
生活随笔 收集整理的这篇文章主要介绍了 冰与火之歌-五王之战(优达数据分析进阶项目) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

简介

五王之战(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_commandersummerlocationregionnote01234
Battle of the Golden Tooth2981Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNTullyNaNNaNNaNwinpitched battle1.00.015000.04000.0Jaime LannisterClement Piper, Vance1.0Golden ToothThe WesterlandsNaN
Battle at the Mummer's Ford2982Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNBaratheonNaNNaNNaNwinambush1.00.0NaN120.0Gregor CleganeBeric Dondarrion1.0Mummer's FordThe RiverlandsNaN
Battle of Riverrun2983Joffrey/Tommen BaratheonRobb StarkLannisterNaNNaNNaNTullyNaNNaNNaNwinpitched battle0.01.015000.010000.0Jaime Lannister, Andros BraxEdmure Tully, Tytos Blackwood1.0RiverrunThe RiverlandsNaN
Battle 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
Battle 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_type012345678910111213141516171819202122232425262728293031323334353637
Joffrey/Tommen Baratheonwinpitched battle
Joffrey/Tommen Baratheonwinambush
Joffrey/Tommen Baratheonwinpitched battle
Robb Starklosspitched battle
Robb Starkwinambush
Robb Starkwinambush
Joffrey/Tommen Baratheonwinpitched battle
Balon/Euron Greyjoywinpitched battle
Balon/Euron Greyjoywinsiege
Balon/Euron Greyjoywinambush
Robb Starkwinpitched battle
Balon/Euron Greyjoywinambush
Balon/Euron Greyjoywinsiege
Joffrey/Tommen Baratheonwinambush
Robb Starkwinambush
Stannis Baratheonwinsiege
Joffrey/Tommen Baratheonlosspitched battle
Robb Starkwinambush
Robb Starkwinambush
Stannis Baratheonlosspitched battle
Robb Starkwinsiege
Robb Starklosspitched battle
NaNwinpitched battle
Joffrey/Tommen Baratheonwinpitched battle
Joffrey/Tommen Baratheonwinpitched battle
Joffrey/Tommen Baratheonwinambush
Robb Starkwinsiege
Stannis Baratheonlosssiege
Joffrey/Tommen Baratheonwinsiege
NaNwinrazing
Stannis Baratheonwinpitched battle
Balon/Euron Greyjoywinpitched battle
Balon/Euron Greyjoywinrazing
Joffrey/Tommen Baratheonwinsiege
Joffrey/Tommen Baratheonwinsiege
Joffrey/Tommen Baratheonwinsiege
Joffrey/Tommen Baratheonwinsiege
Stannis 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.由于统计需要,对attacker_king列中的空值进行了2行删除操作,对结论的影响很小。 3.在思考有战争获胜有关的因素时,如果能再加一点天气的因素在里边就更完美了。 4.没有混淆相关性与因果性,在未通过统计学验证及机器学习的支持下,只能初步得出:是否采用ambusy与siege类型,与能否获胜有一定的相关性。

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

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

    总结

    以上是生活随笔为你收集整理的冰与火之歌-五王之战(优达数据分析进阶项目)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。