? ? ? ?市區(qū)運(yùn)營公共自行車已經(jīng)有三年了,突然接到任務(wù)要進(jìn)行一個(gè)大數(shù)據(jù)分析扒腕,反正也不是很懂绢淀,科學(xué)方法論,實(shí)踐出真知瘾腰,從馬克思主義方法論出發(fā)皆的,從整體性、實(shí)踐性蹋盆、開放性和真理性上闡釋公共自行車對于出行的影響费薄,揭示內(nèi)在的、本質(zhì)的邏輯聯(lián)系,就是要按照正確的的科學(xué)方法,客觀地認(rèn)識(shí)和對待大數(shù)據(jù)分析栖雾,,推動(dòng)公共自行車的發(fā)展建設(shè)楞抡,運(yùn)維!?
? ? ? ? 首先析藕,對簡友的文章進(jìn)行一個(gè)模擬操作過程召廷,分析內(nèi)容,根據(jù)自己的數(shù)據(jù)來實(shí)現(xiàn)方法的可行性账胧。簡友的文件鏈接地址:
本內(nèi)容接下來的說明分析都是根據(jù)自己的數(shù)據(jù)(就是市區(qū)自行車的租還數(shù)據(jù))竞慢,模擬簡友的方法進(jìn)行操作實(shí)現(xiàn)!
一:研究問題
市區(qū)公共自行車的使用情況的幾個(gè)問題:
1:周一到周末的使用量會(huì)有怎么樣具體的變化呢治泥!
2:天氣對人們使用自行車的使用有多大的影響呢筹煮!
3:自行車的使用能否得到用戶行為習(xí)慣!
二:研究工具
總結(jié)windows下pythonmon開發(fā)工具:
1:寫個(gè)小腳本居夹,用notepad++或是sublime败潦,在cmd下命令實(shí)現(xiàn)。
2:做個(gè)小項(xiàng)目:操作數(shù)據(jù)庫讀寫的小案例吮播,自己學(xué)習(xí)用的变屁,推薦用spyder。
3:做生產(chǎn)項(xiàng)目賺錢的意狠,推薦專業(yè)的IDE粟关,如Pycharm,Eclipse with PyDev等。
三:數(shù)據(jù)分析
1:隨機(jī)抽取10個(gè)數(shù)據(jù)
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
hourly = pd.read_csv(r"D:\working\windows\bikeAnalyze\SeattleBike\bike2015.csv",parse_dates=True,index_col="Date")#讀入數(shù)據(jù)闷板,同時(shí)默認(rèn)“Date作為index”
hourly.sample(n = 10)? #隨機(jī)抽取10行查看情況
隨機(jī)抽取數(shù)據(jù)圖表
2:對租車數(shù)跟還車數(shù)進(jìn)行統(tǒng)計(jì)
hourly.columns = ['lendbike', 'rentbike']? ? ? #把列名改的簡單一些澎灸,兩個(gè)列名代表自行車經(jīng)過時(shí)的方向。
hourly["total"] = hourly.lendbike + hourly.rentbike? ? #新加一列遮晚,計(jì)算每個(gè)時(shí)刻自行車的總數(shù)
daily = hourly.resample("d",how='sum')? #對數(shù)據(jù)框的日期按照天進(jìn)行重采樣性昭,屬于同一天的加在一起
weekly = daily.resample('w', how = 'sum') #對數(shù)據(jù)框的日期按照天進(jìn)行重采樣,屬于同周的加在一起
weekly.plot()
過程中有一些警告县遣,可以不處理
數(shù)據(jù)結(jié)果圖表:
稍微說下:表示藍(lán)色線的租車數(shù)量在圖中好像不顯示糜颠,實(shí)際上市由于租車和還車的數(shù)據(jù)相差不大,對于用萬來統(tǒng)計(jì)數(shù)量萧求,就更小了其兴,導(dǎo)致租車藍(lán)色數(shù)據(jù)線沒有顯示。
3:白晝時(shí)間對租還車數(shù)量的影響
白晝時(shí)間計(jì)算方式:
def hours_of_daylight(date, axis=19.44, latitude=29.08):
"""Compute the hours of daylight for the given date
date:? exmple:2012-10-07
axis:? 地區(qū)的經(jīng)度
latitude: 地區(qū)的緯度
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.
幾個(gè)未解決的問題:
(1)經(jīng)緯度的計(jì)算夸政,經(jīng)度相差100度元旬,緯度正常,后來在計(jì)算的時(shí)候發(fā)現(xiàn)用守问,經(jīng)緯度查詢出來的工具匀归,得到的結(jié)果是不對的,全部是一條直線耗帕。按照前面簡友的文章計(jì)算西雅圖的經(jīng)緯度也差100度穆端,這個(gè)怎么計(jì)算的,一下子沒懂兴垦?徙赢??探越?狡赐??钦幔?枕屉?
(2)時(shí)間計(jì)算方式:從(2000, 12, 21)這一天開始算,是什么緣故鲤氢,我更改下數(shù)值搀擂,比如(2000, 01, 01),結(jié)果得到的白晝時(shí)間也還有差異。
白晝時(shí)間變化數(shù)據(jù)圖形
4:自行車的數(shù)量變化和白天的長度之間的關(guān)系
plt.scatter(weekly.day_of_hours,weekly.total)
plt.xlabel('daylight hours')
plt.ylabel('weekly bicycle traffic');
兩者關(guān)系數(shù)據(jù)圖形
是否存在線性關(guān)系很難說卷玉,而且跟簡友的數(shù)據(jù)有一定的偏差哨颂,不管如何,還是驗(yàn)證一下相种。使用簡友說的scikit-learn威恼。
from sklearn.linear_model import LinearRegression
X = weekly[['day_of_hours']]? ? ? ? ? #白晝時(shí)間作為自變量
y = weekly['total']? ? ? ? ? ? ? ? ? #自行車數(shù)量作為應(yīng)變量
clf = LinearRegression(fit_intercept=True).fit(X, y)? ? #對上面兩個(gè)變量進(jìn)行線性擬合
print(clf.coef_)
#按照這個(gè)線性模型,白晝時(shí)間每增加一個(gè)小時(shí),那么一周內(nèi)觀察到的自行車數(shù)量增加2056輛
print(clf.score(X,y))
#計(jì)算線性模型對數(shù)據(jù)的擬合情況箫措,結(jié)果越接近1腹备,說明線性模型越精確
#為了更加直觀看出我們建立的線性模型的預(yù)測效果,我們對預(yù)測結(jié)果和真實(shí)結(jié)果進(jìn)行可視化對比
weekly["day_of_hours_trend"] = clf.predict(X)? #利用模型去預(yù)測"total"
weekly[["day_of_hours_trend","total"]].plot()? #利用模型預(yù)測值和真實(shí)值進(jìn)行對比
線性關(guān)系數(shù)據(jù)圖形
5:工作日與騎行量的數(shù)據(jù)關(guān)系
days = ['Mon','Tues','Wed','Thurs','Fri','Sat','Sun']defget_day_of_week(index):returndays[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')
數(shù)據(jù)關(guān)系圖形
這個(gè)結(jié)果可以了解斤蔓,周一到周五人們使用自行車的情況最多植酥,周六和周末相對減少,看來大部分市民是用自行車來上班的弦牡。到目前為止友驮,影響選擇自行車出行的方式已經(jīng)有白晝的時(shí)長、星期幾這兩個(gè)因素了驾锰,下面我們根據(jù)簡友說的天氣變化的影響
6:天氣變化跟騎行量的數(shù)據(jù)關(guān)系
由于沒有天氣變化的數(shù)據(jù)文件喊儡,只能根據(jù)github上的數(shù)據(jù)來做下模擬分析
數(shù)據(jù)導(dǎo)入
weather = pd.read_csv(r"D:\working\windows\bikeAnalyze\SeattleBike\SeaTacWeather.csv",index_col="DATE",parse_dates = True,usecols=[2,3,6,7])? #讀入天氣文件
weather.sample(n = 10)? #隨機(jī)查看10行數(shù)據(jù)
顯示圖表
#對溫度和降雨量進(jìn)行單位轉(zhuǎn)化,轉(zhuǎn)化到我們?nèi)粘I钪械膯挝?/p>
weather['TMIN'] =0.18* weather['TMIN'] +32
weather['TMAX'] =0.18* weather['TMAX'] +32
weather['PRCP'] /=254weather.TMIN.plot()#繪出每日最高溫隨著時(shí)間的變化weather.TMAX.plot()#繪出每日最低溫隨著時(shí)間的變化
數(shù)據(jù)關(guān)系圖形
? 重新計(jì)算采樣方式
#按照每周進(jìn)行時(shí)間規(guī)劃稻据,選出每周溫度最大的和溫度最小的,可視化weather.TMIN.resample('w',how='min').plot()
weather.TMAX.resample('w',how='max').plot()
plt.xlabel("日期")
plt.ylabel("每周的最大氣溫和最小氣溫")
重新采樣圖形關(guān)系圖
綠色代表每天的最高氣溫
藍(lán)色代表每天的最低氣溫
我的編譯環(huán)境識(shí)別不了中文买喧,中文顯示亂碼
7:天氣捻悯、白晝時(shí)長、星期幾這三個(gè)變量淤毛,對自行車騎行的變化影響以及根據(jù)這三個(gè)變量去預(yù)測自行車的數(shù)目變化今缚。
算法分析
daily_1 =daily
fori inrange(7):? ??
? ? ? daily_1[days[i]]= (daily_1.index.dayofweek == i).astype(float)
daily_1.head(10)
結(jié)構(gòu)關(guān)系顯示圖表
根據(jù)簡友的說明,可以發(fā)現(xiàn):“day_of_week”轉(zhuǎn)化成了7列低淡,而這7列的值都是數(shù)值姓言,因此我們利用“day_of_hours”和['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']總共八個(gè)變量去預(yù)測自行車總數(shù)的變化。
計(jì)算誤差
我們截圖上發(fā)現(xiàn)蔗蹋,我們利用兩個(gè)給出的信息何荚,分別是星期幾和白晝時(shí)長,我們就可以判斷猪杭,這個(gè)某一天的自行車總數(shù)餐塘,平均誤差在13102輛。
所以說我們的計(jì)算方式在存在相當(dāng)大的問題皂吮。
分析原因:1:白晝時(shí)間的計(jì)算方式
? ? ? ? ? ? ? ? ? ?2:剔除節(jié)假日的較大變化數(shù)據(jù)
? ? ? ? ? ? ? ? ? ?3:考慮其他變量影響
8:降水量戒傻、溫度、白晝時(shí)長蜂筹、和星期幾等多數(shù)據(jù)對自行車騎行量的分析
計(jì)算方式:
daily_new = daily_1.join(weather,how ='inner')##對daily 和 weather按照index需纳,進(jìn)行合并#使用合并后的數(shù)據(jù)進(jìn)行計(jì)算:包括周幾,每天白晝有幾個(gè)小時(shí)艺挪,溫度的最大和最小值不翩,降雨量作為自變量去預(yù)測每天的自行車總數(shù)
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)
發(fā)現(xiàn)執(zhí)行之后,發(fā)現(xiàn)一些錯(cuò)誤。
根據(jù)簡友說的慌盯,降雨量對自行車騎行總數(shù)的影響
ind = columns.index('PRCP')
slope = clf.coef_[ind]
print(slope)
9:
使用sklearn.linear_model.LinearRegression進(jìn)行線性回歸
應(yīng)用場景:1) 預(yù)測房子價(jià)格
? ? ? ? ? ? ? ? ? 2) 預(yù)測下周哪個(gè)電視節(jié)目會(huì)有更多的觀眾
? ? ? ? ? ? ? ? ? 3) 替換數(shù)據(jù)集中的缺失值
結(jié)論周霉,根據(jù)簡友的說明,重復(fù)這些代碼也是能夠完全重現(xiàn)以上的這些結(jié)果的亚皂!
本人也親測過可以使用俱箱,但是用我的數(shù)據(jù)文件就會(huì)出錯(cuò),明天在好好查查原因灭必。
雖然最后出現(xiàn)一點(diǎn)問題狞谱,但是關(guān)系不大,當(dāng)做學(xué)習(xí)禁漓,明天繼續(xù)把下一篇進(jìn)階文章看完跟衅。感謝簡友作者的文章,學(xué)習(xí)了播歼!
人生苦短伶跷,我用python
希望在簡友圈跟大家學(xué)習(xí)交流!