我报名参与金石计划1期应战——瓜分10万奖池,这是我的第23篇文章,点击检查活动详情
- 作者:韩信子@ShowMeAI
- 数据剖析实战系列:www.showmeai.tech/tutorials/4…
- 机器学习实战系列:www.showmeai.tech/tutorials/4…
- 本文地址:www.showmeai.tech/article-det…
- 声明:版权所有,转载请联络平台与作者并注明出处
- 保藏ShowMeAI检查更多精彩内容
许多公司的技术人员在做用户画像的作业,细分客户/客户分群是一个很有含义的作业,能够确保企业构建更个性化的消费者针对策略,同时优化产品和服务。
在机器学习的视点看,客户分群通常会选用无监督学习的算法完结。运用这些办法,咱们会先收集整理客户的根本信息,例如区域、性别、年纪、偏好等,再对其进行分群。
在之前的文章 依据机器学习的用户价值数据发掘与客户分群中,ShowMeAI 现已做了一些用户分群实操介绍,本篇内容中,ShowMeAI 将更深化地介绍聚类分群的办法,运用更丰厚的建模办法,并剖析模型评价的办法形式。
数据加载 & 根本处理
咱们先运用 pandas 加载 Mall_Customers数据,并做了一些最根本的数据清洗,把字段名称更改为明晰可理解的字符串格式。
实战数据集下载(百度网盘):大众号『ShowMeAI研究中心』回复『实战』,或者点击 这儿 获取本文 [27]依据多种聚类算法的商城用户分群!制作精准用户画像 『Mall_Customers数据集』
⭐ ShowMeAI官方GitHub:github.com/ShowMeAI-Hu…
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 g
pairplot_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是最高开销分数但是最低年收入组。 → 客户购买欲望强,但消费能力有限。
参考资料
- 依据机器学习的用户价值数据发掘与客户分群:showmeai.tech/article-det…
- 数据科学东西库速查表 | Pandas 速查表:www.showmeai.tech/article-det…
- 数据科学东西库速查表 | Matplotlib 速查表:www.showmeai.tech/article-det…
- 数据科学东西库速查表 | Seaborn 速查表:www.showmeai.tech/article-det…
- 图解数据剖析:从入门到精通系列教程:www.showmeai.tech/tutorials/3…
- 图解机器学习 | 聚类算法详解:ttps://www.showmeai.tech/article-detail/197