一、项目描述
1.1 项目背景:
该数据集由kaggle提供的,为英国一家在线零售商在2010年12月1日到2011年12月9日的网络交易订单数据,该电商公司主要以销售各类礼品为主,主要客户是批发商。
1.2 分析工具
MYSQL + Tebleau
1.3 分析步骤
1.4 分析结论
从商品销售规律和用户行为特征两个方面对数据集进行了探索性的分析:
1)有效订单共19960笔,笔单价为533.17英镑,连带率约为279件。订单以批发性质为主,总体来说订单交易金额与订单内商品件数正相关。
2)客单价为2049英镑,客户的购买力存在较大的差异,总体来说客户消费金额与购买商品数量呈正相关。随着时间的推移,其订单成交量,商品售卖数量,交易总额是震荡上升,到了年底会达到一个最高峰。
3)该电商主营低价的小商品批发业务,低于5美元的商品最受欢迎。低价商品不仅销售数量更多,也是销售额的主要组成部分;
4)该网站大部分的交易发生在英国本地,并向英国周边国家辐射。
5)用户生命周期的分布呈两极分化的状态,36%的用户仅消费过一次,该电商需要更加重视客户初次购买的体验感,引导用户进行多次消费;另有部分用户有极高的用户粘性。
6)该网站30%的客户贡献了80%的消费额,属于明显的消费数据,基本符合二八原则。
二、数据理解
1. 发生时间
2010年12月1日到2011年12月9日
2. 数据集大小
541909条数据,8个字段
3.字段说明
三、明确分析目的
四、数据清理
主要按以下思路进行数据清洗
1. 导入数据并删除重复值
//1.navicat 导入csv文件 data.csv
//2.创建工作表ecommerce
create table ecommerce like data;
//工作表插入数据并去重
insert into ecommerce select distinct * from data;
数据集原有数据541909条,去重后有536641条记录
2. 处理缺失值
select sum(case when Invoice No 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 UnitPrice is null then 1 else 0 end) as 商品单价,
sum(case when CustomerID is null then 1 else 0 end) as 客户编号,
sum(case when Country is null then 1 else 0 end) as Country from ecommerce;
商品描述不影响我们的分析,可以暂时不理会。
客户编号是客户的唯一标识,共缺失135037条数据,缺失数据占1/5,现实情况可以要求相关负责人补全,在这里,可以填充为CustomerID=0。但是当我们分析对象是客户时,需要排除CustomerID=0的记录。
//填充缺失的CustomerID
update ecommerce set CustomerID = 0 where CustomerID is null;
3. 格式一致化
3.1 更改时间格式:
根据分析目的,我们需要把InvoiceTime转换成方便处理的日期。
//增加日期列 Dtime,并填充数据
alter table ecommerce add column Dtime char(20) not null;
update ecommerce set Dtime = str_to_date(InvoiceDate,'%m/%d/%Y %H:%i');
3.2 增加消费金额列
根据分析目的,我们增加消费金额列用于存放改行数据的总价,方便后面分析
// 增加消费金额列Amounts ,并填充数据
ALTER TABLE ecommerce add column Amounts decimal(8,2) not null;
update ecommerce set Amounts = Quantity * UnitPrice;
4. 处理异常值
4.1 检查日期是否在规定时间内
select max(InvoiceDate),min(InvoiceDate) from ecommerce;
结果显示,所有日期都在规定日期范围内,属于正常数据。
4.2 检查单价和数量是否存在负值或零值
4.2.1 数量异常值
//检查数量出现零值情况
select * from ecommerce where Quantity=0;//0条记录
//检查数量出现负值情况
select * from ecommerce where Quantity<0;//10587条记录
结果显示,交易数量小于0的发票编号大都是"C”开头的,共有10587条取消订单数据。
本次分析主要以成功交易订单为主,在此可以将工作表拆分成两个数据表,取消订单表ecommerce_cancel 以及 成功订单表ecommerce_success,
//拆分工作表ecommerce_cancel
create table ecommerce_cancel as (select * from ecommerce where Quantity<0);
//拆分工作表ecommerce_success
create table ecommerce_success as (select * from ecommerce where Quantity>0);
4.2.2 单价异常值
select count(*) from ecommerce_success where UnitPrice =0;//1174条记录
select count(*) from ecommerce_success where UnitPrice <0;//2条记录
//拆分赠品订单表ecommerce_free
create table ecommerce_free as (select * from ecommerce_success where Quantity=0);
//删除单价异常值记录
delete from ecommerce_success where UnitPrice =0;
delete from ecommerce_success where UnitPrice <0;
单价为0可能是促销活动的附赠品,对后面对订单量的分析会造成干扰,拆分保存到另一张表ecommerce_free,后面再分析赠品订单。
单价为负值的,描述中已说明是做的坏账处理,可以直接删除。
经过数据清洗,ecommerce_success剩余524878条记录
5、数据分析与可视化
销售额Amounts =∑ 商品数量 * 商品价格
5.1 订单维度
5.1.1描述性统计
2010年12月1日到2011年12月9日,有效订单19960笔,笔单价(每笔订单平均购买金额)为533.17英镑,连带率(每笔订单平均购买商品数量)279件,说明订单以批发为主。 笔单价与连带率都大于中位数,交易金额均值大于Q3分位数,说明订单总体差异大,存在部分购买力极强的客户。
5.1.2 订单金额的分布情况
部分交易订单金额过大,观察1000英镑以下的订单,订单金额集中分布在400英镑以内,峰值集中在20英镑内、100-220英镑、300-320英镑。
5.1.3 订单内商品数量分布
订单内商品数量呈现出典型的长尾分布,大部分订单数量在250件内,且商品数量越多,订单数量逐渐减少。
5.1.4 订单内商品件数与订单金额的关系
总体来说订单交易金额与订单内商品件数呈正相关,订单内商品件数越多,订单金额越高;
5.2 客户维度:
5.2.1 描述性统计
人均购买笔数为90笔,中位数为41笔;每位客户平均购买1187件商品,超过Q3分位数,最多客户购买了196915件商品;客单价为2049英镑,超过Q3分位数,说明客户的购买力存在较大的差异,存在小部分的高消费用户拉高人均数值。
5.2.2 客户消费金额分布
大部分客户的消费力不高,高消费用户几乎看不到;截取消费金额小于5000英镑的消费金额分布可以看出,客户消费金额分布呈现单峰长尾分布,金额金额集中在100-330之间。
5.2.3 客户购买商品数量分布
5.2.4 客户购买商品件数与金额的关系
1.总体来说客户购买商品数量与消费金额呈正相关,购买商品数量越多,消费金额越高;
2.有一定数量消费能力强的客户。
5.2.5 用户时间行为分析
1. 三条线总体上呈相近的趋势,2010年12月-2011年8月销售情况相近,在2011年9月-11月连续增长,达到高峰。推测主要是受年末节日(万圣节、圣诞节)影响较大。
1.销售额和销售数量趋势是趋同的,该电商主要是以低价电商为主,商品价低且集中,则销售额主要随销量变化而变化。
2.12月9日,订单量大幅下降,但是销售额和销售量却创历史新高,说明存在某笔或某几笔购买量极大的订单,使得销售额大幅上升。
对该数据进行溯源,发现是客户ID为16446的用户一次性大量订购某种商品。建议对该用户配备固定客服,建立长期合作关系,
5.3 商品维度
5.3.1 商品平均价格分布
商品平均价格分布峰值在1-2英镑,大部分是10英镑以内的商品,推测该电商主营低价的小商品批发业务。
5.3.2 商品平均价格与销售数量的关系
从散点图可以看出,低于5英镑的商品销量更多,最受客户欢迎。
5.3.3 商品平均价格与销售总额的关系
低价商品不仅销售数量更多,也是销售额的主要组成部分;
高价商品虽然单价高昂,但是销量很低,并没有带来太多的销售额,建议采购部门以低于10英镑的商品为主,来进一步扩充低价商品品类。
5.4 地区维度
绝大部分客户来自英国本土,基本以英国为核心 向外辐射,这种现象可能和运输成本及语言等有关,也可能是影响力随距离而衰减。
1.可以尝试增加境外的宣传投放,提高知名度,建议网站做好多国语言的适配,也可以在网站上对于境外物流费用计算及手续办理等事项给出更易懂的说明。
2.但是建议衡量投入产出比,适当放弃一些地区,集中优势在英国。
5.5 用户生命周期
大量用户首次消费在观察日期初期,最后消费时间在观察期末期,说明有大量用户的生命周期被低估,实际上还要向前向后延伸。
36%的客户生命周期为0,仅消费过一次,需要更加重视客户初次购买的体验感,引导用户进行多次消费。
64%的用户有二次消费行为,并且在350天以后,用户数量有一个小高峰,这部分用户拥有极高的用户粘性。
下面将根据RFM模型,划分出用户等级,可以根据用户不同价值,对客户进行销售推广策略
5.6 基于RFM模型用户分层
交易客户中,新客户最多,占总数的33.54%,其次是流失客户28.10%,重要深耕客户25.45%,重要价值客户7.61%,重要挽留客户5.14%和重要挽回客户0.16%。虽然新客很多,但是贡献最多的却是重要价值客户,占总交易额的49.03%。其次是重要深耕客户,占总交易额的31.71%。符合我们常说的二八原则。
//TEBLEAU
//R:
//Rec
{ FIXED ([CustomerID]):DATEDIFF('day',max(Dtime),#2011-12-09#)}
//R评分
IF [Rec]<=30 THEN 5
ELSEIF [Rec]>30 AND [Rec]<=90 THEN 4
ELSEIF [Rec]>90 AND [Rec]<=180 THEN 3
ELSEIF [Rec]>180 AND [Rec]<=365 THEN 2
ELSE 1
END
//R标准
round(avg([R评分]),1)
//R标记值
IIF([R评分]<3.8,0,1)//3.8为R标准
//F:
//Freq
{ FIXED ([CustomerID]):COUNTD([InvoiceNo])}
//F评分
IF [Freq]<=10 THEN 1
ELSEIF [Freq]>10 AND [Freq]<=30 THEN 2
ELSEIF [Freq]>30 AND [Freq]<=50 THEN 3
ELSEIF [Freq]>50 AND [Freq]<=80 THEN 4
ELSE 5
END
//F标准
round(avg([F评分]),1)
//F标记值
IIF([R评分]<1.1,0,1)//1.1为F标准
//M:
//每个客户消费金额
{ FIXED ([CustomerID]):sum([Amounts])}
//M评分
IF [每个客户消费金额] <=1000 THEN 1
ELSEIF [每个客户消费金额]>1000 AND [每个客户消费金额]<=3000 THEN 2
ELSEIF [每个客户消费金额]>3000 AND [每个客户消费金额]<=5000 THEN 3
ELSEIF [每个客户消费金额]>5000 AND [每个客户消费金额]<=8000 THEN 4
ELSE 5
END
//M标准
round(avg([M评分]),1)
//M标记值
IIF([M评分]<1.6,0,1)//1.6为M标准
//客户分层
IF [R标记值]=1 AND [F标记值]=1 AND [M标记值]=1 THEN '重要价值用户'
ELSEIF [R标记值]=0 AND [F标记值]=1 AND [M标记值]=1 THEN '重要唤回用户'
ELSEIF [R标记值]=1 AND [F标记值]=0 AND [M标记值]=1 THEN '重要深耕用户'
ELSEIF [R标记值]=0 AND [F标记值]=0 AND [M标记值]=1 THEN '重要挽留用户'
ELSEIF [R标记值]=1 AND [F标记值]=1 AND [M标记值]=0 THEN '潜力用户'
ELSEIF [R标记值]=1 AND [F标记值]=0 AND [M标记值]=0 THEN '新用户'
ELSEIF [R标记值]=0 AND [F标记值]=1 AND [M标记值]=0 THEN '一般维持用户'
ELSEIF [R标记值]=0 AND [F标记值]=0 AND [M标记值]=0 THEN '流失用户'
END