1、基于AARRR漏斗模型,使用常见的电商分析指标,从新增用户数量、各环节转化率、新增用户留存率进行分析,确定影响新增用户数量的因素,找到需要改进的环节,发现留存现存问题 | ||
2、研究用户在不同时间尺度下的行为规律,找到用户在不同时间周期下的活跃规律 | ||
3、找出最具核心付费用户群,对这部分的用户进行分析。 | ||
4、找到用户对于不同商品的偏好,指定对不同商品的营销策略。 1、数据源 | ||
来源:阿里云天池 | 数据源记录数(经过处理后) | 研究的时间范围 |
https://tianchi.aliyun.com | 100150807 | 2017.11.25~2017.12.03 |
2、使用模型
AAARR模型
3、分析思路
3.1 AAARR模型
获客 每日新增用户数 转化 各环节转化率分析 留存 次日留存、三日留存、7日留存 变现 复购次数、复购率:4.17%3.1.1每日新增的用户
date | 新增的数量 |
2017-11-26 | 159329 |
2017-11-27 | 64516 |
2017-11-28 | 31587 |
2017-11-29 | 18028 |
2017-11-30 | 9369 |
2017-12-01 | 585 |
2017-12-02 | 85 |
2017-12-03 | 7 |
新增用户情况 | |
2017/11/26至2017/12/3,每天都有新增的用户,但是新增的用户在递减。 |
3.1.2 各环节转化率分析
UV | 987976 |
pv | 67108664 |
跳失用户数量 | 868 |
跳转失率 | 99.91% |
behavior | 用户独立访客人数 |
pv | 983994 |
fav_cart | 831025 |
buy | 409322 |
behavior | 用户行为数量 |
pv | 67108664 |
fav_cart | 6996320 |
buy | 764599 |
用户独立访客分析 | |||||
APP的付费用户=409322/983994=41.5%. APP约有41.5的付费用户,用户付费转化率相当高,应将经营重心转化为培养用的忠诚度上,鼓励用户高频次消费。 |
用户行为分析 | |||||
从上图中可以看出确定有购物意向的只有9%的转化率,在 点击到收藏加购这一过程中,可能原因是用户花费大量的时间寻找合适的产品,可以针对性的优化平台的筛选功能,让用户更容易找到合适的产品。 |
3.1.3 留存
date | 次日留存率 | 第三日留存率 | 第七日留存率 |
2017-11-26 | 63.70% | 62.85% | 89.74% |
2017-11-27 | 59.85% | 60.35% | 83.47% |
2017-11-28 | 59.51% | 61.65% | 0 |
2017-11-29 | 66.56% | 70.01% | 0 |
2017-11-30 | 85.71% | 87.07% | 0 |
2017-12-01 | 84.96% | 77.95% | 0 |
2017-12-02 | 68.24% | 0 | 0 |
留存:新用户留存情况 | |||
在26号、27号,留存率存在上升的趋势。三种类型的留存率均维持在60%以上,表现非常优秀的.11-30、12-01较的留存率相较之前有大约20%的上涨。故促销活动能为提升留存率带来一定的正面影响 |
# 计算每日新增的用户
'''
假设11-25号为基础的用户数量。(需要去重统计,可以用集合去重),设置为基础用户id列表
当计算11-26号的用户新增数量的时候,统计11-26号出现的用户id,当11-26号出现的用户id,11-25号没有出现时为11-26号的新增加的用户。
并将新增的用户加入到基础用户id列表。
当计算11-27号新增用户数量的时候。去匹配基础用户id列表。不在基础用户id列表列表的为新增的用户。
'''
# 统计2017-11-25号的所有用户,和数量。(记得为去重统计)
df_data_11_25_userid_qc = list(set(df_data[df_data['dates'] == '2017-11-25']['user_id']))
userid_11_25_sl = len(df_data_11_25_userid_qc)
logger.info('11-25基础用户数量:{}'.format(userid_11_25_sl))
date_nyr_list = list(set(df_data['dates']))
date_nyr_list.remove('2017-11-25')
date_nyr_list.sort(reverse = False)
# 新增加的用户数量
df_data_i_userid_qc_xzj_all = 0
# 新增用户的列表
data_i_userid_qc_xzj_lb = []
# 新增次日留存率列表。
data_i_userid_qc_xzj_lc_i_1_lc_rate_all = []
for i in date_nyr_list:
# i号的所有用户,和新增加的用户。以及新增加的数量。
# i号的所有用户。(已去重)
df_data_i_userid_qc = list(set(df_data[df_data['dates'] == i]['user_id']))
# 11-25号与i号都有的用户。
df_data_i_userid_11_25 = set(df_data_11_25_userid_qc) & set(df_data_i_userid_qc)
# i号新增加的用户数量。
userid_i_xzj_sl = len(df_data_i_userid_qc) - len(df_data_i_userid_11_25)
# i号新增加的用户列表。
df_data_i_userid_qc_xzj = list(set(df_data_i_userid_qc) - set(df_data_i_userid_11_25))
# 基础用户数量为前一天的用户数量。
logger.info('{}基础用户数量:{}'.format(i, len(df_data_11_25_userid_qc)))
# 将新增加的用户加入基础用户的列表中。(11-25号的用户列表)
df_data_11_25_userid_qc.extend(df_data_i_userid_qc_xzj)
logger.info('{}新增加的用户数量:{}'.format(i, userid_i_xzj_sl))
df_data_i_userid_qc_xzj_all += userid_i_xzj_sl
# 向新增用户(df_data_i_userid_qc_xzj_zd)中添加元素。
# i日新增加的用户数量
i_userid_qc_xzj_sl = []
i_userid_qc_xzj_sl.append(i)
i_userid_qc_xzj_sl.append(userid_i_xzj_sl)
data_i_userid_qc_xzj_lb.append(i_userid_qc_xzj_sl)
if i != '2017-11-25' and i != '2017-12-03':
# 次日的时间
date_cr = datetime.date(*map(int, i.split('-'))) + datetime.timedelta(days=1)
date_cr = date_cr.strftime('%Y-%m-%d')
logger.info('i的类型{},date_cr的类型{}'.format(type(i), type(date_cr)))
# 次日的用户集合
df_data_i_cr_userid_qc = list(set(df_data[df_data['dates'] == date_cr]['user_id']))
logger.info('次日的用户数量:{}'.format(len(df_data_i_cr_userid_qc)))
# i号新增加的用户在i + 1号的留存用户。
df_data_i_userid_qc_xzj_lc_i_1 = set(df_data_i_userid_qc_xzj) & set(df_data_i_cr_userid_qc)
# i号新增加的用户在i+1号的留存用户数量。
df_data_i_userid_qc_xzj_lc_i_1_sl = len(df_data_i_userid_qc_xzj_lc_i_1)
logger.info('{}号新增加的用户在{}号的留存用户数量:{}'.format(i, date_cr, df_data_i_userid_qc_xzj_lc_i_1_sl))
# i号新增加的用户在i+1号的留存率。(即次日留存率)
df_data_i_userid_qc_xzj_lc_i_1_lc_rate = '%.2f%%' % ((df_data_i_userid_qc_xzj_lc_i_1_sl/userid_i_xzj_sl) * 100)
logger.info('{}号新增加的用户的次日留存率:{}'.format(i, df_data_i_userid_qc_xzj_lc_i_1_lc_rate))
'''
# i号的次日留存率
'''
date_i_xzj_userid_qc__lc_i_1_rate_lb = []
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(i)
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(df_data_i_userid_qc_xzj_lc_i_1_lc_rate)
data_i_userid_qc_xzj_lc_i_1_lc_rate_all.append(date_i_xzj_userid_qc__lc_i_1_rate_lb)
# 创建新增用户的dataframe
df_userid_xzj = pd.DataFrame(data_i_userid_qc_xzj_lb, columns = ['date', '新增的数量'])
logger.info('新增加的用户的datafraame:{}'.format(df_userid_xzj))
df_userid_xzj.to_excel(file + '每日新增用户数量.xls', index = False)
# 创建新增用户次日留存率dataframe
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all = pd.DataFrame(data_i_userid_qc_xzj_lc_i_1_lc_rate_all, columns=['date', '次日留存率'])
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all.to_excel(file + '新增用户的次日留存率.xls', index = False)
# 期间所有的用户
df_data_userid_qc = list(set(df_data['user_id']))
logger.info('11-26号到12-02号总共增加的用户数量:{}'.format(df_data_i_userid_qc_xzj_all))
logger.info('期间所有的用户数量:{}'.format(len(df_data_userid_qc)))
# 计算每日新增的用户
'''
假设11-25号为基础的用户数量。(需要去重统计,可以用集合去重),设置为基础用户id列表
当计算11-26号的用户新增数量的时候,统计11-26号出现的用户id,当11-26号出现的用户id,11-25号没有出现时为11-26号的新增加的用户。
并将新增的用户加入到基础用户id列表。
当计算11-27号新增用户数量的时候。去匹配基础用户id列表。不在基础用户id列表列表的为新增的用户。
'''
# 统计2017-11-25号的所有用户,和数量。(记得为去重统计)
df_data_11_25_userid_qc = list(set(df_data[df_data['dates'] == '2017-11-25']['user_id']))
userid_11_25_sl = len(df_data_11_25_userid_qc)
logger.info('11-25基础用户数量:{}'.format(userid_11_25_sl))
date_nyr_list = list(set(df_data['dates']))
date_nyr_list.remove('2017-11-25')
date_nyr_list.sort(reverse = False)
# 新增用户的列表
data_i_userid_qc_xzj_lb = []
# 新增第三日留存率列表。
data_i_userid_qc_xzj_lc_i_1_lc_rate_all = []
for i in date_nyr_list:
# i号的所有用户,和新增加的用户。以及新增加的数量。
# i号的所有用户。(已去重)
df_data_i_userid_qc = list(set(df_data[df_data['dates'] == i]['user_id']))
# 11-25号与i号都有的用户。
df_data_i_userid_11_25 = set(df_data_11_25_userid_qc) & set(df_data_i_userid_qc)
# i号新增加的用户数量。
userid_i_xzj_sl = len(df_data_i_userid_qc) - len(df_data_i_userid_11_25)
# i号新增加的用户列表。
df_data_i_userid_qc_xzj = list(set(df_data_i_userid_qc) - set(df_data_i_userid_11_25))
# 基础用户数量为前一天的用户数量。
logger.info('{}基础用户数量:{}'.format(i, len(df_data_11_25_userid_qc)))
# 将新增加的用户加入基础用户的列表中。(11-25号的用户列表)
df_data_11_25_userid_qc.extend(df_data_i_userid_qc_xzj)
logger.info('{}新增加的用户数量:{}'.format(i, userid_i_xzj_sl))
if i != '2017-11-25' and i != '2017-12-03' and i != '2017-12-02':
# 第三日的时间
date_cr = datetime.date(*map(int, i.split('-'))) + datetime.timedelta(days=2)
date_cr = date_cr.strftime('%Y-%m-%d')
# 第三日的用户集合
df_data_i_cr_userid_qc = list(set(df_data[df_data['dates'] == date_cr]['user_id']))
logger.info('第三日的用户数量:{}'.format(len(df_data_i_cr_userid_qc)))
# i号新增加的用户在i + 2号的留存用户。
df_data_i_userid_qc_xzj_lc_i_1 = set(df_data_i_userid_qc_xzj) & set(df_data_i_cr_userid_qc)
# i号新增加的用户在i+2号的留存用户数量。
df_data_i_userid_qc_xzj_lc_i_1_sl = len(df_data_i_userid_qc_xzj_lc_i_1)
logger.info('{}号新增加的用户在{}号的留存用户数量:{}'.format(i, date_cr, df_data_i_userid_qc_xzj_lc_i_1_sl))
# i号新增加的用户在i+2号的留存率。(即第三日留存率)
df_data_i_userid_qc_xzj_lc_i_1_lc_rate = '%.2f%%' % ((df_data_i_userid_qc_xzj_lc_i_1_sl/userid_i_xzj_sl) * 100)
logger.info('{}号新增加的用户的第三日留存率:{}'.format(i, df_data_i_userid_qc_xzj_lc_i_1_lc_rate))
'''
# i号的第三日留存率
'''
date_i_xzj_userid_qc__lc_i_1_rate_lb = []
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(i)
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(df_data_i_userid_qc_xzj_lc_i_1_lc_rate)
data_i_userid_qc_xzj_lc_i_1_lc_rate_all.append(date_i_xzj_userid_qc__lc_i_1_rate_lb)
# 创建新增用户次日留存率dataframe
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all = pd.DataFrame(data_i_userid_qc_xzj_lc_i_1_lc_rate_all, columns=['date', '第三日留存率'])
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all.to_excel(file + '新增用户的第三日留存率.xls', index = False)
print(df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all)
# 计算每日新增的用户
'''
假设11-25号为基础的用户数量。(需要去重统计,可以用集合去重),设置为基础用户id列表
当计算11-26号的用户新增数量的时候,统计11-26号出现的用户id,当11-26号出现的用户id,11-25号没有出现时为11-26号的新增加的用户。
并将新增的用户加入到基础用户id列表。
当计算11-27号新增用户数量的时候。去匹配基础用户id列表。不在基础用户id列表列表的为新增的用户。
'''
# 统计2017-11-25号的所有用户,和数量。(记得为去重统计)
df_data_11_25_userid_qc = list(set(df_data[df_data['dates'] == '2017-11-25']['user_id']))
userid_11_25_sl = len(df_data_11_25_userid_qc)
logger.info('11-25基础用户数量:{}'.format(userid_11_25_sl))
date_nyr_list = list(set(df_data['dates']))
date_nyr_list.remove('2017-11-25')
date_nyr_list.sort(reverse = False)
# 新增用户的列表
data_i_userid_qc_xzj_lb = []
# 新增第七日留存率列表。
data_i_userid_qc_xzj_lc_i_1_lc_rate_all = []
for i in date_nyr_list:
# i号的所有用户,和新增加的用户。以及新增加的数量。
# i号的所有用户。(已去重)
df_data_i_userid_qc = list(set(df_data[df_data['dates'] == i]['user_id']))
# 11-25号与i号都有的用户。
df_data_i_userid_11_25 = set(df_data_11_25_userid_qc) & set(df_data_i_userid_qc)
# i号新增加的用户数量。
userid_i_xzj_sl = len(df_data_i_userid_qc) - len(df_data_i_userid_11_25)
# i号新增加的用户列表。
df_data_i_userid_qc_xzj = list(set(df_data_i_userid_qc) - set(df_data_i_userid_11_25))
# 基础用户数量为前一天的用户数量。
logger.info('{}基础用户数量:{}'.format(i, len(df_data_11_25_userid_qc)))
# 将新增加的用户加入基础用户的列表中。(11-25号的用户列表)
df_data_11_25_userid_qc.extend(df_data_i_userid_qc_xzj)
logger.info('{}新增加的用户数量:{}'.format(i, userid_i_xzj_sl))
if i == '2017-11-26' or i == '2017-11-27':
# 第七日的时间
date_cr = datetime.date(*map(int, i.split('-'))) + datetime.timedelta(days=6)
date_cr = date_cr.strftime('%Y-%m-%d')
# 第三日的用户集合
df_data_i_cr_userid_qc = list(set(df_data[df_data['dates'] == date_cr]['user_id']))
logger.info('第七日的用户数量:{}'.format(len(df_data_i_cr_userid_qc)))
# i号新增加的用户在i + 6号的留存用户。
df_data_i_userid_qc_xzj_lc_i_1 = set(df_data_i_userid_qc_xzj) & set(df_data_i_cr_userid_qc)
# i号新增加的用户在i+6号的留存用户数量。
df_data_i_userid_qc_xzj_lc_i_1_sl = len(df_data_i_userid_qc_xzj_lc_i_1)
logger.info('{}号新增加的用户在{}号的留存用户数量:{}'.format(i, date_cr, df_data_i_userid_qc_xzj_lc_i_1_sl))
# i号新增加的用户在i+6号的留存率。(即第七日留存率)
df_data_i_userid_qc_xzj_lc_i_1_lc_rate = '%.2f%%' % ((df_data_i_userid_qc_xzj_lc_i_1_sl/userid_i_xzj_sl) * 100)
logger.info('{}号新增加的用户的第七日留存率:{}'.format(i, df_data_i_userid_qc_xzj_lc_i_1_lc_rate))
'''
# i号的第七日留存率
'''
date_i_xzj_userid_qc__lc_i_1_rate_lb = []
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(i)
date_i_xzj_userid_qc__lc_i_1_rate_lb.append(df_data_i_userid_qc_xzj_lc_i_1_lc_rate)
data_i_userid_qc_xzj_lc_i_1_lc_rate_all.append(date_i_xzj_userid_qc__lc_i_1_rate_lb)
# 创建新增用户次日留存率dataframe
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all = pd.DataFrame(data_i_userid_qc_xzj_lc_i_1_lc_rate_all, columns=['date', '第七日留存率'])
df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all.to_excel(file + '新增用户的第七日留存率.xls', index = False)
print(df_data_i_userid_qc_xzj_lc_i_1_lc_rate_all)
3.1.4变现
购买的次数 | 用户数量 | 累计用户数量 | 累计用户数量占比 | 购买次数>=i的用户数量 | 总的用户数量 | 占比 |
0 | 578654 | 578654 | 987976 | 987976 | 100.00% | |
1 | 236785 | 815439 | 0.825363167 | 409322 | 987976 | 41.43% |
2 | 94204 | 909643 | 0.920713661 | 172537 | 987976 | 17.46% |
3 | 39313 | 948956 | 0.960505113 | 78333 | 987976 | 7.93% |
4 | 17817 | 966773 | 0.978538952 | 39020 | 987976 | 3.95% |
5 | 8674 | 975447 | 0.987318518 | 21203 | 987976 | 2.15% |
6 | 4669 | 980116 | 0.992044341 | 12529 | 987976 | 0.0127 |
7 | 2643 | 982759 | 0.994719507 | 7860 | 987976 | 0.80% |
8 | 1616 | 984375 | 0.996355175 | 5217 | 987976 | 0.53% |
9 | 1000 | 985375 | 0.997367345 | 3601 | 987976 | 0.36% |
10 | 633 | 986008 | 0.998008049 | 2601 | 987976 | 0.26% |
11 | 453 | 986461 | 0.998466562 | 1968 | 987976 | 0.20% |
12 | 309 | 986770 | 0.998779323 | 1515 | 987976 | 0.15% |
13 | 249 | 987019 | 0.999031353 | 1206 | 987976 | 0.12% |
14 | 165 | 987184 | 0.999198361 | 957 | 987976 | 0.10% |
变现:复购分析 | ||||||
复购5此以上的用户数量占存在购买行为的用户数量的例: (987976-975447)/(987976-578654)=3.06% 右图片展示了不同复购次数对应的用户数量,发现复购5次以上的用户仅占存在购买用户的3。06%,发现复购用户的次数很少,商家可以从商品展示、服务质量物流体验方面寻找原因,定位所在问题点,寻求高复购率的突破。 |
3.2 商品维度分析
商品销售情况 排名 商品类目 排名3.2.1 商品的销售情况
销量前20的商品 | 关注人数 | 付费人数 | 该款商品的付费率 |
3557522 | 372 | 288 | 77.42% |
3964583 | 4057 | 291 | 7.17% |
4219087 | 3554 | 248 | 6.98% |
555181 | 537 | 284 | 52.89% |
3122135 | 2416 | 1209 | 50.04% |
4260261 | 687 | 294 | 42.79% |
1034594 | 1030 | 436 | 42.33% |
740947 | 8212 | 365 | 4.44% |
1728241 | 755 | 274 | 36.29% |
4499425 | 934 | 332 | 35.55% |
1116492 | 1235 | 430 | 34.82% |
705557 | 7815 | 255 | 3.26% |
1910706 | 1711 | 410 | 23.96% |
4443059 | 12373 | 324 | 2.62% |
3031354 | 13242 | 297 | 2.24% |
4438744 | 1286 | 246 | 19.13% |
257772 | 1986 | 285 | 14.35% |
3503155 | 2101 | 268 | 12.76% |
1415828 | 2403 | 251 | 10.45% |
1535294 | 17933 | 294 | 1.64% |
商品的销售情况分析 | ||||
1、浏览前20的商品销量也是前20的商品 | 1535294 3031354 4443059 | |||
2、浏览前20的商品收藏也是前20的商品有 | 812879 3845720 1535294 | 2032668 2331370 138964 | 2453685 2279428 2818406 | 1583704 3031354 4649427 |
3、加购前20的商品中也是销量前20的商品 | 705557 740947 1535294 | 3031354 | 4443059 | |
总结 | ||||
1、浏览与购买存在相关性 | ||||
2、浏览与收藏存在很强大的相关性 | ||||
3、加购与购买存在相关性 | ||||
4、加购与购买的相关性强于浏览与购买的相关性 |
# -*- coding:utf-8 -*-
import datetime
import os
import time
import pandas as pd
import logging
import os
from methods.logger_info import logger_info
import numpy as np
# logger_info方法实例话对象。
logger = logger_info()
logger.info('开始分析计算相关指标:{}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
# 当前py文件的绝对路径
file = os.getcwd() + '/'
# 上一级文件夹的路径
file_s = os.path.abspath(os.path.join(os.getcwd(), "..")) + '/'
# 输出指定文件夹下的所有的文件名
namelist = os.listdir(file_s)
str1 = '清洗后的电商数据'
# 输出数据分析的文件名,为name
for i in namelist:
# 当可以找到时间,不返回-1,则表明可以找到。
if i.find(str1) != -1:
name = i
# 默认读取列标签
df_data = pd.read_csv(file_s + name)
'''
# 付费率 = 付费人数/浏览商品的总人数
'''
# 以商品为分组条件,统计每种商品的状态的数量。
# 三个字段,商品id,行为behavior。每个商品在该中行为的数量。
df_data_groupby_item_id_value_counts_behavior = df_data['behavior'].groupby(df_data['item_id']).agg(['value_counts']).reset_index()
# 统计销量前20 的商品。
df_data_groupby_item_id_behavior_buy_q20 = df_data_groupby_item_id_value_counts_behavior[df_data_groupby_item_id_value_counts_behavior['behavior'] == 'buy'].sort_values(by = 'value_counts', ascending = False).iloc[:20, :]
df_data_groupby_item_id_behavior_buy_q20.to_excel(file + '销量前20的商品.xls', index=False)
# 统计销量收藏前20 的商品。
df_data_groupby_item_id_behavior_fav_q20 = df_data_groupby_item_id_value_counts_behavior[df_data_groupby_item_id_value_counts_behavior['behavior'] == 'fav'].sort_values(by = 'value_counts', ascending = False).iloc[:20, :]
df_data_groupby_item_id_behavior_fav_q20.to_excel(file + '收藏前20的商品.xls', index=False)
# 统计销量加购前20 的商品。
df_data_groupby_item_id_behavior_cart_q20 = df_data_groupby_item_id_value_counts_behavior[df_data_groupby_item_id_value_counts_behavior['behavior'] == 'cart'].sort_values(by = 'value_counts', ascending = False).iloc[:20, :]
df_data_groupby_item_id_behavior_cart_q20.to_excel(file + '加购前20的商品.xls', index=False)
# 统计浏览前20的商品。
df_data_groupby_item_id_behavior_pv_q20 = df_data_groupby_item_id_value_counts_behavior[df_data_groupby_item_id_value_counts_behavior['behavior'] == 'pv'].sort_values(by = 'value_counts', ascending = False).iloc[:20, :]
df_data_groupby_item_id_behavior_pv_q20.to_excel(file + '浏览前20的商品.xls', index=False)
# 商品类目的销售情况
df_data_groupby_category_id_value_counts_behavior = df_data['behavior'].groupby(df_data['category_id']).agg(['value_counts']).reset_index()
# 统计销量前20 的商品。
df_data_groupby_category_id_behavior_buy_q20 = df_data_groupby_category_id_value_counts_behavior[df_data_groupby_category_id_value_counts_behavior['behavior'] == 'buy'].sort_values(by = 'value_counts', ascending = False).iloc[:20, :]
df_data_groupby_category_id_behavior_buy_q20.to_excel(file + '销量前20的商品类目.xls', index=False)
# 销量排名前20 的商品id。
df_data_groupby_item_id_behavior_buy_q20_item_id = list(set(df_data_groupby_item_id_behavior_buy_q20['item_id']))
# 销量排名前20 的商品的付费人数以及浏览人数。
# 双重筛选,取交集。
q20_ffl = []
logger.info('销量排名前20的商品有:{}'.format(df_data_groupby_item_id_behavior_buy_q20_item_id))
for i in df_data_groupby_item_id_behavior_buy_q20_item_id:
q20_i_ffl = []
q20_i_ffl.append(i)
# 销量前20的商品中i商品de 消费人数。(已去重)
item_id_behavior_buy_q20_userid_sl = len(list(set(df_data[(df_data['behavior'] == 'buy') & (df_data['item_id'] == i)]['user_id'])))
logger.info('销量前20的商品中i商品de 消费人数:{}'.format(item_id_behavior_buy_q20_userid_sl))
# 销量前20的商品中i商品de 关注人数。(已去重)
item_id_behavior_q20_userid_sl = len(list(set(df_data[df_data['item_id'] == i]['user_id'])))
logger.info('销量前20的商品中i商品de 关注人数:{}'.format(item_id_behavior_q20_userid_sl))
# 商品i的付费率:表示为这款商品付费的人数/浏览这款商品的人数
if item_id_behavior_q20_userid_sl != 0:
item_id_i_ffl = '%.2f%%' % ((item_id_behavior_buy_q20_userid_sl/item_id_behavior_q20_userid_sl) * 100)
else:
item_id_i_ffl = 0
logger.info('销量排名前20的商品中,商品{}的付费率为{}'.format(i, item_id_i_ffl))
# 添加关注人数
q20_i_ffl.append(item_id_behavior_q20_userid_sl)
# 添加付费人数
q20_i_ffl.append(item_id_behavior_buy_q20_userid_sl)
# 添加付费率
q20_i_ffl.append(item_id_i_ffl)
q20_ffl.append(q20_i_ffl)
# 生成销量前20款商品的付费率文件
df_item_id_behavior_buy_q20_all_ffl = pd.DataFrame(q20_ffl,
columns = ['item_id', '关注人数', '付费人数', '该款商品的付费率']).sort_values(by = '该款商品的付费率', ascending = False)
df_item_id_behavior_buy_q20_all_ffl.to_excel(file + '销量前20的商品的付费率.xls', index = False)
'''
复购率
'''
# 付费人数,购买两次以上的人数。
# 付费人数
item_id_behavior_buy_sl = len(list(set(df_data[df_data['behavior'] == 'buy']['user_id'])))
# 后买两次以上的人数
df_data_groupby_item_id_value_counts_behavior = df_data['behavior'].groupby(df_data['user_id']).agg(['value_counts']).reset_index()
item_id_behavior_buy_dz2_sl = len(list(set(df_data_groupby_item_id_value_counts_behavior[(df_data_groupby_item_id_value_counts_behavior['behavior'] == 'buy')
& (df_data_groupby_item_id_value_counts_behavior['value_counts'] >= 2)]['user_id'])))
# 复购率:指的是消费两次以上的用户数量/付费人数
fgl = '%.2f%%' % ((item_id_behavior_buy_dz2_sl/item_id_behavior_buy_sl) * 100)
logger.info('复购率:{}'.format(fgl))
'''
# 变现:复购分析
'''
# 以user_id为分组的条件,去统计behavior为buy的个数。
# value_counts表示对该字段的统计函数以及生成列的名称
df_data_groupby_user_id_value_counts_behavior = df_data['behavior'].groupby(df_data['user_id']).agg(['value_counts']).reset_index()
df_data_groupby_user_id_value_counts_behavior.columns = ['user_id', 'behavior', '该用户存在该中行为的次数']
# 筛选购买行为的所有记录
df_data_groupby_user_id_value_counts_behavior_buy = df_data_groupby_user_id_value_counts_behavior[df_data_groupby_user_id_value_counts_behavior['behavior'] == 'buy']
# 基于字段‘该用户存在该中行为的次数’的降序排序
df_data_groupby_user_id_value_counts_behavior_buy = df_data_groupby_user_id_value_counts_behavior_buy.sort_values(by = '该用户存在该中行为的次数', ascending=False)
# 购买次数排名前三的用户
logger.info('购买次数排名前三的用户:{} '.format(df_data_groupby_user_id_value_counts_behavior_buy.iloc[:3, :]))
# 产品的总的关注人数(去重)
item_id_sl = len(set(df_data['user_id']))
# 购买商品的人数(去重),即付费人数
# 统计购买次数为0次的用户数量
item_id_behavior_buy_0_item_id_sl = item_id_sl - item_id_behavior_buy_sl
logger.info("统计购买次数为0次的用户数量:{}".format(item_id_behavior_buy_0_item_id_sl))
# 累计用户数量
user_id_behavior_buy_i_user_id_ljsl = item_id_behavior_buy_0_item_id_sl
logger.info("统计购买次数为0的累计用户数量:{}".format(user_id_behavior_buy_i_user_id_ljsl))
# 最多的购买次数
user_id_behavior_buy_value_counts_max = np.array(df_data_groupby_user_id_value_counts_behavior[df_data_groupby_user_id_value_counts_behavior['behavior'] == 'buy']['该用户存在该中行为的次数']).max()
# 购买i次的用户数量
user_id_behavior_buy_value_counts_lb = [[0, item_id_behavior_buy_0_item_id_sl, user_id_behavior_buy_i_user_id_ljsl]]
for i in range(1, user_id_behavior_buy_value_counts_max + 1):
# 筛选字段behavior == 'buy'且字段该用户存在该中行为的次数 == i
# 购买i次的用户。
user_id_behavior_buy_i_value_counts_lb = []
user_id_behavior_buy_i_value_counts_lb.append(i)
user_id_behavior_buy_i_user_id = list(set(df_data_groupby_user_id_value_counts_behavior[(
df_data_groupby_user_id_value_counts_behavior[
'behavior'] == 'buy') & (
df_data_groupby_user_id_value_counts_behavior[
'该用户存在该中行为的次数'] == i)][
'user_id']))
user_id_behavior_buy_i_user_id_sl = len(user_id_behavior_buy_i_user_id)
logger.info('购买{}次的用户数量:{}'.format(i, user_id_behavior_buy_i_user_id_sl))
user_id_behavior_buy_i_user_id_ljsl += user_id_behavior_buy_i_user_id_sl
logger.info("统计购买次数小等于{}的累计用户数量:{}".format(i, user_id_behavior_buy_i_user_id_ljsl))
# 累计用户数量占比
user_id_behavior_buy_i_user_id_ljsl_rate = user_id_behavior_buy_i_user_id_ljsl/item_id_sl
user_id_behavior_buy_i_value_counts_lb.append(user_id_behavior_buy_i_user_id_sl)
user_id_behavior_buy_i_value_counts_lb.append(user_id_behavior_buy_i_user_id_ljsl)
user_id_behavior_buy_i_value_counts_lb.append(user_id_behavior_buy_i_user_id_ljsl_rate)
user_id_behavior_buy_value_counts_lb.append(user_id_behavior_buy_i_value_counts_lb)
df_user_id_behavior_buy_i_value_counts = pd.DataFrame(user_id_behavior_buy_value_counts_lb, columns=['购买的次数', '用户数量', '累计用户数量', '累计用户数量占比例'])
# 购买次数大于等于i de用户数量
user_id_behavior_buy_di_value_counts_lb_all = []
for i in range(0, user_id_behavior_buy_value_counts_max + 1):
user_id_behavior_buy_di_value_counts_lb = [i]
# 购买次数大等于i次的用户的数量
df_user_id_behavior_buy_di_value_counts = df_user_id_behavior_buy_i_value_counts[df_user_id_behavior_buy_i_value_counts['购买的次数'] >= i]['用户数量'].sum()
# 购买次数大等于i次的用户的数量/总的用户数量
df_user_id_behavior_buy_d5_value_counts_rate = '%.2f%%' % ((df_user_id_behavior_buy_di_value_counts/item_id_sl) * 100)
user_id_behavior_buy_di_value_counts_lb.append(df_user_id_behavior_buy_di_value_counts)
user_id_behavior_buy_di_value_counts_lb.append(item_id_sl)
user_id_behavior_buy_di_value_counts_lb.append(df_user_id_behavior_buy_d5_value_counts_rate)
user_id_behavior_buy_di_value_counts_lb_all.append(user_id_behavior_buy_di_value_counts_lb)
df_user_id_behavior_buy_di_value_counts_lb_all = pd.DataFrame(user_id_behavior_buy_di_value_counts_lb_all,
columns=['购买次数i', '购买次数>=i的用户数量', '总的用户数量', '占比'])
# 生成复购分析文件
save_file = file + '复购分析.xls'
writer = pd.ExcelWriter(save_file)
for i in range(2):
if i == 0:
df_user_id_behavior_buy_i_value_counts.to_excel(writer, sheet_name='不同购买次数的用户数量')
if i == 1:
df_user_id_behavior_buy_di_value_counts_lb_all.to_excel(writer, sheet_name='购买次数>=i次的用户数量占比')
writer.save()
3.3 时间维度分析
3.3.1 研究一天内各时段活跃人数
dates | behavior | value_counts |
2017-11-25 | pv | 7912302 |
2017-11-26 | pv | 7515296 |
2017-11-27 | pv | 6906771 |
2017-11-28 | pv | 6718449 |
2017-11-29 | pv | 6920372 |
2017-11-30 | pv | 6985336 |
2017-12-01 | pv | 7320544 |
2017-12-02 | pv | 9135873 |
2017-12-03 | pv | 7693721 |
dates | behavior | value_counts |
2017-11-25 | fav | 278933 |
2017-11-26 | fav | 272064 |
2017-11-27 | fav | 254041 |
2017-11-28 | fav | 252092 |
2017-11-29 | fav | 258982 |
2017-11-30 | fav | 260748 |
2017-12-01 | fav | 267245 |
2017-12-02 | fav | 343819 |
2017-12-03 | fav | 285106 |
dates | behavior | value_counts |
2017-11-25 | cart | 501218 |
2017-11-26 | cart | 490790 |
2017-11-27 | cart | 453440 |
2017-11-28 | cart | 444319 |
2017-11-29 | cart | 457954 |
2017-11-30 | cart | 469017 |
2017-12-01 | cart | 519216 |
2017-12-02 | cart | 647386 |
2017-12-03 | cart | 539950 |
dates | behavior | value_counts |
2017-11-25 | buy | 98146 |
2017-11-26 | buy | 86042 |
2017-11-27 | buy | 84120 |
2017-11-28 | buy | 80615 |
2017-11-29 | buy | 81428 |
2017-11-30 | buy | 81800 |
2017-12-01 | buy | 77664 |
2017-12-02 | buy | 94592 |
2017-12-03 | buy | 80192 |
3.3.2 研究范围内每日活跃用户数
hours | behavior | counts | behavior | counts | behavior | counts | behavior | counts |
0 | cart | 162494 | fav | 90883 | pv | 2325668 | buy | 26370 |
1 | cart | 192251 | fav | 111111 | pv | 2808578 | buy | 37504 |
2 | cart | 221548 | fav | 128074 | pv | 3247828 | buy | 49803 |
3 | cart | 216068 | fav | 126020 | pv | 3150231 | buy | 47721 |
4 | cart | 211023 | fav | 122093 | pv | 3172085 | buy | 45661 |
5 | cart | 230986 | fav | 130592 | pv | 3482938 | buy | 46333 |
6 | cart | 228792 | fav | 128491 | pv | 3485147 | buy | 45536 |
7 | cart | 234180 | fav | 130783 | pv | 3617971 | buy | 45868 |
8 | cart | 230465 | fav | 128883 | pv | 3467993 | buy | 44173 |
9 | cart | 210636 | fav | 119229 | pv | 3156021 | buy | 39852 |
10 | cart | 208628 | fav | 115258 | pv | 3244956 | buy | 38243 |
11 | cart | 258591 | fav | 138917 | pv | 4105637 | buy | 45367 |
12 | cart | 323804 | fav | 165210 | pv | 5007207 | buy | 52044 |
13 | cart | 383280 | fav | 189346 | pv | 5750354 | buy | 55409 |
14 | cart | 400298 | fav | 201005 | pv | 5691194 | buy | 50740 |
一天中的每小时行为分析
观察发现各项行为数据变化趋势相同从右边的图中可以发现,流量的高峰大概在13点和14点。流量低峰大概在19点20点之间,可能是由于晚上这段时间,用户上网的概率比较低。外出玩的人比较多。21点之后流量存在明显的回调,说明这段时间比较空闲,上网的概率比较大。
logger.info("数据的记录数量:{}".format(len(df_data)))
# 期间所有的用户
df_data_userid_qc = list(set(df_data['user_id']))
# 访问用户总数UV。表示为期间访问这个网站的人的统计。(去重)
UV = len(df_data_userid_qc)
logger.info('期间访问用户总数为:{}'.format(UV))
# 页面的总的访问量。
# behavior状态为pv的访问的统计。
import numpy as np
df_data_behavior_pv = list(np.array(df_data[df_data['behavior'] == 'pv']['behavior']))
df_data_behavior_pv_sl = len(df_data_behavior_pv)
# 页面的总访问数
PV = df_data_behavior_pv_sl
logger.info('页面总访问数:{}'.format(PV))
df_data_behavior_pv = list(set(df_data[df_data['behavior'] == 'pv']['user_id']))
logger.info('浏览人数:{}'.format(len(df_data_behavior_pv)))
df_data_behavior_buy = list(set(df_data[df_data['behavior'] == 'buy']['user_id']))
logger.info('购买人数:{}'.format(len(df_data_behavior_buy)))
df_data_behavior_fav_cart = list(set(df_data[(df_data['behavior'] == 'cart')|(df_data['behavior'] == 'fav')]['user_id']))
logger.info('收藏加购人数:{}'.format(len(df_data_behavior_fav_cart)))
# 用户的平均访问次数
user_id_pv_mean = PV/UV
logger.info('用户的平均访问次数:{}'.format(user_id_pv_mean))
# 购买商品的转化率
# 两个状态的人数的对比。pv:表示浏览状态→buy:表示购买的状态
# 购买转化率 = 购买产品的人数/浏览的人数
# 存在购买行为的人数
user_id_pv_buy_rate = len(list(set(df_data[df_data['behavior'] == 'buy']['user_id'])))/UV
logger.info('购买行为转化率:{}'.format(user_id_pv_buy_rate))
# 以字段'dates'为分组条件,统计'behavior'字段中不同的元素的数量的统计
df_data_groupby_date_nyr_value_counts_behavior = df_data['behavior'].groupby(df_data['dates']).agg(['value_counts']).reset_index()
#所有的行为
behavior_list = list(set(df_data['behavior']))
# 时间区间
date_nyr_list = list(set(df_data['dates'])).sort(reverse=False)
save_path = file + '每天的用户行为统计.xls'
writer = pd.ExcelWriter(save_path)
for i in behavior_list:
df_behavior_i = df_data_groupby_date_nyr_value_counts_behavior[df_data_groupby_date_nyr_value_counts_behavior['behavior'] == i].sort_values(by = 'dates', ascending = 'True')
logger.info("df_behavior_i为{}".format(df_behavior_i))
if i == 'pv':
df_behavior_i.to_excel(writer, sheet_name='每天用户行为为pv的人数的变化', index = False)
if i == 'buy':
df_behavior_i.to_excel(writer, sheet_name='每天用户行为为buy的人数的变化', index=False)
if i == 'cart':
df_behavior_i.to_excel(writer, sheet_name='每天用户行为为cart的人数的变化', index = False)
if i == 'fav':
df_behavior_i.to_excel(writer, sheet_name='每天用户行为为fav的人数的变化', index=False)
writer.save()
# 跳转率
# 只是点击浏览一次的用户数量/总用户访问数
df_data_pv = df_data[df_data['behavior'] == 'pv']
df_data_groupby_user_id_value_count_behavior_pv = df_data_pv.groupby('user_id')['behavior'].agg(['value_counts']).reset_index()
user_id_pv_d1 = len(df_data_groupby_user_id_value_count_behavior_pv[df_data_groupby_user_id_value_count_behavior_pv['value_counts'] > 1])
user_id_z = len(df_data_groupby_user_id_value_count_behavior_pv['user_id'])
tzl = '%.2f%%' % ((user_id_pv_d1/user_id_z) * 100)
print(tzl)
logger.info('跳转用户数量:{}'.format(user_id_z - user_id_pv_d1))
# 以字段'hours'为分组条件,统计'behavior'字段中不同的元素的数量的统计
df_data_groupby_date_nyr_value_counts_behavior = df_data['behavior'].groupby(df_data['hours']).agg(['value_counts']).reset_index()
#所有的行为
behavior_list = list(set(df_data['behavior']))
# 时间区间
date_nyr_list = list(set(df_data['hours'])).sort(reverse=False)
save_path = file + '每小时的用户行为统计.xls'
writer = pd.ExcelWriter(save_path)
for i in behavior_list:
df_behavior_i = df_data_groupby_date_nyr_value_counts_behavior[df_data_groupby_date_nyr_value_counts_behavior['behavior'] == i].sort_values(by = 'hours', ascending = 'True')
logger.info("df_behavior_i为{}".format(df_behavior_i))
if i == 'pv':
df_behavior_i.to_excel(writer, sheet_name='每小时的用户行为为pv的人数的变化', index = False)
if i == 'buy':
df_behavior_i.to_excel(writer, sheet_name='每小时的用户行为为buy的人数的变化', index=False)
if i == 'cart':
df_behavior_i.to_excel(writer, sheet_name='每小时的用户行为为cart的人数的变化', index = False)
if i == 'fav':
df_behavior_i.to_excel(writer, sheet_name='每小时的用户行为为fav的人数的变化', index=False)
writer.save()
3.4 用户价值分析
3.4.1 消费次数
用户的消费情况 | |
总的购买次数 | 764599 |
总的消费用户 | 409322 |
一般消费用户 | 236785 |
中频消费用户 | 94204 |
高频消费用户 | 78333 |
前20的用户消费次数 | 1558 |
user_id | F | F_SCORE | 用户类型 |
702034 | 143 | 4 | 高频消费用户 |
866670 | 118 | 4 | 高频消费用户 |
107013 | 115 | 4 | 高频消费用户 |
1003412 | 97 | 4 | 高频消费用户 |
432739 | 82 | 4 | 高频消费用户 |
294043 | 78 | 4 | 高频消费用户 |
337305 | 77 | 4 | 高频消费用户 |
1014116 | 76 | 4 | 高频消费用户 |
98084 | 71 | 4 | 高频消费用户 |
490508 | 69 | 4 | 高频消费用户 |
960681 | 68 | 4 | 高频消费用户 |
469870 | 67 | 4 | 高频消费用户 |
92448 | 67 | 4 | 高频消费用户 |
128379 | 64 | 4 | 高频消费用户 |
78030 | 64 | 4 | 高频消费用户 |
486458 | 63 | 4 | 高频消费用户 |
900581 | 62 | 4 | 高频消费用户 |
122504 | 60 | 4 | 高频消费用户 |
166776 | 59 | 4 | 高频消费用户 |
919666 | 58 | 4 | 高频消费用户 |
'''
# 用户价值分层
'''
# 用户价值分层(RFM模型)
# 对R(最近一次购买时间)和F(消费频率)的数据对客户进行评分。
# 筛选购买行为的所有记录
df_data_behavior_buy = df_data[df_data['behavior'] == 'buy']
# 筛选需要的字段
df_data_behavior_buy_yhfc = df_data_behavior_buy[['user_id', 'datetime']]
'''
R时间段的计算
'''
# 本次统计的时间为2017-11-25 到 2017-12-03
# 故以12-03为节点,以下单用户的最近一次下单时间为基期。
# 统计时间段内不同客户到12-03的交易间隔期
# 根据user_id进行分组并找出每位用户date_nyr的最大值的所有的行记录。并重新设置索引。
r = df_data_behavior_buy_yhfc.groupby('user_id')['datetime'].max().reset_index()
# 生成新的一列,为每位用户最近一次购买的间隔天数
r['R'] = (pd.to_datetime('2017-12-03') - pd.to_datetime(r['datetime'])).dt.days
r.columns = ['user_id', 'g_datetime_max', 'R']
'''
F频次的计算
'''
# 计算期间每位用户的交易频次
# 以user_id为分组条件,计算每位用户的订单数量,即交易频次。
f = df_data_behavior_buy_yhfc.groupby('user_id')['datetime'].count().reset_index()
# logger.info('f为:{}'.format(f))
# 修改列名
f.columns = ['user_id', 'F']
sum_xfch = sum(list(np.array(f['F'])))
logger.info("总的消费次数:{}".format(sum_xfch))
# 降序排序
# f = f.sort_values(by='F', ascending=False)
# f = f.iloc[:20,:]
# print(f)
# f.to_excel(file+"前20名的用户消费的次数.xls", index = False)
# 合并R与F两个字段
rf = pd.merge(r, f, left_on='user_id', right_on='user_id', how='inner')
# 提取需要的字段
rf = rf[['user_id', 'R', 'F']]
# R,F字段的特征
R_t = rf['R'].describe()
# R字段的最大值,最小值,以及四分位置上的值
import math
R_min = int(R_t['min']) - 1
R_0_25 = int(R_t['25%'])
R_0_5 = int(R_t['50%'])
R_0_75 = int(R_t['75%'])
R_max = math.ceil(R_t['max']) + 1
F_t = rf['F'].describe()
F_max = math.ceil(F_t['max']) + 1
# logger.info('rf为{}'.format(rf))
# logger.info("rf['F'].describe()为{}".format(F_t))
# R评分的标准为:R值越小,R的得分越高
rf['R_SCORE'] = pd.cut(rf['R'], bins=[R_min, R_0_25, R_0_5,R_0_75, R_max], labels=[4, 3, 2, 1], right=False).astype(float)
# F值的评分标准为:F值越小的话,F得分越高
# 购买的频次为1时间得分为1,购买的频次为2时,得分为2,购买频次为3时间得分为3.购买频次大于3时间。得分为4
rf['F_SCORE'] = pd.cut(rf['F'], bins=[0, 1, 2, 3, F_max], labels=[1, 2, 3, 4], right=False).astype(float)
rf_f_fc = rf[['user_id', 'F', 'F_SCORE']].sort_values(by='F', ascending=False).iloc[:20,:]
rf_1 = rf.groupby('F_SCORE')['user_id'].count().reset_index()
print(rf_1)
4.数据处理
4.1 导入数据
4.2数据清洗
4.2.1 理解字段
字段 | 中文名 | 字段说明 | 字段类型 |
user_id | 用户id | 用户标识 | int64 |
item_id | 商品id | 商品标识 | int64 |
category_id | 商品类目id | 商品类目标识 | int64 |
behavior | 行为类型 | 用户行为 | object |
timestamps | 时间戳 | 行为发生的时间戳 | int64 |
4.2.2 缺失值处理
删除含有缺失值的所有记录
4.2.3 重复值处理
多列判断是否重复。当user_id、item_id、category_id三列的值重复时。去掉重复的记录。
4.2.4 数据一致化
转化时间类型,并添加datetime、dates、hours三个字段
4.2.5 异常值处理
检查日期是否在规定的时间范围内:2017/11/25~2017/12/03
#coding:UTF-8
import datetime
import os
import time
import pandas as pd
import numpy as np
import sys
# 当前py文件的绝对路径
file = os.getcwd() + '/'
# 输出文件假下的所有的文件名
namelist = os.listdir()
str1 = 'User'
# 输出数据分析的文件名,为name
for i in namelist:
# 当可以找到时间,不返回-1,则表明可以找到。
if i.find(str1) != -1:
name = i
# 设置读取文件时间无列标签。系统默认列标签为0, 1, 2...
df_data = pd.read_csv(file + name, header=None)
df_data.columns = ['user_id', 'item_id', 'category_id', 'behavior', 'timestamps']
# print(len(df_data))
# 多列判断是否重复。当user_id、item_id、category_id三列的值重复时。去掉重复的行。
df_data_qc = df_data.drop_duplicates(['user_id', 'item_id', 'category_id'])
# print(len(df_data_qc))
# 删除含有缺失值的所有的行。
df_data_qc_qqsh = df_data_qc.dropna()
# print(len(df_data_qc_qqsh))
# 将时间戳修改为格式化的时间格式
# 当时间戳的位数为10位时,将时间戳转化为日期格式使用的参数为:unit='s'
df_data_qc_qqsh['datetime'] = pd.to_datetime(df_data_qc_qqsh['timestamps'], unit='s')
df_data_qc_qqsh['dates'] = df_data_qc_qqsh['datetime'].dt.date
print(list(set(df_data_qc_qqsh['dates'])).sort(reverse=False))
# 当时间戳的位数为13位时,将时间戳转化为日期格式使用的参数为:unit='ms'
# df_data_qc_qqsh['g_datetime'] = pd.to_datetime(df_data_qc_qqsh['timestamps'], unit='ms')
# print(df_data_qc_qqsh)
# 保存列为特定时间内的所有行
# 筛选出时间范围内的所有行
# &符号表示并列的意思,需要同时满足
df_data_qc_qqsh_sxsj = df_data_qc_qqsh[(df_data_qc_qqsh['datetime'] > '2017-11-25 00:00:00') & (df_data_qc_qqsh['datetime'] < '2017-12-04 00:00:00')]
# print(len(df_data_qc_qqsh_sxsj))
# 将dataframe保存为excel,不保存行索引
# 提取日期时间中的日期。
# df_data_qc_qqsh_sxsj['date_nyr'] = df_data_qc_qqsh_sxsj['g_datetime'].dt.strftime('%Y-%m-%d')
df_data_qc_qqsh_sxsj['dates'] = df_data_qc_qqsh_sxsj['datetime'].dt.date
df_data_qc_qqsh_sxsj['hours'] = df_data_qc_qqsh_sxsj['datetime'].dt.hour
print(set(df_data_qc_qqsh_sxsj['dates']))
df_data_qc_qqsh_sxsj.to_csv(file + '清洗后的电商数据.csv', index = False)
5、结论与建议
AARRR模型分析用户使用的各个环节 | |||
5.1获取用户:987976 | |||
在研究时段内,每天都有新增的用户,但新增用户在递减。 | |||
5.2 激活用户 | |||
在购物环节中,收藏和加入购物车都是确定购物意向的行为,将这两个行为合并成为购物环节中的一步。 从浏览到有购物意向只有9%的转化率,说明了大多数用户以浏览为主而购买转化比较少,此处为转化漏斗中 需要改善和提高的环节。 建议:1、优化电商平台的搜索匹配和推荐策略,主动根据客户的喜好推荐相关的商品。 2、给用户提供同类产品的比较功能,让用户不需要多次返回搜索结果反复查看,便于用户确定心仪的产品。 3、在商品的详情页的展示上突出用户关注的重要信息,减少用户寻找信息的成本。 | |||
5.3 留存分析 | |||
在26号、27号,留存率存在上升的趋势。三种类型的留存率均维持在60%以上,表现非常优秀的.11-30、12-01较的留存率相较之前有大约20%的上涨。故促销活动能为提升留存率带来一定的正面影响 | |||
5.4 增加收入 | |||
APP的用户中间有41.5%的付费用户,付费转化率属于中等水平。 | |||
有购买行为的用户中,大概有42.15%的用户会重复购买,淘宝APP的复购率相对客观。 应该将经营的重点转化为培养用户的忠诚度上,鼓励用户进行更高频次的消费。 | |||
高复购次数的用户少,商家可以从商品质量、服务质量、物流体验三个方面寻找原因,定位问题点,寻求高复购率。 | |||
研究用户每天的行为分布、每小时的行为分许 | |||
1、在12月2号收藏和加购的数量存在大幅上涨,为周末,故周末多推出营销活动,上班族周末空闲时间的消费欲望还存在很大的挖掘潜力。 | |||
2、流量的高峰大概在13点和14点。21点之后流量存在明显的回调,说明这段时间比较空闲,上网的概率比较大。针对高峰期进行营销活动,此时使用人数最多,营销活动可以通过促销,拼团等方式。 | |||
通过用户的消费频次找出最具有价值的付费用户群体。 | |||
1、通过用户的消费频次找出最具有价值的付费用户群体。对这部分用户的行为进行分析。对于高频消费类型的用户需要重点关注,并且活动投放需要谨慎对待,不要引起用户的反感。 | |||
商品的销售情况分析 | |||
1、浏览量最高的商品812879没有进入销量前20,销量最高的商品3557522没有进入浏览榜单前20.说明了这些吸引用户更多注意的商品没有很好的转化成实际的销量。 | |||
针对浏览量高而销量不高的这部分商品,商家可以从以下几个方面提高销量: | |||
1、诚信吸引用户 | |||
2、从用户的角度出发设计详情页信息流展示,便于用户获取信息。 | |||
3、优化视频展示形式。 | |||
4、评论区评价管理,认真对待差评,分析自身劣势,并做出积极的回应和弥补。 | |||
2、商品转化率分析 | |||
(1)在销量前20的商品中付费率浏览到购买的转化率达到50%以上的商品数有5个。最高的商品转化率达到77.42%。 | |||
(2)浏览前20的商品中存在11个商品也是收藏前20的商品,说明浏览和收藏存在很强的相关性。需要重视这些商品,能够吸引顾客的注意。重点分析,这些商品吸引的顾客的类型,并采取针对性的营销策略。 | |||
(3)加购前20的商品中存在5个也是销量前20的商品,说明加购与销量存在很强的相关性质,我们应该重点关注用户加购的商品,说明该用户关注这一类型的商品,并对此采取针对性的营销的策略。 | |||
3、用户浏览行为的相关性结论。 | |||
(1)浏览与购买存在相关性 | |||
(2)浏览与收藏存在很强大的相关性 | |||
(3)加购与购买存在相关性 | |||
(4)加购与购买的相关性强于浏览与购买的相关性 |