项目背景

自行车共享系统是租用自行车的一种方式,在这里,通过遍布城市的信息亭网络,可以自动获得会员资格、租赁和自行车归还。使用这些系统,人们可以从一个地方租一辆自行车,并根据需要将其送回另一个地方。目前,全世界有超过500个自行车共享项目。

这些系统产生的数据使它们对研究人员具有吸引力,因为旅行的持续时间、出发地点、到达地点和经过的时间都有明确的记录。因此,自行车共享系统起到了传感器网络的作用,可以用来研究城市中的移动性。本项目通过结合历史使用模式和天气数据,以预测华盛顿的共享单车租赁需求。可以按照这些去需求合理投放共享单车,提高共享单车的利用率。

数据集地址:https://www.kaggle.com/c/bike-sharing-demand

数据分析

数据集包括两部分,分别为训练就和测试集,训练集由每月前19天的数据组成,测试集是每月第20天到当月底的数据。

我们先从训练数据集入手,分析一下天气等特征对租赁数量的影响,服务下一步的模型预测。

数据中的变量说明

datetime(日期) - hourly date + timestampseason(季节) - 1 = spring, 2 = summer, 3 = fall, 4 = winterholiday(是否假日) - whether the day is considered a holidayworkingday(是否工作日) - whether the day is neither a weekend nor holidayweather(天气等级) -1. 清澈,少云,多云。2. 雾+阴天,雾+碎云、雾+少云、雾3. 小雪、小雨+雷暴+散云,小雨+云4. 暴雨+冰雹+雷暴+雾,雪+雾temp(温度) - temperature in Celsiusatemp(体感温度) - "feels like" temperature in Celsiushumidity(相对湿度) - relative humiditywindspeed(风速) - wind speedcasual(临时租赁数量) - number of non-registered user rentals initiatedregistered(会员租赁数量) - number of registered user rentals initiatedcount(总租赁数量) - number of total rentals

导入数据

import pandas as pd
train=pd.read_csv('train.csv')
print(train.info())

训练集中一共有10886个数据,并且没有缺失值。

时间特征‘datetime’可以分成多个特征,对‘’datetime’的数据进行分割,我们新增加了年,月,日,小时的特征。

datatime=train['datetime'].map(lambda x:x.split()[0])
hours=train['datetime'].map(lambda x:x.split()[1])
train['year']=datatime.map(lambda x:x.split('-')[0])
train['month']=datatime.map(lambda x:x.split('-')[1])
train['day']=datatime.map(lambda x:x.split('-')[2])
train['hours']=hours.map(lambda  x:x.split(':')[0])

数据可视化

下面看一下单个特征对于租赁数量的影响

季节对租赁数量的影响

train.groupby(['season'])['registered','casual','count'].sum().plot(kind='bar',stacked=True)

总体上看,在春天时租赁量最小,秋天租赁量最大。注册用户的租赁量要大与非注册用户的租赁量,注册用户和非注册用户随季度的变化趋势是一致的。

节假日对租赁数量的影响

train.groupby(['holiday'])['count'].mean().plot(kind='bar')

从假日和非假日的平均租赁量来看,两者的日租赁量持平。

工作日对租赁数量的影响

train.groupby(['workingday'])['count'].mean().plot(kind='bar')

从工作日和非工作日来看,日均租赁数量也是持平的。他与假日和非假日日均租赁数量相似。这表明日均租赁数量与是否为假期无关。但是,是否与每天的不同时段有关,还需要进一步探索。

天气对租赁量的影响

train.groupby(['weather'])['count'].mean().plot(kind='bar')

总体上看,人们在晴朗天气选择租赁共享单车的人数最多,在小雨,小雪天的租赁数量最少。

我们再看一下天气情况的分布:

train['weather'].value_counts().plot(kind='bar')

从中可以发现华盛顿天气处于晴朗的时间占多数。

通过分析工作日数据集,我们发现大雪天气的租赁量之所以多与于小雨,小雪天,是由于工作日的通勤所致。

温度对租赁数量的影响

train.groupby(['temp'])['registered','casual'].mean().plot()

