我是一名技术创作者
在互联网行业,电商领域绝对是数据分析使用最多的场所,各大电商平台都依靠数据分析来帮助他们挖掘用户订单增长机会。 例如,购买宝藏的核心思想是根据用户每天的浏览内容和停留时间,以及订单的相关性来推荐它。
在本文中,我们将通过一个真实的电子商务数据集进行分析,在回顾之前的内容的基础上,我们也可以感受到电子商务数据分析的分析过程。
最近,一家电子商务公司**需要策划一项促销活动,通过发送短信向客户发送广告和优惠,以吸引他们购物。 但是,由于预算和短信的限制,不可能发送给所有客户,因此有必要找出最有可能转换的人,并有针对性地发送促销信息。
基于以上要求,作为数据分析师,我们需要根据自己的需求制定自己的分析方案。 那么我们的任务是:
通过数据分析,找到最有可能转化的人群特征(如年龄、性别、地区等)。 通过数据分析,我们可以给出最合适的时间发送促销短信。 任务明确后,我们需要考虑完成上述任务需要哪些数据支持,并开始寻找数据部门提供相应的数据支持。
通过一顿饭的友情(唇)好(枪)合作(舌)商(战),最终从数据部得到以下数据:
用户行为表:过去6个月的用户行为数据。 即订单数据VIP数据:用户VIP会员开户数据。 用户数据:与用户个人信息相关的数据。 一旦我们有了数据,我们就可以尽力而为。
为了方便我们学习,我们需要自己模拟一些相关数据,如果不想模拟,可以联系***获取。
获取数据后,解压后可以看到以下文件:
user_beh**ior_time_resampled.CSV(用户行为数据)VIP用户CSV(VIP 用户数据)用户信息csv(用户数据) 我们先来看一下每个表的字段说明:
user_beh**ior_time_resampled.csvvip_users.csv
user_info.csv
从这里开始,我们将开始使用我们之前了解的一些包和库来读取数据,从 pandas 开始加载数据。
import pandas as pd
df_user_log = pd.read_csv("ecomm/user_beh**ior_time_resampled.csv")
df_vip_user = pd.read_csv("ecomm/vip_user.csv")
df_user_info = pd.read_csv("ecomm/user_info.csv")
df_user_log
df_vip_user
df_user_info
加载后,输出如下所示:
这里,df 用户日志表中有一个时间戳和时间戳字段,我们需要了解这两个字段的含义。让我们看一下这两个字段的边界值。
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
如您所见,时间戳的最大值为 1112,最小值为 511,时间戳的最大值为 8639999 的最小值为 01。
从数据集的描述来看,用户行为表是用户 6 个月的行为,时间戳最多 1112,最小值为 511,看起来很像一个日期。 表示最短日期为 5 月 11 日,最长日期为 11 月 12 日。
那么既然时间戳是日期,那么时间戳会是特定时间吗? 时间戳的最大值为 86399,而一天中的最大秒数为 24*3600 = 86400。 如果这两个数字非常接近,则可以假定时间戳表示发生此行为的一天中的秒数。
解决了两个时间字段的问题,为了避免歧义,我们将时间戳列重命名为 date。
df_user_log.rename(columns=, inplace = true)
df_user_log
一旦我们读取了数据并理解了每个字段的含义,我们就可以开始清理数据了。
对于数据分析中使用的数据集,我们需要尽可能了解数据的完整性,不清理与我们的数据分析无关的字段也没关系。 但是,如果关键分析维度缺少部分,我们需要考虑是完成还是直接删除。
让我们先看一下缺失值:
df_user_log.isnull().sum()
输出如下:
user_id 0
item_id 0
cat_id 0
seller_id 0
brand_id 18132
date 0
action_type 0
timestamp 0
dtype: int64
从以上结果来看,日志表中缺少品牌数据的数据超过18000条,缺失率相对较低,为016%(1.8w 1098w),一般这个数量级不会影响数据分析的整体严谨性,我们暂且不处理。
df_user_info.isnull().sum()
输出如下:
user_id 0
age_range 2217
gender 6436
dtype: int64
从结果中可以看出,信息表中缺少 2217 个年龄数据和 6436 个缺失的性别字段。 但是我们对用户的年龄和性别进行了分析,完成度完全不规则,所以这里我们直接删除它。
df_user_info = df_user_info.dropna()
df_user_info
df_vip_user.isnull().sum()
输出:
user_id 0
merchant_id 0
label 0
dtype: int64
从结果来看,VIP桌没有丢失,不需要处理。
完成上述准备工作后,是时候开始我们的核心数据分析工作了。
还记得我们的分析任务吗? 第一个是针对需要推广的人,第二个是确定推广信息的发送时间。 因此,让我们专注于我们的两个任务,让我们做下一个工作。
让我们通过 DataFrame 的 value counts 函数看一下年龄分布
df_user_info.age_range.value_counts()
输出:
name: age_range, dtype: int64
除了未知数据外,我们可以发现 3 和 4 的值占比最大。 3 和 4 分别代表 25-30 岁和 30-34 岁。 然后我们用**来计算25-34岁的用户比例。
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)用户性别分析接下来,我们使用值计数函数来分析性别。
df_user_info.gender.value_counts()
输出:
name: gender, dtype: int64
就字段含义而言,0 代表女性,1 代表男性,2 代表未知。 由此可以得出结论,该平台的核心用户群体是女性,男性数量为235倍。
到现在为止,通过对用户群体的分析,我们已经可以得出结论,平台的核心用户是25-34岁的女性,但这种情况现实吗? 毕竟,我们只分析了注册用户信息,并没有将其与订单数据相结合。 也许只是注册的女性多了,订购的女性却少了。 所以下一步就是结合用户信息和订单数据,验证猜想是否合理。
如上所述,我们需要结合用户信息和订单信息来分析是否是女性具有更强的购买力。 但是用户数据和订单数据属于未使用的表,那我们该怎么办? 如果你看一下数据,我们可以看到 user 表和 order 表都有一个名为 user id 的字段,因此我们有办法将这两个表关联起来。
按用户 ID 关联两个表:
df_user_log = df_user_log.join(df_user_info.set_index('user_id'), on = 'user_id')
df_user_log
输出:
从上面的输出中可以看出,用户表的年龄和性别被合并到订单表中。 接下来,我们可以根据下单的用户来分析用户的性别和年龄。
df_user_log.loc[df_user_log["action_type"] == "order", ["age_range"]].age_range.value_counts()
输出:
name: age_range, dtype: int64
通过以上结果可以看出,订单的年龄段和用户信息的分析基本一致,25-34岁的人占比为599%。
df_user_log.loc[df_user_log["action_type"] == "order", ["gender"]].gender.value_counts()
输出:
name: gender, dtype: int64
从以上结果可以看出,下订单较多的还是女性。 至此,我们基本可以得出结论:我们向 25-34 岁的女性用户发送促销信息。 至此,任务已经接近一半,我们已经确定了发送短信的组。 但另一项任务是确定何时发送。 让我们继续前进。
在这里,我们将每个日期分组,看看哪个时间段的下订单的人最多。 由于数据是最近 6 个月的数据,那么我们将数据分为 6 组并查看:
df_user_log.loc[df_user_log["action_type"] == "order", ["date"]].date.value_counts(bins = 6)
输出:
name: date, dtype: int64
可以看出,10月11日至11月11日下单量最多。 分析完日期后,我们来看看哪个时间段的订单更多。
timestamp 字段存储每条记录的排序时间,即从当天午夜开始累积的秒数。 它并不直观,我们更希望能够根据小时级数据对其进行分析。 因此,让我们考虑根据时间戳列创建一个新的时间列来表示小时。
df_user_log.loc["time_hours_view"] = df_user_log["timestamp"]/3600
df_user_log
输出:
我们可以直接使用 Value Count 来统计新添加的 Time Hours View 字段,然后我们可以分配一天的小时级分布。 我们以两小时为单位查看分布情况,因此将其分为 12 组。
df_user_log.loc[df_user_log["action_type"] == "order", ["time_hours_view"]].time_hours_view.value_counts(bins = 12)
输出:
name: time_hours_view, dtype: int64
从以上结果可以看出,晚上 8 点到 10 点是最有序的至此,我们已经完成了根据要求分析数据的任务。 基本确定短信发送群的推广是:对于25-34岁的女性用户,发送短信的最佳时间是10月下旬至11月中旬的晚上8点至10点
欢迎关注***服务器端技术选型。
如果您有任何问题或其他需求,可以留言。