电商用户购买行为数据分析
1 相关背景
数据来源:该数据集来自The UCI Machine Learning Repository
数据背景:该数据集是英国某电商在2年内的全部在线销售数据,该电商主要销售独特的全时礼品,多数客户是批发零售商。该类产品的销售不需要太多的售前服务,消费也具有一定的频次。
分析目的:从海量购买数据中,挑选出优质客户?对客户进行细分并提出具有针对性的业务策略。
2 理解数据
1) 数据大小:1067371行数据,8个字段
2) 时间节点:2009年12月1日~2011年12月9日
3) 数据来源:点击下载
4) 字段说明:
字段名 | 说明 |
---|---|
InvoiceNo | 发票编号。每个交易分配唯一的6位整数。如果此代码以字母 “C” 开头,则表示已取消。 |
StockCode | 产品编号。每个不同产品分配唯一的5位整数。 |
Description | 产品名称、描述。 |
Quantity | 每笔交易中每个产品(项目)的数量。 |
InvoiceDate | 发票日期和时间。生成交易的日期和时间。 |
UnitPrice | 单价。单位产品的价格,货币单位为英镑。 |
CustomerID | 客户编号。每个客户分配唯一的5位整数。 |
Country | 国家名称。客户居住国家或地区的名称。 |
3数据清洗
3.1 导入数据
原数据集是以Excel表格的形式保存的,需要先另存为csv格式,再导入PostgreSQL数据库。
--创建表
CREATE TABLE online
(Invoice VARCHAR(8) NOT NULL,
StockCode VARCHAR(15),
Description VARCHAR(52),
Quantity NUMERIC,
InvoiceDate DATE,
Price NUMERIC,
Customer_ID VARCHAR(12),
Country VARCHAR(30));
将online.csv 导入表
COPY online ( Invoice, StockCode, Description, Quantity, InvoiceDate,
Price, Customer_ID, Country ) from 'D:\online.csv' WITH CSV HEADER;
查看表的前5行
SELECT * FROM online LIMIT 5;
3.2 去除重复数据
创建一个临时表,保存去除重复记录后的数据
CREATE TABLE new_table AS SELECT DISTINCT * FROM online;
原有数据1067371条,去重后数据1033034条,删除重复值34337条。
--删除旧的表
DROP TABLE online;
--将新的表重命名
ALTER TABLE new_table RENAME TO online;
3.3缺失值处理
查看缺失值的数量
SELECT SUM(CASE WHEN invoice IS NULL THEN 1 ELSE 0 END) AS "发票编号",
SUM(CASE WHEN stockcode IS NULL THEN 1 ELSE 0 END) AS "商品编号",
SUM(CASE WHEN description IS NULL THEN 1 ELSE 0 END) AS "商品描述",
SUM(CASE WHEN quantity IS NULL THEN 1 ELSE 0 END) AS "数量",
SUM(CASE WHEN invoicedate IS NULL THEN 1 ELSE 0 END) AS "发票时间",
SUM(CASE WHEN price IS NULL THEN 1 ELSE 0 END) AS "单价",
SUM(CASE WHEN customer_id IS NULL THEN 1 ELSE 0 END) AS "客户编号",
SUM(CASE WHEN country IS NULL THEN 1 ELSE 0 END) AS "国家"
FROM online;
customer_id存在235151个空值,description存在4275个空值。在实际中空值应该找数据来源部门补全数据,此处无法核实,暂且将空值替换为‘NULL’,作为特殊标记。商品描述存在的空值,对本次分析没什么影响。
UPDATE online SET customer_id = COALESCE(NULLIF(TRIM("customer_id"), ''), 'NULL');
替换后缺失值的数量
3.4 异常值处理
3.4.1 时间异常值检查
检查日期是否存在异常值,所有日期必须在范围内(2009年12月1日到2011年12月9日)
SELECT MIN(invoicedate), MAX(invoicedate) FROM online;
日期符合要求,没有异常值。
3.4.2数量的异常值处理
查看价格与数量是否有“0”或负数值,按正常销售的情况,价格与数量均应该为正数。
SELECT MIN(price) AS “最低价格”, MAX(price) AS “最高价格”,
MIN(quantity) AS “最小数量”, MAX(quantity) AS “最大数量” FROM online;
价格与数量均存在负值。根据数据集的说明,数据集中包含了取消的订单,订单号以”C”开头的是取消的订单。同时如果订单已经生成,却没有最终完成交易,也可能是异常值出现的原因。
因为本次分析的目的是交易数据,所有未完成交易的数据可以删除掉,以便后面分析数据。
SELECT COUNT(*) FROM online WHERE quantity<='0';
一共有22496条数量为0或负数的记录,删除这些记录。
DELETE FROM online WHERE quantity<='0';
查看还有没有订单号以”C”开头记录。其实还有一条记录,因为金额是正的,所以没有删掉。也把它删掉。
SELECT * FROM online WHERE invoice LIKE 'C%';
DELETE FROM online WHERE invoice LIKE 'C%';
3.4.3单价的异常值处理
检查单价为0的订单。
SELECT COUNT(*) FROM online WHERE price='0';
删除了数量为0或负数的记录,还剩下2621条价格为0的记录。推测可能是做活动推广时的促销赠品。
--查询价格为负数的记录
SELECT * FROM online WHERE price < 0;
这几条记录注释都是Adjust bad debt,意思是调整坏账,也和销售分析无关。
--删除单价为0或负数的记录。
DELETE FROM online WHERE price<= 0;
再次查询注释为Adjust bad debt的,发现还有一条数据。价格是正数还没删除。因为不是交易记录,也把它删掉。
SELECT * FROM online WHERE description = 'Adjust bad debt';
DELETE FROM online WHERE description = 'Adjust bad debt';
3.5增加小计
在数据集中,只有数量quantity和单价price,需要求出总价。
ALTER TABLE online ADD COLUMN amounts NUMERIC;
UPDATE online SET amounts = (quantity*price);
4. 数据分析
根据分析目的,采用RFM模型,从用户、时间、国家等维度展开分析。
RFM分析是根据客户活跃程度和交易金额贡献,进行客户价值细分的一种客户细分方法。RFM分析,主要由三个指标构成,分别是R(Recency)近度,F(Frequency)频度,M(Monetary)额度组成。
R表示近度(Recency),也就是客户最近一次交易时间到现在的间隔,要注意,R是最近一次交易时间到现在的间隔,而不是最近一次的交易时间,R越大,表示客户未发生交易的时间越长;R越小,表示客户未发生交易时间越短。
F表示频度(Frequency),也就是客户在最近一段时间内的交易次数,F越大,表示客户交易越频繁,F越小,表示客户越不活跃。
M表示额度(Monetary),也就是客户在最近一段时间内的交易金额,M越大,表示客户价值越高;M越小,表示客户价值越低。
R、F、M三个维度,根据分值分为高低两类。高,表示该指标高于平均值;低,表示该指标低于平均值。最终三个指标,每个指标分为高低两类,两两组合,就细分为八大客户群体。
使用RFM分析,需要满足以下三点假设:
1) 假设最近有过交易行为的客户,再次发生交易的可能性要高于最近没有交易行为的客户;
2) 假设交易频率较高的客户比交易频率较低的客户更有可能再次发生交易行为;
3) 假设过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性。
尽管大多数场景都符合这三个假设条件,但在使用RFM分析之前,还是需要结合实际的业务场景,判断是否都符合以上三个假设条件。
按照R、F、M的高低,可以分成8类客户。
R_S分类 | F_S分类 | M_S分类 | 客户类型 | 用户行为 |
---|---|---|---|---|
高 | 高 | 高 | 高价值客户 | 最近买过,经常买,消费多 |
低 | 高 | 高 | 重点唤回客户 | 消费多,次数买,但最近无交易,需要唤回 |
高 | 低 | 高 | 重点发展客户 | 消费多,最近有购买,但购买次数少,要重点发展 |
低 | 低 | 高 | 重点挽留客户 | 消费多,很久没买了,将要流失,要重点挽留 |
高 | 高 | 低 | 一般价值客户 | 交易次数多频率高,但是累计金额小 |
低 | 高 | 低 | 一般保持客户 | 交易次数多,但价值不大,一般维持 |
高 | 低 | 低 | 一般发展客户 | 最近有交易,但频率和金额不到,新客户属于这一类 |
低 | 低 | 低 | 流失客户 | 三个指标都低于平均值,最近没交易相当于流失 |
SELECT COUNT(*) AS "总数据", COUNT(DISTINCT invoice) AS "总订单数",
COUNT(DISTINCT customer_id) AS "总客户数" FROM online;
一共有1007910条数据,40076个订单,5879个客户
聚合为订单数据,每张订单一条数据。原数据集中,一个订单各个条目分开记录的,把各条目金额加总,total_amt表示这个订单的总金额。
CREATE TABLE orders AS
SELECT invoice, customer_id, invoicedate, SUM(amounts) AS “total_amt”
FROM online GROUP BY invoice, customer_id, invoicedate;
客户编号customer_id缺失的记录,被汇总为同一个客户的了。暂不对客户编号缺失的数据进行分析。
DELETE FROM orders WHERE customer_id = 'NULL';
只提取为RFM分析需要的字段。
在SPSS中又一个针对营销行为的直销模块,RFM分析可以用这个模块完成,并可以输出分析结果,实现数据可视化。将数据库中的orders表导入到SPSS中。
单击【分析】菜单,选择【直销】【选择技术】,弹出【直销】对话框。在【直销】对话框中,单击【帮助确定我的最佳联系人(RFM分析)】,然后单击【继续】按钮。【RFM分析:数据格式】对话框中选择【交易数据】。在【交易数据RFM分析】的【变量】选项卡中,将变量移动到对应的位置,如图所示。
在【输出】选项卡中,勾选全部选项。然后点击【确认】。分箱化按照0.2, 0.4, 0.6, 0.8的阈值,评定1-5的整数得分。
随后生成了如下的数据文件。
崭新_得分,表示R_S,即最后一次交易间隔的得分。
频率_得分,表示F_S,即交易总次数的得分。
消费金额_得分,表示M_S,即交易总金额的得分。
输出结果中“RFM分箱计数”图,显示了分箱分布。每个条形都表示被赋予每个组合RFM得分的客户数。希望获得相当均匀的分布,即所有(或大多数)条形的高度大致相同,但其实也会产生一定程度的偏差。从分箱结果来看,虽然有3个空分箱,但其他分箱的频数分布相对均匀。可能是靠近边际的个案,大多被划分到R_S=2, F_S=1的分箱中。总体来说尚且呈现近似的均匀分布。
个案处理摘要。对5878个客户进行分析,没有缺失值。
RFM交叉表。是将“RFM分箱计数”图,以表格的形式展示出来。
RFM热图,用颜色深浅表示交易金额的大小。可以发现,随着R_S和F_S的分值越大,颜色越深,即右侧的颜色比左侧深,上方的颜色比下方深,说明客户最近一次交易时间间隔越近,交易次数越多,其平均交易金额越多。
“RFM分布直方图”。显示了最近一次交易时间、交易总次数和交易金额的频率分布,以此来判断各自的客户人群分布的情况,横轴的排列顺序较小的值在左边,较大的在右边,频率和货币两项的横坐标是对数刻度。大部分客户在最近进行过交易,经过处理后的交易金额也大致呈正态分布。
“RFM散点图”,是最近一次交易时间、交易总次数和交易金额之间的散点图。通过散点图可以清晰、直观地看到三个分析指标两两之间的关系。可以看出,交易总次数和交易金额存在较为明显的正相关性,而最近一次交易时间和另外两个分析指标之间的也有一定的正相关性,但相关性较弱。
接下来对R_S,F_S,M_S的评分进行描述统计。结果如下表所示。均值是我们关注的。
将每个客户的R_S,F_S,M_S与均值比较,如果低于均值就定义为“低”,如果高于均值就定义为“高”。
在【转换】菜单中的【重新编码为不同变量】,分别将R_S,F_S,M_S的值按“高”与“低”确定新的变量,“高”用2表示,“低”用1表示。再用【转换】菜单中的【计算变量】,用三个分类的情况,定义“客户分类”变量,用1-8来编码。
最后在【数据】菜单中的【定义变量属性】中,将1-8分别定义为8种客户类型。
各个分层的客户数量及构成,如下图所示。
最后如图所示。
5. 结论与措施
本次分析涉及到5878位客户,他们的总交易金额17374770.67英镑。高价值客户只占总人数的22.4%,却贡献了69.3%的交易额。虽然并不恰好是20%和80%,但情况基本符合帕累托法则。
少数高价值客户支撑了大多数销售额,通过本次分析,就是要将这少数关键客户找出来,以便后续提供更好的服务,对于公司的发展和业绩的增长起到帮助。
针对不同级别的客户,采取不同的业务策略。采取有效的倾斜性措施,确保重点方面取得重点突破,进而带动全面。同时对于价值不高的客户群体,要“有所为,有所不为”,结合实际情况,在适当的条件下可以舍弃。
客户类型 | 用户行为 | 业务策略 |
---|---|---|
高价值客户 | 最近买过,经常买,消费多 | 倾斜更多资源,VIP服务,个性化服务及附加销售等 |
重点唤回客户 | 消费多,次数买,但最近无交易,需要唤回 | 邮件DM营销,提供有用的资源,可以通过续订/更新产品换回他们 |
重点发展客户 | 消费多,最近有购买,但购买次数少,要重点发展 | 提供会员、积分等计划,推荐其他相关产品等 |
重点挽留客户 | 消费多,很久没买了,将要流失,要重点挽留 | 重点联系或拜访,提高留存率 |
一般价值客户 | 交易次数多频率高,但是累计金额小,有潜力 | 向上销售价值更高,更有用的产品,提示评论,吸引他们 |
一般保持客户 | 交易次数多,但价值不大,一般维持 | 积分会员制,分享宝贵的资源,以折扣推荐热门产品,与他们重新联系 |
一般发展客户 | 最近有交易,但频率和金额不到,新客户属于这一类 | 留住新客户,会员社群活动,提供免费试用或服务,提高客户的兴趣,创建品牌知名度 |
流失客户 | 三个指标都低于平均值,最近没交易相当于流失 | 以促销折扣等方式回复客户兴趣,否则暂时放弃无价值的客户 |
作者:钱奇天
上一篇: python实现淘宝用户行为数据分析