【泰迪杯-数据分析-4】K-means聚类分析

该博客介绍了如何使用Python的scikit-learn库进行K-means聚类分析,以2021年泰迪杯B题化肥信息为例,详细展示了数据预处理、聚类分析和三维散点图的绘制过程,帮助理解K-means算法在数据分析中的应用。
摘要由CSDN通过智能技术生成

【泰迪杯-数据分析-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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值