利用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被提及的最少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM