本文概述
- 什么是客户细分?
- 客户细分需求
- 细分类型
- 使用RFM分析进行客户细分
- 在Python中使用RFM识别潜在的客户群
- 总结
所有客户都有不同的需求。随着客户群和交易量的增加, 不容易理解每??个客户的需求。确定潜在客户可以改善营销活动, 从而最终增加销售额。在将这些客户分为不同的细分受众群时, 细分可以发挥更好的作用。
在本教程中, 你将涵盖以下主题:
- 什么是客户细分?
- 客户细分需求
- 细分类型
- 使用RFM分析进行客户细分
- 在Python中使用RFM识别潜在的客户群
- 总结
文章图片
客户细分需求
- 这将有助于确定最有潜力的客户。
- 它将帮助管理人员轻松地与目标受众群体进行交流。
- 另外, 帮助选择最佳媒体与目标受众群体进行交流。
- 它提高了服务质量, 忠诚度和保留率。
- 通过更好地了解细分需求来改善客户关系。
- 它提供了向上销售和交叉销售的机会。
- 这将帮助经理为目标客户设计特别优惠, 以鼓励他们购买更多产品。
- 它可以帮助公司领先于竞争对手。
- 它还有助于确定客户可能感兴趣的新产品。
文章图片
使用RFM分析进行客户细分 RFM(新近度, 频率, 货币)分析是一种基于行为的方法, 可将客户分组。它根据客户以前的购买交易对客户进行分组。客户最近购买多少次, 购买多少次。 RFM将客户分为不同的组, 以提供更好的服务。它可以帮助管理人员确定潜在客户以开展更多获利业务。有一部分客户是最大的花费者, 但是如果他们只购买一次或最近购买一次该怎么办?他们经常购买我们的产品吗?此外, 它还可以帮助经理进行有效的促销活动以提供个性化服务。
- Recency(R):谁最近购买了?自上次购买以来的天数(最近一次)
- 频率(F):谁经常购物?它表示购买总数。 ( 高频)
- 货币价值(M):谁有高购买金额?这表示客户花费的总金额(较高的货币价值)
RFM的步骤(汇率, 频率, 货币):
- 计算每个客户的新近度, 频率, 货币值。
- 使用四分位数将细分受众群值添加到RFM表。
- 按升序对客户RFM分数进行排序。
文章图片
2.使用四分位数将分段bin值添加到RFM表。
文章图片
3.将所有分数串联在单个列中(RFM_Score)。
文章图片
在Python中使用RFM识别潜在的客户群 导入所需的库
#import modulesimport pandas as pd # for dataframesimport matplotlib.pyplot as plt # for plotting graphsimport seaborn as sns # for plotting graphsimport datetime as dt
加载数据集 我们首先使用pandas read CSV函数加载所需的HR数据集。你可以从此链接下载数据。
data = http://www.srcmini.com/pd.read_excel("Online_Retail.xlsx")
data.head()
文章图片
data.tail()
文章图片
data.info()
<
class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908Data columns (total 8 columns):InvoiceNo541909 non-null objectStockCode541909 non-null objectDescription540455 non-null objectQuantity541909 non-null int64InvoiceDate541909 non-null datetime64[ns]UnitPrice541909 non-null float64CustomerID406829 non-null float64Country541909 non-null objectdtypes: datetime64[ns](1), float64(2), int64(1), object(4)memory usage: 33.1+ MB
data= http://www.srcmini.com/data[pd.notnull(data['CustomerID'])]
删除重复项 有时你会得到一个混乱的数据集。你可能需要处理重复项, 这会使你的分析失真。在python中, 熊猫提供了drop_duplicates()函数, 该函数删除重复或重复的记录。
filtered_data=http://www.srcmini.com/data[['Country', 'CustomerID']].drop_duplicates()
让我们进入数据洞察
#Top ten country's customerfiltered_data.Country.value_counts()[:10].plot(kind='bar')
<
matplotlib.axes._subplots.AxesSubplot at 0x7fd81725dfd0>
文章图片
在给定的数据集中, 你可以观察到大多数客户来自” 英国” 。因此, 你可以为英国客户过滤数据。
uk_data=http://www.srcmini.com/data[data.Country=='United Kingdom']
uk_data.info()
<
class 'pandas.core.frame.DataFrame'>
Int64Index: 361878 entries, 0 to 541893Data columns (total 8 columns):InvoiceNo361878 non-null objectStockCode361878 non-null objectDescription361878 non-null objectQuantity361878 non-null int64InvoiceDate361878 non-null datetime64[ns]UnitPrice361878 non-null float64CustomerID361878 non-null float64Country361878 non-null objectdtypes: datetime64[ns](1), float64(2), int64(1), object(4)memory usage: 24.8+ MB
熊猫中的describe()函数可方便地获取各种摘要统计信息。此函数返回计数, 均值, 标准偏差, 最小值和最大值以及数据的分位数。
uk_data.describe()
数量 | 单价 | 顾客ID | |
---|---|---|---|
计数 | 361878.000000 | 361878.000000 | 361878.000000 |
意思 | 11.077029 | 3.256007 | 15547.871368 |
小时 | 263.129266 | 70.654731 | 1594.402590 |
我 | -80995.000000 | 0.000000 | 12346.000000 |
25% | 2.000000 | 1.250000 | 14194.000000 |
50% | 4.000000 | 1.950000 | 15514.000000 |
75% | 12.000000 | 3.750000 | 16931.000000 |
最大值 | 80995.000000 | 38970.000000 | 18287.000000 |
uk_data = http://www.srcmini.com/uk_data[(uk_data['Quantity']>
0)]uk_data.info()
<
class 'pandas.core.frame.DataFrame'>
Int64Index: 354345 entries, 0 to 541893Data columns (total 8 columns):InvoiceNo354345 non-null objectStockCode354345 non-null objectDescription354345 non-null objectQuantity354345 non-null int64InvoiceDate354345 non-null datetime64[ns]UnitPrice354345 non-null float64CustomerID354345 non-null float64Country354345 non-null objectdtypes: datetime64[ns](1), float64(2), int64(1), object(4)memory usage: 24.3+ MB
过滤所需的列 在这里, 你可以过滤用于RFM分析的必要列。你只需要她的五个列CustomerID, InvoiceDate, InvoiceNo, Quantity和UnitPrice。 CustomerId将唯一地定义你的客户, InvoiceDate帮助你计算购买的新近度, InvoiceNo帮助你计算交易执行的时间(频率)。客户在每次交易中购买的数量和客户购买的每个单位的单价将帮助你计算购买的总金额。
uk_data=http://www.srcmini.com/uk_data[['CustomerID', 'InvoiceDate', 'InvoiceNo', 'Quantity', 'UnitPrice']]
uk_data['TotalPrice'] = uk_data['Quantity'] * uk_data['UnitPrice']
uk_data['InvoiceDate'].min(), uk_data['InvoiceDate'].max()
(Timestamp('2010-12-01 08:26:00'), Timestamp('2011-12-09 12:49:00'))
PRESENT = dt.datetime(2011, 12, 10)uk_data['InvoiceDate'] = pd.to_datetime(uk_data['InvoiceDate'])
uk_data.head()
顾客ID | 发票日期 | 发票号码 | 数量 | 单价 | 总价格 | |
---|---|---|---|---|---|---|
0 | 17850.0 | 2010-12-01 08:26:00 | 536365 | 6 | 2.55 | 15.30 |
1 | 17850.0 | 2010-12-01 08:26:00 | 536365 | 6 | 3.39 | 20.34 |
2 | 17850.0 | 2010-12-01 08:26:00 | 536365 | 8 | 2.75 | 22.00 |
3 | 17850.0 | 2010-12-01 08:26:00 | 536365 | 6 | 3.39 | 20.34 |
4 | 17850.0 | 2010-12-01 08:26:00 | 536365 | 6 | 3.39 | 20.34 |
- 对于新近度, 请计算当前日期与每个客户的上次购买日期之间的天数。
- 对于频率, 计算每个客户的订单数。
- 对于货币, 计算每个客户的购买总价。
rfm= uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (PRESENT - date.max()).days, 'InvoiceNo': lambda num: len(num), 'TotalPrice': lambda price: price.sum()})
rfm.columns
Index(['InvoiceDate', 'TotalPrice', 'InvoiceNo'], dtype='object')
# Change the name of columnsrfm.columns=['monetary', 'frequency', 'recency']
rfm['recency'] = rfm['recency'].astype(int)
rfm.head()
货币 | 频率 | 新近度 | |
---|---|---|---|
顾客ID | |||
12346.0 | 325 | 77183.60 | 1 |
12747.0 | 2 | 4196.01 | 103 |
12748.0 | 0 | 33719.73 | 4596 |
12749.0 | 3 | 4090.88 | 199 |
12820.0 | 3 | 942.34 | 59 |
qcut()是基于分位数的离散化函数。 qcut根据样本分位数对数据进行分箱。例如, 四个分位数的1000个值将产生一个分类对象, 指示每个客户的分位数成员身份。
rfm['r_quartile'] = pd.qcut(rfm['recency'], 4, ['1', '2', '3', '4'])rfm['f_quartile'] = pd.qcut(rfm['frequency'], 4, ['4', '3', '2', '1'])rfm['m_quartile'] = pd.qcut(rfm['monetary'], 4, ['4', '3', '2', '1'])
rfm.head()
货币 | 频率 | 新近度 | 四分位数 | f_quartile | m_quartile | |
---|---|---|---|---|---|---|
顾客ID | ||||||
12346.0 | 325 | 77183.60 | 1 | 1 | 1 | 1 |
12747.0 | 2 | 4196.01 | 103 | 4 | 1 | 4 |
12748.0 | 0 | 33719.73 | 4596 | 4 | 1 | 4 |
12749.0 | 3 | 4090.88 | 199 | 4 | 1 | 4 |
12820.0 | 3 | 942.34 | 59 | 3 | 2 | 4 |
rfm['RFM_Score'] = rfm.r_quartile.astype(str)+ rfm.f_quartile.astype(str) + rfm.m_quartile.astype(str)rfm.head()
货币 | 频率 | 新近度 | 四分位数 | f_quartile | m_quartile | RFM_得分 | |
---|---|---|---|---|---|---|---|
顾客ID | |||||||
12346.0 | 325 | 77183.60 | 1 | 1 | 1 | 1 | 111 |
12747.0 | 2 | 4196.01 | 103 | 4 | 1 | 4 | 414 |
12748.0 | 0 | 33719.73 | 4596 | 4 | 1 | 4 | 414 |
12749.0 | 3 | 4090.88 | 199 | 4 | 1 | 4 | 414 |
12820.0 | 3 | 942.34 | 59 | 3 | 2 | 4 | 324 |
# Filter out Top/Best cusotmersrfm[rfm['RFM_Score']=='111'].sort_values('monetary', ascending=False).head()
货币 | 频率 | 新近度 | 四分位数 | f_quartile | m_quartile | RFM_得分 | |
---|---|---|---|---|---|---|---|
顾客ID | |||||||
16754.0 | 372 | 2002.4 | 2 | 1 | 1 | 1 | 111 |
12346.0 | 325 | 77183.6 | 1 | 1 | 1 | 1 | 111 |
15749.0 | 235 | 44534.3 | 10 | 1 | 1 | 1 | 111 |
16698.0 | 226 | 1998.0 | 5 | 1 | 1 | 1 | 111 |
13135.0 | 196 | 3096.0 | 1 | 1 | 1 | 1 | 111 |
在本教程中, 你涵盖了有关客户细分的许多详细信息。你已经了解了客户细分是什么, 客户细分需求, 细分类型, RFM分析, 从头开始在python中实现RFM。此外, 你还介绍了熊猫的一些基本概念, 例如基于样本分位数处理仓位的重复项, groupby和qcut()。
希望你现在可以利用主题建模来分析自己的数据集。感谢你阅读本教程!
【Python客户细分简介】如果你想了解有关Python的更多信息, 请参加DataCmp的Python数据科学免费入门课程。
推荐阅读
- 降维技术(t-SNE简介)
- 使用Python BeautifulSoup抓取srcmini教程并进行分析
- Python中的文档字符串
- 在Pandas中加入DataFrames
- R Rstudio使用debugr进行调试
- 自动化机器学习(Python的TPOT库)
- 用Python揭开关键统计的神秘面纱
- R中的for循环用法
- 在R中创建列表