1. 程式人生 > >共享單車專案的Python視覺化分析,教你成為資料分析大師!

共享單車專案的Python視覺化分析,教你成為資料分析大師!

Python對資料的處理能力,很多人是抱著一定的懷疑的,不過在看完這篇文章之後,我相信你一定不會再懷疑的。

一、背景:

共享單車想必大家一定不會陌生,共享單車在國內的興起,應該是2014年ofo的創立。截止到2017年3月,中國共享單車數量已經達到400萬輛,成為大城市居民出行的重要交通工具。 在kaggle網站上的共享單車專案,它提供了美國某城市的共享單車2011年到2012年的資料集。該資料集包括了租車日期,租車季節,租車天氣,租車氣溫,租車空氣溼度等資料。我們可以通過利用這些資料來進行分析,得出有用的結論。

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

二、本次的目標

我們通過對資料進行清洗,計算描述性統計資料,以此來實現視覺化資料分析。

三、資料收集與分析:

1、資料來源Kaggle專案地址(由於平臺不予許設外連結,所以只能發連結了,請見諒):

http://link.zhihu.com/?target=https%3A//www.kaggle.com/c/bike-sharing-demand

2、匯入資料

#匯入numpy、pandas、matplotlib.pyplot、seaborn包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#matplotlib.pyplot圖表風格設定
plt.style.use('ggplot')
#命令列顯示圖表
%matplotlib inline
#忽略提示警告
import warnings
warnings.filterwarnings('ignore')

本專案利用資料視覺化進行分析,只用到train資料來源。

#匯入資料
train=pd.read_csv('train.csv')

3、資料資訊檢視

#顯示前5行
train.head(5)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

train資料來源欄位:

  • datetime:時間 - 年月日小時
  • season:季節 - 1 = spring春天, 2 = summer夏天, 3 = fall秋天, 4 = winter冬天
  • holiday:節假日 - 0 = 否,1 = 是
  • workingday:工作日 - 該天既不是週末也不是假日(0 = 否,1 = 是)
  • weather:天氣 - 1 = 晴天,2 = 陰天 ,3 = 小雨或小雪 ,4 = 惡劣天氣(大雨、冰雹、暴風雨或者大雪)
  • temp:實際溫度
  • atemp:體感溫度
  • humidity:溼度
  • windspeed:風速
  • casual:未註冊使用者租借數量
  • registered:註冊使用者租借數量
  • count:總租借數量
#描述統計
train.describe()

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

四、資料清洗

#欄位資訊描述
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 12 columns):
datetime 10886 non-null object
season 10886 non-null int64
holiday 10886 non-null int64
workingday 10886 non-null int64
weather 10886 non-null int64
temp 10886 non-null float64
atemp 10886 non-null float64
humidity 10886 non-null int64
windspeed 10886 non-null float64
casual 10886 non-null int64
registered 10886 non-null int64
count 10886 non-null int64
dtypes: float64(3), int64(8), object(1)
memory usage: 1020.6+ KB

train資料集無缺失資料,由於其中日期時間欄位datetime精確到小時,為了進一步分析需要提取此欄位資訊,新增月、時、星期欄位。

#datetime改為日期格式
train.datetime=pd.to_datetime(train.datetime,format='%Y-%m-%d %H:%M:%S')
#提取年月日欄位,格式YYYYmmdd
train['datetime_D']=train.datetime.dt.strftime('%Y-%m-%d')
train['datetime_D']=pd.to_datetime(train.datetime_D,format='%Y-%m-%d')
#提取月份欄位
train['datetime_M']=train.datetime.dt.strftime('%Y%m')
#提取小時欄位
train['datetime_H']=train.datetime.dt.strftime('%H')
train['datetime_H']=train.datetime_H.astype('int')
#提取星期欄位
train['datetime_W']=train.datetime.dt.strftime('%a')
#將週一至週日改為1-7數字
weekDict={'Mon':1,'Tue':2,'Wed':3,'Thu':4,'Fri':5,'Sat':6,'Sun':7}
train.datetime_W=train.datetime_W.map(weekDict)
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 16 columns):
datetime 10886 non-null datetime64[ns]
season 10886 non-null int64
holiday 10886 non-null int64
workingday 10886 non-null int64
weather 10886 non-null int64
temp 10886 non-null float64
atemp 10886 non-null float64
humidity 10886 non-null int64
windspeed 10886 non-null float64
casual 10886 non-null int64
registered 10886 non-null int64
count 10886 non-null int64
datetime_D 10886 non-null datetime64[ns]
datetime_M 10886 non-null object
datetime_H 10886 non-null int32
datetime_W 10886 non-null int64
dtypes: datetime64[ns](2), float64(3), int32(1), int64(9), object(1)
memory usage: 1.3+ MB
#更新欄位後檢視train
train.head(3)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

