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