United天文学 States圣路易斯人们接纳自行车处境分析与估计

By admin in 天文学 on 2019年2月12日

Background:

首先声惠氏点,那篇博客不是自家的原创,小编被笔者对咱们习惯的数据而有所长远一线的思维格局所折服,花了两日时间把数量下载下来,并且再次出现了原小编的经过和结论。原文链接[blog1]
[blog2],作者的那篇博客是汇总以上两篇博客写成的。如有误会原小编的情趣大概缺漏,请我们指正!

Part 1: 研商难点:

在美利坚合众国伊斯兰堡市,好像人们对车子越来越喜欢了,从进一步多的单车俱乐部可以看到端倪。在我们的古板印象中,就好像骑单车只是当作业余爱好,那么在西雅图是或不是也是那种气象呢,自行车的拔取情况随着周三到周四会有怎么着具体的变型吧,天气又对芸芸众生选拔自行车的主宰有多大的熏陶呢,上边笔者将尝试着应对那么些难题。

Part 2:探讨工具

本文使用的是python3.4+ipython notebook + pandas + numpy
+sklearn
,,其实以上的这个只用装一个Anaconda就可以完全缓解了,数据是开源的,所有的结果是完全可复出的。

Part 3: 让数听他们说话

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

hourly = pd.read_csv(r"E:\研究生阶段课程作业\python\好玩的数据分析\SeattleBike-master\FremontHourly.csv",parse_dates=True,index_col="Date")#读入数据,同时默认“Date作为index”
hourly.sample(n = 10)  #随机抽取10行查看情况 

随便取样10行

地方的几行代码,首先是我们读入数据,这个数据足以在我的github直白下载,当然你也可以沟通自身,小编会邮件给你。在此地大家读入数据的时候,做了一部分小的处理,把csv文件中的”Date”字段作为日期处理。

hourly.columns = ['northbound', 'southbound']       #把列名改的简单一些,两个列名代表自行车经过时的方向。
hourly["total"] = hourly.northbound + hourly.southbound    #新加一列,计算每个时刻自行车的总数
daily = hourly.resample("d",how='sum')  #对数据框的日期按照天进行重采样,属于同一天的加在一起
weekly = daily.resample('w', how = 'sum') #对数据框的日期按照天进行重采样,属于同周的加在一起
weekly.plot()

从二零一三年到二零一四年突塔那那利佛城市自行车行驶情形

从可视化结果上看,大家的率先眼直觉告诉大家,在2014年5月左右,西雅图街上的车子最多,超过了32000/每一周,上图,大家得以隐隐看出来和二零一三年对待,二零一四年的单车数量有所增添.
别的大家发现,冬日就像人们使用自行车的数码会丰盛的多,难道是夏天人们更愿意骑自行车吗,依旧因为春日,白昼时间会更长一些造成的吗。

def hours_of_daylight(date, axis=23.44, latitude=47.61):
    """Compute the hours of daylight for the given date
       date:  exmple:2012-10-07
       axis:   地区的经度
       latitude: 地区的纬度
return :how many hours a day
    """
    diff = date - pd.datetime(2000, 12, 21)
    day = diff.total_seconds() / 24. / 3600
    day %= 365.25
    m = 1. - np.tan(np.radians(latitude)) * np.tan(np.radians(axis) * np.cos(day * np.pi / 182.625))
    m = max(0, min(m, 2))
    return 24. * np.degrees(np.arccos(1 - m)) / 180.

“hours_of_daylight”只是用来测算某一天的白昼有稍许个小时的,那和天教育学相关了,不用管具体原理了。

daily["day_of_hours"] = daily.index.map(hours_of_daylight)
weekly["day_of_hours"] = weekly.index.map(hours_of_daylight)
weekly.day_of_hours.plot()   #绘出白天时长随着时间的变化图

大廷广众时长随着时间变化图

果真美帝也是冬天有16个小时白天,夏日只有将近8个钟头的白昼呀。大家再钻探一下2013-二〇一四年,天津市每一周自行车的数量变化和白天的长度是何等关联。

plt.scatter(weekly.day_of_hours,weekly.total)
plt.xlabel('daylight hours')
plt.ylabel('weekly bicycle traffic');

