数据分析入门系列教程-EM实战-划分LOL英雄

简介: 数据分析入门系列教程-EM实战-划分LOL英雄

今天,我们就通过LOL英雄分类的实战,来进一步体会下 EM 聚类的强大之处。

数据获取

页面分析

前面章节,我们实验所用的数据都是直接获取到的,今天我们通过前面学习的爬虫知识,来手动收集我们需要的英雄数据。

我们的目标网站是:http://cha.17173.com/lol/

首先我们可以看到一个英雄列表页面

然后点击每个英雄,又可以跳转至英雄详情页面,就可以看到英雄的初始属性信息了

所以我们的爬取流程为:

1.在第一个页面抓取所有英雄所在页面的 url 信息

2.在每个英雄详情页面抓取属性信息

获取英雄所在页面 url

通过分析页面可以知道(如何分析网页,忘记的同学可以查看前面章节),英雄详情页面 url 地址信息保存在一个 class 名为 “games_list” 的 ul 标签中,于是我们可以得到如下的获取信息代码

url = 'http://cha.17173.com/lol/'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
url_list = []
res = requests.get(url, headers=headers).text
content = BeautifulSoup(res, "html.parser")
ul = content.find('ul', attrs={'class': "games_list"})
hero_url = ul.find_all('a')
for i in hero_url:
    url_list.append(i['href'])

英雄属性抓取

接下来我们就可以通过刚刚获取到的 url 信息,来逐个抓取英雄的属性信息了

base_url = 'http://cha.17173.com'
detail_list = []
for i in url_list[5:]:
    print(i)
    res = requests.get(base_url + i, headers=headers).content
    content = BeautifulSoup(res, "html.parser")
    name_box = content.find('h1')
    name = name_box.text
    # print(name)
    hero_attr = content.find('ul', attrs={'class': 'num_li'})
    print(hero_attr)
    attr_star = hero_attr.find_all('span')
    print(attr_star)
    live = attr_star[0].text
    live_return = attr_star[1].text
    magical = attr_star[2].text
    magical_return = attr_star[3].text
    speed = attr_star[4].text
    attach_range = attr_star[5].text
    attach_power = attr_star[6].text
    attach_speed = attr_star[7].text
    armor = attr_star[8].text
    magical_armor = attr_star[9].text
    detail_list.append([name, live, live_return, magical, magical_return, speed, attach_range, attach_power, 
                       attach_speed, armor, magical_armor])

保存数据到 csv

现在我们已经获得了一个包含属性信息的列表,下一步就是保存进 csv 文件中,以便于后面的分析使用

with open('all_hero_init_attr.csv', 'w', encoding='utf-8') as f:
    f.write('英雄名字,生命值,生命值回复,魔法值,魔法值回复,移动速度,攻击范围,攻击力,'
             '攻击速度,护甲,魔法抗性\n')
    for i in detail_list:
        try:
            rowcsv = '{},{},{},{},{},{},{},{},{},{},{}'.format(
                i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9], i[10]
        )
            f.write(rowcsv)
            f.write('\n')
        except:
            continue

最后我们得到的数据如下

数据处理

接下来进行数据聚类前的数据处理工作

读取数据

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from pyecharts.charts import Pie
from collections import Counter
plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
data = pd.read_csv('all_hero_init_attr.csv', encoding='gb18030')

查看关联特征

feature = ['英雄名字','生命值','生命值回复','魔法值','魔法值回复','移动速度','攻击范围','攻击力',
             '攻击速度','护甲','魔法抗性']
data_init = data[feature]
corr = data_init[feature].corr()
plt.figure(figsize=(14, 14))
sns.heatmap(corr, annot=True)
plt.show()

可以得到如下的热力图,用来分析不同特征之间的关联关系

对于关联关系比较强的特征,我们只保留一个,所以可以得到如下的简化特征集

features_remain = ['生命值','生命值回复','魔法值','魔法值回复','移动速度','攻击范围','攻击力',
             '攻击速度','护甲','魔法抗性']
data_init = data_init[features_remain]

Sklearn 中的 EM

使用 sklearn 库中的的 EM 聚类算法框架,采用高斯混合模型

from sklearn.mixture import GaussianMixture

一些主要参数意义如下

  1. n_components:混合高斯模型个数,也就是想要的聚类个数,默认为1
  2. covariance_type:协方差类型,包括{‘full’,‘tied’, ‘diag’, ‘spherical’}四种,分别对应完全协方差矩阵(元素都不为零),相同的完全协方差矩阵(HMM会用到),对角协方差矩阵(非对角为零,对角不为零),球面协方差矩阵(非对角为零,对角完全相同,球面特性),默认‘full’ 完全协方差矩阵
  3. max_iter:最大迭代次数,默认100

所以可以构造 GMM 聚类如下:

gmm = GaussianMixture(n_components=20, covariance_type='full')

EM 聚类英雄

下面我们就可以开始给英雄聚类了,首先先对数据进行标准化

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
data_init = ss.fit_transform(data_init)

接下来构建 GMM 聚类模型

