美国西雅图人们使用自行车情况分析与预测(进阶)

这篇博客和美国西雅图人们使用自行车情况分析与预测(初步)是姊妹篇,是对前一篇博客的延续,更多的背景信息这里不多介绍,可以去以上提到的博客中找到,同样的所有数据和源代码都是可以重现的。
和上一篇博客不同的是,这篇博客不在建立模型去预测未来的情况,而是立足于数据,从数据中找出有趣的东西来,换句话说,我们不再像上一篇博客一样去使用有监督的机器学习方法,取而代之,我们使用无监督的学习方法,类似聚类,把具有相似行为的使用自行车的人们进行聚类,挖掘出一些有趣的玩意。

Part 1: 数据来源

这篇博客和上篇博客使用的数据基本一致,我们可以在github下载,或者我在博客结尾会给出我本人的联系方式,找我要也行。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn; seaborn.set()  # 这是更高级一点的库,绘图更酷炫
data = pd.read_csv(r"E:\研究生阶段课程作业\python\好玩的数据分析\SeattleBike-master\Fremont_Bridge.csv",index_col = "Date", parse_dates = True)
data.sample(n = 5)   #随机抽样5个样本
随机抽样5行数据
data.columns = ["West","East"]   #原来的列名太长,蛋疼,改的简单一些
data.fillna(0,inplace=True)  #填充null值,用0填充,同时就地填充:就是直接对data进行填充,不用一系列的赋值之类的操作
data['total'] = data.West + data.East  #增加一个新列,计算每个时刻的经过这座桥的自行车总数
![Uploading 5_633120.png . . .]

data.resample('w',how = 'sum').plot()
每周桥上不同方向和总数的自行车数量变化图

到目前为止,好像和上篇博客没有什么不同,处理方法也是一致的,好啦,下面开始放大招了

#因为我们想知道人们在不同日期使用自行车的习惯,我们对数据进行透视
data_pivoted = data.pivot_table(values = ["West","East"], index = data.index.date,columns = data.index.hour,fill_value = 0)
data_pivoted.sample(n = 10)
经过透视表操作后的数据

经过处理后的数据列有48维,为了可视化需要,我们对48列进行降维

from sklearn.decomposition import PCA          #使用自带的pca进行降维
xpca = PCA(n_components = 2).fit_transform(x)    #只保留2维

total_trips = data_pivoted.sum(1)       #计算每一天的经过自行车总数
plt.scatter(xpca[:, 0], xpca[:, 1], c=total_trips,
            cmap='cubehelix')
plt.colorbar(label='total trips');

很明显,我们可以看出这些数据明显可以分成两类,下面要做的就很简单了,聚类开始登场。首先我们使用kmeans

#首先使用kmeans,聚类的数目为2:
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=2, random_state=1)
kmeans_model.fit(xpca)
labels = kmeans_model.labels_
#对聚类结果进行可视化
plt.scatter(xpca[:,0],xpca[:,1],c = labels)
plt.colorbar(label='total trips');
kmeans

果然kmeans表现的还是那么菜,聚类的效果并不完美,下面我们使用高斯混合模型聚类

#使用高斯混合模型,进行聚类
from sklearn.mixture import GMM
gmm = GMM(2, covariance_type='full', random_state=0)
gmm.fit(xpca)
cluster_label = gmm.predict(xpca)
plt.scatter(xpca[:, 0], xpca[:, 1], c=cluster_label);
9.png

还是高斯混合模型靠谱啊,多试几种方法,找出最适合你的方法吧

data_pivoted["Cluster"] = cluster_label
data_new = data.join(data_pivoted["Cluster"],on = data.index.date)  
data_new.sample(10)
增加了一个所属类别
#对两个聚类按照时间分别作图
#data_new_0        #包含cluster为0的所有数据
#data_new_1        #包含cluser为1的所有数据
data_new_0 = data_new[data_new.Cluster == 0]
data_new_1 = data_new[data_new.Cluster == 1]

by_hour_0 = data_new_0.groupby(data_new_0.index.time).mean()
by_hour_1 = data_new_1.groupby(data_new_1.index.time).mean()

by_hour_0[["West","East","total"]].plot()
plt.xlabel("time")
plt.ylabel("mean of bikes")
第一个类中,自行车数量变化图

