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

article/2025/9/17 23:41:31

一、项目背景

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 snschamps=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()

在这里插入图片描述
展示matches表:

matches.head()

在这里插入图片描述
展示participants表:

participants.head()

在这里插入图片描述
展示stats1& stats2表,由于列数过多,仅能展示部分:

stats1_shape = stats1.shape
print(stats1_shape)
#(999999, 56)

在这里插入图片描述
展示teambans表:

teambans.head()

在这里插入图片描述
展示teamstats表:

teamstats.head()

在这里插入图片描述

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

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

各表缺失值均为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
#Index(['id_x', 'matchid', 'player', 'championid', 'ss1', 'ss2', 'role',
#       'position', 'win', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6',
#        'trinket', 'kills', 'deaths', 'assists', 'largestkillingspree',
#       'largestmultikill', 'killingsprees', 'longesttimespentliving',
#       'doublekills', 'triplekills', 'quadrakills', 'pentakills',
#       'legendarykills', 'totdmgdealt', 'magicdmgdealt', 'physicaldmgdealt',
#       'truedmgdealt', 'largestcrit', 'totdmgtochamp', 'magicdmgtochamp',
#       'physdmgtochamp', 'truedmgtochamp', 'totheal', 'totunitshealed',
#       'dmgselfmit', 'dmgtoobj', 'dmgtoturrets', 'visionscore', 'timecc',
#       'totdmgtaken', 'magicdmgtaken', 'physdmgtaken', 'truedmgtaken',
#       'goldearned', 'goldspent', 'turretkills', 'inhibkills',
#       'totminionskilled', 'neutralminionskilled', 'ownjunglekills',
#       'enemyjunglekills', 'totcctimedealt', 'champlvl', 'pinksbought',
#       'wardsbought', 'wardsplaced', 'wardskilled', 'firstblood', 'name',
#       'id_y', 'id', 'gameid', 'platformid', 'queueid', 'seasonid', 'duration',
#       'creation', 'version'],
#      dtype='object')

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)#整理得到玩家位置信息,包括TOP(上单)、MID(中单)、JUNGLE(打野)、DUO_SUPPORT(辅助)、DUO_CARRY(C位)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 #以50%为基准的胜率
champs_stats['KDA']= (champs_stats['K'] + champs_stats['A']) / champs_stats['D']  #计算KDA
champs_stats['KDA-mean']= champs_stats['KDA'] - champs_stats.KDA.mean() #以平均KDA为基准
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的英雄

获胜率排名前10的英雄:
获胜率排名前10的英雄
获胜率倒数的10名英雄:
获胜率倒数的10名英雄
最高获胜率为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()

在这里插入图片描述
以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()

在这里插入图片描述
可以看到获胜率在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') #取头尾10个做条形图
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) #x轴标签旋转
plt.yticks([1500,5000,10000,20000,30000,40000,50000,60000]) #y轴标签
plt.title('Top 10 and Last 10 Pick Rate')
plt.show()

在这里插入图片描述
可以看到最热门的英雄分别是盲僧、皮城女警、圣枪游侠、魂锁典狱长、九尾妖狐、暗夜猎手、疾风剑豪、发条魔灵、逆羽、探险家,其中只有九尾妖狐在获胜率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)

在这里插入图片描述
可以很明显地看出盲僧的虽然非常热门但是获胜率并不高,翠神则相反地获胜率最高但并不是热门英雄。
新手玩家可以选择获胜率优秀的热门英雄进行练手,比如阿狸、迦娜、亚索等,这类英雄比较好上手,能够提升新手玩家的体验感。

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)]= Trueplt.figure(figsize=(18,11))
sns.heatmap(df_fac.corr(), cmap= 'coolwarm', annot= True, fmt= '.2f', linewidths= .5, mask= mask)plt.title('Win Factors')

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

四、分析总结

未完待续……


