母婴商品销售数据分析-Python数据分析项目

文章目录

  • 母婴商品销售数据分析
    • 项目介绍
      • 项目背景
      • 分析目的
    • 数据准备
      • 导入数据
      • 数据清洗
    • 数据分析
      • 整体市场情况
      • 第一季度销量下滑原因
        • 第四季度销量上升原因
        • 复购率
      • 商品销售情况

母婴商品销售数据分析

项目介绍

项目背景

政策Politics:国家发展改革委2013年5月28日表示,13个部门将出台系列政策措施,从可信交易、移动支付、网络电子发票、商贸流通和物流配送共5个方面支持电子商务发展,有利于促进在线母婴商品市场快速发展。

经济Economy:随着国内经济的稳定增长,2015年我国城镇居民可支配收入增长到31195元, 同期农村居民可支配收入增长到11422元。不断提高的人均可支配收入将提升家庭的消费意愿,2015年中国母婴行业市场规模有望达到2万亿。

社会Society:对于一线城市居民来说,随时随地通过手机、电脑等电子网络设备足不出门即可完成购物的新型消费方式更能适应他们紧凑的生活节奏;而对于二三线城市以及农村居民,物流上门配送带来的便捷也使得网购更具吸引力。

技术Technology:4G网络的普及、手机和ipad等移动设备快速升级迭代更新、网络在线支付系统的发展,为电子商务迅速崛起注入强大的动力。

分析目的

  1. 帮助在线商家针对不同的时间节点和场景做出不同的销售和运营管理策略,帮助商家提高销量和营业额、减少经营成本。
  2. 根据父母的购买行为来预测孩子的年龄,或者根据孩子的信息(年龄、性别等)来预测用户会购买什么样的商品。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import pyecharts.charts as pyc
import pyecharts.options as opts
import warnings
from datetime import datetime
warnings.filterwarnings("ignore")
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 作图的字体默认设置
fontdict = {'fontsize': 15,'horizontalalignment': 'center'}

数据准备

导入数据

baby = pd.read_csv("./(sample)sam_tianchi_mum_baby.csv")
trade = pd.read_csv("./(sample)sam_tianchi_mum_baby_trade_history.csv")
baby.head()
user_idbirthdaygender
02757201303111
1415971201211110
21372572201201301
310339332201109100
410642245201302130
trade.head()
user_idauction_idcat_idcat1propertybuy_mountday
078629554441098319944500148665002252021458:86755362;13023209:3593274;10984217:21985…220140919
153211045717916191097500119932821458:11399317;1628862:3251296;21475:137325;16…120131011
224901372521896936223500124615001481521458:30992;1628665:92012;1628665:3233938;1628…120131011
391705600712515996043500188315001481521458:15841995;21956:3494076;27000458:59723383…220141023
444406917320487688075500136365000816821458:30992;13658074:3323064;1628665:3233941;1…120141103
baby.info()
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()

在这里插入图片描述

数据清洗

  1. 保留buy_amount[1,195]以内的订单。
  2. 查看有无缺失值异常值,并进行处理。
  3. trade中的auction_id未指定是什么属性,我们就将他默认改为item_id。
  4. 数据集中的property全是数字,需要有对应的字典才能知道对应什么属性,这边先删除。
  5. day改成日期形式。
# 保留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'))
trade['day'] = pd.to_datetime(trade.day.astype('str'))
# 本次统计数据的时间范围是2012/7/2-2015/2/5
trade.day.describe()
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)

数据分析

整体市场情况

# 根据年月查看销量趋势
# 根据年分组
year_item = trade[['item_id', 'buy_mount', 'day']].groupby(by=trade.day.dt.year)['buy_mount'].sum()
# 各年季度销量情况
year_quarter_item = trade[['item_id', 'buy_mount', 'day']].groupby(by=[trade.day.dt.year, trade.day.dt.quarter])['buy_mount'].sum()
# 根据年月分组
year_month_item = trade[['item_id', 'buy_mount', 'day']].groupby(by=[trade.day.dt.year, trade.day.dt.month])['buy_mount'].sum()
# 各年销量情况
plt.figure(figsize=(10, 5))
sns.barplot(x=year_item.index, y=year_item.values)
plt.title("年销量趋势", fontdict=fontdict)
plt.xlabel("年份", fontdict=fontdict)
plt.ylabel("销量", fontdict=fontdict)
plt.show()