gmm = GaussianMixture(n_components=20, covariance_type='full')
gmm.fit(data_init)

获得结果

prediction = gmm.predict(data_init)

再把得到的结果插回入原数据集中

data.insert(0, '分组', prediction)
data.to_csv('all_hero_init_attr_our.csv', index=False, sep=',', encoding='utf-8')

最后再画成饼图

from pyecharts.charts import Pie
from pyecharts import options as opts
df = data[['分组', '英雄名字']]  # 获取需要的两列
grouped = df.groupby(['分组'])  # 以”分组“列来进行分组
k = []
# 获取分组后的 组和值,保存为字典,放到列表中
for name, group in grouped:
    k.append({name: list(group['英雄名字'].values)})
kk = []
for i in k:
    for k, v in i.items():
        kk.append(v)
length = []
key = []
for i in kk:
    key.append(str(i))
    length.append(len(i))
pie = Pie()
pie.add("", [list(z) for z in zip(key, length)],
       radius=["30%", "75%"],
            center=["40%", "50%"],
            rosetype="radius")
pie.set_global_opts(
            title_opts=opts.TitleOpts(title="英雄聚类分布"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_left="80%", orient="vertical"
            ),
        )
pie.render_notebook()


可以看到,分类还是蛮详细的!

总结

今天我们一起完成了聚类LOL英雄的例子,从数据获取、数据清洗到 EM 聚类分析再到最后的可视化处理。从整体流程中可以看出,我们需要经过数据加载,处理,数据探索,特征选择,GMM 聚类和结果展示等环节。

聚类是属于无监督的学习方式,也就是说我们没有实际的结果来进行比对,所以对于聚类的结果分析,通常需要加入更多的人为经验在里面。把我们日常学习工作中的经验应用到聚类的结果中,以此来判断当前的聚类结果是否符合我们的预期。

练习题

调整聚类个数,即参数 n_components,查看不同聚类个数的情况下,英雄分类的差别

相关文章
|
2月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
371 0
|
9月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
本文将引导读者了解如何使用Python进行数据分析,从安装必要的库到执行基础的数据操作和可视化。通过本文的学习,你将能够开始自己的数据分析之旅,并掌握如何利用Python来揭示数据背后的故事。
|
10月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
【10月更文挑战第42天】本文是一篇技术性文章,旨在为初学者提供一份关于如何使用Python进行数据分析的入门指南。我们将从安装必要的工具开始,然后逐步介绍如何导入数据、处理数据、进行数据可视化以及建立预测模型。本文的目标是帮助读者理解数据分析的基本步骤和方法,并通过实际的代码示例来加深理解。
198 3
|
6月前
|
数据采集 机器学习/深度学习 数据挖掘
数据分析入门:从数据探索到洞察真相
数据分析入门:从数据探索到洞察真相
157 19
|
7月前
|
SQL JSON 数据可视化
基于 DIFY 的自动化数据分析实战
本文介绍如何使用DIFY搭建数据分析自动化流程,实现从输入需求到查询数据库、LLM分析再到可视化输出的全流程。基于经典的employees数据集和DIFY云端环境,通过LLM-SQL解析、SQL执行、LLM数据分析及ECharts可视化等模块,高效完成数据分析任务。此方案适用于人力资源分析、薪酬管理等数据密集型业务,显著提升效率并降低成本。
12209 16
|
7月前
|
存储 分布式计算 大数据
基于阿里云大数据平台的实时数据湖构建与数据分析实战
在大数据时代,数据湖作为集中存储和处理海量数据的架构,成为企业数据管理的核心。阿里云提供包括MaxCompute、DataWorks、E-MapReduce等在内的完整大数据平台,支持从数据采集、存储、处理到分析的全流程。本文通过电商平台案例,展示如何基于阿里云构建实时数据湖,实现数据价值挖掘。平台优势包括全托管服务、高扩展性、丰富的生态集成和强大的数据分析工具。
|
10月前
|
数据可视化 数据挖掘
R中单细胞RNA-seq数据分析教程 (3)
R中单细胞RNA-seq数据分析教程 (3)
R中单细胞RNA-seq数据分析教程 (3)
|
10月前
|
机器学习/深度学习 数据挖掘
R中单细胞RNA-seq数据分析教程 (2)
R中单细胞RNA-seq数据分析教程 (2)
R中单细胞RNA-seq数据分析教程 (2)
|
10月前
|
数据采集 数据可视化 数据挖掘
深入浅出:使用Python进行数据分析的基础教程
【10月更文挑战第41天】本文旨在为初学者提供一个关于如何使用Python语言进行数据分析的入门指南。我们将通过实际案例,了解数据处理的基本步骤,包括数据的导入、清洗、处理、分析和可视化。文章将用浅显易懂的语言,带领读者一步步掌握数据分析师的基本功,并在文末附上完整的代码示例供参考和实践。
|
10月前
|
数据采集 数据可视化 数据挖掘
Python数据分析:Pandas库实战指南
Python数据分析:Pandas库实战指南

热门文章

最新文章