电商项目:母婴用品购买行为分析

Catalogue
  1. 1. 项目描述
  2. 2. 数据处理
    1. 2.1. 字段重命名
    2. 2.2. 格式转换
    3. 2.3. 字段处理
    4. 2.4. 新特征生成
  3. 3. 可视化分析
    1. 3.1. 商品类型购买分析
    2. 3.2. 购买时间分析
      1. 3.2.1. 月份分析
      2. 3.2.2. 季度分析
  4. 4. 产品需求分析
    1. 4.1. 购买数量对比
      1. 4.1.1. 产品购买趋势
      2. 4.1.2. 商品类别需求
  5. 5. 用户分析
    1. 5.1. 消费分析
    2. 5.2. 行为分析
      1. 5.2.1. 用户首购
      2. 5.2.2. 用户流失
      3. 5.2.3. 复购率
  6. 6. 总结
  7. 7. 写在最后

摘要
通过母婴类产品客户购买行为数据分析,找出核心的用户群,并分析整理销量的趋势,找出其中需要改进的环节~

项目描述

项目名称:母婴用品数据分析

数据来源:数据来源于阿里云天池,有2个表,记录了用户身份信息,商品购买数量,用户的年龄和商品数等。时间介于12年至15年。

字段说明

baby_trade_history表:

​ user_id:用户id(唯一值)

​ auction_id:购买行为编号

​ cat_id:商品种类ID

​ cat1:商品属于哪个类别

​ property:商品属性

​ buy_mount:购买数量

​ day:购买时间

mum_baby表:

​ user_id :用户id

​ birthday :出生日期

​ gender: 性别(0 男性;1 女性)

项目目的:通过母婴类产品客户购买行为数据分析,为以下问题提供解释和改进建议:客户对于不同产品的偏好
找出核心的用户群,并对其分析整理销量的趋势分析,并找出其中需要改进的环节

环境解释:基于jupyter notebook,可视化工具包:seaborn、matplotlib

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

import warnings
warnings.filterwarnings('ignore')

import os
os.chdir(r'/Users/nanb/Documents/数据存放')
1
2
goods_df = pd.read_csv('baby_trade_history.csv',sep = ',')
baby_df = pd.read_csv('mum_baby.csv',sep = ',')

数据处理

字段重命名

为方便字段操作与识别,进行字段重命名

1
2
3
4
# 商品信息表字段重命名

goods_df.columns = ['用户id','购买行为编号','商品种类id','商品类别','商品属性','购买数量','购买时间']
goods_df.head()


1
2
3
4
# 婴儿信息表字段重命名

baby_df.columns = ['用户id','出生日期','性别']
baby_df.head()



格式转换

方便以后换算以及添加新特征类别,进行时间格式转换

1
2
3
4
# 时间格式转换

goods_df['购买时间'] = pd.to_datetime(goods_df['购买时间'],format = '%Y%m%d')
baby_df['出生日期'] = pd.to_datetime(baby_df['出生日期'],format = '%Y%m%d')

字段处理

1
2
3
4
# 处理baby表中性别

baby_df['性别'] = baby_df['性别'].replace([0,1,2],['男','女','未知'])
baby_df.head()

新特征生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 购买年份

goods_df['购买年份'] = goods_df['购买时间'].dt.year

# 购买月份

goods_df['购买月份'] = goods_df['购买时间'].astype('datetime64[M]')
# goods_df['购买月份'] = goods_df['购买时间'].dt.month


# 季度

goods_df['季度'] = goods_df['购买时间'].dt.quarter

goods_df.head()


1
2
3
# 根据购买数量进行排序,粗略查看购买数量最多的是哪些商品以及用户

goods_df.sort_values(by = '购买数量',ascending = False).head(10)

图表解析:单次购买数量最多的是:50014815;其次为28商品

可视化分析

商品类型购买分析

1
2
3
# 商品类别与购买数量

goods_df[['商品类别','购买数量']].groupby(['商品类别']).sum().sort_values(by='购买数量',ascending=False).plot.bar()

图表解析:28商品产品销量最高,其次是50014815商品和50008168商品

1
2
3
4
# 查看商品类别与购买的用户之间的联系

df1 = goods_df[['商品类别','用户id']].groupby(['商品类别']).count()
df1.sort_values(by = '用户id',ascending=False).plot.bar()

图表解析:把汇总依据改成计数项得知,更多用户倾向于5008168产品,其次是28。