从温度上我们可以发现,整体上平均租赁数量随着温度的增加呈现先增加后减小的趋势,在温度30℃到35℃时,达到最大租赁量 。这些情况表明人们更倾向于在温暖的天气里租赁共享单车,但是当温度过高时,共享单车的需求量有所减小。

体感温度对租赁数量的影响

train.groupby(['atemp'])['registered','casual','count'].mean().plot()

体感温度的趋势与气温的趋势基本保持一致,人们更倾向于温暖的天气出行。在下一步进行建模时,temp和atemp这两个特征只选择一个。

湿度对租赁数量的影响

train.groupby(['humidity'])['registered','casual','count'].mean().plot()

湿度在20-30之间选择租赁共享单车的人数最多,并且注册用户与一般用户的趋势几乎一致。当湿度大于30后,选择租赁共享单车数量逐渐减小,湿度与天气,季节等因素有关。出现高湿度有以下情况:分别为气候自身以及雨雪天气。

风速对租赁数量的影响

train.groupby(['windspeed'])['registered','casual','count'].mean().plot()

当风速大于45左右时,使用共享单车的人数急剧减小。然而在大于50后,租赁人数又急剧增加,这种现象出现在工作日中,是由于下班高峰所到导致。

处在工作日内,风速对租赁数量的影响

从中可以很明显的发现,在风速为50左右,工作日和总体租赁量都有急剧升高。这是由于上下班的通勤所致。

时间对租赁数量的影响

不同年份与租赁数量的关系

train.groupby(['year'])['registered','casual','count'].mean().plot(kind='bar',stacked=True)
train.groupby(['month'])['registered','casual','count'].mean().plot(kind='bar',stacked=True)
train.groupby(['hours'])['registered','casual','count'].mean().plot()

我们可以发现随着年份的增长,使用共享单车的人越来越多。

不同月份与租赁数量的关系

随着月份的增加,共享单车的使用量逐渐增加,在5月到10月间租赁数量基本稳定,之后略有下降。这是由于季节原因所致,在5-10月气候适宜,人们更愿意使用共享单车出行。

每天不同时段与租赁数量的关系

我们可以很明显的发现,每天共享单车有两个租赁的高峰期。这两个时段分别代表上班高峰和下班高峰。在中午也存在一个小的租赁高峰。

不同季节的每天不同时段对租赁数量的影响

plt.figure(figsize=(20,2*6))
for i in range(1,5):ax=plt.subplot(2,2,i)season_index = train['season'] == iseason_train = train[season_index]season_train.groupby(['hours'])['registered', 'casual', 'count'].mean().plot(ax=ax)ax.set_title('%d'%i)
plt.show()

我们在不同季节上班高峰出现的时间相同,在春天租赁数量整体较少。

工作日和非工作日的不同时段对租赁数量的影响

workingday_0=train[train['workingday']==0]
workingday_1=train[train['workingday']==1]
workingday_1.groupby('hour')['casual', 'registered', 'count'].mean().plot()
plt.show()

工作日和不同时间和租赁数量的关系,与之前的总体分析类似,租赁数量都出现了两个高峰

该图为非工作日租赁数量与时间的关系,对比上图,可以发现两者都很大区别,在非工作日,从十点开始,租赁持续增加,在12左右达到最大,并且租赁数量保持稳定。在约下午4点,租赁数量开始较少

小结

通过对数据集的分析我们可以发现,租赁数量与天气,气候,季节,时段,是否处于工作日等因素有关。对于天气,在晴朗无雨的天气中租赁量较多。对于温度,人们更青睐于在温暖的天气里使用共享单车。当空气湿度很大时,人们对共享单车的需求变小,这可能与天气因素有关。此外当风速在45左右时,对共享单车的需求量急剧减小。当风速在50左右时,由于上下班高峰,需求量会又会呈现急剧升高的趋势。另外工作日对共享单车的使用存在两个高峰,而在非工作日,中午和下午时段的租赁量较多。

数据建模

我们基于上述分析,我们对训练数据进行建模,从而实现测试集数据的预测。

检查异常值

首先我们先来看一下数据的分布情况

train.drop(labels=['datetime'],axis=1,inplace=True)
data_column=list(train.columns)
plt.figure(figsize=(20,5*6))
for i in data_column:ax=plt.subplot(5,3,data_column.index(i)+1)data=train[i].astype(np.int)sns.distplot(data,ax=ax)

从数据分布上来看,租赁数量count是一个右偏态分布,并且标准差很大,这不利于我们建模。为此我们保留了三倍方差以内的样本,并对该特利用log1p进行处理。

train_data=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
train=train_data[np.abs(train_data['count']-train_data['count'].mean())<=(3*train_data['count'].std())]
data=pd.concat([train,test],axis=0)
datatime=data['datetime'].map(lambda x:x.split()[0])
hours=data['datetime'].map(lambda x:x.split()[1])
data['year']=datatime.map(lambda x:x.split('-')[0])
data['month']=datatime.map(lambda x:x.split('-')[1])
data['day']=datatime.map(lambda x:x.split('-')[2])
data['hours']=hours.map(lambda  x:x.split(':')[0])
y_train=np.log1p(train['count'])

此外风速为0的值很多,这与真实情况不相符,有可能在风速上存在缺失值被填充为0.需要使用随机森林进行填充。我们选取了'season','weather','humidity','month','temp','year',和'atemp'这些特征对风速为0的样本进行了填充。

data.drop(labels=['datetime','casual','count','registered'],axis=1,inplace=True)
windspeed_1=data[data['windspeed']!=0]
windspeed_0=data[data['windspeed']==0]
from sklearn.ensemble import RandomForestRegressor
rf=RandomForestRegressor()
x=windspeed_1[['season','weather','humidity','month','temp','year','atemp']]
y=windspeed_1['windspeed']
x_0=windspeed_0[['season','weather','humidity','month','temp','year','atemp']]
y_0=windspeed_0['windspeed']
rf.fit(x,y)
windspeed_replace=rf.predict(x_0)
data.loc[(data['windspeed']==0),'windspeed'] = windspeed_replace
data=pd.DataFrame(data)

特征工程

特征'holiday','season', 'weather','workingday'的数据类型为int,但是实际中,他们是离散的变量,因此需要做one-hot编码。并且从上面的特征分析中,我们发现,temp和atemp分布比较相似,我们只保留一个。
one_hot=pd.get_dummies(data[['holiday','season', 'weather','workingday']].astype(np.str))
data=pd.concat([data,one_hot],axis=1)
data.drop(['holiday','season', 'weather','workingday','atemp',],axis=1)#删除重复特征

模型训练

x_train=data[:len(train)]
x_test=data[len(train):]

我们选用 GradientBoostingRegressor模型来预测租赁数量,并提交到kaggle平台上。

首先我们通过网格调参的方式选择最佳的参数,下面是GBDT算法的调参代码和结果:

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import GridSearchCV
gbdt=GradientBoostingRegressor()
n_tree=np.arange(1,1000,100)
clf=GridSearchCV(gbdt,param_grid={'n_estimators':n_tree})
clf.fit(x_train,y_train)
print(clf.best_params_)

输出的最佳参数为

n_estimators=701,learning_rate=0.1

模型预测和结果提交

我们选用此参数对测试集进行预测

gbdt=GradientBoostingRegressor(n_estimators=700,learning_rate=0.1)
gbdt.fit(x_train,y_train)
result=gbdt.predict(x_test)
result=np.around(np.expm1(result))
result=pd.DataFrame(result)
result.columns=['count']
result_1=pd.concat([name,result],axis=1)
result_1.columns=['datetime','count']
result_1.to_csv('bike_int_2_gbdt_0.1_700.csv',index=False)

提交后得分0.42215 ,模型的评估标准为均方根对数误差(RMSLE)。


由于比赛已经结束,没有产生排名,但是通过查询排行榜可以发现排名大约在480名,总共有3201只支队伍,排名约为15%


总结

我们首先对贡献单车的数据集进行了分析,通过数据的可视化,我们找到了影响租赁的因素。通过建立DGBT(梯度提升决策树),对共享单车的租赁数量进行预测。这有助于合理投放单车,提高单车的使用效率。