散点图

我们可以很显然的观看,随着白天的日子增加,活跃的车子数量也在追加,而且感觉上还存在线性关系,所以在此此前我们说秋天人们骑自行车更加多,只怕只是因为秋日的白昼岁月长,并不是因为天气炎热之类的,当然那须求进一步的钻研。
既是,白昼时间的车子总数或然存在线性关系,那么大家来验证一下。
得益于scikit-learn,大家一般须求的机器学习方法在其间整套方可找到。小编强烈提议翻看它的文档,我也在按步骤把scikit-learn翻译成汉语。

from sklearn.linear_model import LinearRegression
X = weekly[['day_of_hours']]   #白昼时间作为自变量
y = weekly['total']                   #自行车数量作为应变量
clf = LinearRegression(fit_intercept=True).fit(X, y)    #对上面两个变量进行线性拟合
print(clf.coef_)   
out: 2056.44964989            #按照这个线性模型,白昼时间每增加一个小时,那么一周内观察到的自行车数量增加2056辆
print(clf.score(X,y))
out:0.74184335208140473  #计算线性模型对数据的拟合情况,结果越接近1,说明线性模型越精确
#为了更加直观看出我们建立的线性模型的预测效果,我们对预测结果和真实结果进行可视化对比
weekly["day_of_hours_trend"] = clf.predict(X)   #利用模型去预测"total"
weekly[["day_of_hours_trend","total"]].plot()   #利用模型预测值和真实值进行对比

**前瞻结果和实际结果可视化相比较**

作者们可以认为大家创建的线性模型较为可相信,能够影响出街上的车子数量随着白昼时间的浮动。

归来大家那时的标题,一般在我们眼里,美帝人民采用自行车,那肯定用来休闲的,只怕训练肉体,那事情情形正是那样吗,大家继续挖掘。

days = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']
def get_day_of_week(index):
    return days[index.dayofweek]
daily["day_of_week"] = daily.index.map(get_day_of_week)
daily.head(10)
day_count = daily.groupby("day_of_week").total.sum().plot(kind = 'bar')

下面的代码就是新添一个列,对应每一种日子的星期几。,然后对星期1-7进展分租,按组求出自行车出游的总次数。结果如下:

按星期几查看自行车总数处境

那些结果出乎我们的想象,竟然周五到周一人们使用自行车的动静最多,星期四和周一最少,看来美帝人民半数以上是用自行车来上班的,并不是我们想像的只是骑着脚踏车来休闲的。到近来甘休,影响圣路易斯公民接纳自行车骑行的主意已经有白昼的时长、星期几那多少个要素了,上边大家再组成天气因素开展深一步的驾驭。

weather = pd.read_csv(r"E:\研究生阶段课程作业\python\好玩的数据分析\SeattleBike-master\SeaTacWeather.csv",index_col="DATE",parse_dates = True,usecols=[2,3,6,7])  #读入天气文件

有关伊斯兰堡市的天气情状,大家有现成的weather数据。
weather.sample(n = 10) #随机查看10行数据

萨格勒布的气候情况

#对温度和降雨量进行单位转化,转化到我们日常生活中的单位
weather['TMIN'] = 0.18 * weather['TMIN'] + 32
weather['TMAX'] = 0.18 * weather['TMAX'] + 32
weather['PRCP'] /= 254
weather.TMIN.plot()      #绘出每日最高温随着时间的变化
weather.TMAX.plot()     #绘出每日最低温随着时间的变化

天气温度随着年华变化图

那种图简直就是凝聚恐惧症伤者的劫数,为了更直观彰显温度变化,我们对每一周重采样,绘出每一周的最低温和最高温随着岁月的成形。

#按照每周进行时间规划,选出每周温度最大的和温度最小的,可视化
weather.TMIN.resample('w',how='min').plot()
weather.TMAX.resample('w',how='max').plot()
plt.xlabel("日期")
plt.ylabel("每周的最大气温和最小气温")

重采样后图

和地点的图比较,作者认为一切世界都痛快了呢。

咱们将来有着了天气、白昼时长、星期几那五个变量,下边的工作就是围绕那五个变量去预测自行车的数目变化,首先大家把天气信息放在一旁,只考虑每一日的白昼时长星期几,以那两个成分为自变量去预测街上自行车数量的变化.

daily_1 = daily
for i in range(7):
    daily_1[days[i]] = (daily_1.index.dayofweek == i).astype(float)
daily_1.head(10)

这几行代码比较精简,也不易于领悟,作者来解释一下,首先是采用daily_1去备份daily那几个数据框,然后为数据框伸张7个列,分别是[‘Mon’,
‘Tues’, ‘Wed’, ‘Thurs’, ‘Fri’, ‘Sat’,
‘Sun’],为何要如此做吧,因为在大家的线性预测模型中,我们选拔的自变量必须是数值,可是大家的周几却是字符串变量,因而大家拔取了一个小技巧对其开展了量化。大家可以一直看一下量化的结果:

离散变量转化成一而再变量

咱俩着眼变化后的结果,可以发现:“day_of_week”转化成了7列,而那7列的值都以数值,由此我们运用
“day_of_hours”[‘Mon’, ‘Tues’, ‘Wed’, ‘Thurs’, ‘Fri’, ‘Sat’,
‘Sun’]
共计多少个变量去预测自行车总数的变迁。

X = daily_1[days + ['day_of_hours']]
y = daily_1['total']
clf = LinearRegression().fit(X, y)
daily_1['dayofweek_trend'] = clf.predict(X)
print(clf.score(X,y))    #检验线性拟合的效果
out: 0.68
(np.abs(daily_1.total - daily_1.dayofweek_trend)).mean()  #计算模型预测值和真实值之间的平均误差
out: 532.11

从统计的结果可以看看,大家运用多个给出的消息,分别是星期几和白昼时长,大家就可以判定,那几个某一天金奈市街上的单车总数,平均误差在532辆。

因为我们手里也有吉达市的天气资料,大家决定加上天气那些选项,联合方面的七个成分,继续做臆度。理想的场馆是,大家手里的信息越多,预测的结果会越加精确,那么结果真的是那般啊,大家后续向下探索。

要是您是顺着那篇博客从上马观望那里,你就活该清楚,大家前日有七个数据框:
daily和weather,将来我们须要统一那七个数据框,使用降雨量、温度、白昼时长、和星期几去预测街上自行车的数额。

daily_new = daily_1.join(weather,how = 'inner')##对daily 和 weather按照index,进行合并
#使用合并后的数据进行计算:包括周几,每天白昼有几个小时,温度的最大和最小值,降雨量作为自变量去预测每天的自行车总数
columns = days + ['day_of_hours', 'TMIN', 'TMAX', 'PRCP']
X = daily_new[columns]
y = daily_new['total']
clf = LinearRegression().fit(X, y)
daily_new['overall_trend'] = clf.predict(X)

(np.abs(daily_new.total - daily_new.overall_trend)).mean()
out: 365

本次大家拔取了七个变量去预测某一天街上自行车的数量,和前边只用八个成分拿到的532辆平均误差比较,将来的平均误差唯有365,我们的前瞻结果更是好了哇。

天文学,我们来看降水量那么些因素的震慑,首先我们须求控制别的变量不变的景观

ind = columns.index('PRCP')
slope = clf.coef_[ind]
print(slope)
out: -824.64

标志在维系其他变量不变的情况下,当降水量扩大一英尺,街上的车子数量大约裁减824辆.

Part 4: 结论

为了强调原作者,我也把全部内容分成两局地来成功,分别是始于和进阶,在那篇博客中,紧要接纳了pandas的多少清洗和剖析工作,同时也使用了sklearn中回归预测的文化,分外的概括,不过发生了较好的预测效果。所有的数量都以足以下载的,重复那些代码也是力所能及完全重现以上的这么些结果的,假设您有问号,那么可以参考英文原博客[blog1]
[blog2],和原作者的github可以下载完整的代码和多少,如果自身翻译有不做到的地方,希望您可见联系自己,举办指正。

Life is short, I use python

Emial:
1527927373@qq.com

QQ: 1527927373

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢手机官网 版权所有