2017/7-2015/2期间总销量是49973件,从上图我们可以看出淘宝和天猫平台母婴商品市场销量整体呈现上升趋势,但是波动较大。


index_list = year_quarter_item.index.tolist()
index_list = ['-'.join([str(x[0]),str(x[1])]) for x in index_list]
index_list
# 各季度销售情况
plt.figure(figsize=(10, 5))
sns.barplot(x=index_list, y=year_quarter_item.values)
plt.title("季度销量趋势", fontdict=fontdict)
plt.xlabel("(年,季度)", fontdict=fontdict)
plt.ylabel("销量", fontdict=fontdict)
plt.show()
  1. 2015年由于数据缺失,所以不能反应2015年第一季度的真实销量情况
  2. 每年第一季度的销售额都会呈现一定幅度的下跌。每年第四季度的销量都会呈现大幅度上升。
# 各月份销量情况
x = [str(x[0])+"/"+str(x[1]) for x in year_month_item.index]
y = [int(x) for x in year_month_item.values]
p  =pyc.Bar().add_xaxis(xaxis_data=x).add_yaxis(series_name="销量", y_axis=y, markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(coord=[x[4], y[4]], value=y[4]), opts.MarkPointItem(coord=[x[10], y[10]], value=y[10]), opts.MarkPointItem(coord=[x[16], y[16]], value=y[16]), opts.MarkPointItem(coord=[x[22], y[22]], value=y[22]), opts.MarkPointItem(coord=[x[28], y[28]], value=y[28])])).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="月销量趋势", subtitle="2012/7-2015/2的销量趋势图"), toolbox_opts=opts.ToolboxOpts())
p.render_notebook()
  1. 2013年和2014年的第一季度销量都有所下滑,主要聚集在1、2月。
  2. 每年的5月、11月都会出现不同程度的销量上涨。
    在这里插入图片描述

第一季度销量下滑原因

假设一下销售量下降是否和春节假期有关?\

def quarterData(trade: pd.DataFrame, low: tuple, high: tuple) -> list:"""输入日期型字符串,返回日期范围内的销量和用户量"""from datetime import datetimelow = datetime.strptime(low, "%Y/%m/%d")high = datetime.strptime(high, "%Y/%m/%d")trade_low = trade[(trade.day >= datetime(low.year, low.month, low.day)) & (trade.day <= datetime(high.year, high.month, high.day))]group_low = trade_low[['buy_mount', 'day', 'user_id']].groupby(by=[trade_low.day.dt.month, trade_low.day.dt.day])mount = group_low.buy_mount.sum()user = group_low.user_id.nunique()return [mount, user]
def lineMountUser(mount, user, title):"""输入销量和用户量数据以及标题,生成折线图"""plot = pyc.Line().add_xaxis(xaxis_data=[str(x[0])+"/"+str(x[1]) for x in mount.index]).add_yaxis(series_name="销量", y_axis=[int(x) for x in mount.values], markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name='当月销量均值', type_="average")])).add_yaxis(series_name="用户量", y_axis=[int(x) for x in user.values], markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name='当月用户量量均值', type_="average")])).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title=title), toolbox_opts=opts.ToolboxOpts(), tooltip_opts=opts.TooltipOpts(trigger='axis')).render_notebook()return plot
mount_2013_1_quarter = quarterData(trade, "2013/1/1", "2013/3/31")[0]
mount_2014_1_quarter = quarterData(trade, "2014/1/1", "2014/3/31")[0]
user_2013_1_quarter = quarterData(trade, "2013/1/1", "2013/3/31")[1]
user_2014_1_quarter = quarterData(trade, "2014/1/1", "2014/3/31")[1]
lineMountUser(mount_2013_1_quarter, user_2013_1_quarter, "2013年第一季度销量")
lineMountUser(mount_2014_1_quarter, user_2014_1_quarter, "2014年第一季度销量")

在这里插入图片描述

  • 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年第一季度情况

