分析的背景
最近小家电类目的订单数量、产品浏览量、搜索数量等都有所下降, 现在运营同事计划对小家电类目进行一次季末促销活动,希望你能针对小家电的用户特征给出一些建议。
促销活动落地的方向:
- 活动的受众群体定位
- 受众群体的偏好
- 活动的推送时间
导入所需模块
%matplotlib inline
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
读取上一节根据用户行为数据获取的标签
engine = create_engine('mysql://root:root@localhost:3306/data')
df =pd.read_sql_query("select * from profile_user_labels",con = engine)
df.head()
1、用户的基本属性
- 用户的性别分布
- 用户的年龄分布
- 用户的地域分布
- 用户的婚育情况
- 用户的学历和职业
df_gender=df.groupby('gender')['user_id'].count()
df_gender
plt.figure(figsize=(15,10))
plt.pie(df_gender,labels=['女','男'],colors=['#FF69B4','#87CEFA'],autopct='%1.1f%%',explode=[0.01,0.01])
plt.title('性别分布图')
plt.show()
1.2 用户的年龄分布
#利用pd.cut进行数据离散化切分,注意分组标签和分组数要一致
"""
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
x:需要切分的数据
bins:切分区域
right : 是否包含右端点默认True,包含
labels:对应标签,用标记来代替返回的bins,若不在该序列中,则返回NaN
retbins:是否返回间距bins
precision:精度
include_lowest:是否包含左端点,默认False,不包含
"""
bins = [0,20,25,30,35,40,45,50,55,1000]
labels = ["(0-20]","(20-25]","(25-30]","(30-35]","(35-40]","(40-45]","(45-50]","(50-55]","55岁以上"]
df["age_group"] = pd.cut(df["age"],bins=bins,labels=labels)
df.head()
# 绘制柱状图,,rot=0 表示旋转角度,0-360
age_group_df = df.groupby("age_group").user_id.count().reset_index()
age_group_df.plot.bar(figsize=(10,5),x="age_group",y="user_id",title="用户年龄分布",rot=0)
从数据来看,下单的消费者中男性更多,但是和女性用户数量差别不是特别大,用户集中在20-39岁之间,20岁以下的年轻用户和40岁以上的中老年用户比较少。
1.3 用户的地域分布
# 根据省份统计计数,并且升序排列顺序
pro_user_df = df.groupby("province").user_id.count().reset_index().sort_values(by="user_id",ascending=True)
pro_user_df
# legend=False 表示不要图例
pro_user_df.plot.barh(figsize=(10,5),x="province",y="user_id",legend=False)
# 根据城市统计计数,并且升序排列顺序
city_user_df = df.groupby("city").user_id.count().reset_index().sort_values(by="user_id",ascending=True)
city_user_df.plot.barh(figsize=(10,5),x="city",y="user_id",legend=False)
从数据来看,消费者最多的是来自广东省,其次是北京和上海。排名前五的地区有4个是东部沿海,另外北上广深的超一线城市占据消费用户数量的前4名。
1.4 用户的婚育情况
marry_df = df.groupby("marriage").user_id.count()
marry_df
# 绘制饼图
plt.figure(figsize=(15,10))
plt.pie(marry_df,labels=['已婚','未婚'],colors=['#FF69B4','#87CEFA'],autopct='%1.1f%%',explode=[0.01,0.01])
plt.title('婚育情况图')
plt.show()
1.5 用户的学历和职业
eduction_df = df.groupby("eduction").user_id.count().reset_index()
eduction_df
# 绘制条形图
eduction_df.plot.bar(figsize=(10,5),x="eduction",y="user_id",title="用户学历分布",rot=0)
job_df = df.groupby("job").user_id.count().reset_index()
# 绘制条形图
job_df.plot.bar(figsize=(10,5),x="job",y="user_id",title="用户职业分布",rot=0)
从数据来看,消费者最多的是白领和互联网从业人员,学历普遍在本科及以上
消费的典型用户:
男性,年龄在30岁左右。他在一线城市居住,拥有本科学历,并且在一家互联网公司任职。收入比较高,他应该比较追求生活品质,注重家庭观念。但是一线城市节奏太快,生活压力也大,他可能缺少时间和精力来关注家庭生活。
2、用户的购买行为属性
# 导入订单数据
order_df = pd.read_excel("order_data.xlsx")
order_df.head()
# 把订单日期转换为时间格式
order_df["time"]=pd.to_datetime(order_df["time"])
order_df.time.head()
# 提取时间点
order_df["time_hour"]=order_df["time"].dt.hour
order_df[["time_hour","time"]].head()
# 为了能按星期统计情况,需要把时间转换成星期几,默认周一是从0计数
order_df["time_week"]=order_df["time"].dt.dayofweek+1
order_df.time_week.head()
# 统计星期购物的情况
week_order_df = order_df.groupby("time_week").user_id.count().reset_index()
week_order_df.head()
# 绘制折线图,指定x轴的值,以及y轴的范围
week_order_df.plot(figsize=(10,5),x="time_week",ylim=[30000,42000])
# 统计时间点购物情况
hour_order_df = order_df.groupby("time_hour").user_id.count().reset_index()
hour_order_df.head()
# 绘制折线图,指定x轴的值,以及y轴的范围,并且指定x轴的刻度为 0-24 时间范围
hour_order_df.plot(figsize=(10,5),x="time_hour",ylim=[0,26000],xticks=range(0,24))
从整周的数据上来看,绝大部分订单都是在周三、周四来完成的,而周六、日的订单量最少。
从单日的每小时订单量来说,晚上21-22点是用户大量下单的时间。
3、分析结论
用户的特征:
多数是来自一线城市的男性,年龄在30岁左右。学历水平较高,从事互联网等高收入行业。他们喜欢在周二到周五的晚上10点左右下单。他们喜欢追求生活品质,关心家庭,但是因为生活节奏和工作压力又没有时间在家庭生活上付出很多时间和精力。
对于促销活动的建议:
- 文案:采取无性别风格的文案,突出产品对于家庭生活品质的提升,突出产品口碑
- 时间:活动应该选择在周二到周五的晚上8点进行推送