在上一篇文章中我们分析了用户的性别、年龄、会员类别,并得出了相关结论。但对于一个属于共享经济类别的业务,我们还需要更多的分析用户的行为习惯,从而使服务更加符合用户的需求。在这篇文章中,我们将分析用户的骑行时间和骑行速度。
1.分析用户的骑行时间
cb5=pd.DataFrame(pd.read_csv('201505-citibike-tripdata.csv'))#读取5月数据并创建数据表
time_split = pd.DataFrame((x.split(' ') for x in cb5.starttime),i ndex=cb5.index,columns=['start_date','star_time'])#对starttime字段进行分列
cb5=pd.merge(cb5,time_split,right_index=True, left_index=True)#对分列后的表与原数据表进行拼接
cb5['star_time']=pd.to_datetime(cb5['star_time'])#更改star_time字段为日期格式
cb5 = cb5.set_index('star_time')#设置star_time为表索引
#按小时对数据进行汇总
star_hour=cb5.resample('H',how=len)#按小时对数据进行汇总
ride_hour=star_hour["bikeid"]#提取按小时汇总的bikeid数据
plt.rc('font', family='STXihei', size=15)a=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23])
plt.plot(ride_hour,'8',ride_hour,'g-',color='#052B6C',linewidth=3
,markeredgewidth=3,markeredgecolor='#052B6C',alpha=0.8) plt.xlabel('24小时')
plt.ylabel('租赁次数')
plt.title('Citi Bike用户24小时租赁次数')
plt.grid( color='#95a5a6',linestyle='--', linewidth=1 ,axis='y',a lpha=0.4)
plt.xticks(a, ('0','','','','','5','','','','','10','','','','','
15','','','','','20','','','') )
plt.show()#绘制24小时折线图
在上一片文章中,我们分析了用户的会员类别,得出了这样的假设:Citi Bike的使用者大部分为城市居民,少部分为游客。
从上图可以看出,在一天中的上午7点—8点和下午的5点~6点是Citi Bike的使用高峰。这两个时间正好是上下班的高峰时间。除此之外中午12点~下午4点也有较高的使用量。
结合这两个结论我们可以基本确定推论是正确的,纽约市的用户大部分为在此定居的上班族,商家可以根据这个信息推出更加适合上班族的活动,以此稳定住老客户,吸引新用户,以获得更大的收益。
2.分析用户骑行时长
在骑行时间方面,按照不同的会员类别Citi Bike对时间有不同的限制,1天和3天会员每次骑行的限制时间为30分钟,超过30分钟每增加15分钟收费4美金。年度会有每次骑行限制时间为45分钟,超出10 分钟收费2.5美金,再次超出逐级收费。Citi Bike鼓励用户短途使用并且在接近限制时间时重新租赁新的自行车,避免产生超时费用,并且提高自行车的周转率。
bins = [0, 300, 600, 1200, 1800, 2700, 2825827]#对骑行时长进行分组
group_tripduration = ['5分钟', '10分钟', '20分钟', '30分钟', '45分钟'
, '更长时间']#为每个分组命名
cb5['group_tripduration'] = pd.cut(cb5['tripduration'], bins, lab els=group_tripduration)#在原数据表中增加时间分组字段
group_minute=cb5.groupby('group_tripduration')['group_tripduratio n'].agg(len)#按分组对数据进行汇总计数
plt.rc('font', family='STXihei', size=15)
a=np.array([1,2,3,4,5,6]) plt.bar([1,2,3,4,5,6],group_minute,color='#9F713F',alpha=0.8,alig n='center',edgecolor='white')
plt.xlabel(' 时 间 分 组 ') plt.ylabel(' 骑 行 次 数 ') plt.title('Citi Bike骑行时间分布')
plt.legend([' 时 间 '], loc='upper right') plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alp ha=0.4)
plt.xticks(a,('5分钟','10分钟','20分钟','30分钟', '45分钟','更长时间')
)
plt.show()#汇总骑行时间分组柱状图
通过图表可以看出大部分用户的使用时间为10~20分钟。其次为30分钟和5分钟以内。超过30分钟的使用次数较少。即使在86%的用户为年度会员的情况下,使用时间在30-45分钟的情况也较少。由此推测大部分的用户的骑行为短途。
3.分析用户的骑行速度
在Citi Bike的数据表中并没有直接提供每次骑行的速度数据,但包含了每个开始和结束站点的经纬度坐标。我们通过这些坐标计算出了两个站点间的距离,并匹配到对应的骑行中,再经过与本次骑行所耗费的时间计算出这次骑行的平均速度。
from math import radians, cos, sin, asin, sqrt import numpy as np
import pandas as pd
#通过经纬度计算距离的函数
def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2
(十进制度数)
# 将十进制度数转化为弧度
lon1= map(radians, np.array(lon1)) lat1= map(radians, np.array(lat1)) lon2= map(radians, np.array(lon2)) lat2= map(radians, np.array(lat2))
lon1 = np.array(list(lon1)).reshape(-1,1) lon2 = np.array(list(lon2)).reshape(-1,1) lat1 = np.array(list(lat1)).reshape(-1,1) lat2 = np.array(list(lat2)).reshape(-1,1) # haversine公式
dlon = lon2 - lon1 dlat = lat2 - lat1
a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin( dlon/2)**2
c = 2 * np.arcsin(np.sqrt(a)) r = 6371 # 地球平均半径,单位为公里return c * r * 1000
# 计 算 每 次 骑 行 的 米 数 并 增 加 骑 行 距 离 字 段
cb5["meter"]=haversine(cb5["start station longitude"],cb5["start station latitude"],cb5["end station longitude"],cb5["end station latitude"])
#将原数据表中的骑行时间由秒转化为小时
cb5["duration_hour"]=cb5["tripduration"]/3600 #将米转化为公里并与小时计算出速度
cb5["speed"]=cb5["meter"]/1000/cb5["duration_hour"]
现在我们有了每次骑行的速度,还需要计算出用户平均的骑行速度。
#将每次骑行的米数求和并转化为公里
km=cb5["meter"].sum()/1000 #将每次骑行的秒数求和并转化为小时
hour=cb5["tripduration"].sum()/3600 #计算平均速度
speed=km/hour
#结果:平均速度为6.31公里/小时speed 6.3101247093495
从以上的结论可以看到,在5月,用户的平均骑行速度为6.3公里/小时,并不算快,在这里,我们可以推测用户的这种行为可能是受温度影响,由于天气比较热,用户不想骑的很快。因此,商家可以联系厂家,在原来的基础上,改变自行车的结构,设计一款不用费很大的力气就可以骑得很快的共享单车,以吸引更多的用户来使用。