临近春节可能存在部分企业提早放假,快递停运,销售低谷时段与春节假期基本吻合,假期结束后购买量和用户量上升,所以可以认为第一季度销量下降是由春节假期造成的

第四季度销量上升原因

假设是否与双11双12活动有关?

mount_2012_4_quarter, user_2012_4_quarter = quarterData(trade, "2012/10/1", "2012/12/31")
mount_2013_4_quarter, user_2013_4_quarter = quarterData(trade, "2013/10/1", "2013/12/31")
mount_2014_4_quarter, user_2014_4_quarter = quarterData(trade, "2014/10/1", "2014/12/31")
lineMountUser(mount_2012_4_quarter, user_2012_4_quarter, "2012年第四季度销量")
lineMountUser(mount_2013_4_quarter, user_2013_4_quarter, "2013年第四季度销量")
lineMountUser(mount_2014_4_quarter, user_2014_4_quarter, "2014年第四季度销量")
  1. 可以很明显看出2013年和2014年双十一及双十二当天的销量和销售额都激增。
  2. 每年的双十一活动用户量和销量都比往年多,用户量增长为75%-80%。
复购率
# trade = pd.merge(left=trade, right=baby, how='left',
#                       on='user_id', suffixes=("_trade", "_baby"))
# 由于数据不完整,所以我们只计算2013年和2014年的复购率
repurchase_data_2013 = trade[(trade.day >= datetime(2013, 1, 1)) & (trade.day <= datetime(2013, 12, 31))]
repurchase_data_2014 = trade[(trade.day >= datetime(2014, 1, 1)) & (trade.day <= datetime(2014, 12, 31))]
# 根据月和userid分组
group_2013 = repurchase_data_2013.groupby(by=[repurchase_data_2013.day.dt.month, 'user_id'])
group_2014 = repurchase_data_2014.groupby(by=[repurchase_data_2014.day.dt.month, 'user_id'])
repurchase_data_2013.groupby(by=[repurchase_data_2013.day.dt.month, 'user_id']).size()[[1]].sum()
628
def cmonthPurchaseRate(data):"""导入根据月和userid分组数据"""rate = []for i in range(1, 13):cmonth_bought_user = data.size()[[i]].sum()cmonth_repurchase_user = (data.size()[[i]] > 1).sum()rate.append(round(cmonth_repurchase_user/cmonth_bought_user, 4))return rate
purchase_rate_month_2013 = cmonthPurchaseRate(group_2013)
purchase_rate_month_2014 = cmonthPurchaseRate(group_2014)
pyc.Line().add_xaxis(xaxis_data=[x for x in range(1, 13)]).add_yaxis(series_name='2013年当月复购率', y_axis=purchase_rate_month_2013
).add_yaxis(series_name='2014年当月复购率', y_axis=purchase_rate_month_2014).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="当月复购率变化趋势", subtitle="2013年及2014年月复购率变化趋势"), toolbox_opts=opts.ToolboxOpts(), tooltip_opts=opts.TooltipOpts(is_show=True, trigger='axis')).render_notebook()

在这里插入图片描述

# 产品大类复购率
# 根据产品大类分组,然后循环大类进行索引求出每个大类的复购率
t = trade.groupby(by=['cat1', 'user_id']).size()
purchase_dict={}
for i in trade.cat1.unique():c = t.loc[i].value_counts()purchase_dict[i]=((c.sum()-c[:1])/c[:1]).values[0].round(4)
plt.figure(figsize=(10,6))
sns.barplot(x=list(purchase_dict.keys()),y=list(purchase_dict.values()))
plt.title("各大类复购率",fontdict=fontdict)
plt.show()

在这里插入图片描述

4月、10月及11月都存在一定的用户当月复购,但是复购率都极低,各产品大类的复购率也极低,均未到达1%,考虑到用户单次购买量大多是一件,且复购率低,说明用户对单一商品的回购欲望极低,商家应该从产品角度进行考虑,例如产品质量及购物体验等。

商品销售情况

# 商品大类销售情况
cat = trade.groupby("cat1")['buy_mount'].sum()
sns.barplot(x=cat.index, y=cat.values)
plt.title("商品大类销售情况")
plt.xlabel("商品大类")
plt.show()

