首页 > 技术文章 > python分析数据分析项目:共享单车租用情况影响因素探索分析

xxstudyshare 2020-04-28 11:20 原文

 

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,租车人数最多。

 

推荐阅读