第九課 案例分析:共享單車需求
本數(shù)據(jù)包含某城市共享單車租借數(shù)據(jù)雷袋。共享單車使人們可以一個(gè)地方租借自行車并在另一個(gè)地方換車怖侦,符合目前低碳環(huán)保的理念居凶。 新增知識(shí)點(diǎn):
特征工程的概念
日期型變量的處理
相關(guān)性分析
問題:
租車人數(shù)是由哪些因素決定的界逛?
數(shù)據(jù)特征描述
datatime - 日期+時(shí)間
season - 1=春天李请,2=夏天瞧筛,3=秋天厉熟,4=冬天
holiday - 是否是節(jié)假日
workingday - 1=工作日 0=周末
weather -
? ? ?1:晴天,多云
? ? ?2:霧天较幌,陰天
? ? ?3:小雪揍瑟,小雨
? ? ?4:大雨,大雪乍炉,大霧
temp - 氣溫?cái)z氏度
atemp - 體感溫度
humidity - 濕度
windspeed - 風(fēng)速
casual - 非注冊(cè)用戶個(gè)數(shù)
registered - 注冊(cè)用戶個(gè)數(shù)
count - 給定日期時(shí)間(每小時(shí))總租車人數(shù)绢片,是casual和registered的求和。
1岛琼、讀取數(shù)據(jù)
還是一樣的套路底循,導(dǎo)入數(shù)據(jù)分析包/繪圖工具包/時(shí)間變量處理相關(guān)的工具包/繪圖設(shè)置,導(dǎo)入基礎(chǔ)包之后衷恭,再導(dǎo)入共享單車這個(gè)案例的數(shù)據(jù)包此叠,賦值給變量 BikeData。又是一次數(shù)據(jù)導(dǎo)入随珠,現(xiàn)在的數(shù)據(jù)讀取完全沒有壓力啦灭袁!QQ群或者老師給的 GitHub 鏈接的資料下載數(shù)據(jù),然后在 jupyter 頁面窗看,首先是要找到數(shù)據(jù)所在的路徑茸歧,然后 upload 數(shù)據(jù),文件名不改變的話显沈,都可以直接在 jupyter 里面用 “bike.csv” 來讀取使用软瞎。
數(shù)據(jù)上手三部曲
了解數(shù)據(jù)大小
查看前幾行/最后幾行數(shù)據(jù)
查看數(shù)據(jù)類型與缺失值
此處的 shape 是一個(gè)屬性,不是對(duì)象的一個(gè)方法拉讯,所以這后面沒有()涤浇,直接用 ?.shape ?就可以看到數(shù)據(jù)的大小了——10886 行和 12 列數(shù)據(jù)。12 列也稱為 12 個(gè)特征魔慷。
用的是 head 語句只锭,查看前十行的數(shù)據(jù),我們可以發(fā)現(xiàn)院尔,每一行的數(shù)據(jù)是間隔一個(gè)小時(shí)的蜻展。
在第三步的輸出,我們可以看到這份數(shù)據(jù)的大多數(shù)都是字符數(shù)據(jù) int邀摆,有幾個(gè)是浮點(diǎn)型 float纵顾,還有一個(gè)比較特殊的 datetime 是 object 類型,其實(shí)也指的是字符串類型栋盹。
然后我們可以觀察此處是否有缺失值施逾,我們上節(jié)課的泰坦尼克號(hào)在填充缺失值這一步,就耗費(fèi)了很多時(shí)間呢!總數(shù)一共是 10886 行汉额,顯示的所有行數(shù)都是 10886 行沪饺,所以可以看到,這里是沒有缺失值的闷愤。
這個(gè)“數(shù)據(jù)上手三部曲”的套路,大家可以熟悉一下件余,畢竟之前我們都是這么學(xué)的讥脐,后面應(yīng)該也是這么用的。我的理解就是啼器,這個(gè)三部曲就是讓我們這些小白在拿到一份數(shù)據(jù)之后旬渠,不會(huì)懵逼地不知道自己下一步應(yīng)該做什么,這個(gè)三部曲給了我們一點(diǎn)思路端壳,看整份數(shù)據(jù)的大小告丢,看前面十行最后十行直觀了解數(shù)據(jù)的內(nèi)容,然后看數(shù)據(jù)的整體信息损谦,數(shù)據(jù)類型岖免,有無缺失值,是否需要填充照捡,后面是否需要增加更多數(shù)據(jù)颅湘,這份數(shù)據(jù)什么樣的思考方向值得繼續(xù)探索,等等栗精。
我們上面只是對(duì)數(shù)據(jù)進(jìn)行導(dǎo)入闯参,下面來看對(duì)變量進(jìn)行處理。
2悲立、日期型變量的處理
數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限鹿寨,而一個(gè)好的模型只是逼近那個(gè)上限而已
我們的目標(biāo)是盡可能得從原始數(shù)據(jù)上獲取有用的信息,一些原始數(shù)據(jù)本身往往不能直接作為模型的變量薪夕。
特征工程是利用數(shù)據(jù)領(lǐng)域的相關(guān)知識(shí)來創(chuàng)建能夠使機(jī)器學(xué)習(xí)算法達(dá)到最佳性能的特征的過程脚草。
(又在解密大數(shù)據(jù)團(tuán)隊(duì)的課程回放PPT里面截圖了。寥殖。)
老師說玩讳,從原始數(shù)據(jù)里面提取的特征,能夠盡量地概括描述原始數(shù)據(jù)嚼贡。特征工程包括三個(gè)子模塊:
特征的構(gòu)建(人工構(gòu)建)
/特征的提妊俊(自動(dòng)提取)
/特征的選擇(從特征集合中挑選一組最具統(tǒng)計(jì)意義的特征子集粤策,從而達(dá)到降維的效果)樟澜。
老師說這一部分內(nèi)容的加入,是因?yàn)橹笆褂玫臅r(shí)間變量并不能達(dá)到我們想要的效果,所以我們學(xué)習(xí)新的東西來獲取新的特征秩贰。
來霹俺,正經(jīng)地:
以 datetime 為例子,這個(gè)特征里包含了日期和時(shí)間點(diǎn)兩個(gè)重要信息毒费。我們還可以進(jìn)一步從日期中導(dǎo)出其所對(duì)應(yīng)的月份和星期數(shù)丙唧。
為了簡(jiǎn)單起見,取第一個(gè)元素:表示是2011年1月1號(hào)一點(diǎn)整觅玻,是一個(gè)字符串
第9行的輸出是 “str”想际,應(yīng)該大家還記得這表示 ex 是一個(gè)字符串類型吧?字符串可以用 split 方法進(jìn)行拆分的溪厘,我們看到原本選取的數(shù)據(jù)胡本,日期和時(shí)間點(diǎn)之間是用空格來區(qū)分的,通過 split 語句畸悬,我們看到第 10 行侧甫,生成了一個(gè)列表,這個(gè)列表中有兩個(gè)元素蹋宦,每個(gè)元素都是字符串披粟。此處的目的是拆分字符串,提取相應(yīng)的日期冷冗。
2.1 通過datetime這個(gè)特征來生成租車的日期
因?yàn)橛辛松厦娴牧斜碜址钥梢运魅∵@個(gè)列表的第 0 個(gè)字符串,我們能夠得到日期的輸出贾惦。這里用到了索引的方法胸梆。
但是我們這里去到的是一個(gè)列的元素,要是我們回到剛開始的那份數(shù)據(jù)须板,想要取一排的數(shù)據(jù)呢碰镜?可能很多同學(xué)想到的就是用循環(huán)來取。老師提醒我們习瑰,對(duì)整個(gè)列進(jìn)行操作—— apply 方法绪颖。之前使用這個(gè)方法是在分組數(shù)據(jù)中使用這個(gè)數(shù)據(jù)的,這個(gè)可以對(duì)一個(gè)列的數(shù)據(jù)進(jìn)行同時(shí)操作甜奄,但是這里我們先要定義一個(gè)獲取日期的函數(shù)柠横。
定義函數(shù)用 def 開頭,函數(shù)名 get_date课兄,參數(shù)名 X 是之前定義的字符串類型牍氛,用 return 作為返回的數(shù)值,返回的結(jié)果是 ( x.split( )[0] )烟阐,也就是如何獲取日期的方法搬俊。這個(gè)輸出結(jié)果紊扬,就把之前含有時(shí)間和日期的字符串,返回成只有日期的字符串唉擂。有了這個(gè)函數(shù)餐屎,就可以使用 apply 方法來。
把新生成的這一列定義為 date 玩祟,然后使用前面的數(shù)據(jù)腹缩,參數(shù)是剛剛定義好的 get_date 函數(shù),參數(shù)是一個(gè)函數(shù)名空扎。這樣就可以在 datetime 整個(gè)函數(shù)上進(jìn)行操作庆聘,對(duì)每一個(gè)函數(shù)都進(jìn)行操作。所以上圖的輸出最后一列是新增的勺卢,此處只剩日期了。
2.2 生成租車時(shí)間(24小時(shí))
得到時(shí)間的字符串象对,這個(gè)字符串中間是用冒號(hào)分隔的黑忱。此處用的是 split 來進(jìn)行分隔,不過之前默認(rèn)的是空格勒魔,這里用的是冒號(hào)甫煞。
將時(shí)分秒轉(zhuǎn)換成列表的形式,轉(zhuǎn)換成小時(shí)時(shí)冠绢,就是需要索引為 0 的元素了抚吠。
但是我們要造的不是一列,而是很多列弟胀,操作方法還是先定義一個(gè)函數(shù):
將這個(gè)新賦值的函數(shù)用 apply 的方法運(yùn)用到 datetime 上楷力,然后定義成一個(gè)新的列,叫 hour孵户。我們?cè)诙x新函數(shù)get_hour 后面還是 x萧朝,這個(gè) x 表示的是一個(gè)字符串,比如在輸出的 datetime 中夏哭,2011-01-01 00:00:00 這一項(xiàng)检柬,就是 x 的表達(dá)。由于使用的是 apply 方法竖配,所以在此處是可以整列操作的何址,但是每次傳遞給x的值,只是一個(gè)日期进胯。
課堂上的此進(jìn)度有同學(xué)問起用爪,要是刪除了datetime ,我們生成的 date 和 hour 會(huì)被自動(dòng)刪除嗎?余老師回答胁镐,不會(huì)的项钮。不過必須是在有 datetime 的情況下,先生成 date 和 hour,然后刪除的 datetime 是不影響的烁巫。我的理解是署隘,Python 里面會(huì)會(huì)自動(dòng)更新最新一步,要是修改了數(shù)據(jù)亚隙,會(huì)讓最新的數(shù)據(jù)作為更新的條目在代碼中磁餐,此刻要是已經(jīng)生成了date 和 hour ,過河拆橋的事情在 Python 中是被允許的阿弃。
2.3 生成日期對(duì)應(yīng)的星期數(shù)
我們上面講的是把一串時(shí)間分成日期和時(shí)間戳诊霹,那要是我們需要顯示相應(yīng)的星期數(shù)的時(shí)候,怎么操作呢渣淳?這里會(huì)復(fù)雜一些脾还,因?yàn)椴皇遣鸱肿址耍枰獢?shù)據(jù)格式的轉(zhuǎn)換入愧。這節(jié)課一開始就導(dǎo)入的數(shù)據(jù)包里面含有calendar鄙漏,我們來看看這個(gè)這個(gè)方法在這里怎么用起來的:
生成了周一到周日的代稱。
dateString 是一個(gè)字符串類型棺蛛,把一個(gè)字符串分割之后還是一個(gè)字符串怔蚌。對(duì)于這個(gè)數(shù)據(jù)類型爹土,此處進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換迫筑,使用的是 Python 中的模塊 datetime 里面的函數(shù) strptime 夜赵,這里使用的 datetime 是 Python 之中的模塊乎完,和前面列舉的列名是不一樣的瞒瘸,雖然名字是重合的宏所。這里的 strptime 從名字上可以看到是把 time 變成字符串的格式冗懦,表示從 datetime 時(shí)間日期到字符串的轉(zhuǎn)換景殷。這里的參數(shù)就是上一句獲取日期的字符串 dateString 了离福,后一個(gè)參數(shù) %Y-%m-%d 就是日期的形式了芒炼。日期的形式為什么要這樣設(shè)定呢?因?yàn)榍懊嫖覀兩杀砀裰械娜掌诰褪?011-01-01的术徊,要是不設(shè)置成一致本刽,此處將會(huì)無法識(shí)別,通過這樣的格式告訴程序赠涮,dateString 的格式是這樣的子寓,然后將這個(gè)字符串轉(zhuǎn)換成相應(yīng)的日期格式了。將它儲(chǔ)存在 dateDT 的變量中笋除。
這里先看類型轉(zhuǎn)換成不成功斜友。type 后的輸出是 datetime.datetime,表示的是在模塊 datetime 中的 datetime 類型垃它。
我們知道鲜屏,前面的每一步都是為了后面做鋪墊的烹看,這里的轉(zhuǎn)換格式,也是為了后面操作方便洛史,比如下一步要查看日期是星期幾的時(shí)候惯殊,直接用上 dateDT 再加一個(gè) weekday,得到星期幾:
這里的 ?weekday 包含了 0-6 的整數(shù)也殖。星期一對(duì)應(yīng)的是 0土思,星期日對(duì)應(yīng)的是 6,所以這里的輸出 5忆嗜,代表的不是星期五己儒,而是星期六。這里的對(duì)應(yīng)和上面捆毫,來闪湾,往上翻,第 17 條運(yùn)行中的 calendar 得出的輸出是一一對(duì)應(yīng)的绩卤,等于是這里第 19 條運(yùn)行是在做一個(gè)切片索引的活途样。所以,按照這個(gè)邏輯省艳,我們是可以讓程序輸出到底是星期幾,而不是一個(gè)可能讓人誤會(huì)的數(shù)字:
總結(jié)一下套路:
獲取數(shù)據(jù)之后嫁审,將數(shù)據(jù)轉(zhuǎn)換了數(shù)據(jù)類型變成時(shí)間類型的變量
——然后用 weekday 的方法來獲取星期的數(shù)字
——再通過列表索引的方式獲取具體的字符串類型的星期了
然后我們需要把一列數(shù)據(jù)同時(shí)進(jìn)行轉(zhuǎn)化了跋炕,整合一下上面的套路,加上apply 方法:
這里定義的函數(shù)其實(shí)就是上面三步的整合律适,輸入的參數(shù) dateString 其實(shí)就是上面 date 的每一個(gè)參數(shù)辐烂,然后用 strptime 進(jìn)行類型轉(zhuǎn)換,獲取相應(yīng)星期的數(shù)字捂贿,返回值通過索引獲取相應(yīng)列表的星期纠修。最后用 apply 方法來獲取,注意方法前面對(duì)應(yīng)的是我們后面生成的 date 的這一列厂僧,然后這個(gè)表和上面的相比扣草,多了星期這一列數(shù)據(jù)。
接下來講月份了:(表格越來越寬颜屠,我表示截圖很困難俺矫睢!8摺密浑!
2.4 生成日期對(duì)應(yīng)的月份
記住,套路都是一樣的粗井。
先獲取定義月份的函數(shù)尔破,輸入的類型進(jìn)行類型轉(zhuǎn)換街图,直接使用 month 這個(gè)屬性,就可以獲取月份了懒构。我們拉到獲取星期的代碼去看餐济,使用的是獲取星期的方法 weekday ,所以方法后面是要加上圓括號(hào)的痴脾,這里的 month 用的是它的屬性颤介,所以不需要加括號(hào)獲取月份。這就是一個(gè)獲取月份的函數(shù)了赞赖。
直到這里滚朵,我們?cè)诒砀裰行略隽怂牧袛?shù)據(jù),包括 date / hour / weekday / month前域。
來吧辕近,最后一擊!可視化匿垄!
2.5 數(shù)據(jù)可視化舉例
繪制租車人數(shù)的箱線圖移宅, 以及人數(shù)隨時(shí)間(24小時(shí))變化的箱線圖
這里需要繪制兩幅圖,所以一開始需要設(shè)置一個(gè)比較大的畫布椿疗,用 figure 的方法給出一個(gè)畫布漏峰,figsize 這個(gè)參數(shù)決定了整個(gè)畫布的大小:18*5 ( inch? ) 届榄。不過顯示的大小會(huì)隨著你的屏幕大小進(jìn)行變換的浅乔。
121,還記得嗎——這個(gè)圖中第1行第2列的第1行铝条。
這里用的是 seaborn 里面的 boxplot 來繪制靖苇,括號(hào)中的參數(shù)首先是傳遞箱圖里面的數(shù)據(jù) data 是從 BikeData 來的,然后確定橫軸和縱軸的參數(shù)班缰,由于此處的數(shù)據(jù)是所有租車的數(shù)據(jù)贤壁,橫軸在此處忽略不計(jì),設(shè)置縱軸為租車的人數(shù)埠忘,對(duì)應(yīng)的就是 “count” 這一列了脾拆。
每次的圖表設(shè)置后,都要想著加上圖表橫縱軸的標(biāo)示和圖表的標(biāo)題莹妒,因?yàn)椴徽f明假丧,別人很難看得出來這個(gè)圖表講的內(nèi)容是什么。
這里使用的是 set 方法來同時(shí)設(shè)置坐標(biāo)軸和標(biāo)題动羽,Y 軸設(shè)置的是 “Count”包帚,要是不設(shè)置的話,也是有這個(gè)標(biāo)示的运吓,因?yàn)閷?duì)應(yīng)的就是 count 的那個(gè)數(shù)據(jù)渴邦。
畫一個(gè)橫坐標(biāo)和時(shí)間相關(guān)的箱線圖疯趟,所以這里設(shè)置的參數(shù)加了 x 的數(shù)據(jù) hour來區(qū)分。這里是每個(gè)小時(shí)都畫一個(gè)箱圖谋梭。
老師說信峻,畫完圖,不要沉迷于它的美色瓮床。盹舞。。
要看圖說明了什么問題:它有雙峰隘庄!??上下班的早晚高峰踢步,一個(gè)是 8 點(diǎn),另外兩個(gè)是 17 點(diǎn)和 18 點(diǎn)丑掺。說明還是上班族使用的多哦获印!你們從圖中看到了什么呢,分享一下吧街州!??
作業(yè)9-1:
模仿上面的例子兼丰,畫出 count 與 holiday 的箱線圖以及 count 與 month 的箱線圖,并將上面的兩幅圖和新產(chǎn)生的兩幅圖放到一個(gè)畫布里唆缴。
這節(jié)課的這部分講完了數(shù)據(jù)導(dǎo)入數(shù)據(jù)轉(zhuǎn)換的內(nèi)容鳍征,后半部分就是相關(guān)性的分析。盡量這兩天更新面徽!今晚上課啦艳丛!最后一節(jié)課了。斗忌。质礼。