python分析數據分析項目:共享單車租用情況影響因素探索分析
數據來源: kaggle網站提供。
數據內容:某城市共享單車2011-2012年數據集,數據集包括了
租車日期,季節,天氣,氣溫、空氣濕度等相關數據。
本項目旨在通過python對此數據集進行分析,以了解共享單車的租用情況與哪些因素有關??
數據特征描述:
datetime - 日期+時間
season- 1=春 2 =夏 3 =秋 4=冬
holiday -是否節假日
workingday - 1 = 工作日 0 = 周末
weather -
1:晴天,多雲
2:霧天,陰天
3:小雪、小雨
4:大雪,大雨,大霧
temp - 氣溫攝氏度
atemp - 體感溫度
humidity - 濕度
windspeed - 風速
casual - 非注冊用戶個數
registered - 注冊用戶個數
count - 給定日期時間(每小時)總租車人數
0、環境搭建
環境:Anaconda+jupyter Notebook
導入包:
數據分析包: numpy、pandas
畫圖包:matplotlib、seaborn
缺失值可視化查詢包:missingno
日期變量處理包:calendar、datetime
1、數據准備
數據包導入+ 數據讀取+數據大小、類型查看
#導入數據包 import numpy as np import pandas as pd #導入畫圖包 import matplotlib.pyplot as plt import missingno as msno import seaborn as sns sns.set() #日期處理包 import calendar from datetime import datetime #jupyter notebook繪圖設置 %matplotlib inline %config InlineBack.figure_format="retina" #讀取數據 BikeData = pd.read_csv("E:/數據分析/數據分析項目實戰/python分析共享單車租用影響因素探索/bike.csv")
數據讀取后,可以開始對數據進行簡單的預覽,主要包括數據的
數據大小,字段名,數據格式,為后續數據處理做准備。
# 數據集大小
BikeData.shape
#輸出 (10886, 12)
數據大小為10886 x 12.
# 查看數據的內容,只需要查看前幾行
BikeData.head(5)
#查看數據類型
BikeData.dtypes
2、數據處理
數據清洗:查漏、去重、補缺、糾錯
數據加工(特征構造): 提取、計算、分組、轉換數據集字段
# 日期字段處理
從"datetime" 字段中,提取 "date", "hour", "weekday", "month"
# 提取date # apply()自動遍歷dateframe數據每一行 # split()分割字符串 [0]取第一個分片 BikeData["date"] = BikeData.datetime.apply(lambda x: x.split()[0]) #提取hour BikeData["hour"] = BikeData.datetime.apply(lambda x: x.split()[1].split(":")[0]) dateString = BikeData.datetime[1].split()[0] #提取weekday BikeData["weekday"] = BikeData.date.apply(lambda dateString : calendar.day_name[datetime.strptime(dateString,"%Y-%m-%d").weekday()]) #提取"month" BikeData["month"] = BikeData.date.apply(lambda dateString: calendar.month_name[datetime.strptime(dateString,"%Y-%m-%d").month] )
預覽一下提取的字段:
BikeData.head()
# 其他字段處理
由於''season'' ''weather'' ''holiday'' 字段中的值為定性變量(數值),將數值映射為描述型取值(字符)
需要做映射處理。
# 季節映射處理 BikeData["season_label"] = BikeData.season.map({1:"Spring",2:"Summer",3:"Fall",4:"Winter"}) #天氣映射處理 BikeData["weather_label"] = BikeData.weather.map({1:"sunny",2:"cloudy",3:"rainly",4:"bad_day"}) #是否節假日映射處理 BikeData["holiday_label"] = BikeData.holiday.map({0:"non-holiday",1:"holiday"}) BikeData.head()
# 缺失值處理
處理缺失值之前需要看看數據中是否存在缺失情況。
#可視化查詢缺失值 msno.matrix(BikeData,figsize=(12,5))
查詢可得,本次數據沒有缺失值。
如果存在缺失值,在處理過程中,一般會刪除缺失行。
在pandas模塊中,提供了包含NaN值的行刪除方法dropna(),但是處理缺失值最好的方法是 :用最合適的數據替換
對於數值型數據:該列數據均值或中位數填充
對於分類型數據:該列數據出現頻數最多的數據填充
處理不了的,暫時存放。后續可能會出現:后續運算可以跳過該空值進行
由此數據基本處已經完成,后面對處理加工后的數據進行分析。。。。
3、數據分析
# 首先探索文章開頭提出的問題:
共享單車的租用情況與哪些因素有關?
下面代碼展示了該數據集各字段相關程度。
correlation = BikeData[["temp","atemp","casual","registered","humidity","windspeed","count"]].corr() mask = np.array(correlation) mask[np.tril_indices_from(mask)] = False fig,ax = plt.subplots() fig.set_size_inches(20,10) sns.heatmap(correlation,mask=mask,vmax=.8,square=True,annot=True) plt.show()
從上圖可以看出:
count 和 casual、registered 高度正相關,相關系數分別為0.69與0.97 ,因為count = casual+ registered 符合預期。
count 和 temp 正相關,相關系數為0.39。 一般氣溫低人們不願意出行。
count 和 humidity負相關,相關系數為-0.32。濕度過大天氣不適宜騎車,租車人數相對較少。
windspeed對租車影響不大(0.1),也應該考慮到極端大風天氣出現的頻率不高。
#下面探索 租車人數按照不同因素划分的分布情況
date/ month /weekday/ hour
代碼如下:
# 設置繪圖格式和畫布大小 fig,axes = plt.subplots(nrows=2,ncols=2) fig.set_size_inches(12,10) #添加第一個字圖,租車人數分布箱線圖 sns.boxplot(data = BikeData,y = "count",orient="v",ax=axes[0][0]) #添加第二個子圖,租車人數季節分布的箱線圖 sns.boxplot(data=BikeData,y="count",x="season",orient="v",ax=axes[0][1]) #添加第三個子圖,租車人數時間分布的箱線圖 sns.boxplot(data=BikeData,y="count",x="hour",orient="v",ax=axes[1][0]) #添加第四個子圖,租車人數工作日分布的箱線圖 sns.boxplot(data=BikeData,y="count",x="workingday",orient="v",ax=axes[1][1]) #設置第一個子圖坐標軸和標題 axes[0][0].set(ylabel="Count",title="Box Plot On Count") # 設置第二個子圖坐標軸和標題 axes[0][1].set(xlabel='Season', ylabel='Count',title="Box Plot On Count Across Season") # 設置第三個子圖坐標軸和標題 axes[1][0].set(xlabel='Hour Of The Day', ylabel='Count',title="Box Plot On Count Across Hour Of The Day") # 設置第四個子圖坐標軸和標題 axes[1][1].set(xlabel='Working Day', ylabel='Count',title="Box Plot On Count Across Working Day") plt.show()
從上圖可以看出:
在hour of the day 圖中可以看出,此圖存在雙高峰,一個是早上7-8點,另一個是17-18點。
可以分析出,按照上班群體角度看,正好是上下班早晚高峰。
# 下面探索什么樣的 溫度和濕度情況下租車人數最多?
由於濕度和溫度是連續,需要將其離散化,也就是分成幾個區間。
代碼如下:
#溫度和濕度離散化 BikeData["humidity_band"] = pd.cut(BikeData['humidity'],5) BikeData["temp_band"] = pd.cut(BikeData["temp"],5) #假期字段映射處理 BikeData["holiday_map"] = BikeData["holiday"].map({0:"non-holiday",1:"hoiday"}) sns.FacetGrid(data=BikeData,row="humidity_band",size=3,aspect=2).\ map(sns.barplot,'temp_band','count','holiday_map',palette='deep',ci=None).\ add_legend() plt.show()
從上圖可以看出:
濕度在 0-60,溫度在20-40之間租車人數最多、
一般情況下 ,假期租車人數多於非假期
寒冷天氣下,非假期租車人數比假期多
# 下面探索不同季節(season)每小時租車人數變化?
sns.FacetGrid(data=BikeData,size=8,aspect=2).\ map(sns.pointplot,'hour','count','season_label',palette="deep",ci=None).\ add_legend() plt.show()
從上圖可以看出:
秋天和夏天租車人數最多,春天租車人數顯著低於其他季節,可能是冬天剛過,春天還比較冷。
# 不同天氣情況下,每個月的租車人數如何變化?
sns.FacetGrid(data=BikeData,size=8,aspect=2).\ map(sns.pointplot,'month','count','weather_label',palette="deep",ci=None).\ add_legend() plt.show()
從上圖可以看出:
天氣越好租車人數越多(晴天>多雲 / 陰天>雨天)
5-10月租車人數較多,從1月到5月呈現上升趨勢,10月份以后有明顯下降趨勢。
# 按星期划分,每小時平均租車人數如何變化?
sns.FacetGrid(data=BikeData,size=8,aspect=1.5).\ map(sns.pointplot,'hour','count','weekday',palette="deep",ci=None).\ add_legend() plt.show()
從上圖可以看出:
周六和周天租車高峰在下午期間,
工作日租車高峰在上下班期間。
4、結束
從以上分析可知,租車人數與很多因素有關,但是程度不同,
租車人數在上班的雙高峰數量最多 -hour
在秋天夏天人數較多 -season
在濕度0-60和溫度20-40租車人數較多 -temp、 humidity
天氣越好,租車人數越多 - weather
周末租車人數較多 -weekday
假日租車人數較多 - holiday
由此可見,在秋天和夏天天氣好的假日期間,且濕度0-60和溫度20-40,租車人數最多。