一、问题描述
客户个性化消费数据分析是对公司理想客户的详细分析。它帮助企业更好地了解其客户,并使他们更容易根据不同类型客户的特定需求、行为和关注点来修改产品。 客户个性化消费数据分析帮助企业根据其目标客户来自不同类型的客户细分市场来修改其产品。例如,与其花费资金向公司数据库中的每个客户推销新产品,不如公司分析哪个客户细分市场最有可能购买该产品,然后仅在该特定细分市场上推销该产品,进行精准营销。
二、数据集内容
数据结构
数据集marketing_campaign.csv包括:人员、产品、促销和地点共4类属性。数据集发布时间是2018年。
**人员**
ID:客户的唯一标识符
Year_Birth:客户的出生年份
Education:客户的教育水平
Marital_Status:客户的婚姻状况
Income:客户的年度家庭收入
Kidhome:客户家庭中的孩子数量
Teenhome:客户家庭中的青少年数量
Dt_Customer:客户加入公司的日期
Recency:自客户上次购买以来的天数
Complain:如果在过去2年中有投诉则为1,否则为0
**产品**
MntWines:过去2年中在葡萄酒上的花费
MntFruits:过去2年中在水果上的花费
MntMeatProducts:过去2年中在肉类产品上的花费
MntFishProducts:过去2年中在鱼类产品上的花费
MntSweetProducts:过去2年中在糖果上的花费
MntGoldProds:过去2年中在黄金上的花费
**促销**
NumDealsPurchases:使用折扣购买的次数
AcceptedCmp1:如果客户在第1次活动中接受了优惠则为1,否则为0
AcceptedCmp2:如果客户在第2次活动中接受了优惠则为1,否则为0
AcceptedCmp3:如果客户在第3次活动中接受了优惠则为1,否则为0
AcceptedCmp4:如果客户在第4次活动中接受了优惠则为1,否则为0
AcceptedCmp5:如果客户在第5次活动中接受了优惠则为1,否则为0
Response:如果客户在最后一次活动中接受了优惠则为1,否则为0
**地点**
NumWebPurchases:通过公司网站进行的购买次数
NumCatalogPurchases:使用目录进行的购买次数
NumStorePurchases:直接在商店进行的购买次数
NumWebVisitsMonth:上个月访问公司网站的次数
数据样例
ID | Year_Birth | Education | Marital_Status | Income | Kidhome | Teenhome | Dt_Customer | Recency | MntWines | MntFruits | MntMeatProducts | MntFishProducts | MntSweetProducts | MntGoldProds | NumDealsPurchases | NumWebPurchases | NumCatalogPurchases | NumStorePurchases | NumWebVisitsMonth | AcceptedCmp3 | AcceptedCmp4 | AcceptedCmp5 | AcceptedCmp1 | AcceptedCmp2 | Complain | Z_CostContact | Z_Revenue | Response |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
5524 | 1957 | Graduation | Single | 58138 | 0 | 0 | 04-09-2012 | 58 | 635 | 88 | 546 | 172 | 88 | 88 | 3 | 8 | 10 | 4 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 1 |
2174 | 1954 | Graduation | Single | 46344 | 1 | 1 | 08-03-2014 | 38 | 11 | 1 | 6 | 2 | 1 | 6 | 2 | 1 | 1 | 2 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
4141 | 1965 | Graduation | Together | 71613 | 0 | 0 | 21-08-2013 | 26 | 426 | 49 | 127 | 111 | 21 | 42 | 1 | 8 | 2 | 10 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
6182 | 1984 | Graduation | Together | 26646 | 1 | 0 | 10-02-2014 | 26 | 11 | 4 | 20 | 10 | 3 | 5 | 2 | 2 | 0 | 4 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
5324 | 1981 | PhD | Married | 58293 | 1 | 0 | 19-01-2014 | 94 | 173 | 43 | 118 | 46 | 27 | 15 | 5 | 5 | 3 | 6 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
7446 | 1967 | Master | Together | 62513 | 0 | 1 | 09-09-2013 | 16 | 520 | 42 | 98 | 0 | 42 | 14 | 2 | 6 | 4 | 10 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
965 | 1971 | Graduation | Divorced | 55635 | 0 | 1 | 13-11-2012 | 34 | 235 | 65 | 164 | 50 | 49 | 27 | 4 | 7 | 3 | 7 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 11 | 0 |
致谢
数据集由Dr. Omar Romero-Hernandez提供。
数据集使用许可协议
Deed – CC0 1.0 Universal – Creative Commons
三、聚类算法
1. 加载数据
2. 数据清洗
3. 预处理
3.1. 数据转换
我们可以按照以下方式转换一些特征:
- 用客户年龄替换出生年份
- 从Marital_Status、Kidhome和Teenhome中找出家庭规模和孩子数量
- 找出从该人成为客户以来的天数,作为Dt_Customer的替代
- 通过汇总在葡萄酒、水果、肉类、鱼类、糖果和黄金上的所有消费,找出客户总共花费的金额
- 通过汇总在交易、网络、目录和商店上的所有购买,找出客户的总购买次数
- 找出客户接受的总活动次数
3.2. 异常值移除
我们可以看到年龄、收入和购买中存在一些异常值。年龄和收入中的异常值将被移除,因为它们是非常少的数据点。购买中的异常值将被保留,因为值的范围内相当大。
3.3. 对分类特征编码
我们拥有的两个分类特征可以按以下方式编码:
- 教育:使用标签编码器,因为它被认为是有序的
- 婚姻状况:对于“婚姻状况”这一特征,将采用独热编码(One Hot Encoding)进行处理,因为该特征被认为是名义变量(Nominal Variable)。
说明:名义变量(Nominal Variable):名义变量是一种分类变量,其中的类别之间没有固定的顺序或等级关系。例如,“婚姻状况”可能包括“已婚”、“未婚”、“离异”等类别,这些类别之间没有明确的排序或优先级。
独热编码(One Hot Encoding):独热编码是一种处理分类变量的方法,它将每个类别转换为一个二进制向量。对于有n个类别的分类变量,独热编码会生成n个新的特征列,每个特征列对应一个类别。如果某个样本属于该类别,则对应的特征列值为1,否则为0。
例如,对于“婚姻状况”这一特征,如果类别有“已婚”、“未婚”、“离异”,独热编码会生成三个新的特征列:“Marital_Status_已婚”、“Marital_Status_未婚”、“Marital_Status_离异”。如果某个样本的婚姻状况是“已婚”,则“Marital_Status_已婚”列的值为1,其余两列的值为0。
通过独热编码,可以将名义变量转换为数值形式,便于机器学习算法进行处理和分析。
3.4. 特征缩放
3.5. 特征提取
很多特征具有很高的相关性值。将使用主成分分析(PCA)来减少维度,同时保留95%的变异。
4.聚类
首先,我们需要很好地了解我们的数据集中有多少个簇。为了确定这一点,我们将使用肘部方法/elbow method。根据图表,我们选择聚类个数k的值为4。
#clustering data and adding the output to the data dataframe
clusters = KMeans(n_clusters=4, random_state=201).fit(reduced_data)
data["Personality"]= clusters.labels_
dataCopy["Personality"]= clusters.labels_
#define labels
labels = ['Personality 0', 'Personality 1', 'Personality 2', 'Personality 3']
counts= []
#compute counts
for i in range(4):
counts.append(len(data[data["Personality"]==i]))
plt.figure(figsize=(15, 5), dpi=80)
plt.rcParams.update({'axes.grid': False})
#pie plot
ax1 = plt.subplot2grid((1,2),(0,0))
ax1.set_title("Percentage of Customers In Each Personality")
plt.pie(counts, labels = labels, autopct='%.0f%%')
#bar plot
ax1 = plt.subplot2grid((1,2), (0, 1))
ax1.set_title("Histogram of Customer Count In Each Personality")
sns.countplot(x=data["Personality"], alpha=.9, ax=ax1)
sns.despine()
plt.show()
5. 客户特征分析
人口统计学特征:根据年龄分布特征0~3的分析结果,
* 特征0和3:年轻人比老年人多
* 特征1:具有广泛且几乎均匀的分布,显示出年龄组的多样化变化。
* 特征2:与其他特征相比,主要由老年人组成
详细信息参见源码的运行结果。