本地分析选用19年销售额近10亿的某化妆品旗下某一品牌的电商数据,时间跨度为2019年9月-2019年12月
分析目标:
1.查看该电商的运营情况
2.客户分类,探索不同客户群的营销策略
分析思路:
一是探索电商情况,主要探索其订单数和销售额的增长情况、用户每月消费情况,以及各区域销售额对比情况;
二是构建RFM模型,对客户群进行分类,探索不同客户群的营销策略
评估并清洗数据
导入所需要的python包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt # 加载数据可视化包
from mpl_toolkits.mplot3d.axes3d import Axes3D# 显示3D散点图导入的库
import os
#显示所有列
pd.set_option('display.max_columns', None)
# 可视化显示在页面
# %matplotlib具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,
# 可以直接在你的python console里面生成图像。
%matplotlib inline
# 更改设计风格
plt.style.use('ggplot')
# 设置中文编码和负号的正常显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
读取所需数据集
order_Path = os.getcwd()+'\\'+'tm_order'
order_Products = os.getcwd()+'\\'+'tm_products'
def func(path):
print('path = ', path)
#将该文件夹下的所有文件名存入一个列表
file_list = os.listdir(path)
print('file_list = ',file_list)
#创建一个空列表,存储当前目录下的CSV文件全称
file_name = []
for i in file_list:
#判断是否为CSV文件,如果是则存储到列表中
if os.path.splitext(i)[1] == '.csv':
file_name.append(i)
print('file_name = ',file_name)
all_df = []
#循环遍历列表中各个CSV文件名
for i in range(0,len(file_name)):
df = pd.read_csv(path + '\\' +file_name[i], encoding = 'gb18030',low_memory=False)
all_df.append(df)
columns = all_df[0].columns
# 将其中一个的列名作为合并后的列名 不然会出现乱序
data = pd.concat(all_df, sort=True, ignore_index = True,join_axes=[columns])
return data
data_Order = func(order_Path)
data_Products = func(order_Products)
数据说明
因为原数据集比较复杂,订单数据和产品数据都通过相应的键值连接,本文着重分析产品销售情况和客户分类,对数据进行了一定的取舍,数据清洗过程略过
进过数据清理之后,汇总成3个数据集:
- orders订单数据集
- products产品条目数据集
数据可视化:
1.店铺销售分析(按月):
- 每月订单数
- 每月销售总额
- 每月客单价
- 每月消费人数
每月订单数
month_orders = orders.groupby('month')['订单号'].nunique()
store_plot(data=month_orders ,
xlab='月份',
ylab='订单数',
title='每月订单数')
每月订单数.jpg
可以看到:订单数在11月份-12月份期间增长了30%,有可能是因为双11活动前后大量促销导致
每月销售总额
month_sales = orders.groupby('month')['订单实付金额'].sum()
store_plot(data=month_sales,
xlab='月份',
ylab='销售金额',
title='每月销售总额')
商店消费情况绘图函数.jpg
有趣的是,订单数和销售总额在10月初的出现了不一样的走向,订单数下降而销售额上升,原因要看下客单价
每月客单价
ATV = orders.groupby('month')['订单实付金额'].sum()/ orders.drop_duplicates(subset=['收货人/提货人']).groupby('month')['收货人/提货人'].count()
store_plot(data=ATV ,
xlab='月份',
ylab='客单价',
title='每月客单价')
plt.savefig('每月客单价.jpg')
每月客单价.jpg
从每月客单价看出,10月份订单数下降而销售额上升是因为客单价提升了,猜测是国庆大促时促销活动进行了比较大幅度的降价(经询问业务后证实了这个猜测)
每月消费人数
month_person = orders.drop_duplicates(subset=['收货人/提货人'])
store_plot(data=month_person.groupby('month')['收货人/提货人'].count(),
xlab='月份',
ylab='订单数',
title='每月消费人数')
每月消费人数.jpg
从月消费人数来看,国庆大促的促销活动带来了大量用户消费,效果明显。而双11活动的带来用户消费并不多
2.用户个体消费分析
- 用户消费金额、消费次数的描述统计
- 用户累计消费金额占比(百分之多少的用户占了百分之多少的消费额)
消费金额描述统计
orders.groupby('收货人/提货人').sum().describe()
消费金额描述统计.png
用户平均消费68元,中位数为9.9,超过一半的用户仅消费9.9元,方差为302,存在高消费用户(询问业务后发现部分高消费用户为经销商)
用户累计消费金额占比
plt.figure(figsize=(12,8))
plt.plot(orders.groupby('收货人/提货人').sum().sort_values('订单实付金额').apply(lambda x:x.cumsum()/x.sum()).reset_index()['订单实付金额'])
plt.xlabel('消费金额')
plt.ylabel('消费占比')
plt.title('用户累计消费金额占比')
用户累计消费金额占比.jpg
40%的用户占据了60%的销售额,另外60%占据了40%的销售额,消费集中在一些高消费用户上
3.用户消费行为分析:
- 用户分层:
- RFM
- 新、老、活跃、回流、流失
## RFM分层
# 定义数据框rfm_model
rfm_model = pd.DataFrame()
# 筛选最近购买时间 recency
rfm_model['recency'] = (orders.groupby('收货人/提货人')['订单创建时间'].max()-pd.to_datetime('2019-09-01'))/np.timedelta64(1,'D')
# # 统计消费次数 frequency
rfm_model['frequency'] = orders.groupby('收货人/提货人')['订单创建时间'].count()
# # 计算购买额 money
rfm_model['money'] = orders.groupby('收货人/提货人').sum().query('订单实付金额 < 10000')['订单实付金额']
# 重置索引
rfm_model = rfm_model.reset_index(drop = False)
# 3d呈现数据的三个特征情况
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
ax.scatter(rfm_model['recency'],rfm_model['frequency'],rfm_model['money'],s=30);
不同分层消费者消费总额.jpg
一般价值客户贡献的金额并不高,所以没必要在这一块花费太多心思和精力,应该着重将运营的中心放在重要保持客户上,如何留住核心收入来源的"重要价值客户"以及通过各种运营方法保持"重要保持客户"和召回"重要挽留客户"是下一阶段的任务
新、老、活跃、回流、流失
fig = plt.figure(figsize=(10,5)) # 表示figure 的大小为宽、长(单位为inch)
ax = fig.add_subplot(111)
ax.set_xticklabels(indexs)
players = ['active','new','return','unactive']
plt.stackplot(indexs,purchase_stats_ct.fillna(0),labels=players)
plt.title('新老活跃客户')
plt.legend()
新老活跃客户.jpg
用户流失相当多,活跃用户相对稳定
4.区域购买力
city_top = data_Order[['订单实付金额','收货人城市']].groupby('收货人城市').sum().sort_values('订单实付金额',ascending=False)
city_top10 = city_top.head(20)
fig = plt.figure(figsize=(10,5)) # 表示figure 的大小为宽、长(单位为inch)[图片上传中...(城市购买力.jpg-8af9f-1584651760463-0)]
city_bar = plt.bar(city_top10.index,height=city_top10['订单实付金额'].astype('int64'))
plt.xlabel('城市')
plt.ylabel('消费金额')
plt.title('城市购买力')
# 添加数据标签 就是矩形上面的数值
def add_labels(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width()/2, height, height, ha='center', va='bottom')
rect.set_edgecolor('white')
add_labels(city_bar)
城市购买力.jpg
该品牌主要是北上广深等一线和准一线城市较受欢迎,说明与经济发展情况有较大关系
5.最受欢迎产品
fig = plt.figure(figsize=(10,5)) # 表示figure 的大小为宽、长(单位为inch)
ax = fig.add_subplot(111)
buy_top10.plot(kind="bar",color='#228B22',)
plt.xlabel('规格编码')
plt.ylabel('销量')
plt.title('最受欢迎产品')
最受欢迎产品.jpg
排名第一的是某款9.9包邮的流量款面膜,可以明显的看出来流量款占据了绝对领先的位置。
综述:
就数据反映的情况来说,该品牌化妆品的流量款虽然带来了大量的流量(潜在客户),但是带来的消费贡献并不高,只有重要价值客户提供了大量的消费贡献,要把运营的重点放在老客户身上,毕竟发展一个新客户的成本是维护一个老客户成本的3—10倍。
网友评论