python分析數據分析項目:共享單車租用情況影響因素探索分析


 

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,租車人數最多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM