产品运营中为什么需要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算法帮我们聚合出了五类用户,分别是低收入-高支出、低收入-低支出、收支平衡、高收入-高支出、高收入-低支出。