【泰迪杯-数据分析-4】K-means聚类分析
本文以2021年泰迪杯B题为例介绍Python实现K-means聚类分析,安装必要库,导入文件,数据预处理,scikitlearn实现k-means聚类分析,以及用三维散点图实现数据可视化。文末附2021泰迪杯题目和附件。
1,安装库
使用cmd运行pip命令安装必要库
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
若未安装pandas,运行下面命令安装
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
若未安装matplotlib,运行下面命令安装
pip install matplotlib-i https://pypi.tuna.tsinghua.edu.cn/simple/
2,导入文件
使用pandas读取文件,并取得需要处理的数据
import pandas as pd
# 对化肥信息进行聚类分析
############ 导入数据,并需要分析的数据列 ############
data = pd.read_excel('./data/化肥信息.xlsx')
# csv文件使用read_csv函数
如果这里读取xlsx文件失败,报错:Excel xlsx file; not supported
。可能是因为xlrd版本太高,使用pip命令写在现在版本,安装旧版本即可解决
# 卸载
pip uninstall xlrd
# 安装
pip install xlrd==1.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/
3,预处理数据
将需要进行聚类分析的数据转化为嵌套列表,即:[[a1,b1…],[a2,b2…],[a3,b3…]]的形式
# 只保留需要的数据,方便后续操作
temp_data = pd.DataFrame([])
temp_data['N'] = data['总氮百分比']
temp_data['P2O5'] = data['P2O5百分比']
temp_data['K2O'] = data['K2O百分比']
data = temp_data
# 将数据装换为嵌套列表 : [[ data ]] ** 这一步才是关键
data_list = []
for index in range(data.shape[0]):
temp_in_list = list(data.loc[index].values) # 需要强制类型转换为list,方便后续处理
data_list.append(temp_in_list)
print(data_list)
4,对数据进行聚类分析
使用
sklearn
库的KMeans方法进行聚类分析,并获取数据
############ K-Means聚类 ############
from sklearn.cluster import KMeans
# 设置聚类组数
k_means = KMeans(n_clusters=4)
# 开始聚类
k_means.fit(data_list)
# 获取聚类标签
k_label = k_means.labels_
# 获取聚类中心
k_center = k_means.cluster_centers_
print(k_label) # 返回组号,编号对应传递参数中的数据顺序
print(k_center) # 获取各组的中心你点位置
5,绘制散点图
在完成聚类分析之后,可以通过散点图来对结果进行展示
############ 画图 ############
import matplotlib.pyplot as plt
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
fig.set_size_inches(20,8) # 设置图形的大小和dpi
fig.set_dpi(80)
# 分组显示不同的颜色
for index in range(len(data_list)):
if k_label[index] == 0:
my_color = 'r'
elif k_label[index] == 1:
my_color = 'g'
elif k_label[index] == 2:
my_color = 'b'
else:
my_color = 'y'
ax.scatter(data_list[index][0], data_list[index][1], data_list[index][2],color=my_color)
break
# 防止中文乱码
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["KaiTi"]
mpl.rcParams["axes.unicode_minus"] = False
ax.set(xlabel="总氮百分比", ylabel="P2O5百分比", zlabel="K2O百分比") # 设置x,y,z轴的标签
# ax.scatter(xs, ys, zs=zs1, zdir="", c="", marker="", s=) 设置x,y,z轴的刻度
# 显示图形
plt.show()
6,完整代码
import pandas as pd
############ 导入数据,并需要分析的数据列 ############
data = pd.read_excel('./data/化肥信息.xlsx')
############ 数据处理 ############
# 只保留需要的数据,方便后续操作
temp_data = pd.DataFrame([])
temp_data['N'] = data['总氮百分比']
temp_data['P2O5'] = data['P2O5百分比']
temp_data['K2O'] = data['K2O百分比']
data = temp_data
# 将数据装换为嵌套列表 : [[ data ]]
data_list = []
for index in range(data.shape[0]):
temp_in_list = list(data.loc[index].values) # 需要强制类型转换为list,方便后续处理
data_list.append(temp_in_list)
# print(data_list)
############ K-Means聚类 ############
from sklearn.cluster import KMeans
# 设置聚类组数
k_means = KMeans(n_clusters=4)
# 开始聚类
k_means.fit(data_list)
# 获取聚类标签
k_label = k_means.labels_
# 获取聚类中心
k_center = k_means.cluster_centers_
print(k_label)
print(k_center)
############ 画图 ############
import matplotlib.pyplot as plt
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
fig.set_size_inches(20,8) # 设置图形的大小和dpi
fig.set_dpi(80)
# 分组显示不同的颜色
for index in range(len(data_list)):
if k_label[index] == 0:
my_color = 'r'
elif k_label[index] == 1:
my_color = 'g'
elif k_label[index] == 2:
my_color = 'b'
else:
my_color = 'y'
ax.scatter(data_list[index][0], data_list[index][1], data_list[index][2],color=my_color)
break
# 防止中文乱码
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["KaiTi"]
mpl.rcParams["axes.unicode_minus"] = False
ax.set(xlabel="总氮百分比", ylabel="P2O5百分比", zlabel="K2O百分比") # 设置x,y,z轴的标签
# ax.scatter(xs, ys, zs=zs1, zdir="", c="", marker="", s=) 设置x,y,z轴的刻度
# 显示图形
plt.show()
数据为泰迪杯-数据分析2021年B题附件2
链接:https://pan.baidu.com/s/1-4T70_pvNDEKfxKJQFoWnQ
提取码:nesp