由此反应出5008168接受的人群会更多但必须提高用户的粘性让其重复购买的次数增多。


购买时间分析

月份分析

1
2
3
4
5
6
# 根据月份分析购买趋势

plt.style.use('ggplot')
plt.figure(figsize = (15,8))

goods_df.groupby('购买月份')['用户id'].count().plot()

图表解析

2013年开始到2014年年末,用户的总体消费次数(订单数)趋势呈现上升趋势。其中,2013年和2014年年间,用户的消费波动也是相似的。
13年订单数有2个高峰,分别是5月和11月。
14年订单数有2个高峰,分别是5月在和11月。

1
2
3
4
# 购买月份与购买数量

plt.figure(figsize = (15,8))
goods_df.groupby(by = '购买月份')['购买数量'].sum().plot()

图表解析:2013年11月和2014年11月,由于双11活动,销量有明显的上升。其中,14年的销量明显比13年高出很多

原因猜测 :根据淘宝官方数据显示,14年阿里的销售额相当于13年的1.6倍,说明在14年双11活动开始被越来越受到大众关注,商家的促销活动也更加刺激消费,从而导致了销量的攀升


1
2
3
4
5
# 根据月份统计购买情况

goods_df['月份'] = goods_df['购买时间'].dt.month

goods_df.groupby('月份')['购买数量'].sum().plot(kind = 'bar',rot = 360,figsize = (15,8))
<matplotlib.axes._subplots.AxesSubplot at 0x1a22605a20>

图表解析:根据月份统计销售情况,11月是全年最高的,可能由于双十一促销或者商家活动所导致销量攀升

季度分析

1
2
3
4
5
6
# 根据季度分析购买情况

fig,axes = plt.subplots(2,1,figsize = (15,12))

goods_df.groupby('季度')['购买数量'].sum().plot(kind = 'bar',ax = axes[0],rot = 360)
goods_df.groupby(['购买年份','季度'])['购买数量'].sum().plot(kind = 'bar',ax = axes[1],rot = 360)

图表解析

根据季度统计,第四季度销量最高;第一第二季度销量都不高而细分到每一年每一季度查看时:也发现每年的第一第二季度销量都不高,可认定为产品淡季;而第三第四季度销量很好,属于产品的旺季,即秋天后是母婴产品销售的旺季
而第四季度的销量最好,很大可能是双十一的影响根据前面图表分析入秋后销量增加,到2月又开始下滑。应在2月份发起促销清理库存,入秋后再囤积货物。


产品需求分析

购买数量对比

1
2
df = pd.merge(baby_df,goods_df,on = '用户id',how = 'right')
df.head()


1
2
3
4
# 根据性别划分,统计购买数量

plt.figure(figsize = (15,8))
df.groupby(by = '性别')['购买数量'].sum().plot(kind = 'bar',rot = 360,figsize = (15,8))


产品购买趋势

1
2
sex_df = df.dropna(axis = 0,how = 'any')
sex_df


1
2
3
4
5
6
7
8
9
10
11
plt.figure(figsize = (15,7))
plt.title('男女婴儿产品需求折线图')

man_df = sex_df.loc[sex_df['性别'] == '男']
man_df.groupby('购买月份')['用户id'].count().plot(label = '男')

famale_df = sex_df.loc[sex_df['性别'] == '女']
famale_df.groupby('购买月份')['用户id'].count().plot(label = '女')

plt.legend()
plt.show()

图表解析:上图可以看到,女婴销量比男婴少的原因是在14年的6月到9月,销量有个明显跌落。但在总体的产品需求趋势来看,男女婴儿大致上相同。所以商家的计划上新的产品量可以男女平均分配

商品类别需求

1
2
3
4
5
df5 = df[['性别','商品类别','购买数量']]

df_33 = pd.crosstab(index = df5['性别'],columns = df5['商品类别'])
df_33.plot(kind = 'bar',figsize = (15,8),fontsize = 15)
plt.xticks(rotation = 360)

图表解析:男女婴儿对50008168商品需求最大,且男婴比例较女婴大,正对50008168商品可以多向男婴做推广或打造爆款

用户分析

消费分析

1
2
group_user = df.groupby('用户id')
group_user['购买数量'].sum().describe()
count    29944.000000
mean         2.546420
std         64.015736
min          1.000000
25%          1.000000
50%          1.000000
75%          1.000000
max      10000.000000
Name: 购买数量, dtype: float64

图表解析:平均数是2,标准差是64,表明波动比较大。中位数是1,上下四分位数也是1,说明大部分用户只购买1件。最大值是10000,说明有部分刚需用户拉大了平均值。这批用户值得开发维护。

1
2
3
e = group_user.sum().query('购买数量 < 17')

e['购买数量'].plot.hist(bins = 16,figsize = (15,8))

图表解析:可以看出绝大部分用户只购买了一件

行为分析

用户首购

1
2
3
4
5
6
7
8
9
10
# 用户首购 -- 第一次购买

df['购买月份'].value_counts().index.sort_values()

# s = df.groupby('用户id')['购买时间'].min().value_counts().sort_values()

# s.tail()


df.groupby('用户id')['购买时间'].min().value_counts().plot(figsize = (15,8))

图表解析

用户首购的时间分布范围比较广,从2012-7到2015-2都有,呈现稳步上升趋势。 其中:
2013-11-11 购买用户数:139
2013-12-12 购买用户数:142
2014-11-11 购买用户数:454
2014-12-12 购买用户数:221

说明双十一打折促销活动对用户的吸引很大,新增用户比平时要多很多,建议运营人员多关注好的渠道,即找最少的投入,但有最好效果的渠道去做优化。后续还可以对广告页面做A/B Testing,把好的元素保留,不好的再进行优化。


用户流失

1
2
3
# 用户流失 -- 最后一次购买

df.groupby('用户id')['购买时间'].max().value_counts().plot(figsize = (15,8))

图表解析:最后一次购买和第一次购买图形很类似,原因应该是大部分用户就进行一次消费

1
2
3
4
# 验证大部分用户就进行一次消费

user_lv = group_user['购买时间'].agg(['min','max'])
(user_lv['min'] == user_lv['max']).value_counts()
True     29920
False       24
dtype: int64

图表解析:有29920位用户仅消费一次,只有24位用户进行了多次消费

复购率

1
2
3
4
5
6
# 复购率

b_more = df.pivot_table(index = '用户id',columns = '购买月份',
values = '购买时间',
aggfunc = 'count').fillna(0)
b_more.head()


1
2
3
4
# 数据筛选

purchase_r = b_more.applymap(lambda x:1 if x>1 else np.NaN if x == 0 else 0)
#purchase_r.head()

1
2
3
4
# 复购率折线图

m = (purchase_r.sum()/purchase_r.count())
m.plot(figsize = (15,8))

图表解析:复购率最高在0.14%,可以得知大部分用户只购买一次

总结

  • 每月用户的消费趋势

    • 订单数:2013年开始到2014年年末,用户的总体消费次数(订单数)趋势呈现上升趋势。同时用户的消费波动也是相似的。6月和11月是消费高峰期。
    • 成交数量:随着阿里双11越来越被大众接受,产品成交数量也是越来越高。
    • 成交用户数:每月的消费人数和每月的订单数趋势波动基本相同。
  • 男女婴儿产品成交数量的比例与趋势:男女婴儿的产品需求总体趋势来看是1:1。

    • 建议商家的计划上新的产品量可以男女平均分配。
  • 用户个体的消费情况分析

    • 每位用户的成交数量的描述统计: 平均数是2,标准差是64,表明波动比较大。
    • 中位数是1,上下四分位数也是1,说明大部分用户只购买1件。
    • 最大值是10000,说明有部分刚需用户拉大了平均值。建议这批用户值得开发维护。
  • 用户消费行为分析

    • 用户的第一次消费(首购):用户首购的时间分布范围比较广,从2012-7到2015-2都有,呈现稳步上升趋势,说明新客的渠道,商家的运营做的都还可以。另外14年双11和双12同比13年上涨了56%,64%,说明打折促销活动对用户的吸引很大,新增用户环比前几月也明显增多。
    • 建议运营人员多关注好的渠道,即找最少的投入,但有最好效果的渠道去做优化。后续还可以对广告页面做A/B Testing,把好的元素保留,不好的再进行优化。
    • 用户的最后一次消费(流失),用户复购率:由于这个数据集是网上来源,有缺失,大部分用户只消费1次,所以流失和复购率不是很准。

写在最后

以上是对母婴用品数据做的一下分析与可视化,数据内容还有待挖掘。文中有任何错误,欢迎指正!感谢阅读~