kaggle实战:黑色星期五画像分析
本文是对还是kaggle上一份黑色星期五消费数据的分析,主要是针对用户和商品信息的画像分析。
关键词:用户画像、可视化、plotly、Pandas
图形:柱状图、饼图、散点图、小提琴图、桑基图、树状图、漏斗图、多子图等
导入库
1 | import pandas as pd |
数据基本信息
导入数据
探索数据的基本信息
In [2]:
1 | df = pd.read_csv("train.csv") |
基本信息
In [3]:
1 |
|
Out[3]:
1 | (550068, 12) |
In [4]:
1 |
|
Out[4]:
1 | User_ID int64 |
In [5]:
1 |
|
Out[5]:
1 | User_ID 0 |
In [6]:
1 | # 4、数据信息 |
缺失值可视化
In [7]:
1 | import missingno |
Out[7]:
1 | User_ID 0.000000 |
In [8]:
可以看到有两个字段存在缺失值
1 | # 矩阵图:查看缺失值的分布 |
1 | # 条形图 |
从下面的图像中也能够观察到只有两个字段存在缺失值
小结1:在我们的数据中包含object、float64和int64共3种数据类型
其中Product_Category_2字段有约31%的缺失占比,Product_Category_3有69%的缺失值占比。
总信息
寻找3个总体的数据信息:
- 总消费人数
- 总消费商品种类
- 总消费金额
In [10]:
1 | # 总消费人数 |
Out[10]:
1 | 5891 |
In [11]:
1 | # 总消费商品种类 |
Out[11]:
1 | 3631 |
In [12]:
1 |
|
Out[12]:
1 | 5095812742 |
商品类别
In [13]:
1 | # 总消费商品种类 |
Out[13]:
1 | 20 |
In [14]:
1 | df["Product_Category_2"].nunique() |
Out[14]:
1 | 17 |
画像1:消费金额Top10
In [15]:
不同用户的消费金额对比
1 | df1 = df.groupby("User_ID")["Purchase"].sum().reset_index() |
1 | fig = px.bar(df2[:10], # 选择前10人 |
可以看到最高的一位用户花费了1千多万!
画像2:高频消费前10
In [19]:
1 | df3 = df.groupby("User_ID").size().reset_index() |
1 | df4["User_ID"] = df4["User_ID"].apply(lambda x: "id_"+str(x)) |
画像3:人均消费金额Top10
In [23]:
1 | df5 = pd.merge(df2, df4) |
1 | fig = px.scatter(df5, |
1 | px.violin(df5["Average"]) |
从散点分布图和小提琴图中能够看到,大部分用户的平均消费金额在8k到10k之间
画像4:男女消费对比
In [28]:
1 | df6 = df.groupby("Gender").agg({"User_ID":"nunique", "Purchase":"sum"}).reset_index() |
Out[28]:
Gender | User_ID | Purchase | |
---|---|---|---|
0 | F | 1666 | 1186232642 |
1 | M | 4225 | 3909580100 |
1 | labels = df6["Gender"].tolist() |
总结:男士才是消费主力军!
画像5:不同年龄的消费人数和金额
In [30]:
1 | df7 = df.groupby("Age").agg({"User_ID":"nunique", "Purchase":"sum"}).reset_index() |
Out[30]:
Age | User_ID | Purchase | |
---|---|---|---|
0 | 0-17 | 218 | 134913183 |
1 | 18-25 | 1069 | 913848675 |
2 | 26-35 | 2053 | 2031770578 |
3 | 36-45 | 1167 | 1026569884 |
4 | 46-50 | 531 | 420843403 |
5 | 51-55 | 481 | 367099644 |
6 | 55+ | 372 | 200767375 |
In [31]:
1 | labels = df7["Age"].tolist() |
总结:26到35岁的人群,年轻人,大部分都是工作多年的用户,有家庭和经济基础,成为了消费主力军
画像6:不同性别+年龄的消费人数、金额
In [32]:
1 | df8 = df.groupby(["Gender","Age"]).agg({"User_ID":"nunique", "Purchase":"sum"}).reset_index() |
1 | fig = px.treemap( |
画像7:不同城市、年龄消费金额
In [34]:
1 | df9 = df.groupby(["City_Category","Age"]).agg({"User_ID":"nunique", "Purchase":"sum"}).reset_index() |
1 | fig = px.bar(df9, |
从3个城市来看,26-35一直都是消费主力
从上面的柱状图来看,在不同的年龄段,一直保持A < B < C的现象。C城市果真是消费的主要城市
画像8:不同婚姻状态的消费次数和金额
In [37]:
1 | df10 = df.groupby(["Marital_Status"]).agg({"User_ID":"nunique", "Purchase":"sum"}).reset_index() |
Out[37]:
Marital_Status | User_ID | Purchase | |
---|---|---|---|
0 | 0 | 3417 | 3008927447 |
1 | 1 | 2474 | 2086885295 |
In [38]:
1 | df10["Marital_Status"] = df10["Marital_Status"].map({0:"未婚",1:"已婚"}) |
In [39]:
1 | fig = px.pie(names=df10["Marital_Status"], |
总结:单身自由,就是要买
画像9:城市停留时间
In [41]:
1 | px.violin(df, |
1 | df11 = (df.groupby(["Stay_In_Current_City_Years"]) |
1 | stages = df12["Stay_In_Current_City_Years"].tolist() |
在一个城市停留1-2年内的用户更容易成为消费主力
画像10:销售额Top20商品
In [46]:
1 | df13 = df.groupby(["Product_ID"]).agg({"Purchase":"sum"}).reset_index() |
1 | fig = px.bar(df13[:10], # 选择前10人 |
画像11:二八法则
In [49]:
1 | # 销售额 |
Out[49]:
1 | 726 |
In [50]:
1 | sum(df13[:top20]["Purchase"]) / sum(df13["Purchase"]) |
Out[50]:
1 | 0.7325143993257992 |
通过计算的结果发现:销售额排名前20的商品其总销售额占据整体的73%,基本上是符合我们听到的二八法则
画像11:商品种类
In [51]:
1 | df14 = df.groupby(["Product_Category_1"]).agg({"Purchase":"sum"}).reset_index() |
1 | px.box(df, |
画像12:不同性别不同种类销售额
In [54]:
1 | df15 = (df.groupby(["Gender","Product_Category_1","Product_Category_2","Product_Category_3"]) |
第一级
In [56]:
1 | df16 = df15.groupby("Gender")["Purchase"] ). ) |
Out[56]:
Gender | Purchase | |
---|---|---|
0 | F | 416719106 |
1 | M | 1528099293 |
In [57]:
1 | df16["Total"] = "总销售额" |
In [58]:
1 | df16 = df16[["Total","Gender","Purchase"]] |
Out[58]:
父类 | 子类 | 数据 | |
---|---|---|---|
0 | 总销售额 | F | 416719106 |
1 | 总销售额 | M | 1528099293 |
第二级
In [59]:
1 | df17 = df15.groupby(["Gender","Product_Category_1"])["Purchase"] ). ) |
第三级
In [61]:
1 | df18 = df15.groupby(["Product_Category_1","Product_Category_2"])["Purchase"] ). ) |
Out[61]:
In [62]:
1 | df18.columns = ["父类","子类","数据"] |
第四级
In [63]:
1 | df19 = df15.groupby(["Product_Category_2","Product_Category_3"])["Purchase"] ). ) |
Out[63]:
In [64]:
1 | df19.columns = ["父类","子类","数据"] |
数据合并
In [65]:
1 | df20 = pd.concat([df16,df17,df18,df19],axis=0).reset_index(drop=True) |
Out[65]:
子类和父类元素个数
In [66]:
1 | labels = list(set(df20["父类"].tolist() + df20["子类"].tolist())) |
Out[66]:
1 | ['c1_3', 'c3_14', 'c3_18', 'c2_4', 'c2_12'] |
元素字典设置
In [67]:
1 | number = list(range(0, len(labels))) |
配对
In [68]:
1 | df20["父类索引"] = df20["父类"].map(index) |
Out[68]:
绘图
In [69]:
1 | import plotly.graph_objects as go |
从性别、3个不同的商品类别来看:
- 男性的消费能力远高于女性
- 在商品1中,1号品类是一个高需求的物品
- 在商品2中,2号最高,8号其次
- 在商品3中,头部需求的物品差距缩小,整体的需求更均衡