四时宝库

程序员的知识宝库

如何用python执行KMeans聚类算法(python的kmeans聚类结果分析)

产品运营中为什么需要KMeans聚类算法?

在产品运营过程中,有一种思路是专门针对用户来制定运营策略,最理想的状态就是个性化运营,即针对每个用户每个时刻提供不同的产品和服务。但这样极致的策略意味着急速攀升的运营成本,尤其是在用户量很大,平均每个用户利润较低情况下,并不划算。

所以,对用户进行合理的分类,再分析每类用户的特征,绘制出群体的用户画像,最后根据画像属性提供对应的产品和服务,就成了大部分运营团队倾向的策略。而KMeans聚类算法就是实现这个策略的有效手段之一。


如果用python执行KMeans聚类算法?

【获得数据】

用户信息数据库中,我们保存了很多描述用户静态特征的数据,比如性别、年龄、所在地、收入、消费等。从用户行为数据库中,我们也可以通过行为数据提炼出动态特征,比如最近七天登录次数、平均在线时长、累计充值额等。这些数据都可以作为KMeans的数据源。


【数据处理】

【导入函数包】

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

【解决中文识别问题】

font = {"family":"SimHei","size":20}

plt.rc("font",**font)

【上传数据集】

df = pd.read_csv("personal_income.csv")

df.head()

【查看数据集规模】

df.shape

【查看数据列详情】

df.info()

【检查数据是否有空值】

df.isnull().sum()

【换上中文列名,方便阅读】

df.columns = ["用户ID","性别","年龄","年收入","支出"]

df.head()


【初步数据分析】

【描述各列数据统计值】

df.describe()

【共有性别、年龄、年收入、支出四个维度,后续会通过这四个维度来划分用户类别,先来看下这四个维度的用户数量分布情况】

# 可视化各列数据的分布情况(可用直方图)

# 应该会有四个图表组成的一个画布

# 设置画面的整体大小

fig = plt.figure(figsize=(20,5))

# 设置画布的标题

fig.suptitle("四个维度的用户分布情况")

# 画第一个图表

# 设置图表位置,在两行两列的画布中第一个位置

ax1 = fig.add_subplot(221)

# 通过直方图展示年龄分布

ax1.hist(df["年龄"])

# 设置图表名称

ax1.title.set_text("年龄分布")

# 画第二个图表

# 设置图表位置,在两行两列的画布中第二个位置

ax2 = fig.add_subplot(222)

# 通过柱状图展示性别分布

# 分别统计男女的用户数量,并生成一个list

height = [(df["性别"]=="Male").sum(),(df["性别"]=="Female").sum()]

# 绘制性别分布柱状图

ax2.bar(["男","女"],height=height)

# 设置图表名称

ax2.title.set_text("性别分布")


# 画第三个图表

# 设置图表位置,在两行两列的画布中第三个位置

ax3 = fig.add_subplot(223)

# 通过直方图展示年收入分布

ax3.hist(df["年收入"])

# 设置图表名称

ax3.title.set_text("年收入分布")

# 画第四个图表

# 设置图表位置,在两行两列的画布中第四个位置

ax4 = fig.add_subplot(224)

# 通过直方图展示支出分布

ax4.hist(df["支出"])

# 设置图表名称

ax4.title.set_text("支出分布")

# 设置四个图表之间的行列距离

fig.subplots_adjust(wspace=0.3,hspace=0.6)

plt.show()

分析解读

-年龄上以20-50岁的人群为主;

-性别上比较平均,女性偏多一些;

-年收入上以20-90k的人群为主,其中60、80有两个小高峰;

-支出上集中在40-60之间


【进一步分析维度之间的两两关系】

-分别是年龄-年收入,年龄-支出,年收入-支出

-性别始终在三个关系中同步分析

-可用散点图展示

【绘制年龄-年收入关系散点图】

# 设置图表大小

plt.figure(figsize=(20,5))

# 循环,在一个散点图中分别绘制不同性别的年龄-年收入关系散点图

for gender in ["Male","Female"]:

plt.scatter(x="年龄",y="年收入",

data = df[df["性别"]==gender],

s=200,alpha=0.5,label=gender) # s设置图形的大小,alpha设置图形的透明度,label设置图形标签

# 设置x轴、y轴标题

plt.xlabel("年龄")

plt.ylabel("年收入")

# 设置图例

plt.legend()

# 设置图表标题

plt.title("年龄与年收入的关系")

plt.show()

分析解读

-30岁左右收入最高;

-20-30岁,高收入者偏男性;

-30-50岁,高收入者偏女性。

