未加星标

990万次骑行:纽约自行车共享系统分析

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

990万次骑行:纽约自行车共享系统分析

Citi Bike是纽约市在2013年5月27日启动的一项自行车共享计划,由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿,布鲁克林,皇后区和泽西市有8,000辆自行车和500个车站。为纽约的居民和游客提供一种方便快捷,并且省钱的出行方式。


990万次骑行:纽约自行车共享系统分析

人们随处都能借到Citi Bank,并在他们的目的地归还。使用Citi Bank的方法很简单,购买会员资格,然后在附近查找可以使用的Citi Bank,使用会员key解锁,在有效时间内(30或45分钟)归还并锁定Citi Bank。由于每个Citi Bank的租赁站点都有GPS位置信息,因此可以记录到用户租赁和骑行过程中的数据。“Citi Bank”官网提供了用户每一次骑行的数据,包括租赁开始及结束的位置及时间,整个骑行过程的时间,自行车ID,以及用户的性别和出生日期等数据。我们将使用python对“Citi Bank”2015年的数据进行分析,以了解纽约自行车共享计划的情况。并回答诸如谁在使用Citi Bike?他们什么时间开始骑行?每次骑行的时间和距离,以及哪些骑行线路最受欢迎等问题。

开始前的准备工作

首先我们将需要使用的库文件导入到python中,这里包括numpy,pandas,datetime和用于数据可视化的pyplot,后面根据不同的分析方向我们还会陆续导入其他的库文件。

import numpy as np
import pandas as pd
import time,datetime
import matplotlib.pyplot as plt
#读取Citi Bike的数据并创建数据表
cb1=pd.DataFrame(pd.read_csv('201501-citibike-tripdata.csv'))

Citi Bike的数据是按月存储的,因此我们需要逐月读取并将各个月份的数据进行拼接。

#对导入的数据表进行拼接,汇总后的数据表名为cb
cb=cb1.append(cb2,ignore_index=False)
#查看数据表维度
cb.shape
(9937969, 15)

2015年Citi Bike数据共包含993万行,15列数据。其中每一行数据都代表一次“Citi Bank”的租借和骑行记录。

惊人的990万次骑行
990万次骑行:纽约自行车共享系统分析

我们首先对2015年“Citi Bank”的数据中的几个关键指标进行统计,在一年中共有497个租赁点,也就是车站,8477辆自行车被使用。自行车的使用次数更是高达993万次,平均算下来每辆自行车每天被租借3.21次。可见人们对“Citi Bank”的热情。而每次的骑行时间平均为16.13分钟。


990万次骑行:纽约自行车共享系统分析

以下为每个关键指标的统计代码和结果。

#唯一租赁点数量计数
len(cb['start station name'].unique())
497
#唯一自行车ID计数
len(cb['bikeid'].unique())
8477
#骑行次数计数
cb['starttime'].count()
9937969
#每辆自行车租借频率
cb['bikeid'].count()/len(cb['bikeid'].unique())
1172.3450513153239
#每辆自行车每日租借频率
cb['bikeid'].count()/len(cb['bikeid'].unique())/365
3.2119042501789696
#每次租借平均时长(分钟)
cb['tripduration'].sum()/cb['bikeid'].count()/60
16.134794237132358
990万次骑行:纽约自行车共享系统分析

2015年的Citi Bike的使用量整体趋势由低到高,2月Citi Bike的使用量最低,然后使用量逐月增长,直到9月出现使用量最高值。11月使用量开始下降。这可能是由于季节和气温因素导致的。我们下面按季度对骑行数据进行汇总并进行对比。

以下是按月汇总骑行数据并汇总折线图的代码。

