客户分群(客户细分)对于绘制用户画像、构建个性化推广、产品和服务策略,都十分重要。本文解说此过程中,多种机器学习聚类算法的建模流程与评估模式。

作者:韩信子@ShowMeAI
数据分析实战系列:https://www.showmeai.tech/tutorials/40
机器学习实战系列:https://www.showmeai.tech/tutorials/41
本文地址:https://www.showmeai.tech/article-detail/334
申明:版权所有,转载请分割平台与作者并注明出处
珍藏ShowMeAI查看更多精彩内容

很多公司的技术人员在做用户画像的工作,细分客户/客户分群是一个很有意义的工作,能够确保企业构建更个性化的消费者针对策略,同时优化产品和服务。

在机器学习的角度看,客户分群通常会采纳无监督学习的算法实现。利用这些办法,咱们会先收集整理客户的根本信息,例如地区、性别、年龄、偏好等,再对其进行分群。

在之前的文章 基于机器学习的用户价值数据挖掘与客户分群中,ShowMeAI 曾经做了一些用户分群实操介绍,本篇内容中,ShowMeAI 将更深刻地介绍聚类分群的办法,应用更丰盛的建模形式,并分析模型评估的办法模式。

数据加载 & 根本解决

咱们先应用 pandas 加载 Mall_Customers数据,并做了一些最根本的数据荡涤,把字段名称更改为清晰可了解的字符串格局。

实战数据集下载(百度网盘):公众号『ShowMeAI钻研核心』回复『实战』,或者点击 这里 获取本文 [[27]基于多种聚类算法的商城用户分群!绘制精准用户画像](https://www.showmeai.tech/art...) 『Mall_Customers数据集

ShowMeAI官网GitHub:https://github.com/ShowMeAI-Hub

df= pd.read csv( "Mall Customers.csv")df.rename (columns={"CustomerID": "id", "Age": "age", "Annual Income (k$)": "annual_income", "Spending Score (1-100)": "spending_score"}, inplace=True)df.drop(columns=["id"], inplace=True)

探索性数据分析

本文数据操作解决与剖析波及的工具和技能,欢送大家查阅 ShowMeAI 对应的教程和工具速查表,快学快用。

  • 图解数据分析:从入门到精通系列教程
  • 数据迷信工具库速查表 | Pandas 速查表
  • 数据迷信工具库速查表 | Matplotlib 速查表
  • 数据迷信工具库速查表 | Seaborn 速查表

上面咱们对数据做一些探索性数据分析,首先咱们的特色字段能够分为数值型类别型两种类型。前面咱们独自对两类特色字段进行剖析。

numcol = ["age", "annual_income", "spending_score"]objcol = ['Gender']

单变量剖析

① 类别型特色

咱们对性别(女性和男性)做计数统计和绘图,代码如下:

sns.set_style("ticks")my_pal = {"Male": "slateblue", "Female": "lightsalmon"}ax = sns.countplot(data=df, x="Gender", palette=-my_pal)ax.grid(True, axis='both' )for p in ax.patches:        ax.annotate( '{:.Of}'. format(p.get _height()), (p.get _x()+0.25, p.get_height()+0.3))        percentage = "{:.If}%'. format(100 * p.get height )/lendf[ "Gender" ]))        ax.annotate(percentage, (p.get x()+0.25, p.get height ( )/2))olt.title( "Gender Countolot")

② 数值特色

后续的用户分群会应用到聚类算法,为了确保聚类算法能够失常工作,咱们会查看间断值数据分布并查看异样值。如果不加这个步骤,重大歪斜的数据和异样值可能会导致很多问题。

如上图所示,除了annual_income特色有一个异样值之外,大多数数值特色曾经很规整了。

sns.set_style("ticks", {'axes.grid' : False})for idx, col in enumerate (numcol):        plt.figure()        f, ax = plt.subplots(nrows=2, sharex=True, gridspec_kw={"height_ratios": (0.2,0.85)}, figsize=(10,8));        plt.suptitle(f"{col.upper()}",y=0.93);        sns.boxplot(data=df,x=col,ax=ax[0],color="slateblue",boxprops=dict(alpha=.7),                                linewidth=0.8, width=0.6, fliersize=10,                                flierprops={ "marker" :"O", "markerfacecolor": "slateblue"},                                medianprops={ "color": "black", "linewidth":2.5})        sns.histplot(data=df, ×=col, ax=ax[1],multiple="layer", fill=True, color= "slateblue", bins=40)        ax2 =ax[1].twinx()        sns.kdeplot(data=df, x=col, ax=ax2,                                multiple="layer",                                fill=True,                                color="slateblue",                                bw_adjust=0.9,                                alpha=0.1,                                linestyles="--")        ax[1].grid(False)        ax[0].set(xlabel="");        ax[1].set _xlabel(col, fontsize=14)        ax[1].grid(True)

双变量剖析

咱们再对两两的特色做联结剖析,代码和绘制后果如下:

sns.set_style("ticks", {'axes.grid' : False})def pairplot_hue(df, hue, **kwargs):    g = sns.pairplot(df, hue=hue, **kwargs)    g.fig.subplots_adjust(top=0.9)    g.fig.suptitle(hue)    return gpairplot_hue(df[numcol+objcol], hue='Gender')

建模

数据缩放

为了保障后续聚类算法的性能成果,数值特色在送入模型之前须要做缩放解决。咱们间接应用 sklearn 中的 MinMaxScaler 缩放办法来实现这项工作,将数值型字段数据范畴转换为 [0,1]。

scaler = MinMaxScaler()df_scaled = df.copy()for col in numcol:        df scaled[col] = pd.DataFrame(scaler.fit_transform(df_scaled[col].values.reshape(-1,1) ))

模型抉择

本篇内容波及的聚类无监督学习算法,欢送大家查看ShowMeAI的教程文章:

  • 图解机器学习 | 聚类算法详解

① K-Means 聚类

K-Means 算法是一种无监督学习算法,它通过迭代和聚合来依据数据分布确定数据属于哪个簇。

② 档次聚类(BIRCH) 算法

BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies)翻译为中文就是『利用档次办法的均衡迭代规约和聚类』,全称非常复杂。简略来说,BIRCH 算法利用了一个树结构来帮忙咱们疾速的聚类,这个非凡的树结构,就是咱们前面要具体介绍的聚类特色树(CF-tree)。简略地说算法能够分为两步:

  • 1)扫描数据库,建设一棵寄存于内存的 CF-Tree,它能够被看作数据的多层压缩,试图保留数据的外在聚类构造;
  • 2)采纳某个选定的聚类算法,如 K-Means 或者凝聚算法,对 CF 树的叶节点进行聚类,把稠密的簇当作离群点删除,而把更浓密的簇合并为更大的簇。

