在《英雄联盟》的比赛中过程中会有很多因素会影响游戏是否胜利,例如一血,是否拿到小龙和男爵,是否率先推掉水晶等,一般这些资源会对比赛胜利产生影响。通过这个项目,我想更好的了解这些目标中哪一个是赢得英雄联盟游戏最重要的。就此提出的问题如下:​

  • 1.英雄联盟最重要的获胜条件是什么?
  • 2.当某些因素发生后如何让去预测这场比赛是否会胜利

数据获取与探索性数据分析(EDA)

原始数据与源码可以微信后台回复英雄联盟胜利因素分析获取

原始数据中给出了包括比赛ID,是否胜利,以相关资源的获取数量,包括塔,龙,水晶的等因素。首先的探索性数据分析部分我们依旧是先查看数据的数据类型,数据分布与是否存在缺失值

match_df=pd.read_csv(r"matches.csv")
match_df.describe()
match_df.info()


#使用seaborn可视化是否存在缺失值
sns.set_style('darkgrid') 
plt.figure(figsize = (12,8)) 
cmap = sns.diverging_palette(220, 20, l = 40, s = 99, sep = 20, center = 'light', as_cmap = True) 
sns.heatmap(match_df.isna(), cmap = cmap, yticklabels = False)#利用df.isna()来获取是否存在nan并用热力图可视化

在确认数据无缺失值后来看一下各个变量间的相关系数:

#设定图像样式
plt.figure(figsize = (12,8))
cmap = sns.diverging_palette(220, 20, l = 40, s = 99, sep = 20, center = 'light', as_cmap = True) 

#drop函数默认删除行,列需要加axis = 1
#查看各个变量之间的相关系数
sns.heatmap(match_df.drop(['region'], axis = 1).corr(), vmin = 0, vmax = 1, annot = True, cmap = cmap, lw = .5, linecolor = 'white')

在这里插入图片描述
可以看出拿到第一座水晶,推塔数量与摧毁水晶数量对于胜利的影响有较强的相关性

主成分分析部分(PCA)

在这些原始数据提供的维度中,有哪些维度是比较重要的维度,可以让我们在较少的维度下去进行数据分析呢?针对这个问题,我们使用sklearn中的PCA模块对数据进行降维。

#数据标准化 / 归一化
scaler = StandardScaler()
scaler.fit(match_df.drop(['win', 'region'], axis = 1))
scaled_data = scaler.transform(match_df.drop(['win', 'region'], axis=1))

#留下维度数量的选择
exp_var_ratio = []
for n in range(0,8):
    pca = PCA(n_components = n)
    pca.fit(scaled_data)
    pca.transform(scaled_data)
    exp_var_ratio.append(sum(pca.explained_variance_ratio_))

#可视化

fig = plt.figure(figsize = (12, 8))
ax = fig.add_subplot(111)
plt.plot(range(1,9), exp_var_ratio, marker = 'o', markerfacecolor = 'orange', markersize = 6)
#利用zip返回一个可迭代的对象
for i,j in zip(range(1,9),exp_var_ratio):
    ax.annotate('{:.2f}'.format(j),xy=(i-.2,j+.03))
plt.xlabel('Number of Componenets', size = 15)
plt.ylabel('Ratio of Variance Explained', size = 15)

在使用PCA之前必须标准化数据的原因是PCA方法对初始变量的方差非常敏感。也就是说,如果初始变量的范围之间存在较大差异,那么范围较大的变量占的比重较大,和较小的变量相比(例如,范围介于0和100之间的变量较0到1之间的变量会占较大比重),这将导致主成分的偏差。通过将数据转换为同样的比例可以防止这个问题。
输出结果:
在这里插入图片描述
从输出结果来看,超过80%的方差可以用6个特征来解释。为了了解哪个维度更重要,我们对各成分的方差值与方差占比进行计算并使用热力图可视化

#将PCA特征的个数选定在6个
pca = PCA(n_components = 6)
pca.fit(scaled_data)
data_pca = pca.transform(scaled_data)

pca_corr = pd.DataFrame(pca.components_, columns = match_df.drop(['win', 'region'], axis = 1).columns)#pca.components_:返回具有最大方差的成分

plt.figure(figsize = (12,8))
sns.heatmap(pca_corr, cmap = cmap, vmin = -1, vmax = 1, annot = True, lw = .5, linecolor = 'white')

#查看各主成分的方差解释度占比
pca.explained_variance_ratio_

在这里插入图片描述
从热力图中可以看出,摧毁第一座水晶,推塔数和摧毁水晶数占据比赛胜利的重要因素,这也与我们的认知相符。

逻辑回归建模部分

最后通过逻辑回归模型,我们可以看到不同的地区胜利与这些影响因素之间的关系
在这里插入图片描述

从这个模型中可以看出各个地区之间的游戏风格存在的差异,并可以去预测给定因素下是否会胜利

原始数据与源码可以微信后台回复英雄联盟胜利因素分析获取
英文原作者代码与数据清洗:https://github.com/ankushbharadwaj/league-of-legends-win-conditions