这个结果相当耐人寻味,我们可以看到,差不多在早上八点左右,自行车数量到达第一个巅峰,然后下午五点左右,自行车数量到达第二个巅峰。是不是这些日子都是工作日呢,大家骑着自行车去上班,换句话说,第一个聚类难道都是工作日。这个问题有待继续解答,我们再看第二个聚类的情况.

by_hour_1[["West","East","total"]].plot()
plt.xlabel("time")
plt.ylabel("mean of bikes")
12.png

和第一个聚类相比,这个结果没有出现明显的波峰,大约在下午两年的时候,自行车数量最多,好吧,你肯定在猜测,这些日子是不是周末呢。大家吃过中饭,骑车出来浪呢。为了搞清楚这些疑问,我们计算每个日期对应的星期几。

plt.scatter(xpca[:,0],xpca[:,1],c = data_pivoted.index.dayofweek,cmap=plt.cm.get_cmap('jet', 7))
cb = plt.colorbar(ticks=range(7))
cb.set_ticklabels(['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'])
13.png

我们可以得出这样的结论,周六和周末,人们对自行车的使用有着很大的相似,而周一到周五人们对自行车的使用也很相似,结合前面的聚类结果
但是我们很奇怪的发现一个现象:有一些工作日的人们表现的和周末很相似,这些特别的日子具体是神马日子的,是不是节假日,另外和其他的工作日相比,周五表现的和周末很暧昧不清,这我们需要思考
另外在工作日的聚类中,我们发现竟然没有一个非工作日的(至少从图中没有发现特例),结果真是这样吗,我们需要进一步的使用数据进行分析

days = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']     #分别对应“dayofweek”:[0,1,2,3,4,5,6]
def get_weekday(index):
    return days[index.dayofweek]
data_new_0["weekday"] = data_new_0.index.map(get_weekday)
data_new_0_exception = data_new_0[data_new_0.weekday.isin(["Sat","Sun"])]#在第一个聚类中,找特例,换句话说,就是找出这样的周六周末,人们对自行车的使用像工作日一样
len(data_new_0_exception)   #结果和我们在上图可视化的结果一样,没有一个周六周末,人们使用自行车像工作日一样
out:0

没有一个周末,人们使用自行车和工作日一样,这也能从侧面看出,看来美帝真心不加班啊,不像天朝,加班累成狗。

data_new_1['weekday'] = data_new_1.index.map(get_weekday)
data_new_1_exception = data_new_1[data_new_1.weekday.isin(['Mon', 'Tues', 'Wed', 'Thurs', 'Fri'])]#在第2个聚类中,找特例
len(data_new_1_exception):
out:600

倒是有不少天,人们在工作日的时候和周六周末使用自行车的习惯差不多,我们猜测这些工作日很可能是假期,真的是这样吗,我们来验证一下。

date = set(data_new_1_exception.index.date)
#列出从2012-2016年,美国的所有假期
from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
holidays = cal.holidays('2012', '2016', return_name=True)
holidays_all = pd.concat([holidays,
                         "Day Before " + holidays.shift(-1, 'D'),
                         "Day After " + holidays.shift(1, 'D')])
holidays_all = holidays_all.sort_index()
holidays_all.ix[(date)]

不出意外,这些表现反常的工作日,全部都在假期中。大家都放假了,当然开始骑车去浪了

最后一个问题,为什么周五的数据,可视化的时候,有几个点表现的特别反常,这几天究竟发生了什么

fri_day = (data_pivoted.index.dayofweek == 4)   #周5为true,其他为false
plt.scatter(xpca[:, 0], xpca[:, 1], c='gray', alpha=0.2)
plt.scatter(xpca[fri_day, 0], xpca[fri_day, 1], c='yellow');
15.png
weird_fridays = pivoted.index[fridays & (Xpca[:, 0] < -600)]weird_fridays
weird_fridays
out: Index([2013-05-17, 2014-05-16, 2015-05-15], dtype='object')

果然是,周五的这几个奇异点,果然有情况,我查阅了一下资料,这三天是一年一度的
自行车日。。。。。果然没有无缘无故的爱

总结

关于西雅图市人们使用自行车习惯的数据分析到此就结束了,数据蕴含着很多信息等待我们去挖掘。英文过得去的话,建议直接看原文章,如果有不懂的话,再结合这中文译文进行参照,如果你对python和机器学习,数据挖掘等感兴趣,我们也可以一起学习,一起分享好玩的文章。

QQ 1527927373
EMAIL 1527927373@qq.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容