Python | 英雄联盟游戏数据分析

一、项目背景

EDG夺得2021英雄联盟全球总决赛冠军,这场比赛让所有观赛者热血沸腾,也唤起了我这个沉睡多年老玩家对MOBA游戏的兴趣,兴冲冲地下载了英雄联盟,却发现这并不是一个可以轻松上手的游戏。
对于时下最流行的MOBA类游戏——英雄联盟,作为一个新手可以从哪些方面切入,通过数据分析了解游戏机制并快速上手,降低新人过渡期的难度,是该项目的中心主题。

二、数据预处理

1.数据来源

数据源:League of Legends Ranked Matches

2.理解数据

数据集包含英雄联盟的18万场对局数据,数据表包括:
champs.csv :包含英雄名称和英雄id
matches.csv : 包含比赛信息
participants : 每场比赛的玩家信息
stats1.csv & stats2.csv : 对战数据
teambans : 队伍ban选数据
teamstats : 队伍总数据

3.数据清洗

1.导入数据
导入所有数据表

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

champs=pd.read_csv("champs.csv")
matches=pd.read_csv("matches.csv")
participants=pd.read_csv("participants.csv")
stats1=pd.read_csv("stats1.csv")
stats2=pd.read_csv("stats2.csv")
teambans=pd.read_csv("teambans.csv")
teamstats=pd.read_csv("teamstats.csv")

展示champs表:

champs.head()

Python | 英雄联盟游戏数据分析
展示matches表:
matches.head()

Python | 英雄联盟游戏数据分析
展示participants表:
participants.head()

Python | 英雄联盟游戏数据分析
展示stats1& stats2表,由于列数过多,仅能展示部分:
stats1_shape = stats1.shape
print(stats1_shape)

Python | 英雄联盟游戏数据分析
展示teambans表:
teambans.head()

Python | 英雄联盟游戏数据分析
展示teamstats表:
teamstats.head()

Python | 英雄联盟游戏数据分析

2.查找缺失值
计算各表缺失值总和,若缺失值过多再逐列处理

champs_null = sum(champs.isnull().sum())
print(champs_null)

各表缺失值均为0,说明数据集完整

3.合并数据表

stats = stats1.append(stats2)
df = pd.merge(participants, stats, how= 'left', on= ['id'])
df = pd.merge(df, champs, how= 'left', left_on= 'championid', right_on= 'id')
df = pd.merge(df, matches, how= 'left', left_on= 'matchid', right_on= 'id')
df.columns

4.添加必要字段

df['teamid']= df['player'].apply(lambda x: '1' if x<5 else '2')

def final_position(row):
    if row['role'] in ('DUO_SUPPORT','DUO_CARRY'):
        return row['role']
    else:
        return row['position']
df['adjposition']= df.apply(final_position, axis= 1)

df['team_role']= df['teamid']+ '-'+ df['adjposition']

三、探索性分析

1.英雄获胜率、KDA
英雄联盟中的英雄众多,新手往往会不知道该怎么选择英雄练手,因此分析哪些英雄更容易取胜,能得到更高得KDA((K击杀数+A助攻数)/ D死亡数),为新手选择英雄提供参考。

champs_stats= df.groupby('name').agg({'win':'sum', 'name':'count', 'kills':'mean', 'deaths':'mean', 'assists':'mean'})
champs_stats.columns= ['win', 'total matches', 'K', 'D', 'A']
champs_stats['win rate(%)']= champs_stats['win'] / champs_stats['total matches'] * 100
champs_stats['win rate-50%']= champs_stats['win rate(%)'] - 50
champs_stats['KDA']= (champs_stats['K'] + champs_stats['A']) / champs_stats['D']
champs_stats['KDA-mean']= champs_stats['KDA'] - champs_stats.KDA.mean()
champs_stats= champs_stats.round(2)
champs_stats.reset_index(inplace=True)
champs_stats= champs_stats.sort_values('win rate(%)',ascending= False)

champs_stats.head(10).style.set_precision(2)

获胜率排名前10的英雄:

Python | 英雄联盟游戏数据分析
获胜率倒数的10名英雄:
Python | 英雄联盟游戏数据分析
最高获胜率为55.87%,最低获胜率为39.65%,差值并不算大,为了突出英雄之间获胜率的差异,以50%为基准值,观察所有英雄的获胜率情况:
f,ax= plt.subplots(figsize=(10,25))
sns.barplot(x='win rate-50%',y='name',data= champs_stats.sort_values(by='win rate(%)',ascending=False))
plt.title('Win Rate Based on 50%')
plt.show()

Python | 英雄联盟游戏数据分析
以KDA平均值为基准值,观察所有英雄的KDA情况:
f,ax= plt.subplots(figsize=(10,25))
sns.barplot(x='KDA-mean',y='name',data= champs_stats.sort_values(by='KDA',ascending=False))
plt.title('KDA Based on mean')
plt.show()