模型评估

① 聚类算法评估

尽管说聚类是一个无监督学习算法,但咱们也有一些办法能够对其最终聚类成果进行评估,对咱们的建模和聚合有一些指导作用。

◉ 轮廓分数(Silhouette score)

轮廓分数( Silhouette score)是一种罕用的聚类评估形式。对于单个样本,设 a 是与它同类别中其余样本的均匀间隔,b 是与它间隔最近不同类别中样本的均匀间隔,轮廓系数为:

对于一个数据集,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数取值范畴是 [-1,1],同类别样本越间隔相近且不同类别样本间隔越远,分数越高。

◉ 卡林斯基哈拉巴斯得分(Calinski Harabasz score)

卡林斯基哈拉巴斯得分(Calinski Harabasz score)也称为方差比规范,由所有簇的簇间离散度(Between Group Sum of Squares, BGSS)之和与簇内离散度(Within Group Sum of Squares, WGSS)之和的比值计算得出。较高的 Calinski Harabasz 分数意味着更好的聚类(每个聚类中更密集)。以下给出计算过程:

第一步:计算簇间离散度(Between Group Sum of Squares, BGSS)

第二部:计算簇内离散度(Within Group Sum of Squares, WGSS)

第三步:计算卡林斯基哈拉巴斯得分(Calinski Harabasz score)

◉ 戴维斯布尔丹得分(Davies Bouldin score)

戴维斯布尔丹得分(Davies Bouldin score)示意每个集群与与其最类似的集群或每个集群的外部模式的均匀类似度。最低可能或最靠近零示意更好的聚类。

② 利用 K-Means 聚类

