2021-06-06 电商客户行为分析-python#pandas

项目背景
促销活动来袭,某平台希望通过发短信的形式,向潜在的用户发送广告和优惠信息,吸引他们来购物。
由于短信服务商限制,需要对客户进行精细匹配,通过已有信息进行客户画像描绘,找到最容易转化的人群,并且通过数据可以发现客户更青睐于在哪些时段下单,以期在适合时段进行短信推送。

项目目的
对于背景将任务拆解:
通过数据,找到最有可能转化的人群特征(年龄、性别、地域)等;
通过数据,决定出最有利于转化的营销短信投放时间。

项目资料
业务部门提供,包括三部分内容:
用户行为表:最近 6 个月的用户行为记录。
VIP 会员表:用户 VIP 会员开通情况。
用户信息表:用户的相关信息。

首先对于每个表的内容进行解释:

  1. 用户行为表:user_behavior_time_resampled.csv,包括
    2021-06-06 电商客户行为分析-python#pandas

  2. vip会员情况 vip_user.csv
    2021-06-06 电商客户行为分析-python#pandas

  3. 用户信息情况 user_info.csv2021-06-06 电商客户行为分析-python#pandas
    用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两个情况,需要对两个数据展开分析分别代表用户的哪种时间行为。
在数据表中
2021-06-06 电商客户行为分析-python#pandas
两个时间戳字段 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()

输出结果:
2021-06-06 电商客户行为分析-python#pandas
18132对于整个1100万数据来说,缺失率为0.1%,占比较小,所以可以跳过不进行额外处理。

  • 对于info表进行清洗
df_user_info.isnull().sum()

结果:
2021-06-06 电商客户行为分析-python#pandas
对于整体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()

结果:
2021-06-06 电商客户行为分析-python#pandas
这个表数据完整,不需要做清洗。

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

2021-06-06 电商客户行为分析-python#pandas

取值为 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

2021-06-06 电商客户行为分析-python#pandas

数据显示,女性是男性购买数量的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

结果:
2021-06-06 电商客户行为分析-python#pandas

这里我们需要过滤出下单用户判断其购买力,如果是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

购买人群年龄分布图
2021-06-06 电商客户行为分析-python#pandas
重点关注的还是最终的下单转化情况,所以我们筛选了行为为 “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

2021-06-06 电商客户行为分析-python#pandas
可以看到,女性用户不仅注册用户远超过男性,购买力同样惊人,是男性下单量的 2.9 倍。
基本可以确定,营销信息要聚焦的用户群应该是 25~34 岁的女性。

上一篇:并发编程之:Atomic


下一篇:理解CAS