Python | 英雄联盟游戏数据分析
可以看到获胜率在50%以上和50%以下的英雄数量分布相对平衡。获胜率排名前10的英雄里超过一半是法师角色。
KDA最高值是3.81,最低值1.68。KDA排名前10的英雄里以战士/坦克、法师为主,而法师排在头部,考虑到法师在队伍中通常担任辅助角色,能拿到更多助攻;战士/坦克的生存能力、输出能力一般情况下都更强,击杀或助攻数值会比较高。
翠神这个英雄的获胜率和KDA都是所有英雄里最高的,该英雄的官方定位是打野、辅助。

2.英雄出场率
英雄的获胜率高并不代表这个英雄是对新手友好的,这类英雄可能对玩家的游戏技巧和熟练度有很高的要求,因此转向英雄出场率的分析,看看在对局中玩家最常使用的是哪些英雄。

f,ax= plt.subplots(figsize=(18,11))
pick_rate= df['name'].value_counts().sort_values(ascending= False)
ax= pd.concat((pick_rate.head(10),pick_rate.tail(10))).plot(kind= 'bar')
total_records= len(matches)
for x in ax.patches:
    height= x.get_height()
    ax.text(x.get_x() + x.get_width()/2.,
           height,
           '{:.2f}%'.format(height/total_records*100),
           ha= 'center')

plt.xticks(rotation= 45)
plt.yticks([1500,5000,10000,20000,30000,40000,50000,60000])
plt.title('Top 10 and Last 10 Pick Rate')
plt.show()

Python | 英雄联盟游戏数据分析
可以看到最热门的英雄分别是盲僧、皮城女警、圣枪游侠、魂锁典狱长、九尾妖狐、暗夜猎手、疾风剑豪、发条魔灵、逆羽、探险家,其中只有九尾妖狐在获胜率TOP10里。
出场率最低的10名英雄中,水晶先锋斯卡纳位列获胜率TOP10,可以看出斯卡纳不是绝大多数玩家的选择,但如果能驾驭好这个英雄,可以给团队带来巨大优势。

3.英雄出场次数与获胜率
基于英雄的出场次数和获胜率制作散点图。

def lable_point(x, y, val, ax):
    a= pd.concat({'x':x, 'y':y, 'val':val}, axis= 1)
    for i, point in a.iterrows():
        ax.text(point['x'],point['y'],str(point['val']))

champs_stats['color']= champs_stats['win rate(%)'].apply(lambda x: 'red' if x>50 else 'green')

ax= champs_stats.plot(kind= 'scatter', x= 'total matches', y= 'win rate(%)',
                      color= champs_stats['color'].tolist(),
                     figsize= (18,11),
                     title='Win Rate vs Pick')

lable_point(champs_stats['total matches'], champs_stats['win rate(%)'], champs_stats['name'], ax)

Python | 英雄联盟游戏数据分析
可以很明显地看出盲僧的虽然非常热门但是获胜率并不高,翠神则相反地获胜率最高但并不是热门英雄。
新手玩家可以选择获胜率优秀的热门英雄进行练手,比如阿狸、迦娜、亚索等,这类英雄比较好上手,能够提升新手玩家的体验感。

4.取胜相关因素分析
分析获胜与击杀数(kills)、死亡数(deaths)、助攻数(assists)、推塔数(turretkills)、总治疗数(totheal)、补刀数(totminionskilled)、花费金币总数(goldspent)、总承伤(totdmgtaken)、推水晶数(inhibkills)、插眼数(wardsplaced)、游戏时长(duration)等因素间存在怎样的相关性。

df= df[['id', 'matchid', 'player', 'name', 'adjposition', 'team_role',
         'win', 'kills', 'deaths', 'assists', 'turretkills','totdmgtochamp',
         'totheal', 'totminionskilled', 'goldspent', 'totdmgtaken', 'inhibkills',
         'pinksbought', 'wardsplaced', 'duration', 'platformid',
         'seasonid']]

df_fac= df._get_numeric_data()
df_fac= df_fac.drop(['id','matchid','player','seasonid'],axis= 1)

mask= np.zeros_like(df_fac.corr(), dtype= np.bool)
mask[np.triu_indices_from(mask)]= True

plt.figure(figsize=(18,11))
sns.heatmap(df_fac.corr(), cmap= 'coolwarm', annot= True, fmt= '.2f', linewidths= .5, mask= mask)

plt.title('Win Factors')

Python | 英雄联盟游戏数据分析
可以看到,推塔数和推水晶数是制胜关键因素,毕竟这款游戏是以摧毁对方水晶枢纽为目标的推塔游戏;助攻数和击杀数也极大关系着对局的输赢;另外花费金币总数也是重要指标,经济越好,团队的战斗力就会更高,在对剧中更具优势。

四、分析总结

未完待续……

Original: https://blog.csdn.net/PbPbbb/article/details/121310947
Author: PbPbbb
Title: Python | 英雄联盟游戏数据分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/697336/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球