咱们先利用 K-Means 聚类对数据进行建模,聚合失去不同的用户簇,代码如下:

k_range = range(2,10)for x in k range:        model = KMeans(n_clusters=x, random_state=42)  X = df_scaled[[ "annual_ income", "spending_score"]]  model.fit(x)

评估 K-Means 算法的一种十分无效的办法是肘点法,它会可视化具备不同数量的簇的平方间隔之和(失真分数)的减速变动(递加收益)的过程。

咱们联合上述提到的3个得分,以及肘点法进行计算和绘图如下:

如上图所示,簇数 = 5 是实用于该数据集的适当簇数,因为它有着这些个性:

  • 开始递加收益(肘法)
  • 最高均匀轮廓分数
  • 绝对较高的 Calinski Harabarsz 评分(部分最大值)
  • Davies Bouldin 最低分数

咱们以5为聚类个数,对数据从新聚类,并散发聚类 id,而后再对数据进行散布剖析绘图,不同的用户簇的数据分布如下(咱们能够比拟清晰看到不同用户群的散布差别)。

③ 利用 BIRCH 聚类

咱们再应用 BIRCH 进行聚类,代码如下:

n = range(2,10)for x in n:  model = Birch(n_clusters=x, threshold=0.17)  X = df_scaledI[ "annual income", "spending_score"]]  model.fit(X)

与 K-Means 聚类不同,BIRCH 聚类没有失真分数。其余3 个评分指标(Silhouette、CH、DBI)依然雷同。

BIRCH 的计算也给出了簇数等于5这样的一个论断。咱们同样对数据进行散布剖析绘图,不同的用户簇的数据分布如下(仍旧能够比拟清晰看到不同用户群的散布差别)。

两种算法都得出类似的后果(不完全相同)。

④ 建模后果解释

咱们来对聚类后的后果做一些解释剖析,如下:

如上图所示,从年龄的角度来看,不同的用户簇有各自的一些散布特点:

  • 第 2 个用户簇 => 年龄在 27 到 40 岁之间 ,平均值为 33 岁。
  • 第 5 个用户簇 => 年龄在 18 到 35 岁之间 ,均匀为 25 岁。

从支出维度来看:

  • 用户群4和5的年收入大抵相等,大概为 26,000 美元。 → 低收入群体
  • 用户群1和2的年收入大抵相等,这意味着大概 87,000 美元。 → 高支出群体
  • 用户群3是独立组,均匀年收入为 55,000 美元。 → 中等支出群体

综合年龄和年收入得出以下后果。

结果表明

  • 用户群2和5的年龄范畴雷同,但年收入有显着差别
  • 用户群4和5的年收入范畴雷同,但第 5 段属于青少年组(20-40 岁)

从破费的角度来看分组的用户群:

结果表明

  • 用户群5的 收入得分最高
  • 用户群4的 收入得分最低

综合收入分和年收入来看。

结果表明:

  • 用户群1和2的年收入范畴雷同,但收入分范畴齐全不同。
  • 用户群4和5的年收入范畴雷同,但收入分范畴齐全不同。

论断

咱们对各个用户群进行均匀汇总,并绘制图表如下:

  • 用户群1是最高年收入组,但有最差的收入生产。 → 目前商城的产品并不是这部分客户的生产首选(非指标客户)。
  • 用户群2的平均年龄比第 1 段低 10 倍,但在雷同年收入范畴内的均匀收入分数是 4 倍。
  • 用户群5是最高收入分数然而最低年收入组。 → 客户购买欲望强,但生产能力无限。

参考资料

  • 基于机器学习的用户价值数据挖掘与客户分群:https://showmeai.tech/article-detail/325
  • 数据迷信工具库速查表 | Pandas 速查表:https://www.showmeai.tech/article-detail/101
  • 数据迷信工具库速查表 | Matplotlib 速查表:https://www.showmeai.tech/article-detail/103
  • 数据迷信工具库速查表 | Seaborn 速查表:https://www.showmeai.tech/article-detail/105
  • 图解数据分析:从入门到精通系列教程:https://www.showmeai.tech/tutorials/33
  • 图解机器学习 | 聚类算法详解:ttps://www.showmeai.tech/article-detail/197