数据来源于阿里天池:
淘宝母婴购物数据可视化分析_学习赛_赛题与数据_天池大赛-阿里云天池 (aliyun.com)
Ali_Mum_Baby数据集包含脱敏后抽样淘宝母婴购物数据,由淘宝网提供。
本次可视化分析的目的是对用户行为数据进行分析,使用Python、Numpy、Pandas和Matplotlib等工具完成可视化分析。
先导入数据,为数据清洗做准备。
plt.style.use('ggplot') plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams['axes.unicode_minus']= False pd.set_option("display.max_columns",None) path1 = "D:/数据分析/python实战/母婴/tianchi_mum_baby.csv" path2 = "D:/数据分析/python实战/母婴/tianchi_mum_baby_trade_history.csv" read_data1 = pd.read_csv(path1) read_data2 = pd.read_csv(path2) print(read_data1.birthday.describe()) #数据预处理,设置正确的日期格式 read_data1["birthday"] =pd.to_datetime(read_data1.birthday.astype('str')) #发现异常数据 print(read_data1.birthday.describe()) read_data1 = read_data1[read_data1["birthday"]> '2010-01-01'] # 创建新列:月份、季度、年 read_data2['month'] = read_data2['day'].dt.month read_data2['quarter'] = read_data2['day'].dt.quarter read_data2['year'] = read_data2['day'].dt.year #剔除购买量异常(偏离中位数三个标准差) read_data2 = read_data2[(read_data2.buy_mount >= 1) & (read_data2.buy_mount <= 189)]
时间分析
"""按照月份分组,计算每月的购买人数""" grouped = read_data2.groupby('month')['user_id'].nunique() #绘制直方图 plt.bar(grouped.index, grouped.values) # 设置图表标题和轴标签 plt.title('month Purchase User Count') plt.xlabel('month') plt.ylabel('User Count') # 展示图表 plt.show()
统计每月销售数据,发现2月的购买人数,可能是收到春节假期的影响,而11月的购买人数数最多,可能是收到双11促销的影响。
"""按照季度分组,计算每月的购买人数""" grouped = read_data2.groupby('quarter')['user_id'].nunique() #绘制直方图 plt.bar(grouped.index, grouped.values) # 设置图表标题和轴标签 plt.title('quarter Purchase User Count') plt.xlabel('quarter') plt.ylabel('User Count') # 展示图表 plt.show()
从季度来看,母婴用品的销售存在一定的季节性特征,三四季度的购买情况要好于一二季度,特别是第四季度。可能是年末促销活动的影响。
"""查看11月内每天的销售情况""" read_data2 = read_data2[read_data2["month"]==11] read_data2["everyday"] = read_data2["day"].dt.day grouped = read_data2.groupby('everyday')['buy_mount'].sum() # 绘制直方图 plt.bar(grouped.index,grouped.values) # 设置图表标题和轴标签 plt.title('quarter Purchase User Count') plt.xlabel('quarter') plt.ylabel('User Count') # 展示图表 plt.show()
单独查看11月的销售数据,验证了双11对销售的促进作用。
产品分析
grouped = read_data2.groupby('buy_mount')['user_id'].count() plt.bar(grouped.index,grouped.values) lt.show()
从购买数量上看,大多数用户的单次购买数量为一,应具体分析商品属性,考虑是否刺激用户购买更多商品。
""" 查看各大类商品的销售情况"""
category = read_data2.groupby("category_1")['buy_mount'].sum() plt.figure(figsize=(10, 6)) plt.bar(category.index.astype(str),category.values) plt.title("Sales Volumn by Category") #连接 plt.xlabel("Category_1") plt.ylabel('Sales Volumn') # #统计用户年龄 plt.show()
从总量上看,编号28,5008168的产品销售数量较多,应该继续保持,而38、50022520、122650008的销售量较低。
""" 查看各大类商品下各子类商品的销售情况""" category = read_data2.groupby("category_1")['category_2'].nunique() plt.figure(figsize=(10,6)) plt.bar(category.index.astype(str),category.values) plt.title("Son Category") plt.xlabel("Category") plt.ylabel('Sales Volumn') #统计用户年龄 plt.show()
"""统计各类别下,子产品的平均销量""" category_buy_mount = read_data2.groupby("category_1")['buy_mount'].sum() son_category = read_data2.groupby("category_1")['category_2'].nunique() avg = category_buy_mount/son_category print(avg) plt.bar(avg.index.astype(str),avg.values) plt.show()
从子产品的平均销售情况看。5008168的销售数量最高,考虑到其较高的产品销售总量,说明其各子产品有较强的竞争力,相比之下28的平均销售值较低,而子产品的数量又比较高,可以考虑进行一定程度的整合优化。
"""分季度查看销售情况""" grouped = read_data2.groupby(['year','quarter'])['buy_mount'].sum() print(grouped) plt.bar( [str(idx[0]) + "/Q" + str(idx[1]) for idx in grouped.index],grouped.values) plt.show()
观察各个季度的销售情况,可以看出一年之内商品销售数量存在的季节性变化,同时,在2012年到2014年期间,商品销售数量呈现出增长趋势。
用户分析
"""合并数据""" df = pd.merge(read_data2,read_data1) """统计用户性别 """ gender_counts = df["gender"].value_counts() # 绘制饼图 labels = ["Male","Female"] sizes = [gender_counts[0],gender_counts[1]] plt.pie(sizes,labels=labels,autopct='%1.1f%%') plt.title("Gender Distribution") plt.axis('equal') plt.show()
总体上看,用户性别大体持平,男性用户略多于女性用户,可能是父亲参与了母婴用品的购买的过程。说明在销售商品时可以针对父亲群体进行必要的信息说明和推销。
"""男宝宝消费""" df = pd.merge(read_data2,read_data1) df = df[df["gender"] ==0] f_buy_amount = df.groupby("category_1")["buy_mount"].sum() # print(f_buy_amount) plt.pie(f_buy_amount.values,labels = f_buy_amount.index) plt.show() """女宝宝消费""" df = pd.merge(read_data2,read_data1) df = df[df["gender"] ==0] f_buy_amount = df.groupby("category_1")["buy_mount"].sum() # print(f_buy_amount) plt.pie(f_buy_amount.values,labels = f_buy_amount.index) plt.show()
可以看出男性宝宝和女性宝宝间的产品消费情况存在一定差异,在男性宝宝中,消费最多的产品大类是50008168,而在女性宝宝中,消费最多的大类是50014815,因此针对不同性别的宝宝,推销计划应该有所差异。而122650008的消费量最少,应结合产品属性做进一步分析。
链接:https://juejin.cn/spost/7241590154149642301
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。