kaggle 共享单车项目数据分析和单车租赁数预测相关推荐

  1. 共享单车项目数据分析报告

    本文运用Python绘图包(matplotlib.pandas)对数据进行可视化分析,并使用Powerpoint制作描述性分析报告. 项目来自Kaggle,点击下载数据. 作者:钱奇天

  2. python客户端开发自行车租赁系统_python可视化--共享单车项目

    共享单车项目项目说明 自行车共享系统是一种租赁自行车的方法,注册会员.租车.还车都将通过城市中的站点网络自动完成, 通过这个系统人们可以根据需要从一个地方租赁一辆自行车然后骑到自己的目的地归还. 在这 ...

  3. 共享单车数据集_共享单车项目数据可视化展示

    共享单车项目数据可视化展示 1. 数据收集 https://www.kaggle.com/c/bike-sharing-demand/data 1.1 数据说明及问题分析 数据内容包括两年内的每小时租 ...

  4. 共享单车 芝加哥 数据分析_为什么311无法使用数据科学识别并解决芝加哥311明显的服务问题...

    共享单车 芝加哥 数据分析 Did you know that if you call 311, the City of Chicago can help you trim your trees an ...

  5. 全力升级篇-基于Mongodb与Nginx负载均衡打造共享单车项目实战 最新完整项目升级版

    全力升级篇-基于Mongodb与Nginx负载均衡打造共享单车项目实战 最新完整项目升级版 课程作为全新的升级项目课程,基于Nginx负载均衡,Flume与Kafka,Mongodb和Redis等技术 ...

  6. JAV迷你共享单车项目

    JAV迷你共享单车项目 创建公司类 定义好成员变量 package com.qy30.sm.bike; import javax.swing.*; import java.text.ParseExce ...

  7. 2022年版中国共享单车市场现状调研及投资前景预测报告

    2022年版中国共享单车市场现状调研及投资前景预测报告 ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ [报告编号]: 414927    [出版时间]: 2022年3月   [出版机构]: 中商经济研究网 第 ...

  8. Kaggle项目数据分析--heart disease

    Kaggle项目数据分析--heart disease 最近在学习了用python的matplotlib库.seaborn库.numpy.pandas库等做数据分析,matplotlib库.seabo ...

  9. 中国动感单车行业销售模式与营销渠道预测报告2021-2026年

    中国动感单车行业销售模式与营销渠道预测报告2021-2026年  ************************************** [报告编号]: BG547344 [出版时间]: 202 ...

最新文章

  1. 用C语言实现素数筛法获取一亿(100000000)以内的全部素数
  2. (How to) Call somatic mutations using GATK4 Mutect2
  3. python代码画简单图-Python figure参数及subplot子图绘制代码
  4. php读取屏幕大小,jQuery 获取屏幕尺寸
  5. DirectX视口变换矩阵详解
  6. Spring Security 4 使用@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全
  7. GNOME Shell Extensions开发介绍
  8. matlab 置顶曲线,matlab figure 最大,最小,置顶
  9. C++四种cast操作符
  10. android_Text
  11. 请对比html与css的异同,css2与css3的区别是什么?
  12. spring-boot-1.4x后@ConfigurationProperties注解舍弃location
  13. C#.Net工作笔记019---葡萄城控件FlexGrid自定义风格_比如给某列设置某个颜色_该颜色不受选择行的影响
  14. LaTeX学习笔记(legacy)~
  15. 计算机第二显示器黑屏的处理,电脑显示器黑屏的维修处理办法
  16. 使用xmodmap修改键盘映射
  17. 【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 1280期】
  18. Multisim10中仿真时间步长与数码显示管的类型有关
  19. 防止用户将表单重复提交的方法汇总
  20. python乌龟画五角星_使用Python的turtle模块画五角星

热门文章

  1. 情感分析Sentiment Analysis 知识资料全集(入门/进阶/论文/综述/视频/专家,附查看
  2. 小技巧:unicode RLO
  3. Activiti~相关概念
  4. 利用内网穿透实现无固定IP调试支付回调
  5. iphone 4s越狱
  6. 2017-2018-1 20155227 20155318 实验一 开发环境的熟悉
  7. ubuntu16.04外接显示器扩展屏幕设置
  8. 三步搭建免费无限空间无限速网盘——基于docker与阿里云镜像(B站学习)
  9. http://www.dewen.net.cn/q/16042/jquery fadeIn和fadeOut问题
  10. No connection could be made because the target machine actively refused it 127.0.0.1:8888