- 加载购买商品表的数据
- 购买商品表字段信息:
- 用户ID 商品ID 商品二级分类 商品一级分类 商品属性 购买数量 购买日期
- 购买商品表字段信息:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
df=pd.read_csv('./data1/(sample)sam_tianchi_mum_baby_trade_history.csv')
df.head()
- 考虑到属性字段,都是一些编号,没办法具体分析,因此去除该字段
df.drop(labels='property',axis=1,inplace=True)
df.head()
- 将day列的数据转换成实现序列
df['day']=pd.to_datetime(df['day'], format ='%Y%m%d')
df['day'].dtype
- 查看数据的时间范围:
- 显示出数据集的最早购买时间和最后购买时间
df['day'].max()
Timestamp('2015-02-05 00:00:00')
df['day'].min()
Timestamp('2012-07-02 00:00:00')
- 查看buy_mount是否存有异常值
df.loc[df['buy_mount']<=0]
(df['buy_mount']<=0).sum() #0
- 查看数据集用户购买商品的情况
- 需要获知,大部分用户是多次购买商品还是只是购买了一次商品
df['user_id'].nunique(),df.shape[0] #nunique 去重后的数量
#(29944, 29971)
df['user_id'].value_counts()
- 加载婴儿表的数据
- 婴儿信息表字段信息:
- 用户ID 出生日期 性别
- 婴儿信息表字段信息:
df1=pd.read_csv('./data1/(sample)sam_tianchi_mum_baby.csv')
df1.head()
- 把birthday转换成时间序列
df1['birthday']=pd.to_datetime(df1['birthday'], format ='%Y%m%d')
df1['birthday'].dtype
df1['birthday'].head()
- 查看gender列是否存在异常数据
df1['gender']
df1['gender'].value_counts()
#输出结果:
0 489
1 438
2 26
Name: gender, dtype: int64
- 清除gender列中的异常数据
df1=df1.loc[~(df1['gender']==2)]
df1.head()
- 查看婴儿表中的男女比例
df1['gender'].value_counts()
#输出结果:
0 489
1 438
Name: gender, dtype: int64
- 汇总婴儿表和购买商品表的数据
df.head()
df1.head()
df_df1=pd.merge(left=df,right=df1,on='user_id',how='outer')
df_df1.head()
- 查看新老用户的数量
user_order_dt=df_df1.groupby(by='user_id')['day'].agg(['min','max']) #agg():分组后进行不同的聚合操作
user_order_dt.head()
user_order_dt['min']==user_order_dt['max'] #True新用户 False老用户
(user_order_dt['min']==user_order_dt['max']).value_counts()
#输出结果:
True 29920
False 24
dtype: int64
(user_order_dt['min']==user_order_dt['max']).sum()
- 给数据添加新的一列为购买的月份
df_df1['month']=df_df1['day'].astype('datetime64[M]')
df_df1.head()
- 查看每个月商品的销量情况,绘制线形图进行展示
month_amout_s=df_df1.groupby(by='month')['buy_mount'].sum()
month_amout_s
plt.plot(month_amout_s.index,month_amout_s.values)
plt.xticks(rotation=30) #x坐标旋转30度

output_40_1.png
- 查看12,13,14年每个月的销量情况,绘制线性图进行展示
- 提示1:给源数据添加一列为购买的年份
- 提示2:给源数据添加一列为购买的年份的第几个月
- 比如购买时间为2010-10-12,该时间为该年的第10个月,添加数据为10
df_df1['year']=df_df1['day'].astype('datetime64[Y]')
df_df1.head()
#给源数据添加一列为购买的年份的第几个月 dt.month
df_df1['month_num']=df_df1['day'].dt.month
df_df1.head()
year_month_amount_s=df_df1.groupby(by=['year','month_num'])['buy_mount'].sum()
year_month_amount_s
amount_12=year_month_amount_s['2012-01-01']
amount_13=year_month_amount_s['2013-01-01']
amount_14=year_month_amount_s['2014-01-01']
plt.plot(amount_12,label='2012')
plt.plot(amount_13,label='2013')
plt.plot(amount_14,label='2014')
plt.legend()

output_47_1.png
通过走势分析发现,在每年的5月,9月,11月都有不同程度的高峰凸起,整体呈现上涨趋势,接下来分析,为什么销量上涨?
查看每年的5,9,11这三个月每天的销量情况
-
查看12,13年11月份每天的销量情况,同理查看5,9月每天的销量情况
- 提示:给原始数据添加一列为销售时间的天数
df_df1['day_num']=df_df1['day'].dt.day
df_df1.head()
#12年11月份
df_12_11=df_df1.query('year=="2012-01-01" & month_num==11')
#13年11月份
df_13_11=df_df1.query('year=="2013-01-01" & month_num==11')
df_13_11
#12年11月份每天的销量
s_12_11_day=df_12_11.groupby(by='day_num')['buy_mount'].sum()
s_12_11_day
plt.plot(s_12_11_day)

output_54_1.png
#13年11月份每天的销量
s_13_11_day=df_13_11.groupby(by='day_num')['buy_mount'].sum()
s_13_11_day
plt.plot(s_13_11_day,label='13-11')
plt.plot(s_12_11_day,label='12-11')
plt.legend()

output_56_1.png
- 结论:2012年在11月10日和11月19日出现高峰,2013年在11月11日和11月29日出现高峰很明显是双十一促销带来的影响。
#13年5月份
df_13_5=df_df1.query('year=="2013-01-01" & month_num==5')
df_13_5
#13年9月份
df_13_9=df_df1.query('year=="2013-01-01" & month_num==9')
df_13_9
#13年9月份
df_12_9=df_df1.query('year=="2012-01-01" & month_num==9')
df_12_9
s_13_5_day=df_13_5.groupby(by='day_num')['buy_mount'].sum()
s_13_9_day=df_13_9.groupby(by='day_num')['buy_mount'].sum()
s_12_9_day=df_12_9.groupby(by='day_num')['buy_mount'].sum()
plt.plot(s_13_5_day,label='13-5')
plt.plot(s_13_9_day,label='13-9')
plt.plot(s_12_9_day,label='12-9')
plt.legend()

output_60_1.png
- 分析一级分类商品的销量情况,使用柱状图显示
cart1_amount_s=df_df1.groupby(by='cat1')['buy_mount'].sum()
cart1_amount_s
#输出结果:
cat1
28 28545
38 3666
50008168 18792
50014815 19763
50022520 3245
122650008 2239
Name: buy_mount, dtype: int64
plt.bar(cart1_amount_s.index.astype('str'),cart1_amount_s.values)

output_63_1.png
- 分析一级分类商品的购买用户人数,使用柱状图显示
df_df1.groupby('cat1')['user_id'].count() #未考虑重复购买
#输出结果:
#正确实现
cat1_user_num=df_df1.groupby('cat1')['user_id'].nunique()
cat1_user_num
#输出结果:
cat1
28 6963
38 1203
50008168 12494
50014815 4834
50022520 2367
122650008 2110
Name: user_id, dtype: int64
plt.bar(cat1_user_num.index.astype('str'),cat1_user_num.values)

output_67_1.png
- 从图中可以看出 68结尾的商品,购买用户人数是最大的,但是总销量低于28产品,按照我们对于热销产品的定义,50008168为热销产品。
- 热销产品为购买人数最多的产品而不是销量最高的产品,因为可能会有少量用户一次性购买大量的某种商品