目录
用户分析
1.用户男女性别占比
2.用户职业占比
3.用户婚姻占比
4.用户城市占比
5.用户年龄占比
6.用户居住时间占比
7.购物达人(金额)
8.购物能手(订单)
准备工作
导入库
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib as mpl
import pandas as pd
图片正常显示中文
# 图片正常显示中文
mpl.rcParams['font.sans-serif'] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
导入数据
# 导入数据
bf_df = pd.read_csv("data/BlackFriday.csv")
bf_df.columns = ["顾客ID", "商品ID", "性别", "年龄", "职业", "城市类别", "居住时间", "婚姻状况", "商品类别1", "商品类别2", "商品类别3", "购买金额"]
bf_df = bf_df.fillna(0)
用户去重
# 用户去重:一个用户可能有多个订单,通过顾客ID进行去重,获取用户实际总量
user_id_unique = bf_df[["顾客ID", "年龄", "性别",
"职业", "城市类别", "婚姻状况", "居住时间", "购买金额"]].drop_duplicates("顾客ID")
print("去重之前“\n", bf_df.shape)
print("去重之后:\n", user_id_unique.shape)
用户男女量占比计算与绘图
gender_group = user_id_unique.groupby("性别", as_index= False).count()
print(gender_group)
pie_label = gender_group["性别"].values
pie_num = gender_group["顾客ID"].values
# 当前数/总数
plt.pie(pie_num, labels=pie_label, autopct=lambda x : '{:.0f}人'.format(x * pie_num.sum()/100))
plt.legend() # 图例
plt.title("顾客性别占比饼图")
plt.show()
用户职业占比
user_occpation = user_id_unique.groupby("职业", as_index=False).count().sort_values("顾客ID", ascending=False)
print(user_occpation)
# 绘图
pie_labes = user_occpation["职业"].values
pie_num = user_occpation["顾客ID"].values
plt.pie(pie_num, labels=pie_labes, autopct=lambda x:'{:.0f}人'.format(x * pie_num.sum()/100))
plt.title("顾客职业占比饼图")
plt.show()
用户婚姻占比
# 用户婚姻占比
user_marry_status = user_id_unique.groupby("婚姻状况", as_index=False).count().sort_values("顾客ID",ascending=False)
print(user_marry_status)
pie_num = user_marry_status["顾客ID"].values
pie_lables = user_marry_status["婚姻状况"].values
plt.pie(pie_num, labels=pie_lables, autopct=lambda x:'{:.0f}'.format(x * pie_num.sum()/100))
plt.title("顾客婚姻状况占比饼图")
plt.show()
用户城市占比
sns.countplot(x="城市类别", hue="性别", data = user_id_unique.astype(str), orient="h") # countplot计数图;orient="h"水平
plt.title("用户城市类别计数图")
plt.show()
用户年龄占比
sns.countplot(x="城市类别", hue="性别", data = user_id_unique.astype(str), orient="h") # countplot计数图;orient="h"水平
plt.title("用户城市类别计数图")
plt.show()
用户居住时间占比分析
sns.countplot(x="居住时间", hue="城市类别", data=user_id_unique.astype(str))
plt.title("用户居住时间计数图")
plt.show()
购物达人 top10 金额
# 购物达人 top10 金额
bf_df7= bf_df.groupby("顾客ID", as_index=False)["购买金额"].sum().sort_values(by="购买金额", ascending=False)[:10].reset_index()
sns.barplot(x="购买金额", y="顾客ID", data=bf_df7)
plt.title("购物达人 top10")
plt.show()
print(bf_df7)
购物能够 top10 订单量
bf_df8 = bf_df.groupby("顾客ID", as_index=False)["商品ID"].count().sort_values(by="商品ID", ascending=False)[:10]
# print(bf_df8)
bf_df8.columns=["顾客ID", "订单数"]
pie_labels = bf_df8["顾客ID"].values
pei_nums = bf_df8["订单数"].values
plt.pie(pei_nums, labels=pie_labels, autopct=lambda x:'{:.0f}'.format(x * pei_nums.sum()/100)) # autopct数值显示
plt.show()
sns.barplot(x="商品订单数", y="顾客ID", data=bf_df8)
plt.title("购物能手top10")
# plt.show()
总代码
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib as mpl
import pandas as pd
# 用户分析
"""
1.用户男女性别占比
2.用户职业占比
3.用户婚姻占比
4.用户城市占比
5.用户年龄占比
6.用户居住时间占比
7.购物达人(金额)
8.购物能手(订单)
"""
# 图片正常显示中文
mpl.rcParams['font.sans-serif'] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
# 导入数据
bf_df = pd.read_csv("data/BlackFriday.csv")
bf_df.columns = ["顾客ID", "商品ID", "性别", "年龄", "职业", "城市类别", "居住时间", "婚姻状况", "商品类别1", "商品类别2", "商品类别3", "购买金额"]
bf_df = bf_df.fillna(0)
# 用户去重:一个用户可能有多个订单,通过顾客ID进行去重,获取用户实际总量
user_id_unique = bf_df[["顾客ID", "年龄", "性别", "职业", "城市类别", "婚姻状况", "居住时间", "购买金额"]].drop_duplicates("顾客ID")
# print("去重之前“\n", bf_df.shape)
# print("去重之后:\n", user_id_unique.shape)
# 用户男女量占比计算与绘图
# gender_group = user_id_unique.groupby("性别", as_index= False).count()
# print(gender_group)
# pie_label = gender_group["性别"].values
# pie_num = gender_group["顾客ID"].values
# # 当前数/总数
# plt.pie(pie_num, labels=pie_label, autopct=lambda x : '{:.0f}人'.format(x * pie_num.sum()/100))
# plt.legend() # 图例
# plt.title("顾客性别占比饼图")
# plt.show()
# 用户职业占比
# user_occpation = user_id_unique.groupby("职业", as_index=False).count().sort_values("顾客ID", ascending=False)
# print(user_occpation)
#
# # 绘图
# pie_labes = user_occpation["职业"].values
# pie_num = user_occpation["顾客ID"].values
#
# plt.pie(pie_num, labels=pie_labes, autopct=lambda x:'{:.0f}人'.format(x * pie_num.sum()/100))
# plt.title("顾客职业占比饼图")
# plt.show()
# 用户婚姻占比
# user_marry_status = user_id_unique.groupby("婚姻状况", as_index=False).count().sort_values("顾客ID",ascending=False)
# print(user_marry_status)
# pie_num = user_marry_status["顾客ID"].values
# pie_lables = user_marry_status["婚姻状况"].values
# plt.pie(pie_num, labels=pie_lables, autopct=lambda x:'{:.0f}'.format(x * pie_num.sum()/100))
# plt.title("顾客婚姻状况占比饼图")
# plt.show()
# 用户城市占比
# sns.countplot(x="城市类别", hue="性别", data = user_id_unique.astype(str), orient="h") # countplot计数图;orient="h"水平
# plt.title("用户城市类别计数图")
# plt.show()
# 用户年龄占比
# sns.countplot(x = "年龄", hue = "婚姻状况", data=user_id_unique.astype(str), orient="h")
# plt.title("用户年龄计算图")
# plt.show()
#用户居住时间占比分析
# sns.countplot(x="居住时间", hue="城市类别", data=user_id_unique.astype(str))
# plt.title("用户居住时间计数图")
# plt.show()
# 购物达人 top10 金额
# bf_df7= bf_df.groupby("顾客ID", as_index=False)["购买金额"].sum().sort_values(by="购买金额", ascending=False)[:10].reset_index()
# sns.barplot(x="购买金额", y="顾客ID", data=bf_df7)
# plt.title("购物达人 top10")
# plt.show()
# print(bf_df7)
# 购物能够 top10 订单量
# bf_df8 = bf_df.groupby("顾客ID", as_index=False)["商品ID"].count().sort_values(by="商品ID", ascending=False)[:10]
# # print(bf_df8)
# bf_df8.columns=["顾客ID", "订单数"]
# pie_labels = bf_df8["顾客ID"].values
# pei_nums = bf_df8["订单数"].values
# plt.pie(pei_nums, labels=pie_labels, autopct=lambda x:'{:.0f}'.format(x * pei_nums.sum()/100)) # autopct数值显示
# plt.show()
# sns.barplot(x="商品订单数", y="顾客ID", data=bf_df8)
# plt.title("购物能手top10")
# # plt.show()