美国西雅图人们使用自行车情况分析和展望(初步)

By admin in 天文学 on 2018年10月13日

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()

自从2013年届2014年西雅图市自行车行驶状况

从可视化结果上看,我们的率先眼直觉告诉我们,在2014年5月左右,西雅图街上的自行车最多,超过了32000/每周,上图,我们得以隐约看出来跟2013年对待,2014年之自行车数量有增加.
此外我们发现,夏天相仿人们用自行车的多少会大的差不多,难道是夏天人们再度愿意骑单车也,还是坐夏天,白昼时会见重增长一些招的呢。

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-2014年,西雅图市每周自行车的数据变化以及白天底长度是呀关联。

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-2018 亚洲必赢手机官网 版权所有