五、視覺化分析資料

1、相關係數熱力圖

#熱力圖顯示train資料集相關係數
plt.figure(figsize=(11,11))
sns.heatmap(train.corr(),linewidths=.1,annot=True)
plt.title('共享單車相關係數')
#X軸標準旋轉45度
plt.xticks(rotation=45,fontsize=15)
plt.yticks(fontsize=15)
(array([ 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5,
 9.5, 10.5, 11.5, 12.5]), <a list of 13 Text yticklabel objects>)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

由熱力圖可得知:

  • 溫度temp、體感問題atemp、小時datetime_H與租借數量count有較強正相關,其中溫度/體感溫度越高,騎車使用者越多。
  • 溼度humidity與租借數量count有較強負相關,溼度越大,騎車使用者越少。
  • 季節season、節假日holiday、工作日workingday、天氣weather等欄位由於是分類欄位,這裡相關係數較小。

下面將從日期時間、天氣情況、工作/節假日、使用者4個角度進行視覺化分析資料。

2、日期時間分析

#2011-2012年共享單車月租借數量走勢
fig=plt.figure(figsize=(14,4))
ax1=fig.add_subplot(1,1,1)
dataDf=pd.DataFrame(train.groupby(by='datetime_M').mean()['count']).reset_index()
sns.pointplot(x='datetime_M',y='count',data=dataDf,ax=ax1)
plt.title('2011-2012年共享單車月租借數量')
plt.xlabel('日期')
plt.xticks(rotation=45)
plt.ylabel('租借數量(輛/時)')
plt.grid(True)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

2011年至2012年共享單車租借數量呈曲線上升趨勢,越來越多的人願意使用共享單車,由於受溫度、天氣等因素影響,年中5到10月的使用者明顯多於其他月份。

#各時間段租借數量
fig=plt.figure(figsize=(20,4))
ax1=fig.add_subplot(1,2,1)
dataDf=pd.DataFrame(train.groupby(by='datetime_H').mean()['count']).reset_index()
sns.pointplot(x='datetime_H',y='count',data=dataDf,ax=ax1)
plt.title('各時間段租借數量')
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
plt.grid(True)
#按星期租借數量
ax2=fig.add_subplot(1,2,2)
dataDf=pd.DataFrame(train.groupby(by='datetime_W').mean()['count']).reset_index()
sns.pointplot(x='datetime_W',y='count',data=dataDf,ax=ax2)
plt.title('按星期租借數量')
plt.xlabel('星期')
plt.ylabel('租借數量(輛/時)')
plt.grid(True)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

  • 每天8點、17到18點早晚上下班高峰共享單車的租借數量明顯多於其他時間段,凌晨4點時租車輛達到最低。
  • 週六總租借數量最高,週日總租借數量最低。

3天氣角度分析

#分析季節season、溫度temp、體感溫度atemp、租車輛count之間的關係
sns.pairplot(train[['season','temp','atemp','count']],plot_kws={'alpha': 0.5},hue='season')
<seaborn.axisgrid.PairGrid at 0x293f70579e8>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

春、冬、夏、秋4季溫度依次升高,溫度temp與體感溫度atemp呈強正線性關係,可以理解欄位temp近似於atemp。

#不同季節租借數量對比
fig=plt.figure(figsize=(14,4))
ax1=fig.add_subplot(1,2,1)
sns.violinplot(x='season',y='count',data=train,ax=ax1)
plt.title('不同季節租借數量')
plt.xlabel('季節')
plt.ylabel('租借數量(輛/時)')
#不同季節平均租借數量對比
ax2=fig.add_subplot(1,2,2)
sns.barplot(x='season',y='count',data=pd.DataFrame(train.groupby('season').mean()['count']).reset_index(),ax=ax2)
plt.title('不同季節平均租借數量')
plt.xlabel('季節')
plt.ylabel('租借數量(輛/時)')
<matplotlib.text.Text at 0x293fd79f438>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

結合上一張圖表共同分析可知隨著季節性溫度的提高,租借數量也會隨之增加,其中秋季溫度最高共享單車使用者最多,而春季溫度最低共享單車使用者最少。

#不同天氣租借數量對比
plt.figure(figsize=(14,4))
plt.subplot(1,2,1)
sns.boxplot(x='weather',y='count',data=train)
plt.title('不同天氣租借數量')
plt.xlabel('天氣')
plt.ylabel('租借數量(輛/時)')
#不同天氣平均租借數量對比
plt.subplot(1,2,2)
sns.barplot(x='weather',y='count',data=pd.DataFrame(train.groupby('weather').mean()['count']).reset_index())
plt.title('不同天氣平均租借數量')
plt.xlabel('天氣')
plt.ylabel('租借數量(輛/時)')
<matplotlib.text.Text at 0x293ff270b00>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

