共享单车项目项目说明
自行车共享系统是一种租赁自行车的方法,注册会员、租车、还车都将通过城市中的站点网络自动完成,
通过这个系统人们可以根据需要从一个地方租赁一辆自行车然后骑到自己的目的地归还。
在这次比赛中,参与者需要结合历史天气数据下的使用模式,来预测D.C.华盛顿首都自行车共享项目的自行车租赁需求。数据内容说明
比赛提供了跨越两年的每小时租赁数据,包含天气信息和日期信息,
训练集由每月前19天的数据组成,测试集是每月第二十天到当月底的数据。
1.提出问题
影响租用共享单车人数的因素是什么?
注意:本文暂只对可能的影响因素做分析,因此不涉及机器学习相关内容
2.理解数据
#导入所需数据包
import pandas as pd
import matplotlib.pyplot as plt
#不提示警告
import warnings
warnings.filterwarnings('ignore')
#导入训练数据
trainDf=pd.read_csv(r'C:\Users\86158\Desktop\train_bike.csv')
#查看数据
trainDf.head()
理解数据含义
datetime(日期) - hourly date + timestamp
season(季节) - 1 = spring, 2 = summer, 3 = fall, 4 = winter
holiday(是否假日) - whether the day is considered a holiday
workingday(是否工作日) - whether the day is neither a weekend nor holiday
weather(天气等级) -
1: Clear, Few clouds, Partly cloudy 清澈,少云,多云。
2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist 雾+阴天,雾+碎云、雾+少云、雾
3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds 小雪、小雨+雷暴+散云,小雨+云
4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog 暴雨+冰雹+雷暴+雾,雪+雾
temp(温度) - temperature in Celsius
atemp(体感温度) - "feels like" temperature in Celsius
humidity(相对湿度) - relative humidity
windspeed(风速) - wind speed
casual(临时租赁数量) - number of non-registered user rentals initiated
registered(会员租赁数量) - number of registered user rentals initiated
count(总租赁数量) - number of total rentals
#查看数据信息
trainDf.info()
'''此项可以看到每一列都是10886条数据,因此并不存在缺失值'''
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
'\n此项可以看到每一列都是10886条数据,因此并不存在缺失值\n'
#查看数据描述统计信息
trainDf.describe()
3.数据清洗
3.1特征工程
#备份数据集
bikeDf=trainDf
时间特征处理
对于租车量的需求分析,必然需要通过不同纬度的时间来进行分析:
创建新的列:小时hour,天date,星期week,月份month
#导入时间处理数据包
from datetime import datetime
#月份
def get_month(x):
dateStr=x.split()[0]
dateDT=datetime.strptime(dateStr,"%Y-%m-%d")
month=dateDT.month
return month
bikeDf['month']=bikeDf['datetime'].map(get_month)
bikeDf.head()
#星期
def get_weekday(x):
dateStr=x.split()[0]
dateDT=datetime.strptime(dateStr,"%Y-%m-%d")
weekday=dateDT.weekday()
return weekday
bikeDf['weekday']=bikeDf['datetime'].map(get_weekday)
bikeDf.head()
#天date
bikeDf['date']=bikeDf.datetime.map(lambda x: x.split()[0])
bikeDf.head()
#小时
#小时 hour
def get_hour(x):
hour=x.split()[1].split(":")[0]
int_hour=int(hour) # 注意,这里的hour要转换为数值型,因为字符串型在排序时不按数值型排序规则来
return int_hour
bikeDf['hours']=bikeDf.datetime.map(get_hour)
bikeDf.head()
#删去原有的datetime列
bikeDf.drop('datetime',axis=1,inplace=True)#删去datetime列
bikeDf.head(2)
3.2特征选择
#相关系数
correlation=bikeDf.corr()
correlation
bikeDf.info()
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 15 columns):
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
month 10886 non-null int64
weekday 10886 non-null int64
date 10886 non-null object
hours 10886 non-null int64
dtypes: float64(3), int64(11), object(1)
memory usage: 1.2+ MB
bikeDf.set_index("month")
bikeDf.head()
bikeDf.info()
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 15 columns):
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
month 10886 non-null int64
weekday 10886 non-null int64
date 10886 non-null object
hours 10886 non-null int64
dtypes: float64(3), int64(11), object(1)
memory usage: 1.2+ MB
4.可视化分析
接下来对一些常见问题进行可视化分析
#让图表直接在Jupyter Notebook中展示出来
%matplotlib notebook
#让图表的显示更加清晰
%config InlineBackend.figure_format='svg'
#按照月份汇总数据,将其他数据求和
count_month=bikeDf.groupby('month').sum()
count_month.head()
通过折线图查看单车租赁总数(count)和月份(month)的变化趋势
import numpy as np
#建立坐标系
ax1=count_month.plot(y='count')
#x坐标轴文本
plt.xlabel('月份')
#y坐标轴文本
plt.ylabel('租赁总数')
#设置x轴刻度
plt.xticks(np.arange(13))
#标题
plt.title('单车租赁总数随月份变化折线图图')
plt.grid(b='True')
plt.show()
从图中可以看出,单车租赁总数在1-6月份呈上升趋势,6-10月份保持平稳,10-12月下降。出现此种现象的原因应该和天气有关,随着气温升高,单车使用人数增加,而随着冬天临近,使用单车的人数也会下降。降下来我们可以通过温度和季节对单车租赁数量的影响进一步分析。
#按照气温汇总数据,并升序排列
temp_count=bikeDf.groupby('temp').mean()
#按季节汇总数据
season_count=bikeDf.groupby('season').sum()
#建立坐标系
ax1=temp_count.plot(y='count')
ax2=season_count.plot(y='count',kind='bar')
#x坐标轴文本
ax1.set_xlabel('温度')
ax2.set_xlabel('季节')
#y坐标轴文本
ax1.set_ylabel('租赁总数')
ax2.set_ylabel('租赁总数')
#标题
ax1.set_title('单车租赁总数随温度变化折线图')
ax2.set_title('各季节单车租赁总数柱状图')
ax1.grid(b='True')
ax2.grid(b='True',axis='y')
plt.show()
从图中可以看出,随着温度的升高,单车租赁的总数越高,当气温到36摄氏度之后会出现一个急剧的下降。因为温度越高,越适合骑车出行,但是当温度升高的一定程度,暴晒等天气的出现,也会让骑单车不是一个好的选择。
关于季节的柱状图中可以发现春天时骑车数量最低,而秋季单车租赁总数最高。这里可以将春季单车租赁总数低的原因做一个假设分析,首要原因当然是因为气温低,此外可以假设是因为春季假期较多,而且还包括春节这种长假,对单车的需求程度低。
在一天的各时段单车租赁情况如何?
#按照时间汇总数据,并升序排列
hours_count=bikeDf.groupby('hours').sum()
#建立坐标系
ax1=hours_count.plot(y='count')
#x坐标轴文本
plt.xlabel('时间')
#y坐标轴文本
plt.ylabel('租赁总数')
#设置x轴刻度
plt.xticks(np.arange(25))
#标题
plt.title('单车租赁总数随时间变化折线图')
plt.grid(b='True')
plt.show()
从图中的看出用车的两个高峰时刻,一个是早上7-9这个时间段,一个是晚上4-7这个时间段,这两个时间段也是上下班的时间。所以用车的高峰时段是和上下班的时段是相对应的
5.结论
影响单车租赁数量的因素有温度,月份,季节,上下班影响,总体的原因可归纳为两点:首先就是受环境温度影响,在天气温暖的月份和季节里,选择单车的人数较多,而且随着气温的升高,人数也升高,当到一定温度后,又由于高温暴晒的原因,选择单车的人数又有明显回落。而在冬天,或是气温比较低的情况下,选择单车的人数较少
那么第二点就是选择单车的人数受上下班影响,每早高峰和晚高峰时段,同样也会迎来单车使用的高峰期