【绘制年龄-支出关系散点图】

# 设置图表大小

plt.figure(figsize=(20,5))

# 循环,在一个散点图中分别绘制不同性别的年龄-支出关系散点图

for gender in ["Male","Female"]:

plt.scatter(x="年龄",y="支出",

data = df[df["性别"]==gender],

s=200,alpha=0.5,label=gender)

# 设置x轴、y轴标题

plt.xlabel("年龄")

plt.ylabel("支出")

# 设置图例

plt.legend()

# 设置图表标题

plt.title("年龄与支出的关系")

plt.show()

分析解读

-20-40岁之间的支出较高;

-40岁之前,男女的支出差不多;

-40-60岁之间,女性的支出更多。

【绘制年收入-支出关系散点图】

# 设置图表大小

plt.figure(figsize=(20,5))

# 循环,在一个散点图中分别绘制不同性别的年收入-支出关系散点图

for gender in ["Male","Female"]:

plt.scatter(x="年收入",y="支出",

data = df[df["性别"]==gender],

s=200,alpha=0.5,label=gender)

# 设置x轴、y轴标题

plt.xlabel("年收入")

plt.ylabel("支出")

# 设置图例

plt.legend()

# 设置图表标题

plt.title("年收入与支出的关系")

plt.show()

分析解读

-40-70岁之间收支比较平衡;

-20-40岁,支出高,收入低,其中30岁以前女性支出更高,30岁以后男性的支出更高;

-70岁以后,支出低,收入高。


【使用KMeans聚类进行深入分析】

通过以上三图的对比,年收入-支出的关系图看起来最有族群区分度,我们就用KMeans算法来分类不同的年收入-支出族群。

【寻找最佳K值】

# KMeans聚类算法的数据集必须是array,而df是dataframe,可以通过values从df中获得array

x1 = df[["年收入","支出"]].values

x1

# k值就是分类的族群数

# 通过计算不同族群数的族内误差平方和,找到误差最小的那个族群数,就是最佳k值

# 循环,计算10以内每个族群数的族内误差平方和

# 创建一个空的list来装族内误差平方和inertia

inertia = []

for k in range(1,11):

km = KMeans(n_clusters=k)

km.fit(x1)

inertia.append(km.inertia_) # km.inertia_就是族内误差平方和的计算函数

# 设置图表大小

plt.figure(1,figsize=(12,6))

# 绘制折线图来展示不同k值得族内误差平方和

plt.plot(range(1,11),inertia)

# 设置x轴、y轴标题

plt.xlabel("k值")

plt.ylabel("族内误差平方和")

# 设置图表标题

plt.title("查看最佳k值",fontsize=20)

plt.show()

分析解读

从上图可以看出,k值5以后得组内误差平方和曲线下滑趋缓,本着族群数尽量少,误差尽量小的原则,最佳k值选5。


【对数据集进行分类】

# 把k值设为5,用KMeans聚类算法把x1(年收入-支出数据集)划分成5类,获得每类的标签

km = KMeans(n_clusters=5)

y_means = km.fit_predict(x1)

y_means

分析解读

可见分成的5类族群,标签分别为0,1,2,3,4。


# 任选一类,查看年收入-支出数据

data = [x1[y_means==1,0],x1[y_means==1,1]]

data

# 获得每类数据集的中心点

center = [km.cluster_centers_[:,0],km.cluster_centers_[:,1]]

center


【可视化分析结果】

# 设置图表大小

plt.figure(1,figsize=(16,5))

# 分别绘制五类族群的散点图

plt.scatter(x1[y_means==0,0],x1[y_means==0,1],s=200,c="yellowgreen")

plt.scatter(x1[y_means==1,0],x1[y_means==1,1],s=200,c="cornflowerblue")

plt.scatter(x1[y_means==2,0],x1[y_means==2,1],s=200,c="olivedrab")

plt.scatter(x1[y_means==3,0],x1[y_means==3,1],s=200,c="violet")

plt.scatter(x1[y_means==4,0],x1[y_means==4,1],s=200,c="coral")

# 绘制每类族群中心点的散点图

plt.scatter(km.cluster_centers_[:,0],km.cluster_centers_[:,1],s=100,marker="^",c="black",label="中心点")

# 设置x轴、y轴标题

plt.xlabel("年收入")

plt.ylabel("支出")

# 设置图例

plt.legend()

plt.show()

分析解读

KMeans算法帮我们聚合出了五类用户,分别是低收入-高支出、低收入-低支出、收支平衡、高收入-高支出、高收入-低支出。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接