电商母婴用品数据分析
(fork自https://www.kesci.com/home/project/5ec87647b2aca3003746df39)
项目介绍
项目背景
(从PEST角度)
政策Politics:国家发展改革委2013年5月28日表示,13个部门将出台系列政策措施,从可信交易、移动支付、网络电子发票、商贸流通和物流配送共5个方面支持电子商务发展,有利于促进在线母婴商品市场快速发展。
经济Economy:随着国内经济的稳定增长,2015年我国城镇居民可支配收入增长到31195元, 同期农村居民可支配收入增长到11422元。不断提高的人均可支配收入将提升家庭的消费意愿,2015年中国母婴行业市场规模有望达到2万亿。
社会Society:对于一线城市居民来说,随时随地通过手机、电脑等电子网络设备足不出门即可完成购物的新型消费方式更能适应他们紧凑的生活节奏;而对于二三线城市以及农村居民,物流上门配送带来的便捷也使得网购更具吸引力。
技术Technology:4G网络的普及、手机和ipad等移动设备快速升级迭代更新、网络在线支付系统的发展,为电子商务迅速崛起注入强大的动力。
###分析目的
- 帮助在线商家针对不同的时间节点和场景做出不同的销售和运营管理策略,帮助商家提高销量和营业额、减少经营成本。
- 根据baby一表中的birthday字段判断出客户宝宝的年龄,或者根据孩子的信息(年龄、性别等)及对应的商品销量来推断用户喜好进行精准营销。
##数据预处理与探索性分析
baby = pd.read_csv("/home/kesci/input/dian5962/(sample)sam_tianchi_mum_baby.csv")
trade = pd.read_csv("/home/kesci/input/dian5962/(sample)sam_tianchi_mum_baby_trade_history.csv")
baby = pd.read_csv("/home/kesci/input/dian5962/(sample)sam_tianchi_mum_baby.csv")
trade = pd.read_csv("/home/kesci/input/dian5962/(sample)sam_tianchi_mum_baby_trade_history.csv")
baby.head()
user_id birthday gender
0 2757 20130311 1
1 415971 20121111 0
2 1372572 20120130 1
3 10339332 20110910 0
4 10642245 20130213 0
trade.head()
user_id auction_id cat_id cat1 property buy_mount day
0 786295544 41098319944 50014866 50022520 21458:86755362;13023209:3593274;10984217:21985... 2 20140919
1 532110457 17916191097 50011993 28 21458:11399317;1628862:3251296;21475:137325;16... 1 20131011
2 249013725 21896936223 50012461 50014815 21458:30992;1628665:92012;1628665:3233938;1628... 1 20131011
3 917056007 12515996043 50018831 50014815 21458:15841995;21956:3494076;27000458:59723383... 2 20141023
4 444069173 20487688075 50013636 50008168 21458:30992;13658074:3323064;1628665:3233941;1... 1 20141103
baby.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 953 entries, 0 to 952
Data columns (total 3 columns):
user_id 953 non-null int64
birthday 953 non-null int64
gender 953 non-null int64
dtypes: int64(3)
memory usage: 22.4 KB
trade.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 29971 entries, 0 to 29970
Data columns (total 7 columns):
user_id 29971 non-null int64
auction_id 29971 non-null int64
cat_id 29971 non-null int64
cat1 29971 non-null int64
property 29827 non-null object
buy_mount 29971 non-null int64
day 29971 non-null int64
dtypes: int64(6), object(1)
memory usage: 1.6+ MB
#baby表有3个字段,tade表有7个字段,都没有缺失值
trade.buy_mount.describe()
count 29971.000000
mean 2.544126
std 63.986879
min 1.000000
25% 1.000000
50% 1.000000
75% 1.000000
max 10000.000000
Name: buy_mount, dtype: float64
```python
quantity = trade.buy_mount.value_counts().sort_index()
plt.figure(figsize=(10, 8))
sns.scatterplot(x=quantity.index, y=quantity.values, alpha=0.3)
plt.title("单个订单购买量分布", fontdict=fontdict)
plt.ylabel("订单数", fontdict=fontdict)
plt.xlabel("购买量", fontdict=fontdict)
plt.show()
数据清洗
- 保留buy_amount[1,195]以内的订单。
- 查看有无缺失值异常值,并进行处理。
- trade中的auction_id未指定是什么属性,我们就将他默认改为item_id。
- 数据集中的property全是数字,需要有对应的字典才能知道对应什么属性,这边先删除。
- day改成日期形式。
# 本次统计数据的时间范围是2012/7/2-2015/2/5
trade.day.describe()
count 29942
unique 949
top 2014-11-11 00:00:00
freq 454
first 2012-07-02 00:00:00
last 2015-02-05 00:00:00
Name: day, dtype: object
# 保留buy_mount[0,195]以内的记录
trade = trade[(trade.buy_mount >= 1) & (trade.buy_mount <= 195)]
# 列重命名
trade.rename({"auction_id": "item_id"}, axis=1, inplace=True)
# 先将property暂且取出放在一边,后续再分析
property = trade.property
trade.drop('property', axis=1, inplace=True)
# 日期类型转换
baby['birthday'] = pd.to_datetime(baby.birthday.astype('str')) #由上面infoa过可知日期都是int类型的需转为字符串类型
trade['day'] = pd.to_datetime(trade.day.astype('str'))
```python
count_cat1 = trade.cat1.nunique()
count_cat = trade.cat_id.nunique()
count_item = trade.item_id.nunique()
sales_volume = trade.buy_mount.sum()
count_user = trade.user_id.nunique()
print("商品类目数:", count_cat1)
print("商品类别数:", count_cat)
print("商品数:", count_item)
print("总销量:", sales_volume)
print("用户数", count_user)
商品类目数: 6
商品类别数: 662
商品数: 28394
总销量: 49973
用户数 29915
市场整体情况
(下面的代码太多了先不贴,主要是分析思路)
整体销售情况
1.先按年份
2012/7-2015/2期间总销量是49973件,从上图可知该电商平台的母婴商品市场销量2012-2014上升趋势,2015年销量骤降,因为统计的2015年只有两个月的数据,接下来分析每一年的季度销量来对比。
2.按季度分析
2015年由于数据缺失,所以不能反应2015年第一季度的真实销量情况
每年第一季度的销售额都会呈现一定幅度的下跌。每年第四季度的销量都会呈现大幅度上升。所以接下来按月份分析找出第一季度销量下降和第四季度销量上升的原因
3.按月份分析
2013年和2014年的第一季度销量都有所下滑,主要聚集在1、2月,一般春节在1、2月,先假设销量下滑是受到春节的影响。
每年的5月、11月都会出现不同程度的销量上涨,每年11月份有双十一促销活动,假设11月份的销量上涨跟双十一有关。
2013/2/1-2013/2/15处于销量谷底,2013年春节假期:2013/2/9-2013/2/15
- 2014/1/26-2014/2/4处于销售谷底,2014年春节假期:2014/1/31-2014/2/6
2015年春节假期是2015/2/18-2015/2/24,数据集统计时间只到2015/2/5,所以就暂不分析2015年第一季度情况
临近春节快递停运,销售低谷时段与春节假期基本吻合,假期结束后购买量和用户量上升,所以可以认为第一季度销量下降是由春节假期造成的
可以很明显看出2013年和2014年双十一及双十二当天的销量和销售额都激增。
每年的双十一活动用户量和销量都比往年多,用户量增长为75%-80%。
用户分析
1.用户性别
2.用户年龄(假设统计时间为2015年3月)
3.各年龄段的商品总销量分析(联结两张表)
4.用户购买行为
这里由于缺少每笔订单的金额信息,无法进行RFM模型分析,这里只能分析每月复购率(由于数据不完整,只计算2013年和2014年的复购率)
4月、10月及11月都存在一定的用户当月复购,但是复购率都极低,各产品大类的复购率也极低,均未到达1%,考虑到用户单次购买量大多是一件,且复购率低,说明用户对单一商品的回购欲望极低,商家应该从产品角度进行考虑,例如产品质量及购物体验等。
##商品销量分析
大类28和50008168销量最佳,大类38虽然销量低、子类数最少但是人均购买量却很高,说明用户在购买38大类下的产品时选择余地较少,但同时用户对此类产品的需求又很旺盛,可以适量的增加38大类下的子类产品,提高销售量。
##总结
1.总体销售情况:
(1)总体销售量逐年增长但每月销售量的波动大。
(2)受到春节的影响,每年年1、2月份的销量下降。
(3)受到双11、双12的影响促销活动日期都有一定的涨幅。
2.用户画像
(1)消费者中女孩与男孩的人数占比接近,女孩稍多于男孩。
(2)消费者的年龄主要集中在0-3岁,0-3岁购买的商品总量也最大。
(3)性别中含有未知这一项,消费者可能是准妈妈/准爸爸,占比较少。
3.商品销售情况
(1)大多数的用户订单购买量是一件,且复购率极低。
(2)大类50014815、50008168和28的销量最高
(3)大类38虽然子类数量少销量少但是人均用户购买量却很大,复购率也最高,可以考虑在该大类下新增子类,增加用户选择,提高销量。
建议
1.春节前为减少货物积压应减少进货,双十一及双十二预热阶段需要加大力度推广,丰富运营活动,吸引更多的客流量。同时,要增加产品库存,保证稳定货物供应。要增加客服人员,及时与物流联系,保证能够及时解答用户疑问并提高出货效率,提高用户购买体验。
2.从用户角度,可以根据以上分析的消费者性别和年龄进行个性化推荐。比如根据性别为“未知”推测用户可能是准妈妈/准爸爸,可根据用户这个身份个性化推荐一些孕妇用品。
3.产品复购率偏低。需要加强对已购用户的回访,分析不回购的原因,并对这些因素进行改善。
4.大类38虽然子类数量少销量少但是人均用户购买量却很大,复购率也最高,可以考虑在该大类下新增子类,增加用户选择,提高销量。