赞
踩
使用Python、Numpy、Pandas和Matplotlib与seaborn包进行可视化分析,意在挖掘出母婴产品消费的具体目标群体与行为,为销售方做数据支撑,更好的针对客户群体进行优化推荐。
目录
淘宝母婴购物数据可视化分析_学习赛_天池大赛-阿里云天池 (aliyun.com)
首先进行导包以及导入数据,并查看两表的基本情况
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from datetime import datetime
- from pyecharts.charts import Line
- import os
- import seaborn as sns
-
- pd.options.display.max_columns = 15 #扩大显示行列
- pd.options.display.max_rows = 10
- #载入
- information = pd.read_csv(r"D:\Tianchidata\tianchi_mum_baby.csv")
- trade = pd.read_csv(r"D:\Tianchidata\tianchi_mum_baby_trade_history.csv")
- # print(trade)
- # print(information)
- #转换为dataframe,查看两表基本信息
- information = pd.DataFrame(information)
- trade = pd.DataFrame(trade)
- print(trade.info())
- print(information.info())
查看两表的基本情况
可以看到商品交易信息表中发生了29971次交易
用户信息表中记录了953条用户信息
接下来查看商品交易表中的销量列与交易日期的基本信息
- trade["day"] = trade["day"].astype("str") #将day列转换为datetime
- trade["day"] = pd.to_datetime(trade["day"])
- print(trade["day"].describe(),trade["buy_mount"].describe())
可以看到销量列,平均销量为2.5,75%的分位数仍是1,表明大部分人买的都是1件商品,符合常理,最大购买商品数为10000,很明显不符合常识与大多数消费者的行为,应该予以剔除。
交易日期从2012年7月至2015年2月,意味着2012年与2015年的信息不完整,出现频次最多为2014年11月11日即双十一期间,表明双十一对母婴产品销售影响大。
trade = trade[trade["buy_mount"]<=190] #保留buymount大小于标准差std3倍区间内的合理数据
下面查看客户信息表中的婴儿出生日期与性别,并对异常值进行处理
information["birthday"] = pd.to_datetime(information["birthday"].astype("str"))#将出生日期转为datetime类型
print(information["birthday"].describe(),information["gender"].describe())
可以看到出生日期最早为1984年,很明显不符合婴儿的年龄,因此取2010年以后出生的为有效信息。
在婴儿性别中存在2未知性别类型,不利于后续进行性别相关的分析,需要去除
information = information[information["birthday"]>"2010-01-01"] #去除不符合婴儿年龄的信息
information = information.drop(information[information["gender"]==2].index) #去掉2未知性别
最后通过外连接连接两表,
ti = information.merge(trade,how="outer",on="user_id") #通过外连接连接两表
从年份销量分析可以看出,2013-2014年总体销量是在增长的,总体增长了50.8%,2012与2015年数据不完整,故不纳入分析范围。
从季度销量图可以分析出,综合来看,每年的第一季度为全年销量淡季,结合实际情况,可能影响因素为春季期间快递停运。每年第四季度为全年销售旺季,推测是淘宝平台每年11-11的双十一促销活动影响。
从月份销量图来看,每年双十一期间销量最多,也侧面佐证了季度分析图中第四季度销量最多的结论,每年的1-2月销量最低。值得注意的是,每年春节之后,销量重新提升,到5月份会达到一个小高峰,表明5月是一个小旺季。
综上,可以得到以下结论:
1、2013-2014年母婴产品销量总体上升,增长50.8%
2、母婴产品销售旺季为每年的第四季度11-12月,淡季为每年第一季度1-2月。
3、5月为每年的一个小旺季,此后6月份销量下降,之后缓慢增长至11月高峰。
代码:
- #按时间段销量(可以画图来分析趋势)----------------
-
-
-
- t_year = ti.groupby([ti["day"].dt.year])["buy_mount"].sum() #每年销量
-
- t_quarter = ti["buy_mount"].groupby(ti["year_quartar"]).sum() #四年来的季度总销量
-
- t_month = ti["buy_mount"].groupby(ti["Month"]).sum() #月度销量
-
- t_day = ti["buy_mount"].groupby([ti["day"].dt.day]).sum() #日份销量
- #年份销量
- sns.set_style("darkgrid")
- sns.barplot(x=t_year.index,y=t_year.values)
- # plt.plot(t_year.index,t_year.values,color='g') #plt的画图方式
- plt.rcParams['font.sans-serif']=['SimHei'] #用黑体显示中文
- plt.xlabel("年份")
- plt.ylabel("销量")
- plt.title("各年销量图")
- # plt.locator_params("x", nbins = 4) #plt包设置x轴显示的刻度数
- # for x,y in zip(t_year.index,t_year.values): #plt在图上加上数据标签
- # plt.text(x,y+3,str(y),ha='center', va='bottom', fontsize=10)
- for idx, val in enumerate(t_year): #显示标数,enumerate返回一个由索引和值的元组
- plt.text(idx, val, str(val))
- plt.show()
- # print(t_quarter.index.tolist(),t_quarter.values.tolist())
-
- #季度销量图
- sns.lineplot(x=t_quarter.index,y=t_quarter.values)
- # plt.plot(t_quarter.index,t_quarter.values,color='g')
- plt.xlabel("时间")
- plt.ylabel("销量")
- plt.title("各季度份销量图")
- plt.show()
-
- #月份销量图
- sns.set_style('darkgrid') #sns预设风格
- sns.lineplot(x=t_month.index, y=t_month.values)
- plt.rcParams['font.sans-serif']=['SimHei'] #用黑体显示中文
- plt.xlabel("时间")
- plt.ylabel("销量")
- plt.title("各月份销量图")
- avg_buy = np.mean(t_month.values) #设置平均数横线
- plt.axhline(y=avg_buy,color='r')
- plt.xticks(rotation=45) #x轴刻度倾斜45
- plt.show()
可以看出,50014815与50008168的销量较多,最少的为122650008,根据此可以分析,最多的两个门类可能是婴幼儿的必需品。
客户信息中有51%男婴,49%女婴
下面来看男女婴客户所需商品类目对比
可以看出,男婴家长购买最多产品类为50014815,女婴家长购买商品最多类为50008168,表明男女婴所需的商品类别存在差异,其次,女婴所需的28与50022520类产品明显更多,男婴所需38类产品更多,也从侧面证明了这一点。
平台推荐算法也可以根据男女婴所需商品的不同优化推荐商品类别。
代码:
- b_category_1 = ti.groupby(by="category_1")['buy_mount'].sum() #大类销量
- # print(b_category_1)
- sns.set(style="darkgrid") #sns风格
- sns.barplot(x=b_category_1.index.astype('str'),y=b_category_1.values)
- plt.title("大类销量图")
- plt.xlabel("类目")
- plt.ylabel("销量",rotation=0) #rotation 旋转角度
- plt.rcParams['font.sans-serif']=['SimHei'] #设置中文字体
- plt.show()
- #计算年龄
- ti["age"] = round((ti["day"].dt.year - ti["birthday"].dt.year)) #计算年龄,round不加参数默认四舍五入
- ti = ti[ti["age"] >= 0]
- ti["age"] =ti["age"].astype(int)
-
- #性别
- gender_count = ti.groupby(ti["gender"])["user_id"].count() #计算性别
- # print(gender_count)
- plt.rcParams['font.sans-serif']=['SimHei']
- plt.pie(gender_count, labels=["男", "女"], autopct='%.2f%%') #labels标签,autopct显示数值比例
- plt.title("男女比例图")
- plt.show()
- #男女购买比例
- gender0_buymount = ti[ti["gender"] == 0] .groupby(["category_1"])["buy_mount"].sum() #男婴购买大类统计
- gender1_buymount = ti[ti["gender"] == 1] .groupby(["category_1"])["buy_mount"].sum() #女婴购买大类统计
- print(gender0_buymount,gender1_buymount)
- plt.figure(figsize = (12, 6)) #创建画布
- plt.suptitle("男女婴客户所需商品类目对比") #画布标题
- plt.subplot(121) #一行两列,从第一个开始画
- plt.pie(gender0_buymount, labels=gender0_buymount.index.astype("str"), autopct='%.2f%%')
- plt.title("男婴购买商品大类统计图")
-
- plt.subplot(122) #画第二个
- plt.pie(gender1_buymount, labels=gender1_buymount.index.astype("str"), autopct='%.2f%%')
- plt.title("女婴购买商品大类统计图")
- plt.show()
下面来看各年龄段的销量
从图可以看出,购买母婴产品的顾客的孩子主要集中在0-1岁间,从1岁之后,随着婴儿年龄的逐渐增长,销量呈现阶梯式下降,至4岁后,几乎没有母婴产品的销量,由此可以判断,母婴用品的客户群体应在婴儿0-3岁间,重点销售群体应该围绕0-1岁婴儿的家长顾客展开。
下面来看各年龄段购买商品的比率分析
由上图可以分析出如下几点
1、28类与50008168类产品各年龄段比例变化不大,销售周期遍布0-4岁
2、38类产品需求集中在1-2岁,适合推广婴儿在1-2岁的家长客户,除此之外其他年龄所需该类产品需求较少
3、50014815类产品1岁时需求远超其他类产品,销售周期也遍布0-4岁,但2-4岁时50008168类产品需求比这类产品多
4、50022520类产品只适合0岁婴儿,1岁之后销量断崖下降几乎绝迹,表明该商品适龄群体为未满1岁的婴儿
5、122650008类产品销量不多但遍布0-4岁,表明其应该为非母婴必需品。
代码:
- age_buymount = ti.groupby(ti["age"])["buy_mount"].sum()
-
- # print(age_buymount)
- sns.barplot(x=age_buymount.index,y=age_buymount.values)
- sns.lineplot(x=age_buymount.index,y=age_buymount.values,color="b")
- for idx, val in enumerate(age_buymount): #显示标数,enumerate返回一个由索引和值的元组
- plt.text(idx+0.1, val+0.1, str(val))
- plt.title("各年龄段销量")
- plt.xlabel("年龄")
- plt.ylabel("销量")
- plt.show()
- max_age_buy = ti.groupby([ti["age"], ti['category_1']])["buy_mount"].sum()
-
- max_age_buy = pd.DataFrame(max_age_buy)
-
- max_age_buy.reset_index(level=[0,1],inplace=True) #将两层index降维为两列
-
- max_age_buy = max_age_buy.rename(columns={'category_1':'商品类目','age':'年龄','buy_mount':'销量'}) #更改columns的名字
-
- # print(max_age_buy)
-
- sns.barplot(data=max_age_buy,x="年龄", y="销量",hue="商品类目",color="r",palette="deep") #palette为风格
-
- plt.title("0-5岁婴儿家长购买产品类目销量图")
-
- plt.show()
1.1、2013-2014年母婴产品销量总体上升,增长50.8%
1.2、母婴产品销售旺季为每年的第四季度11-12月,淡季为每年第一季度1-2月。
1.3、5月为每年的一个小旺季,此后6月份销量下降,之后缓慢增长至11月高峰。
母婴产品总体销售周期为婴儿年龄0-4岁,自1岁开始呈递减态势,4岁(含)开始需求大幅下滑,母婴用品的客户群体应在婴儿0-3岁间,重点销售群体应该围绕0-1岁婴儿的家长顾客展开。
男婴家长购买最多产品类为50014815,女婴家长购买商品最多类为50008168,表明男女婴所需的商品类别存在差异,其次,女婴所需的28与50022520类产品明显更多,男婴所需38类产品更多。
50022520类:0岁
28类:0-4岁,销量高峰:0-1岁
50008168类:0-4岁,需求均较大
50014815类:0-4岁,需求均较大,0-1岁为最高峰
122650008类:0-4岁,需求较小但总体销量稳定
38类:销售高峰1-2岁,其余年龄段销量较少
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。