文章目录
0. 数据下载
算法学习
、4对1辅导
、论文辅导
、核心期刊
项目的代码和数据下载
可以通过公众号
滴滴我
1. 分析目标
根据现有数据对黑色星期五的消费者进行用户画像的构建,从物理属性和行为属性两个方面进行分析。
用户画像
- 物理属性
- 年龄
- 性别
- 城市
- 学历
- 婚姻
- 生育
- …
- 行为属性
- 品类偏好
- 价格偏好
- 时间偏好
- …
2. 详细分析
2.1 读取数据
准备数据分析所需要的包
# 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["font.serif"] = ["SimHei"]
读取数据
# 读取数据
df_raw = pd.read_csv('BlackFriday.csv')
df_raw.head()
2.2 查看缺失值情况和数据类型
# 查看数据信息
df_raw.info()
# 查看岗位编码的数据有哪几种
df_raw['Occupation'].unique()
array([10, 16, 15, 7, 20, 9, 1, 12, 17, 0, 3, 4, 11, 8, 19, 2, 18, 5, 14, 13, 6])
# 职业应该是文本类型,所以对上面查询到岗位编码,修改数据
# 数据是瞎编的,如果有对应的岗位对照表,就可以直接取
df_raw['Occupation'] = df_raw['Occupation'].replace({
0:'医生',
1:'警察',
2:'律师',
3:'人力',
4:'程序员',
5:'运营',
6:'产品',
7:'项目管理',
8:'金融',
9:'服装设计',
10:'老师',
11:'教授',
12:'行政',
13:'公务员',
14:'物流',
15:'餐饮',
16:'零售',
17:'农业',
18:'广告',
19:'咨询',
20:'学生'
})
Product_Category_2 和 Product_Category_3 两个字段存在缺失值。可以着重分析第一分类,故暂时不做处理。
2.3 通过ID对用户进行groupby
# 对数据就行分组
cus_group = df_raw.groupby('User_ID').agg({
'Gender':np.min,
'Age':np.min,
'Occupation':np.min,
'City_Category':np.min,
'Stay_In_Current_City_Years':np.min,
'Marital_Status':np.min,
'Purchase':np.mean}).reset_index()
cus_group.head()
2.4 用户性别
# 获取全部用户性别分布情况
cus_gender = cus_group.groupby('Gender').agg({'User_ID':'count'}).reset_index()
cus_gender
# 绘制性别占比饼状图
plt.figure(figsize=(15,10))
plt.pie(cus_gender.User_ID,labels=['女性','男性'],colors=['#FF69B4','#87CEFA'],autopct='%1.1f%%',explode=[0.05,0.01])
# 标题
plt.title('不同性别用户数占比')
plt.show()
2.5 用户年龄
# 统计不同年龄段的用户数量
cus_age = cus_group.groupby(['Age','Gender']).agg({'User_ID':'count'}).reset_index()
# 获得年龄分组中的男性用户数量
age_male = cus_age[cus_age['Gender'] == 'M']
# 获得年龄分组中的女性用户数量
age_female =cus_age[cus_age['Gender'] == 'F']
# 绘制柱状堆积图
plt.figure(figsize=(15,5))
# 绘制男性在各个年龄段的数量柱状图
plt.bar(age_male['Age'],age_male['User_ID'],label='男性',color='#87CEFA',width=0.7)
# 绘制女性在各个年龄段的数量柱状图
plt.bar(age_female['Age'],age_female['User_ID'],bottom=list(age_male['User_ID']),label='女性',color='#FF69B4',width=0.7)
# 增加图例
plt.legend(loc='upper right')
# 横纵坐标标签
plt.xlabel('年龄段')
plt.ylabel('用户数量')
plt.show()
2.6 用户职位
# 统计不同岗位类别下的用户数量
cus_Occupation = cus_group.groupby('Occupation').agg({'User_ID':'count'}).reset_index()
cus_Occupation.sort_values('User_ID',inplace=True)
# 绘制不同岗位与用户数量条形图
plt.figure(figsize=(15,10))
plt.barh(list(cus_Occupation['Occupation']),cus_Occupation['User_ID'],color='#87CEFA')
plt.yticks(cus_Occupation['Occupation'])
# 横纵坐标标签
plt.xlabel('用户数量')
plt.ylabel('岗位类别')
plt.show()
2.7 用户城市
# 查看城市类别的值有哪些
df_raw['City_Category'].unique()
array([‘A’, ‘C’, ‘B’], dtype=object)
# 获取不同城市类别对应的数量
cus_city_category = cus_group.groupby('City_Category').agg({'User_ID':'count'}).reset_index()
cus_city_category
# 绘制不同城市类别用户数占比饼状图
plt.figure(figsize=(15,10))
plt.pie(cus_city_category.User_ID,labels=['A','B','C'],colors=['#FF69B4','#87CEFA','#F5DEB3'],autopct='%1.1f%%',explode=[0.01,0.01,0.03])
# 标题
plt.title('各类别用户数量占比')
plt.show()
2.8 婚姻状况
# 已婚和未婚数量统计
cus_Marital_Status = cus_group.groupby('Marital_Status').agg({'User_ID':'count'}).reset_index()
cus_Marital_Status.Marital_Status.replace({0:'未婚',1:'已婚'},inplace=True)
cus_Marital_Status
# 绘制不同婚姻状况用户数量占比
plt.figure(figsize=(15,10))
plt.pie(cus_Marital_Status['User_ID'],labels=cus_Marital_Status['Marital_Status'],colors=['#FF69B4','#87CEFA'],autopct='%1.1f%%',explode=[0.05,0.01])
#标题
plt.title('不同婚姻状况用户数量占比')
plt.show()
2.9 消费偏好:衡量不同年龄段用户的消费区间
# 查看用户分组的前五条数据
cus_group.head()
# 查看用户年龄分组的具体值
cus_group['Age'].unique()
array([‘0-17’, ‘55+’, ‘26-35’, ‘46-50’, ‘51-55’, ‘36-45’, ‘18-25’], dtype=object)
# 获得不同年龄段的消费平均值
group_0to17 = cus_group[cus_group['Age']=='0-17']['Purchase']
group_18to25 = cus_group[cus_group['Age']=='18-25']['Purchase']
group_26to35 = cus_group[cus_group['Age']=='26-35']['Purchase']
group_36o45 = cus_group[cus_group['Age']=='36-45']['Purchase']
group_46to50 = cus_group[cus_group['Age']=='46-50']['Purchase']
group_51to55 = cus_group[cus_group['Age']=='51-55']['Purchase']
group_55more = cus_group[cus_group['Age']=='55+']['Purchase']
# 绘制不同年龄段消费均值的箱线图
plt.figure(figsize=(15,10))
plt.boxplot([group_0to17,group_18to25,group_26to35,group_36o45,group_46to50,group_51to55,group_55more])
plt.xticks(ticks=[1,2,3,4,5,6,7],labels=['0-17','18-25','18-25','36-45','46-50','46-50','46-50'])
plt.show()
# 绘制整体用户的消费均值的箱线图
plt.figure(figsize=(15,10))
plt.boxplot(cus_group.Purchase)
plt.xticks(ticks=[1],labels=['整体购买均值'])
plt.show()
# 整体用户的消费均值的描述性统计
cus_group.Purchase.describe()
3. 总结
- 消费者绝对大多数分布是在C类城市的男性,已婚和未婚在消费者中比较均匀的分布,都在50%左右。
- 消费者主要分布在18-45岁之间,且26-35岁之间最多。
- 从职业分布上来看看,单个岗位下单人数排名的前五分别是:程序员、医生、项目管理、警察、农业从业者。
- 绝大多数的消费者的平均消费处于8400-10800美元之间,且不同年龄段消费金额的集中程度差异不大。