案例:990万次骑行:纽约自行车共享系统分析
System Data
Where do Citi Bikers ride? When do they ride? How far do they go? Which stations are most popular? What days of the week are most rides taken on? We've heard all of these questions and more from you, and we're happy to provide the data to help you discover the answers to these questions and more. We invite developers, engineers, statisticians, artists, academics and other interested members of the public to use the data we provide for analysis, development, visualization and whatever else moves you.
import pandas as pd
import numpy as np
import time,datetime
import matplotlib.pyplot as plt
#读取Citi Bike的数据并创建数据表
cb1=pd.DataFrame(pd.read_csv('201501-citibike-tripdata.csv'))
cb1.shape #查看cb1表的维度
(285552,15)
#对导入的数据表进行拼接,汇总后的数据表名为cb
cb=cb1.append(cb2,ignore_index=False)
#查看数据表维度
cb.shape
(9937969, 15)
#唯一租赁点数量计数
len(cb['start station name'].unique())
497
#唯一自行车ID计数
len(cb['bikeid'].unique())
8477
#每辆自行车租借频率
cb['bikeid'].count()/len(cb['bikeid'].unique())
1172.3450513153239
#每辆自行车每日租借频率
cb['bikeid'].count()/len(cb['bikeid'].unique())/365
3.21190425-1789696
#每次租借平均时长(分钟)
- cb['tripduration'].sum()/cb['bikeid'].count()/60
- 16.134794237132358
#对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(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()
#按季度对骑行数据进行计数
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
#按用户性别进行汇总并计算不同性别的占比
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()
#查看出生日期的范围
cb['birth year'].min(),cb['birth year'].max()
(1885.0,1999.0)
#使用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='uppper right')
plt.grid(color='#95a5a6',linestyle='--',linewidth=1,axis='y',alpha=0.4)
plt.xticks(a,('少年','青年','中年','老年'))
plt.show()
#按用户的会员类别进行汇总并计算占比
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.legend(['Customer','Subscriber'],loc='upper left')
plt.show()
#读取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,markeredgecolor='#052B6C',alpha=0.8)
plt.xlabel('24x小时')
plt.ylabel('租赁次数')
plt.title('Citi Bike用户24小时租赁次数')
plt.grid(color='#95a5a6',linestyle='--',linewidth=1,axis='y',alpha=0.4)
plt.xticks(a,('0','','','','','5','','','','','10','','','','','15','','','','','20','','',''))
plt.show()
#对骑行时间进行分组
bins=[0,300,600,1200,1800,2700,2825827]
#为每个分组命名
group_tripduration=['5分钟','10分钟','20分钟','30分钟','45分钟','更长时间']
#在原数据表中增加时间分组字段
cb5['group_tripduration']=pd.cut(cb5['tripduration'],bins,labels=group_tripduration)
#按分组对数据进行汇总计数
group_minute=cb5.groupby('group_tripduration')['group_tripduration'].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,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,('5分钟','10分钟','20分钟','30分钟','45分钟','更长时间'))
plt.show()
#导入库文件
from math import radians,cos,sin,asin,sqrt
import numpy as np
import pandas as pd
#通过经纬度计算距离的函数
def haversine(lon1,lat1,lon2,lat2):#经度1,j维度1,经度2,维度2,(十进制度数)
'''
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
'''
#将十进制度数转化为弧度
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(cb['start station longitude'],cb5['start station latitude'],cb5['end station longitude'],cb5['end station latitude'])
#将原数据表中的骑行时间由秒转化为小时
cb5['duration_hour']=cb5['tripduration']/3600
#将米转化为公里并与小时计算出速度
cb5['spend']=cb5['meter']/1000/cb5['duration_hour']
#现在我们有了每次骑行的速度,还需要计算出用户平均的骑行速度。
#将每次骑行的米数求和并转化为公里
km=cb5['meter'].sum()/1000
#将每次骑行的秒数求和并转化为小时
hour=cb5['tripduration'].sum()/3600
#计算平均速度
speed=km/hour
#平均速度为6.31公里/小时
speed
6.3101247093495
#读取2015年纽约市的气象数据
weather=pd.DataFrame(pd.read_csv('823248'))
#提取每日最高气温数据
group_weather_day=weather['TMAX']
#对2015年骑行时间按天汇总计算
cb_day=cb.resample('D',how=len)
#提取每日骑行数据量
group_cb_day=cb_day['bikeid']
#对每日最高气温和骑行量数据进行标准化处理
from sklearn import preprocessing
scaler=preprocessing.StandardScaler().fit(group_weather_day)
X_Standard=scaler.transform(group_weather_day)
scaler=preprocessing.StandardScaler().fit(group_cb_day)
Y_Standard=sacler.transform(group_cb_day)
#绘制最高气温和骑行数据散点图
plt.rc('font',family='STXihei',size=15)
plt.scatter(X_Standard,Y_Standard,60,color='#052B6C',marker='+',alpha=0.8,linewidth=1.5)
plt.xlabel('日最高气温')
plt.ylabel('Citi Bike租赁次数')
plt.title('最高气温与Citi Bike之间的关系')
plt.grid(color='#95a5a6',linestyle='--',linewidth=1,axis='both',alpha=0.4)
plt.show()
#设置每日最高气温为自变量X
X=np.array(weather[['TMAX']])
#设置每日骑行数量为因变量Y
Y=np.array(cb-day[['bikeid']])
#导入线性回归库
from sklearn import linear_model
clf=linear_model.LinearRegression()
clf.fit(X,Y)
#计算相关度
clf.score(X,Y)
0.60841860048565455
#斜率
- clf.coef_
- array([[536.64465091]])
- #截距
- clf.intercept
- array([-7282.61437278])
- #分布对19,39和97华氏度的Citi Bike租赁量进行预测
- clf.predict(19)
- array([[2913.63399443]])
- clf.predict(39)
- array([[13646.52701255]])
- clf.predict(97)
- array([[44771.9167651]])
#计算并增加年龄字段
cb5['age']=2015-cb5['birth year']
#提取年龄和骑行速度字段
age_speed=cb5[['speed','age']]
#去除骑行速度为0的数据
age_speed=age_speed.dropna()
#年龄设置为自变量X
X=np.array(age_speed[['age']])
#速度设置为因变量Y
Y=np.array(age_speed[['speed']])
#导入线性回归库
from sklearn import linear_model
#将数据导入模型
clf=linear_model.LinearRegression()
clf.fit(X,Y)
#斜率
clf.coef_
array([[-0.02899706]])
#截距
clf.intercept_
array([10.05513438])
#R方
clf.score(X,Y)
0.011272777068773165
#20岁的骑行速度预测为9.4公里
clf.predict(20)
array([[9.47519327]])
#50岁的骑行速度预测为8.6公里
clf.predict(50)
array([[8.60528161]])
#使用数据透视找出前10个最受欢迎地点的经纬度数据
start_station=pd.pivot_table(cb5,index=['start station name','start station latitude','start station longitude'],values=['bikeid'],aggfunc=[len],fill_value=0,margins=True).head(10)
#获得骑行开始和结束地点及经纬度数据
end_station=pd.pivot_table(cb5,index=['start station name','start station latitude','start station longitude','end station latitude','end station longitude','end station name'],values=['bikeid'],aggfunc=[len],fill_value=0,margins=True).head(10)
转载于:https://www.cnblogs.com/zoe233/p/7026207.html
案例:990万次骑行:纽约自行车共享系统分析相关推荐
- 990万次骑行: 纽约自行车共享系统分析
介绍 案例来着<从Excel到Python--数据分析进阶指南>,作者:王彦平 根据此书中,990万次骑行案例,进行实际操作.代码与笔记如下. 案例 一,数据来源 案例数据来着花旗单车Ci ...
- 喝酒骑行电瓶车属于违法或者犯罪吗?
电动三轮车属于机动车. 常规电瓶车判断为电动自行车的标准:工信部的<电动自行车安全技术规范>. <电动自行车安全技术规范>: 酒驾标准依据:<车辆驾驶人员血液.呼气酒精含 ...
- 骑行中央公园,探索纽约“后花园”别样的美
去纽约旅游吗?自由自在别具一格的那种!带你骑行中央公园(Central Park),用车轮丈量纽约的后花园,用心去记录这片广阔绿洲别样的美! 坐落在摩天大楼耸立的曼哈顿正中心,占地843英亩的中央公园 ...
- txtv28pw河南某中学_中学生骑行典型交通事故案例集 | 知危险会避险
围绕122"全国交通安全日"主题 --"知危险会避险.安全文明出行",YiYa工作室继续为大家推荐相关宣传资源.本期推送的是中学生骑行典型交通事故案例集,欢迎各 ...
- 一路骑行上战场 回望自行车和摩托车“从军史”
"直升机+摩托车",你能想象这将会成为现代战场上的一对"神奇组合"吗?在前不久举行的迪拜航展上,阿拉伯联合酋长国展示的一架UH-60"黑鹰" ...
- 2017“南京周·纽约站”盛大开幕,火柴全景VR骑行游南京大获好评
对于特殊人群来说,VR甚至可以帮助他们圆梦.这才是VR的意义! 9月8日-11日,由南京市政府主办的南京城市宣传推广活动--2017年世界知名城市"南京周·纽约站"在纽约中央火车站 ...
- java tt自行车_骑行圈的知识科普:“大组车”和“TT”车的区别
原标题:骑行圈的知识科普:"大组车"和"TT"车的区别 昨天,小编讲了50年前的环法比赛和现在的区别 忽然发现骑行圈已经变得越来越科技化 各种性能优良的自行车, ...
- java自行车内走线,【骑行课堂】内走线不是噩梦:“一秒“装好内走线神器
QQ截图20170215113108.jpg (12.72 KB, 下载次数: 36) 2017-2-15 11:35 上传 产品与技术编辑简介:山地车狂热爱好者,1米8身高,10年骑山地车经验,现在 ...
- 教你用300万共享单车出行数据,预测骑行目的地 !(附源码)
点击有惊喜 摩拜单车在北京的单车投放量已经超过40万.用户可以直接在人行道上找到停放的单车,用手机解锁,然后骑到目的地后再把单车停好并锁上.因此,为了更好地调配和管理这40万辆单车,需要准确地预测每个 ...
最新文章
- BufferedReader和PrintWriter读写中文的问题
- git回滚到历史版本,并且删除本地untracked file
- NetBean中的使用,比如快捷键
- [设计模式]合成复用原则
- 计算机java培训总结,java培训总结范文
- Ubuntu 18.04 修复 Linux 内核的 11 个漏洞
- yii2 nginx php配置,求助-yii2在nginx上的rewrite配置
- 电子邮件通知系统前十名的 ”磁盘贪婪用户“
- 解决:WebDriverException: 'chromedriver' executable needs to be in PATH
- 基于《Arbitrary Style Transfer with Style-Attentional Networks》的视频风格迁移
- 搜狗输入法linux版怎么安装,Linux 搜狗输入法的安装(Ubuntu版)
- html背景图片固定代码
- 【日语口语词典学习】第0002页
- python爬取京东笔记本标题、品牌、价格、评论数
- ZooKeeper客户端源码(三)——Watcher注册与通知
- STM32WL55-NUCLEO开发(1)----STM32WLLoRaWAN介绍
- Hank的无线802.11学习笔记--part 5
- 【信息系统项目管理师 - 备考宝典 - 39】历年考试试题易错点题库
- 医疗器械检测测试工装研究
- 一个简单的Vue过滤器
热门文章
- 替换T淘宝NPM镜像
- java计算机毕业设计小型超市管理系统源码+系统+数据库+lw文档+mybatis+运行部署
- linux网络存储nas搭建,树莓派自建 NAS 云盘之——树莓派搭建网络存储盘
- php考试系统计时器插件,js考试时间计时器倒计时代码
- 老程序员教你如何提高开发效率、成为大神0——从业余到专业
- google和baidu
- 牙齿破损了是如何修复的?
- DirectX11 创建混合状态
- html通过自适应制作手机端音乐播放器
- 单片机应用技术案例教程(c语言)答案,单片机应用技术案例教程(C语言版)