今天这篇文章将给大家分享一个电商数据分析的案例。
下面我们先来简单了解一下数据。
01
数据信息
字段介绍
Unnamed: 行号
event_time:下单时间
order_id:订单编号
product_id:产品标号
category_id :类别编号
category_code :类别
brand :品牌
price :价格
user_id :用户编号
age :年龄
sex :性别
local:省份
02
分析目的
通过分析销售数据来了解在线销售业务的消费情况,分析用户消费数据来分析用户的消费行为,为用户推荐相匹配的商品。
分析问题
店铺销售情况
每月成交额
每月销售金额
每月消费人数
每月订单数量
每月客单价
不同省份用户数量
不同省份订单数量
不同省份成交金额
订单数随星期分布
订单随小时分布
用户消费行为
用户消费次数
用户消费金额
消费次数与消费金额关系
用户购买周期
新用户、活跃用户、不活跃用户、回流用户、回流率
复购率和回流率
消费人群分层情况
按性别分析
按年龄段分析
按喜好品牌分析
03
结论先行
1、销售金额、订单量、消费人数、客单价在清明小长假、五一小长假、暑假、开学季、十一小长假,几个假期节点表现不错,尤其是开学季的情况最好,在几个关键的节点开始前,店铺一定要提前储备库存,保证货源。
2、北上广销售金额、订单量、消费人数、客单价都优于其他省份,湖南省消费人数少,但是客单价、订单量都表现优异,湖南省潜力巨大,因此要加大对湖南省的宣传力度,增加湖南省的消费人数。
3、75%的消费人群购买力不高,对30岁以下的人群主要推荐亲民价格的商品。
4、40-50岁的人群购买力高,而且男性对高价格的商品购买力强,因此给40-50岁的男性推荐高价格的商品,对女性推荐较高价格的商品。
5、多数用户至少消费了两次,且消费金额与购物次数有较强的正相关,用户消费次数越多销售额越大。可在8天、28天对用户进行召回,引导客户消费。
6、订单集中在早晨,8点到13点是消费高峰期,这段时间要注意维持好网站的稳定性。
7、店铺可以在1-4月份减少营业人员,5-11月增加营业人员,应对销售高峰期。
接下来给大家介绍一下分析的过程,包括数据嗅探、数据清洗等步骤。
04
数据分析过程
数据嗅探
#导入第三方库import osfrom datetime import datetimeimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline#设置中文编码和负号的正常显示#plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#导入数据df=pd.read_csv('./电子产品销售分析.csv')df.head()
输出结果:

df.describe()
输出结果:

数据清洗
#数据清洗和处理#数据类型转化df['event_time'] =pd.to_datetime(df['event_time'].str[:19],format="%Y-%m-%d %H:%M:%S")df['event_time'] = pd.to_datetime(df['event_time'])#计算时间变量df['Month']=df['event_time'].dt.monthdf['Day'] = df['event_time'].dt.daydf['Dayofweek']=df['event_time'].dt.dayofweekdf['hour']=df['event_time'].dt.hourdf.head()
输出结果:

np.sum(df.isnull())
输出结果:
Unnamed: 0 0event_time 0order_id 0product_id 0category_id 0category_code 129370brand 27224price 0user_id 0age 0sex 0local 0Month 0Day 0Dayofweek 0hour 0dtype: int64
有两列中有数据缺失值,类别列缺失129370条,品牌列缺失27224条,这两列数值缺失对店铺销售情况的分析和用户消费行为的分析没主要影响,但是其他数据有重要影响,所以这两列缺失值由missing填充。
df.fillna('missing').head()
输出结果:

np.sum(df.isnull())
输出结果:
Unnamed: 0 0event_time 0order_id 0product_id 0category_id 0category_code 129370brand 27224price 0user_id 0age 0sex 0local 0Month 0Day 0Dayofweek 0hour 0dtype: int64
df['category_code'].fillna('missing',inplace=True)df['brand'].fillna('missing',inplace=True)np.sum(df.isnull())
输出结果:
Unnamed: 0 0event_time 0order_id 0product_id 0category_id 0category_code 0brand 0price 0user_id 0age 0sex 0local 0Month 0Day 0Dayofweek 0hour 0dtype: int64
缺失值已全部填充。
#重复值检查和处理df.duplicated()df.drop_duplicates()
输出结果:

探索性数据分析
店铺销售情况分析
每月成交金额
#商店消费情况绘图函数plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsedef store_plot(data,xlab,ylab,title):plt.figure(figsize=(10,5))plt.plot(data)plt.xlabel(xlab)plt.ylabel(ylab)plt.title(title)#每月成交金额,包含未成单金额store_plot(data=df[df['price']>0].groupby('Month')['price'].sum(), xlab='月份', ylab='成交金额', title='每月成交金额')
输出结果:

每月销售金额
store_plot(data=df.groupby('Month')['price'].sum(), xlab = '月份', ylab = '销售金额', title = '每月销售金额')
输出结果:

每月消费人数
store_plot(data=df[df['price']>0].groupby('Month')['user_id'].nunique(), xlab='月份', ylab='消费人数', title='每月消费人数')
输出结果:

结论:每月消费人数1月到8月呈上升趋势,8到11月呈现下降趋势,由两个高峰期,第一在5月份,第二个高峰期在6月到9月份,推测,可能是五一小长假、暑假和开学季引起了消费人数的上升。
每月订单数量
store_plot(data=df[df['price']>0].groupby('Month')['order_id'].nunique(), xlab='月份', ylab='订单数量', title='每月订单数量')
输出结果:

结论:订单数量有三个小高峰,分别在5月,8月,19月,可能与五一小长假,开学季,十一小长假有关。
每月客单价
store_plot(data=df[df['price']>0].groupby('Month')['price'].sum()/df[df['price']>0].groupby('Month')['order_id'].nunique(), xlab='月份', ylab='客单价', title='每月客单价')
输出结果:

结论:客单价由2个小高峰,分布在3月和8月,8月份的客单价最高,说明8月份的需求量最高,客单价、订单数量达到顶峰,每年八月份是店铺全年营收的关键期,店铺要提前准备,保证货源供应,满足客户需求量。
分析结论&建议:
1、销售金额和成交金额曲线很相似,意味着销售金额约等于成交金额。
2、月订单数量、月消费人数、月成交金额、月销售额、月客单价趋势相似,在五月份有个小高峰,在八月份是最高峰,销售情况最好的月份集中在7-9月份。店铺可以在1-4月份减少营业人员,5-11月增加营业人员,应对销售高峰期。
3、店铺销售高峰估计和五一小长假、暑假、开学季、十一小长假有关,店铺应该在这几个关键的节点,提前布局,打造竞品,加大库存量,保证货源充足。
不同省份用户数量
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['KaiTi']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(12,8))df[df['price']>0].groupby('local')['user_id'].nunique().sort_values(ascending=True).plot.barh()plt.xlabel('用户数量')plt.ylabel('省份')plt.title('不同省份用户数量')
输出结果:
Text(0.5, 1.0, '不同省份用户数量')

不同省份订单数量
plt.figure(figsize=(12,8))df[df['price']>0].groupby('local')['order_id'].nunique().sort_values(ascending=True).plot.barh()plt.xlabel('订单数量')plt.ylabel('省份')plt.title('不同省份订单数量')
输出结果:
Text(0.5, 1.0, '不同省份订单数量')

不同省份成交金额
plt.figure(figsize=(12,8))df[df['price']>0].groupby('local')['price'].sum().sort_values(ascending=True).plot.barh()plt.xlabel('成交金额')plt.ylabel('省份')plt.title('不同省份成交金额')
输出结果:
Text(0.5, 1.0, '不同省份成交金额')

结论:
1、北上广的用户数量、订单数量、成交金额都稳居前三。
2、湖南的客户数量最好,但是订单数,客单价仅次于北上广,湖南客户的潜力巨大,需要加大宣传,增加客户数量。
下单星期分布
#下单时间分布#星期plt.figure(figsize=(12,8))df[df['price']>0].groupby('Dayofweek')['order_id'].nunique().plot.bar()plt.xticks(range(7),['周一','周二','周三','周四','周五','周六','周日'],rotation=0)plt.xlabel('星期')plt.ylabel('订单数')plt.title('订单数随星期变化')
输出结果:
Text(0.5, 1.0, '订单数随星期变化')

结论:周一到周五订单数维持稳定,周六是订单数量最高,周日次之。
下单小时分布
#下单时间分布#小时plt.figure(figsize=(12,8))df[df['price']>0].groupby('hour')['order_id'].nunique().plot()plt.xlabel('小时')plt.ylabel('订单数')plt.title('订单随小时数变化')
输出结果:
Text(0.5, 1.0, '订单随小时数变化')

结论:订单集中在早晨,8点到13点是消费高峰期,这段时间要注意维持好网站的稳定性。
df[df['price']==0].count()
输出结果:
Unnamed: 0 39event_time 39order_id 39product_id 39category_id 39category_code 39brand 39price 39user_id 39age 39sex 39local 39Month 39Day 39Dayofweek 39hour 39dtype: int64
未完成支付的订单只有39单,对比完成支付订单可忽略不计,因此不做未完成订单数、订单金额的统计。
用户消费行为分析
用户消费次数、用户消费金额
df[df['price']>0].groupby('user_id').agg({'order_id':'nunique', 'price':'sum'}).describe()
输出结果:

结论:
1、超过一半的用户消费了两次,甚至有用户消费了666次,估计是批发商。
2、客户平均消费金额是1252.4,标准差是4205.9,用户平均消费金额大于75分位数,存在高额消费用户。
消费次数与消费金额关系
#消费次数与消费金额的关系plt.figure(figsize=(12,8))plt.scatter(x=df[df['price']>0].groupby('user_id')['order_id'].nunique(),y=df[df['price']>0].groupby('user_id')['price'].sum())plt.xlabel('消费次数')plt.ylabel('消费金额')plt.title('消费次数与消费金额关系')plt.savefig('消费次数与消费金额关系.jpeg')
输出结果:
结论:消费次数和消费金额存在较强的相关性,用户消费次数越大,消费金额越大,可以引导用户多次消费。