共享單車租借數量受天氣因素影響較大,天氣越惡劣租借的數量越少,大雪大雨天氣下的租借數量接近為零。

#temp可替代atemp,分析溫度temp、溼度humidity、風速windspeed、租借數量count間的關係
sns.pairplot(train[['temp','humidity','windspeed','count']],plot_kws={'alpha': 0.3})
<seaborn.axisgrid.PairGrid at 0x293f7057588>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

  • 溫度高於33度左右、低於15度左右租借數量明顯減少。
  • 溼度大於70左右租借數量明顯減少。
  • 風速大於20左右租借數量明顯減少。
  • 溫度高於27度左右風速及溼度均明顯減少。
train[['casual','registered']].sum().plot.pie(figsize=(5,5),autopct='%1.1f%%')
<matplotlib.axes._subplots.AxesSubplot at 0x293fa550b00>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

租借共享單車的使用者中註冊使用者佔用戶總數81.2%。

fig=plt.figure(figsize=(14,4))
ax1=fig.add_subplot(1,1,1)
data1=pd.DataFrame(train.groupby('datetime_M').mean()[['casual','registered']]).reset_index()
data2=pd.melt(data1,id_vars='datetime_M',value_vars=['casual','registered'])
sns.pointplot(x='datetime_M',y='value',hue='variable',data=data2,ax=ax1)
plt.title('2011-2012年非註冊使用者和註冊使用者租借數量')
plt.xlabel('日期')
plt.ylabel('租借數量(輛/時)')
plt.xticks(rotation=45)
plt.grid(True)

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

2011-2012年非註冊使用者和註冊使用者的租借數量均呈曲線上升趨勢,但註冊使用者的租借數量上升幅度遠大於非註冊使用者的。

fig=plt.figure(figsize=(16,4))
ax1=fig.add_subplot(1,2,1)
data1=pd.DataFrame(train.groupby('datetime_H').mean()[['casual','registered']])
data1.plot(ax=ax1)
plt.xticks(data1.reset_index().datetime_H)
plt.title('非註冊使用者和註冊使用者各時間點租借數量')
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
ax2=fig.add_subplot(1,2,2)
data1=pd.DataFrame(train.groupby('datetime_W').mean()[['casual','registered']])
data1.plot.bar(ax=ax2)
plt.title('非註冊使用者和註冊使用者星期租借數量')
plt.xticks(rotation=0)
plt.xlabel('星期')
plt.ylabel('租借數量(輛/時)')
<matplotlib.text.Text at 0x293fda96390>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

  • 註冊使用者在每天8點、17到18點早晚上下班高峰租借數量明顯高於其他時間段,而非註冊使用者無明顯租借數量高峰。
  • 註冊使用者在週一至週五租借數量高於週末,而非註冊使用者情況相反。

可分析得出註冊使用者大部分為上班族及學校師生,非註冊使用者為非上班族或自由職業等。

fig=plt.figure(figsize=(12,10))
ax1=fig.add_subplot(2,2,1)
sns.barplot(x='holiday',y='casual',data=train,hue='holiday',ax=ax1)
plt.title('非註冊使用者節假日時和非節假日租借數量')
plt.xticks(rotation=0)
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
ax2=fig.add_subplot(2,2,2)
sns.barplot(x='holiday',y='registered',data=train,hue='holiday',ax=ax2)
plt.title('註冊使用者節假日時和非節假日租借數量')
plt.xticks(rotation=0)
#plt.legend(loc='center')
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
ax3=fig.add_subplot(2,2,3)
sns.barplot(x='workingday',y='casual',data=train,hue='workingday',ax=ax3)
plt.title('非註冊使用者工作日和非工作日租借數量')
plt.xticks(rotation=0)
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
ax4=fig.add_subplot(2,2,4)
sns.barplot(x='workingday',y='registered',data=train,hue='workingday',ax=ax4)
plt.title('註冊使用者工作日和非工作日租借數量')
plt.xticks(rotation=0)
#plt.legend(loc='center')
plt.xlabel('時間')
plt.ylabel('租借數量(輛/時)')
<matplotlib.text.Text at 0x293ff136eb8>

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

  • 非註冊使用者在節假日租借數量高於非節假日,非工作日租借數量高於工作日。
  • 註冊使用者相反,在節假日租借數量低於非節假日,非工作日租借數量低於工作日。

通過以上的分析與得出的結論,大家對Python處理資料的能力是不是有所肯定呢?本文到此就要告一段落了,喜歡的小夥伴可以轉發並點波關注!

寫在最後:

又是新的一年,在這裡小編沒什麼其他的東西送給大家的東西,好在手裡還有一波Python的學習資料,有需要的朋友,可以加群571799375,我將免費送給大家!

共享單車專案的Python視覺化分析,教你成為資料分析大師!

 

本文來自網路,如有侵權,請聯絡小編刪除!