#对starttime设置日期格式
cb['starttime']=pd.to_datetime(cb['starttime'])
#将starttime设置为数据表索引
cb = cb.set_index('starttime')
#按月对骑行数据进行计数
cb_month=cb.resample('M',how=len)
#提取汇总后的bikeid字段
group_cb_month=cb_month['bikeid']
#汇总按月汇总的骑行次数折线图
plt.rc('font', family='STXihei', size=15)
a=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
plt.plot(group_cb_month,'g8',group_cb_month,'g-',color='#39A2E1',linewidth=3,markeredgewidth=3,markeredgecolor='#39A2E1',alpha=0.8)
plt.xlabel('月份')
plt.ylabel('租赁骑行次数')
plt.title('2015年Citi Bike每月骑行次数')
plt.grid( color='#95a5a6',linestyle='--', linewidth=1 ,axis='y',alpha=0.4)
plt.xticks(a, ('1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月') )
plt.show()
990万次骑行:纽约自行车共享系统分析

从2015年四个季度的数据来看,用户对Citi Bike的使用受季节因素的影响,第一季度气温最低,Citi Bike的使用量也较低。第二季度第三季度为夏秋交替,使用量最高。

#按季度对骑行数据进行计数
cb_quarterly=cb.resample('Q',how=len)
#提取按季度汇总后的bikeid字段
group_cb_quarterly=cb_quarterly['bikeid']
#绘制按季度汇总的骑行次数柱状图
plt.rc('font', family='STXihei', size=15)
a=np.array([1,2,3,4])
plt.bar([1,2,3,4],group_cb_quarterly,color='#39A2E1',alpha=0.8,align='center',edgecolor='white')
plt.xlabel('季度')
plt.ylabel('租赁骑行次数')
plt.title('2015年Citi Bike每季度骑行次数')
plt.legend(['次数'], loc='upper right')
plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4)
plt.xticks(a,('一季度','二季度','三季度','四季度'))
plt.show() 哪些人在使用Citi Bike ?
990万次骑行:纽约自行车共享系统分析

我们很好奇993万次骑行这个庞大的数据后面是哪些人在使用Citi Bike。由于获得的数据中只有用户性别,出生日期和会员类别的数据,因此我们仅从这三个维度对Citi Bike的用户进行简单的描述。

66%的男性用户使用Citi Bike

2015年使用Citi Bike服务的用户中,66%为男性用户,女性用户的占比为20%,另外还有13%的用户性别未知。这让我想起了北京自重25公斤的共享单车。


990万次骑行:纽约自行车共享系统分析

以下是计算用户性别占比和绘制饼图的代码。

#按用户性别进行汇总并计算不同性别的占比
user_gender=cb.groupby('gender')['bikeid'].agg(len)/cb["bikeid"].count()*100
#汇总用户性别占比饼图
plt.rc('font', family='STXihei', size=15)
colors = ["#052B6C","#39A2E1","#EA1F29"]
name=['未知', '男性', '女性']
plt.pie(user_gender,labels=name,colors=colors,explode=(0, 0, 0),startangle=60,autopct='%1.1f%%')
plt.title('Citi Bike用户性别占比')
plt.legend(['未知', '男性', '女性'], loc='upper left')
plt.show() 30-50岁用户热衷于骑行

我们将Citi Bike的用户年龄分为四组,0-18岁为少年组,18-30岁为青年组,30-50岁为中年组,50岁以上为老年组。其中少年组的租借和骑行次数最少,中年组的租借和骑行次数最高,其次为青年组。50岁以上的老年组也有相当数量的记录。


990万次骑行:纽约自行车共享系统分析

以下是对用户年龄分组和汇总柱状图的代码,用户年龄由出生日期和当前年份计算得出,其中包含部分极端值。

#查看出生日期的范围
cb['birth year'].min(),cb['birth year'].max()
(1885.0, 1999.0)

这里1885年很怪异,按照这个出生日期,2016年时用户的年龄已经达到了131岁。我们不知道其中的具体原因,但由于Citi Bike整体的数据较为规范不需要清洗,因此我们选择保留这个值。

