出于报告呈现的整洁度和美观度考虑,本篇仅展现分析背景、分析结论和分析过程,前期数据集清洗整理和信息提取,以及探索性分析和可视化过程可移步:《摩拜单车数据探索与可视化》
分析背景
分析目的
- 分析摩拜单车订单的相关数据对骑行时长的影响情况,以此作为业务运营优化的参考和依据(由于原数据集中无订单金额的数据,又因摩拜单车是以骑行时长作为计费标准的,骑行时长是影响订单金额大小的最重要因素,故本分析针对骑行时长展开)。
- 主要集中在分析骑行时间(包括工作日/双休日、高峰时段/非高峰时段两个维度)、骑行位置、用户价值这些变量对骑行时长的影响上。
数据集概要
- 原数据集来自Udacity提供的摩拜单车上海城区2016年8月随机抽样百万条用户使用数据,共有102361条订单记录,包含起点、目的地、租赁时间、还车时间、用户ID、车辆ID、交易编号和路线轨迹信息。
- 经过清洗整理和信息提取后,新数据集增加了22个新变量,主要用于分析的变量为:ttl_min(骑行时长(min))、distance(骑行始末点的直线距离(km))、daytype(工作日/双休日)、hourtype(高峰时段/非高峰时段)、ring_stage(内环内/中环内/外环内/外环外)、rate(高价值用户/中等价值用户/低价值用户)这六个变量。
- 新数据集在使用过程中亦去除了少量骑行速度、距离、时长的异常记录,最终的订单记录数量为102338条。
分析结论
用户行为总结
在数据探索过程中,发现骑行时间(包括工作日/双休日、高峰时段/非高峰时段)、骑行区域和用户价值这四个变量均会对骑行时长产生影响。当依次限定四个变量条件后,可以发现:
- 在骑行地理位置或用户价值条件相同的情况下,骑行时间对于平均骑行时长的规律明显,高峰时段和双休日的平均骑行时长高于非高峰时段和工作日;
- 总体上,用户价值越高、骑行时长越长,骑行区域越远离市中心、骑行时长越长,但前者对于骑行时长的影响远小于后者。
在关注类型变量对于骑行时长的影响之外,又有以下发现:
- 比较不同骑行地理位置和用户价值类型下,工作日和高峰时段的数据点分布特征高度类似,说明工作日和高峰时段的用车行为特征相似;
- 高价值用户更多地分布在内环范围内。
优化建议总结
针对上述用户行为数据分析结论,提出以下优化建议:
- 鉴于骑行时间(工作日/双休日、高峰时段/非高峰时段)高度影响骑行时长的特征,可以不同的骑行时间为划分标准,针对性地推出骑行套餐、营销活动,以提升订单频次和订单金额(如不同时段的骑行徽章奖励、限时免费骑、遇见高峰车等方式)
- 鉴于远离市区用户单次消费高(骑行时长长)、消费频次低(高价值用户少)的行为特征,可按骑行地理位置推出相应骑行套餐,以提升该类地区用户的消费频次、提高他们对于使用摩拜单车的依赖度
- 鉴于工作日和高峰时段的用户行为特征相似,因此在设计运营活动方案时,可合并考虑
其他说明
因原始数据集中的信息量过少,可供分析的内容有限,扩大数据集信息和范围后,可用于分析的内容包括但不限于:
- 根据用户在APP内的点击数据来分析关键路径转化率,以此判断某一地区的单车供需是否平衡,以供单车投放量和调度效率的优化
- 以月度、季度为单位的单车使用情况的周期性规律,以此作为营销方案设计和优化的参考和依据
- 骑行券、骑行套餐、充值返现等优惠活动对用户骑行行为的影响,以此作为用户精细化运营或营销方案设计的参考和依据
分析过程
主要关注四个类型变量对于骑行时长的影响。首先介绍骑行时长、骑行距离的数据分布情况。然后通过绘制小提琴图,观察到两者随类型变量的变化而高度相似的数据特征,进而判定只需关注骑行时长这一关键指标和四个类型变量之间的关系即可。最后通过点图绘制在控制不同条件的类型变量的情况下,其他变量对于骑行时长的影响。
# 导入所有需要用到的库,并将图表设置为直接显示
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
%matplotlib inline
# 清除输出中的警告
import warnings
warnings.simplefilter("ignore")
# 导入清洗整理后的数据集
df_e = pd.read_csv('mobike_master.csv')
# 将对应列转换成类别变量
order_dict = {
'ring_stage': ['inside inner ring', 'inside middle ring', 'inside outer ring', 'outside outer ring'],
'rate': ['high-value user', 'middle-value user', 'low-value user'],
'daytype': ['weekdays', 'weekends'],
'hourtype': ['rush hours', 'non-rush hours']}
for var in order_dict:
order = pd.api.types.CategoricalDtype(ordered = True, categories = order_dict[var])
df_e[var] = df_e[var].astype(order)
# 数据清理,去除少量在骑行速度、骑行时长和骑行距离上明显异常的数据
df_e['speed'] = df_e['distance'] / (df_e['ttl_min'] / 60)
df_e = df_e[-(((df_e['speed'] < 12) | (df_e['speed'] > 20)) & ((df_e['ttl_min'] > 720) | (df_e['distance'] > 50)))]
骑行时长分布
骑行时长的数据范围非常大,最小值为1分钟,最大值为666分钟,且呈现长尾分布,绝大多数骑行时长较短,使用log转换x轴绘图可以发现,骑行时长呈现右偏态分布,峰值出现在7-10分钟之间。
bins = 10 ** np.arange(0, np.log10(df_e.ttl_min.max()) + 0.15, 0.15)