http://chatgpt.dhexx.cn/article/FcnreLSd.shtml

相关文章

【毕业设计】大数据 - 网络游戏数据分析可视化

文章目录 1. 数据集说明2. 数据处理3. 数据分析可视化3.1 新增用户3.2 用户活跃度3.3 用户消费情况3.4 用户游戏情况 4 最后 &#x1f9ff; 选题指导, 项目分享&#xff1a; https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5…

游戏数据分析方法-活跃向

许多公司都会做数据分析系统。而不同游戏产品&#xff0c;一个产品的不同阶段&#xff0c;不同版本所分析的内容都是会跟进实际需求而不一样的。所以除了一些通用的数据指标外&#xff0c;针对不同的问题&#xff0c;分析方法也不一样&#xff0c;这里举几个案例来展示一般的数…

电子游戏数据分析报告

数据分析报告结论&#xff1a; 1.时间维度分析&#xff0c;从全球各地区的销售额变化趋势来看&#xff0c;全球销售额整体是从1980年开始逐步上升直到2008年达到销量顶峰后逐步降低&#xff0c;2008年后直接逐步下降&#xff0c;局部在2000年及2003年都有稍有下跌&#xff0c;…

python游戏数据分析

python游戏数据分析 数据分析思维导图 1.项目背景简介 本次项目分析所用数据集来源于kaggle steam游戏各地区销售数据&#xff0c;可以通过不同国家、发布者、游戏类型&#xff0c;地区收益等因素&#xff0c;对销售数据进行分析&#xff0c;提出有效的建议&#xff0c;帮助…

游戏数据分析小总结

数据分析步骤 明确要求 数据收集 企业内部数据 企业外部数据 数据处理 数据分析 数据分析即用适当的数据分析方法及工具&#xff0c;对处理过的数据进行分 析&#xff0c;提取有价值的数据&#xff0c;形成有效结论的过程。常用的分析方法有对比分析法、分组分析法、结构…

《游戏数据分析实战》总结思考

对于一个游戏行业的门外汉&#xff0c;这本书对于了解游戏业务具有很强的指导性&#xff0c;通过大量的案例说明了游戏这一具有特殊行业逻辑的行业&#xff0c;如何针对性地进行数据分析。 一、游戏关键数据指标 1、转化率——从点击广告到付费的每一步转化&#xff08;常使用…

【数据分析项目实战】篇1:游戏数据分析——新增、付费和用户行为评估

目录 0 结论 1 背景介绍 1.1 游戏介绍 1.2 数据集介绍 2 分析思路 3 新增用户分析 3.1 新增用户数&#xff1a; 3.2 每日新增用户数&#xff1a; 3.3 分析 4 活跃度分析 4.1 用户平均在线时长 4.2 付费用户平均在线时长 4.3 日活跃用户&#xff08;日平均在线时长…

游戏的数据和分析

一、关于数据 数据可以分为两类&#xff0c;一类为运营指标数据。一类为业务行为数据。 1.运营指标数据 比如DAU,PCU,LTV,ROI等常用的代表游戏目前线上运营状态的一些数据指标&#xff0c;用单个指标或者多个指标组合来反映游戏目前的线上运营状态&#xff0c;指标之间一般都有…

游戏数据分析

游戏数据分析 学习目标 知道游戏行业关键数据指标掌握ARPU&#xff0c; ARPPU等指标的计算方法 一、游戏行业关键数据指标 1.1 运营数据 激活数据 总激活码发放量、总激活量、总登录账号数激活率、激活登录率 激活率 激活量 / 安装量(激活码的)激活率 激活量 / 激活码发放…

游戏数据分析 | 用户流失原因分析

流失用户分析的方法有很多&#xff0c;常见的方法有流失等级分布、 等级停滞率、分渠道和平台的留存率对比、主线任务持有率。本文将从合理定义流失用户、客户端卸载原因和5W1H分析法来分析流失用户&#xff0c;并且用聚类分析对活跃用户进行细分&#xff0c;其目标在于更好地了…

