淘宝婴儿用品分析项目需求

  • 加载购买商品表的数据
    • 购买商品表字段信息:
      • 用户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为热销产品。
    • 热销产品为购买人数最多的产品而不是销量最高的产品,因为可能会有少量用户一次性购买大量的某种商品
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容