项目背景
促销活动来袭,某平台希望通过发短信的形式,向潜在的用户发送广告和优惠信息,吸引他们来购物。
由于短信服务商限制,需要对客户进行精细匹配,通过已有信息进行客户画像描绘,找到最容易转化的人群,并且通过数据可以发现客户更青睐于在哪些时段下单,以期在适合时段进行短信推送。
项目目的
对于背景将任务拆解:
通过数据,找到最有可能转化的人群特征(年龄、性别、地域)等;
通过数据,决定出最有利于转化的营销短信投放时间。
项目资料
业务部门提供,包括三部分内容:
用户行为表:最近 6 个月的用户行为记录。
VIP 会员表:用户 VIP 会员开通情况。
用户信息表:用户的相关信息。
首先对于每个表的内容进行解释:
-
用户行为表:user_behavior_time_resampled.csv,包括
-
vip会员情况 vip_user.csv
-
用户信息情况 user_info.csv
用excel单独点开各自csv,发现三个表数据的量级分别是1100万,30万和40万,用excel操作比较费力。
因而用python中的pandas等库进行分析处理。
整个过程包括 数据预处理-异常值剔除-按照要求进行处理分析
分析过程
a. 导入有关数据
import pandas as pd
df_user_log = pd.read_csv("data/user_behavior_time_resampled.csv")
df_user_info = pd.read_csv("data/user_info.csv")
df_vip_user = pd.read_csv("data/vip_user.csv")
# 查看有关数据
df_user_log
df_user_info
df_vip_user
b. 异常值分析-时间节点
在第一个行为表中出现了time_stamp与timestamp两个情况,需要对两个数据展开分析分别代表用户的哪种时间行为。
在数据表中
两个时间戳字段 time_stamp 和 timestamp 的值是不一样的。 time_stamp 看起来是个整数,值比较小,而 timestamp 看起来是个浮点数,值比较大,普遍在五位数,其他看不出来。
对于不明确的数据,一般用的是看边界:也就是看整个列中最大值与最小值,输入代码:
time_stamp_max = str(df_user_log['time_stamp'].max())
time_stamp_min = str(df_user_log['time_stamp'].min())
print("time_stamp max: " + time_stamp_max, "time_stamp min: " + time_stamp_min)
timestamp_max = str(df_user_log['timestamp'].max())
timestamp_min = str(df_user_log['timestamp'].min())
print("timestamp max: " + timestamp_max, "timestamp min: " + timestamp_min)
结果:
time_stamp max: 1112, time_stamp min: 511
timestamp max: 86399.99327792758, timestamp min: 0.10787397733480476
结果显示:time_stamp 的最大值为 1112,最小值为 511,而 timestamp 的最大值为 86399.99 最小值为 0.1。
考虑到是要对近6个月的情况进行分析,511-1112,更像是5月11日至11月12日近半年的情况,而timestamp的最大值为86399,根据一天24小时,每小时60分,每分60秒,一天86400s,所以这列数据为每天的第几秒发生了操作这个行为。
在日期分析时,需要对【86400】敏感,因为一天共有86400s
然后对 time_stamp进行重命名
# time_stamp 改为 date
df_user_log.rename(columns={'time_stamp':'date'}, inplace = True)
df_user_log
c. 清洗各表数据
这里首先对空值进行统计,用的是pandas中的isnull.sum
- 对于log表进行清洗
# 清洗表1数据
df_user_log.isnull().sum()
输出结果:
18132对于整个1100万数据来说,缺失率为0.1%,占比较小,所以可以跳过不进行额外处理。
- 对于info表进行清洗
df_user_info.isnull().sum()
结果:
对于整体30w数据,缺失值影响也不大,但考虑到后面还要对年龄和性别进行描绘,所以要对异常值进行删除处理。
代码:
df_user_info = df_user_info.dropna()
df_user_info
查看处理过的数据情况
print(df_user_info.loc[df_user_info["age_range"] == 0.0, ["user_id"]].shape)
print(df_user_info.loc[df_user_info["gender"] == 0.0, ["user_id"]].shape)
# 第一行代表年龄为空的记录数,第二行代表性别为空的记录数。
结果:
(90638, 1)
(285634, 1)
补充-缺失值处理方法(pandas)
查看缺失值:
按单元格查看:df.isna()
按列查看:df.isna().sum()
按行查看:df.isna().sum(1)
有缺失值的列:df.loc[:, df.isna().any()]
有缺失值的行:df_scores.loc[df_scores.isna().any(1),:]
缺失值总个数:df.isna().sum().sum()
处理缺失值:
删除缺失值:df.dropna()
缺失值替换:df.fillna()
缺失值插值(线性):df.interpolate()
处理重复值:
查看重复行:df.duplicated()
删除重复行:df.drop_duplicates()
- 清洗vip表
代码:
df_vip_user.isnull().sum()
结果:
这个表数据完整,不需要做清洗。
c. 数据分析环节
(1)用户年龄分布分析
df_user_info.age_range.value_counts()
结果:
3.0 110952
0.0 90638
4.0 79649
2.0 52420
5.0 40601
6.0 35257
7.0 6924
8.0 1243
1.0 24
取值为 3.0 和 4.0 的占到绝大多数,根据上面数据集的定义,取值为 3 代表 25~30 岁,取值为 4 代表 30~34 岁。所以年龄在可以得到, 25~34 岁之间的用户占绝大多数。(age_range 取值 3.0、4.0)。
然后,我们可以通过代码计算出 25~34 岁用户的比例。首先通过 loc 函数筛选出所有不等于 0 的记录,然后计算年龄段等于 3.0 与年龄段等于 4.0 的总数除以所有非 0 记录的总数,计算的代码如下:
user_ages = df_user_info.loc[df_user_info["age_range"] != 0, "age_range"]
user_ages.loc[(user_ages == 3) | (user_ages == 4) ].shape[0] / user_ages.shape[0]
计算结果发现:25~34 岁用户占到了 58% 的比例
换句话说,平台对于未成年人购买控制较好,而平台购买的主力人群是中青年。
(2)用户性别分布分析
采用value_counts 分析,代码如下:
df_user_info.gender.value_counts()
输出结果
0.0 285634
1.0 121655
2.0 10419
数据显示,女性是男性购买数量的2.35倍。
从用户群体的分析上,已经大概勾勒出我们的目标用户画像,25~34 岁之间的女性群体。但目前分析的只是注册用户的信息,需要结合其他表对购买情况来分析,从购买力的角度出发去判断。
(3)不同年龄段用户下单行为分析
前边提到过,三个表都有字段:user_id,并且该字段是唯一属性,那么可以将所需表通过user_id联结起来(类比sql知识)
# 第三步 user_log与user_info合并
df_user_log = pd.read_csv("data/user_behavior_time_resampled.csv")
df_user_log.rename(columns={'time_stamp':'date'}, inplace=True)
df_user_log = df_user_log.join(df_user_info.set_index('user_id'), on = 'user_id')
df_user_log
结果:
这里我们需要过滤出下单用户判断其购买力,如果是excel可以直接筛选,但是数量级较大,则需要用pandas中的loc模块
# 第四步分析和并表,从不同年龄段分析
df_user_log.loc[df_user_log["action_type"] == "order", ["age_range"]].age_range.value_counts()
# 数据集定义应该为 action_type = order
输出结果
3.0 172525
4.0 153795
0.0 114908
5.0 79298
6.0 61534
2.0 59072
7.0 10785
8.0 1924
1.0 21
购买人群年龄分布图
重点关注的还是最终的下单转化情况,所以我们筛选了行为为 “order”的记录,查看其年龄段分布。
可以看到,下单的年龄段分布和用户信息的分布基本一致,25-34 岁的人占到 59.9%。
(4)不同性别用户下单行为分析
类比年龄,条件筛选改为性别
df_user_log.loc[df_user_log["action_type"] == "order", ["gender"]].gender.value_counts()
输出结果
0.0 467381
1.0 161999
2.0 24482
可以看到,女性用户不仅注册用户远超过男性,购买力同样惊人,是男性下单量的 2.9 倍。
基本可以确定,营销信息要聚焦的用户群应该是 25~34 岁的女性。