在这里插入图片描述

# 人均大类购买情况
cat_aver_user = (trade.groupby("cat1")['buy_mount'].sum(
) / trade.groupby("cat1")['user_id'].count()).sort_values(ascending=False)
sns.barplot(x=cat_aver_user.index, y=cat_aver_user.values)
plt.title("商品大类人均购买情况")
plt.xlabel("商品大类")
plt.show()

在这里插入图片描述

# 大类下子类别数量
cat_count = trade.groupby("cat1")['cat_id'].count()
sns.barplot(x=cat_count.index, y=cat_count.values)
plt.title("商品大类的子类数量")
plt.xlabel("商品大类")
plt.show()

在这里插入图片描述

大类28和50008168销量最佳,大类38虽然销量低、子类数最少但是人均购买量却很高,说明用户在购买38大类下的产品时选择余地较少,但同时用户对此类产品的需求又很旺盛,可以适量的增加38大类下的子类产品,提高销售量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/591795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】java项目—苍穹外卖day10

文章目录 苍穹外卖-day10课程内容1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功…

RIP协议(路由信息协议)

一、RIP协议概述 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;即根据跳数来度量路由开销&#xff0c;进行路由选择。 相比于其它路由协议&#xff08;如OSPF、ISIS等&#xff09;&#…

好物视频素材怎么找?推荐8个视频素材库大全高清素材

在这个故事无处不在的时代&#xff0c;找到那些能够让你的视频内容脱颖而出的高清无水印素材&#xff0c;就像是探寻宝藏。为了让你的每一帧都充满力量和情感&#xff0c;下面介绍的八个视频素材网站覆盖了从传统风格到现代节奏的各种需求&#xff0c;帮助你在全球范围内寻找到…

uniapp 设置globalStyle navigationBarTitleText 不显示

设置全局的navigationBarTitleText但是没有显示 没效果: 原因: 这里实际上设置了navigationBarTitleText 为"" 所以不会使用全局的设置 解决方法就是直接将这一行代码删除

走进车厂 | 移远通信以前沿车载技术,照亮智能网联汽车产业创新发展之路

无钥匙自动解锁方便快捷、实时路况导航精准高效、语音指令轻松控制车辆、车载娱乐系统丰富多样……随着智能化、数字化浪潮的不断推进&#xff0c;现如今的汽车出行焕然一新。 正如我们所见&#xff0c;汽车产业正在经历前所未有的变革。物联网、车联网等前沿技术的发展和应用&…

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

【JAVAEE学习】探究Java中多线程的使用和重点及考点

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

(四) 序列化器类使用整理

从一、序列化器类中&#xff0c;或 视图集源码 中&#xff0c; 可以得知&#xff1a; 序列化器类可以接收一个instance &#xff0c;和一个data serializer_obj XxxxSerializer(instance,datarequest.data) &#xff08;更新时&#xff0c;instance相当于原…

NKCTF2024 re VM?VM!WP

逻辑似乎很简单&#xff08;个鬼啊&#xff09; 这个函数是把输入的字符转化为二进制并倒序存储 sub_1570太大了加载不出来&#xff0c;应该是加密的主逻辑&#xff0c;目的是需要输出1 可以通过删除栈的方法强行转化伪代码 首先删掉这部分 9A0改小点 这个也是 栈这里U一下再…

江大白 | 万字长文,近3年Transformer在小目标检测领域,进展与突破系统梳理!

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;万字长文&#xff0c;近3年Transformer在小目标检测领域&#xff0c;进展与突破系统梳理&#xff01; 以下文章来源于微信公众号&#xff1a;AI视界引擎 …

作业3:计算机体系结构属性优选

作业3&#xff1a;计算机体系结构属性优选 一. 单选题&#xff08;共11题&#xff0c;55分&#xff09; (单选题)下列哪个选项属于非线性结构&#xff08; &#xff09;&#xff1f; A. 线性表 B. 栈 C. 树 D. 队列 正确答案: C:树; (单选题) 浮点数在机器中的表示形式如下所…

Linux-进程概念

1. 进程基本概念 书面概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核概念&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体。 2. 描述和组织进程-PCB PCB&#xff08;process contral block&#xff09;&#xff0…