【天池学习赛】淘宝母婴购物数据可视化分析

数据预处理

导入需要的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import matplotlib
warnings.filterwarnings("ignore")
%matplotlib inline

读取数据

# 读取数据
df_trade = pd.read_csv('tianchi_mum_baby_trade_history.csv')
df_baby = pd.read_csv('tianchi_mum_baby.csv')
df_trade.head()
#df_baby.head()

商品交易信息表: tianchi_mum_baby_trade_history
字段说明
user_id 用户标识
auction_id 交易ID
category_1 商品一级类目ID
category_1 商品二级类目ID
buy_amount 购买数量
day 订单发生日期 格式:YYYYMMDD
在这里插入图片描述
用户基本信息表: tianchi_mum_baby
字段说明
user_id 用户标识 抽样&字段脱敏
birthday 婴儿出生日期 由user_id填写,有可能不真实,格式:YYYYMMDD
gender 婴儿性别(0 男孩,1 女孩,2性别不明) 由user_id填写,有可能不真实
在这里插入图片描述
合并数据并计算婴儿的年龄(这的年龄是指购买某一商品时,婴儿多少岁)

#合并
df_merge = pd.merge(df_trade,df_baby)
#将age和 birthday取出并转换成同种时间格式方便计算
df_merge['day'] = pd.to_datetime(df_merge['day'], format='%Y%m%d')
df_merge['birthday'] = pd.to_datetime(df_merge['birthday'], format='%Y%m%d')
#计算age,其中的参数 'timedelta64[Y]' 表示将时间差转换为以年为单位的浮点数,再转换成整型
df_merge['age'] = (df_merge['day'] - df_merge['birthday']).astype('timedelta64[Y]').astype('int32')
df_merge.head()

在这里插入图片描述
异常值处理
先观察这一系列数据的范围、大小等等,便于找到需要处理的异常值

df_merge.describe()

在这里插入图片描述

#为方便分析,过滤掉性别“未知”的数据条目
df_merge = df_merge[df_merge.gender != 2]
#保留婴儿年龄0~3岁的数据
df_merge = df_merge.loc[(df_merge['age'] >= 0) & (df_merge['age'] <= 3)]
df_merge.describe()

在这里插入图片描述

用户购物行为分析

sns.stripplot(x='category_1', y='age', hue='gender', jitter=0.3, dodge=True, data=df_merge, size=3)
plt.title("relationship between the age and gender of the buyer and the behavior of its users")
plt.xlabel("category_1")
plt.ylabel("age")
plt.show()

在这里插入图片描述
根据用户行为分析,产品28、50008168使用年龄跨度较大,都非常受0-3岁婴幼儿喜欢,且男女比例相当。产品38则偏向于0-1岁的婴幼儿,在2岁以后购买量显著减少。 而产品50014815是面向于0-3岁的婴幼儿,但在2岁之后婴幼儿需求减少。产品50022520大部分购买者是0岁婴幼儿,在0岁以后购买量显著减少。产品122650008虽是面向于0-3岁的婴幼儿,但是整个类的产品购买量并不高。

商品类目分析

这里单独分析df_trade表

数据处理

1.调整表结构

# 将day转化为datetime类型:
df_trade['day'] = pd.to_datetime(df_trade.day.astype('str'))
# 因为后续我们会基于年、季、月来分析数据变化趋势,为方便起见,我们为df_trade表增加对应的字段:
df_trade['year'] = df_trade.day.dt.year
df_trade['quarter'] = df_trade.day.dt.quarter
df_trade['month'] = df_trade.day.dt.month
df_trade.head()

在这里插入图片描述
2.异常值处理

#这可以看到buy_mount 最大值10000
df_trade.buy_mount.describe()

在这里插入图片描述
显然不是普通用户购物的操作,我们对每次购买量做一个限制

df_trade = df_trade[(df_trade.buy_mount >= 1) & (df_trade.buy_mount <= 189)]
df_trade.buy_mount.describe()

在这里插入图片描述

类目情况分析

查看各列的统计信息

count_user = df_trade.user_id.nunique()
count_auction = df_trade.auction_id.nunique()
count_category_1 = df_trade.category_1.nunique()
count_category_2 = df_trade.category_2.nunique()
count_buy_mount = df_trade.buy_mount.sum()
print("用户数:", count_user)
print("交易数:", count_auction)
print("商品一级类目数:", count_category_1)
print("商品二级类目数:", count_category_2)
print("总销量:", count_buy_mount)

在这里插入图片描述
可以看到:本次抽样数据共包含6个商品大类(一级类目),662个商品二级类目。

3.查看商品大类的销售情况,看看每一类商品的销售总额

# 商品大类销售情况
category_1_stats = df_trade.groupby(by="category_1")['buy_mount'].sum()
sns.barplot(x=category_1_stats.index, y=category_1_stats.values)
plt.title("Sales Volume by Category")
plt.xlabel("Category_1")
plt.ylabel('Sales Volume')
plt.show()

在这里插入图片描述
可视化结果表明:大类中,类28和类50008168销售总额较高。

4.看看大类中各小类的情况:
每个大类下子类的数量:

# 一级类目下二级类别数量
category_2_stats = df_trade.groupby('category_1')['category_2'].nunique()
category_2_stats

在这里插入图片描述
大类下每个子类的平均销售贡献:

# 人均大类购买情况
ave_category_stats = (df_trade.groupby("category_1")['buy_mount'].sum() / df_trade.groupby("category_1")['category_2'].nunique())

sns.barplot(x=ave_category_stats.index, y=ave_category_stats.values)
plt.title("Average Sales Volume Stats by Category_2")
plt.xlabel("Category_1")
plt.ylabel("# Avg Contribution of Category_2")
plt.show()

在这里插入图片描述
绿色(50008168)类目虽然子类数量少,但是子类的平均销量贡献度大。根据类目分析我们发现50008168类目的产品虽然种类比较少但是选购的人次相比于其他产品较多,推测为日常需求较高的消耗品。而28类目产品虽然种类繁多但是对销售量的贡献较少,可以适当减少进货量防止产品挤压。

写在最后

阿里云天池公开NoteBook(点击蓝字)代码在这

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值