#使用2015年与用户出生日期计算年龄
cb['age']=2015-cb['birth year']
#用户最小年龄17岁,最大年龄131岁
cb['age'].min(),cb['age'].max()
(17.0, 131.0)
#对用户年龄进行分组
bins = [0, 18, 30, 50, 131]
group_age = ['少年', '青年', '中年', '老年']
cb['group_age'] = pd.cut(cb['age'], bins, labels=group_age)
#按年龄分组对数据进行汇总
user_age=cb.groupby('group_age')['group_age'].agg(len)
#生成用户年龄分布柱状图
plt.rc('font', family='STXihei', size=15)
a=np.array([1,2,3,4])
plt.bar([1,2,3,4],user_age,color='#052B6C',alpha=0.8,align='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',alpha=0.4)
plt.xticks(a,('少年','青年','中年','老年'))
plt.show() 86%的用户为年费会员

Ctii Bike对纽约本地居民,短期停留和游客提供了三种会员期限选择,按Citi Bike官网的推荐,年度会员适合于本地居民,也是最划算的一种租赁方式。3天的会员适合于短期停留或居住的用户,1天的会员适合于游客。因此我们也可以按不同的会员期限反向推断用户的身份。


990万次骑行:纽约自行车共享系统分析

在2015年的数据表中,1天和3天的会员统称为Customer,年度会有成为Subscriber。从下面的占比数据中可以看出,绝大部分Citi Bike的用户为年度会员,占比高达86%。反向推测绝大部分用户为纽约本地常住居民。


990万次骑行:纽约自行车共享系统分析

以下为计算用户会员类别和汇总饼图的代码。

#按用户的会员类别进行汇总并计算占比
user_type=cb.groupby('usertype')['bikeid'].agg(len)/cb["bikeid"].count()*100
#汇总用户会员类别饼图
plt.rc('font', family='STXihei', size=15)
colors = ["#EA1F29","#39A2E1"]
name=['Customer', 'Subscriber']
plt.pie(user_type,labels=name,colors=colors,explode=(0,0),startangle=43,autopct='%1.1f%%')
plt.title('Citi Bike用户类别占比')
plt.legend(['Customer', 'Subscriber'], loc='upper left')
plt.show() 用户的骑行时间及速度
990万次骑行:纽约自行车共享系统分析

在993万次骑行的数据背后,是否存在一些规律?我们选择了5月(春季)的数据对用户使用Citi Bike的行为进行了统计和分析,这里既包括使用Citi Bike的时间,也包括骑行速度,热门租赁站点和骑行线路。

每日早晚是使用高峰
990万次骑行:纽约自行车共享系统分析

Citi Bike的使用者大部分为城市居民,少部分为游客。在一天中的上午7点―8点和下午的5点―6点是Citi Bike的使用高峰。这两个时间正好是上下班的高峰时间。除此之外中午12点―下午4点也有较高的使用量。

以下是24小时使用趋势和绘制折线图的代码。

#读取5月数据并创建数据表
cb5=pd.DataFrame(pd.read_csv('201505-citibike-tripdata.csv'))
#对starttime字段进行分列
time_split = pd.DataFrame((x.split(' ') for x in cb5.starttime),index=cb5.index,columns=['start_date','star_time'])
#对分列后的表与原数据表进行拼接
cb5=pd.merge(cb5,time_split,right_index=True, left_index=True)
#更改star_time字段为日期格式
cb5['star_time']=pd.to_datetime(cb5['star_time'])
#设置star_time为表索引
cb5 = cb5.set_index('star_time')
#按小时对数据进行汇总
star_hour=cb5.resample('H',how=len)
#提取按小时汇总的bikeid数据
ride_hour=star_hour["bikeid"]
#绘制24小时折线图
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,ma

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

分页:12
转载请注明
本文标题:990万次骑行:纽约自行车共享系统分析
本站链接:http://www.codesec.net/view/484916.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(31)