Google Play Store谷歌应用商店游戏数据分析

数据集&#xff1a;Google Play Store Apps 网址&#xff1a;https://www.kaggle.com/lava18/google-play-store-apps?selectgoogleplaystore.csv 此数据集包含了两个csv文件&#xff0c;一个是Google play store app的整体数据&#xff0c;一个是Google play store用户评论的…

Vue向下滚动加载更多数据-scroll-案例

vue-infinite-scroll 安装 npm install vue-infinite-scroll --save尽管官方也推荐了几种载入方式&#xff0c;但“最vue”的方式肯定是在main.js中加入 import infiniteScroll from vue-infinite-scroll Vue.use(infiniteScroll)实现范例 官方给的代码范例是假设你在根组件…

jQuery 上拉加载更多

上拉加载&#xff0c;当用户浏览到页面底部时候&#xff0c;自动加载下一页的内容 不管是上拉加载还是下拉刷新&#xff0c;其实都离不开一个关键的事件&#xff1a;滚动条滚动事件。 本demo是窗口的滚动条事件&#xff0c;如果需要指定某个元素做上拉加载功能&#xff0c;请手…

uniapp实现上拉加载更多

目录 一、添加全部 1.在主页面中添加一列 2.改云函数 3.插件市场导入 加载中组件 二、实现上拉加载 1.云函数中可以接收参数 2.获取下拉事件 3.写触发这个下拉干嘛 在 显示加载中的组件里面 一、添加全部 1.在主页面中添加一列 data.unshift({name:全部}) //添加一列 …

element-ui,实现点击“加载更多“

首先&#xff0c;实现的大概效果如下&#xff1a; 接下来代码如下: <el-dialog v-el-drag-dialog title"预览" :visible.sync"dialogFormPreview" width"500px" ><div v-for"item in logList.slice(0,loadNum)" :key"i…

史上最全的使用RecyclerView实现下拉刷新和上拉加载更多

前言&#xff1a; 纵观多数App&#xff0c;下拉刷新和上拉加载更多是很常见的功能&#xff0c;但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新&#xff0c;上拉加载更多还要自己做。 本篇文章基于RecyclerView简单封装了这两个操作&#xff0c;下拉刷新支持LinearLayoutM…

一种Flutter加载更多的实现方法

转载注明出处&#xff1a;https://blog.csdn.net/skysukai 1、why flutter&#xff1f; 我们在进行Android开发的时候&#xff0c;比如布局文件&#xff0c;会创建一个xml来存放布局。写熟悉了觉得没什么&#xff0c;可是&#xff0c;用xml来存放布局文件是十年前的技术了。在…

Android BaseRecyclerViewAdapterHelper上拉加载更多

private boolean isErr false; //是否加载错误 private int TOTAL_COUNTER 16; //一共模拟加载16条数据&#xff0c;所有的数据总数 private int mCurrentCounter 6; //当前的数据总数&#xff0c;因为第一次默认加载6个//1.上拉加载mImgDetailsAdapter.setOnLoadMoreListen…

使用SmartRefreshLayout下拉刷新框架实现加载更多

使用 SmartRefreshLayout 可以实现recyclerview的下拉刷新和上拉加载更多&#xff0c;但是有时候在使用上拉加载更多时&#xff0c;不同的json格式需要不同的判断方法 1、后台根据每次相加的totalElements的个数作为请求的参数即pageSize12 pageNo1 {"content":[{…

Android recyclerview上拉加载更多

记录一下视频列表&#xff08;recyclerview&#xff09;上拉显示一个“加载更多”的item&#xff0c;然后加载数据。 效果图&#xff1a; 实现思路&#xff1a; 1.写两个item布局&#xff0c;一个用来展示数据&#xff0c;一个用来展示加载中也就是滑到最下方的时候显示的“…