个性化阅读
专注于IT技术分析

Python客户细分简介

本文概述

在零售部门, 各种大型超市产生大量数据。该数据每天在商店中生成。这个庞大的客户交易数据库需要进行分析以设计获利策略。

所有客户都有不同的需求。随着客户群和交易量的增加, 不容易理解每​​个客户的需求。确定潜在客户可以改善营销活动, 从而最终增加销售额。在将这些客户分为不同的细分受众群时, 细分可以发挥更好的作用。

在本教程中, 你将涵盖以下主题:

  • 什么是客户细分?
  • 客户细分需求
  • 细分类型
  • 使用RFM分析进行客户细分
  • 在Python中使用RFM识别潜在的客户群
  • 总结

什么是客户细分?

客户细分是一种基于共同特征将客户分为组或群的方法。市场研究人员可以使用各种客户的人口统计特征(例如职业, 性别, 年龄, 位置和婚姻状况)将客户划分为B2C模型。心理特征(例如社会阶层, 生活方式和个性特征)和行为特征(例如支出, 消费习惯, 产品/服务使用情况以及以前购买的产品)。在B2B模型中, 使用公司的各种特征, 例如公司的规模, 行业类型和位置。

Python客户细分简介1

客户细分需求

  • 这将有助于确定最有潜力的客户。
  • 它将帮助管理人员轻松地与目标受众群体进行交流。
  • 另外, 帮助选择最佳媒体与目标受众群体进行交流。
  • 它提高了服务质量, 忠诚度和保留率。
  • 通过更好地了解细分需求来改善客户关系。
  • 它提供了向上销售和交叉销售的机会。
  • 这将帮助经理为目标客户设计特别优惠, 以鼓励他们购买更多产品。
  • 它可以帮助公司领先于竞争对手。
  • 它还有助于确定客户可能感兴趣的新产品。

细分类型

Python客户细分简介2

使用RFM分析进行客户细分

RFM(新近度, 频率, 货币)分析是一种基于行为的方法, 可将客户分组。它根据客户以前的购买交易对客户进行分组。客户最近购买多少次, 购买多少次。 RFM将客户分为不同的组, 以提供更好的服务。它可以帮助管理人员确定潜在客户以开展更多获利业务。有一部分客户是最大的花费者, 但是如果他们只购买一次或最近购买一次该怎么办?他们经常购买我们的产品吗?此外, 它还可以帮助经理进行有效的促销活动以提供个性化服务。

  • Recency(R):谁最近购买了?自上次购买以来的天数(最近一次)
  • 频率(F):谁经常购物?它表示购买总数。 ( 高频)
  • 货币价值(M):谁有高购买金额?这表示客户花费的总金额(较高的货币价值)

在此, 三个变量(“新近度”, “频率”和”货币”)中的每一个均由四个相等的组组成, 这些组创建了64个(4x4x4)不同的客户群。

RFM的步骤(汇率, 频率, 货币):

  1. 计算每个客户的新近度, 频率, 货币值。
  2. 使用四分位数将细分受众群值添加到RFM表。
  3. 按升序对客户RFM分数进行排序。

1.计算每个客户的新近度, 频率, 货币值。

Python客户细分简介3

2.使用四分位数将分段bin值添加到RFM表。

Python客户细分简介4

3.将所有分数串联在单个列中(RFM_Score)。

Python客户细分简介5

在Python中使用RFM识别潜在的客户群

导入所需的库

#import modules
import pandas as pd # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
import datetime as dt

加载数据集

我们首先使用pandas read CSV函数加载所需的HR数据集。你可以从此链接下载数据。

data = pd.read_excel("Online_Retail.xlsx")
data.head()
Python客户细分简介6
data.tail()
Python客户细分简介7
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):
InvoiceNo      541909 non-null object
StockCode      541909 non-null object
Description    540455 non-null object
Quantity       541909 non-null int64
InvoiceDate    541909 non-null datetime64[ns]
UnitPrice      541909 non-null float64
CustomerID     406829 non-null float64
Country        541909 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.1+ MB
data= data[pd.notnull(data['CustomerID'])]

删除重复项

有时你会得到一个混乱的数据集。你可能需要处理重复项, 这会使你的分析失真。在python中, 熊猫提供了drop_duplicates()函数, 该函数删除重复或重复的记录。

filtered_data=data[['Country', 'CustomerID']].drop_duplicates()

让我们进入数据洞察

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fd81725dfd0>
Python客户细分简介8

在给定的数据集中, 你可以观察到大多数客户来自”英国”。因此, 你可以为英国客户过滤数据。

uk_data=data[data.Country=='United Kingdom']
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 361878 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      361878 non-null object
StockCode      361878 non-null object
Description    361878 non-null object
Quantity       361878 non-null int64
InvoiceDate    361878 non-null datetime64[ns]
UnitPrice      361878 non-null float64
CustomerID     361878 non-null float64
Country        361878 non-null object
dtypes: 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 = uk_data[(uk_data['Quantity']>0)]
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 354345 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      354345 non-null object
StockCode      354345 non-null object
Description    354345 non-null object
Quantity       354345 non-null int64
InvoiceDate    354345 non-null datetime64[ns]
UnitPrice      354345 non-null float64
CustomerID     354345 non-null float64
Country        354345 non-null object
dtypes: 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=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分析

在这里, 你将执行以下操作:

  • 对于新近度, 请计算当前日期与每个客户的上次购买日期之间的天数。
  • 对于频率, 计算每个客户的订单数。
  • 对于货币, 计算每个客户的购买总价。
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 columns
rfm.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

计算RFM值的位数

新近度最低, 频率最高和货币金额最高的客户被视为最高客户。

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结果解释

将所有三个四分位(r_quartile, f_quartile, m_quartile)合并到一个列中, 此排名将帮助你细分客户分组。

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 cusotmers
rfm[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的更多信息, 请参加DataCmp的Python数据科学免费入门课程。

赞(0)
未经允许不得转载:srcmini » Python客户细分简介

评论 抢沙发

评论前必须登录!