共享单车需求分析(一)

一、问题说明

       共享单车在国内发展时间虽然不算长,但是在国外已经发展不算短了。单车共享系统是一种租赁自行车的方法,使用者租车及还车是通过各个站点网络自动完成,便利大家的生活,本数据来源于Kaggle比赛,本文的目的在于记录数据分析的学习历程。

数据变量说明:

  • datatime 日期+时间
  • season 1=春 2=夏 3=秋 4=冬
  • holiday 1=节假日 0=非节假日
  • workingday 1=工作日 0=周末
  • weather 1=晴天多云 2=雾天阴天 3=小雪小雨 4=大雨大雪大雾
  • temp 气温摄氏度
  • atemp 体感温度
  • humidity 湿度
  • windspeed 风速
  • casual 非注册用户个数
  • registered 注册用户个数
  • count 给定日期时间(每小时)总租车人数

二、数据准备

       导入必要的数据包:

1 #导入处理数据包
2 import numpy as np
3 import pandas as pd
4 from datetime import datetime
5 import matplotlib.pyplot as plt
6 import seaborn as sns

导入数据:

1 train=pd.read_csv(‘train_bike.csv‘)
2 test=pd.read_csv(‘test_bike.csv‘)

这里采用的是相对路径,若是在不同的文件夹下,需使用绝对路径。

查看数据的整体情况:

#数据集大小
print("train:",train.shape)
print("test:",test.shape)
#查看数据集整体确实情况
print(train.info())
print(test.info())
train: (10886, 12)
test: (6493, 9)

<class ‘pandas.core.frame.DataFrame‘>
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
None
<class ‘pandas.core.frame.DataFrame‘>
RangeIndex: 6493 entries, 0 to 6492
Data columns (total 9 columns):
datetime      6493 non-null object
season        6493 non-null int64
holiday       6493 non-null int64
workingday    6493 non-null int64
weather       6493 non-null int64
temp          6493 non-null float64
atemp         6493 non-null float64
humidity      6493 non-null int64
windspeed     6493 non-null float64
dtypes: float64(3), int64(5), object(1)
memory usage: 456.6+ KB
None
#查看数据整体情况
train.describe()

可以看到,count,registered数值分布差异比较大,通过画图来直观的看看数据的分布情况:

#观察数密度分布
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
fig.set_size_inches(5,4)
sns.distplot(train[‘count‘],color="g")
ax.set(xlabel=‘count‘,title=‘Distribution of count‘)
sns.set_style("dark")
ax.grid()
plt.savefig(‘count.jpg‘)
plt.show()

 1 #观察数密度分布
 2 fig = plt.figure()
 3 ax = fig.add_subplot(1, 1, 1)
 4 fig.set_size_inches(5,4)
 5 sns.distplot(train[‘registered‘],color="red")
 6 ax.set(xlabel=‘registered‘,title=‘Distribution of registered‘)
 7 sns.set_style("dark")
 8 ax.grid()
 9 plt.savefig(‘reg.jpg‘)
10 plt.show()

数据偏斜比较严重,去掉3倍标准差以外的数据:

1 #去掉3倍标准差以外的数据
2 train_1 = train[np.abs(train[‘count‘]-train[‘count‘].mean())<=(3*train[‘count‘].std())]
3 train_1 .shape
4 #去掉3倍标准差以外的数据
5 train_2 = train_1[np.abs(train[‘registered‘]-train[‘registered‘].mean())<=(3*train[‘registered‘].std())]
6 train_2 .shape
(10739, 12)

(10648, 12)

处理之后,我们看看数据的分布情况

 1 #处理前后对比
 2 fig = plt.figure()
 3 ax1 = fig.add_subplot(1, 2, 1)
 4 ax2 = fig.add_subplot(1, 2, 2)
 5 fig.set_size_inches(10,6)
 6
 7 sns.distplot(train[‘count‘],ax=ax1)
 8 sns.distplot(train_2[‘count‘],ax=ax2)
 9
10 ax1.set(title=‘Distribution of count without outliers‘,)
11 ax2.set(title=‘Distribution of count‘)
12 plt.savefig(‘reg.jpg‘)
13 plt.show()

数据仍有很大程度的偏移,通常采用对数化来处理:

1 #进行对对数化
2 train_2count=train_2[‘count‘]
3 train_2count_log=np.log(train_2count)
4 sns.distplot(train_2count_log)
5 plt.show()

经过对数变换后数据分布更均匀,大小差异也缩小了,使用这样的标签对训练模型是有益的



接下来对其余的数值型数据进行处理,为方便后续分析,我们对时间进行拆分:

#date
def get_date(x):
    dateStr=x.split()[0]
    dateDT=datetime.strptime(dateStr,"%Y/%m/%d")
    return dateDT
train_2[‘Date‘]=train_2.datetime.apply(get_date)
#年
def get_Year(x):
    year=x.split(‘/‘)[0]
    return year
train_2[‘Year‘]=train_2.datetime.apply(get_Year)
#月份
def get_month(x):
    Month=x.split(‘/‘)[1]
    return Month
train_2[‘Month‘]=train_2.datetime.apply(get_month)
#日
def get_day(x):
    dateStr=x.split()[0]
    dateDT=datetime.strptime(dateStr,"%Y/%m/%d")
    day=dateDT
    return day
train_2[‘Day‘]=train_2.datetime.apply(get_day)
#小时
def get_hour(x):
    hour=x.split()[1].split(‘:‘)[0]
    return hour
train_2[‘Hour‘]=train_2.datetime.apply(get_hour)
#星期
def get_weekday(x):
    date=x.split()[0]
    date_=datetime.strptime(date,"%Y/%m/%d")
    weekday=date_.weekday()
    return weekday
train_2[‘Weekday‘]=train_2.datetime.apply(get_weekday)
print(train_2.head())
print(train_2.info())

<class ‘pandas.core.frame.DataFrame‘>
Int64Index: 10575 entries, 0 to 10885
Data columns (total 18 columns):
datetime      10575 non-null object
season        10575 non-null int64
holiday       10575 non-null int64
workingday    10575 non-null int64
weather       10575 non-null int64
temp          10575 non-null float64
atemp         10575 non-null float64
humidity      10575 non-null int64
windspeed     10575 non-null float64
casual        10575 non-null int64
registered    10575 non-null int64
count         10575 non-null int64
Date          10575 non-null datetime64[ns]
Year          10575 non-null object
Month         10575 non-null object
Day           10575 non-null datetime64[ns]
Hour          10575 non-null object
Weekday       10575 non-null int64
dtypes: datetime64[ns](2), float64(3), int64(9), object(4)
memory usage: 1.5+ MB
None

我们看到分离的Year,Month,Hour都是object类型,这里将其转变为数值型:

train_2[[‘Year‘,‘Month‘,‘Hour‘]]=train_2[[‘Year‘,‘Month‘,‘Hour‘]].astype(int)
print(train_2.info())

然后删掉时间列,同时进行相关性分析

 1 #删除datetime列
 2 train_2.drop(‘datetime‘,axis=1,inplace=True)
 3 cor=train_2.corr()
 4
 5 fig=plt.figure(figsize=(12,12))
 6 sns.set(style=‘white‘)
 7 sns.heatmap(cor,vmax=0.8,square=True,annot=True)
 8 plt.xticks(fontsize=15,color=‘black‘,rotation=45)
 9 plt.yticks(fontsize=15,color=‘black‘)
10 plt.savefig(‘test2.jpg‘)
11 plt.show()

对租赁数量影响进行排序:

cor[‘count‘].sort_values(ascending=False)
count         1.000000
registered    0.964736
casual        0.731193
Hour          0.424267
temp          0.393600
atemp         0.389744
Year          0.218463
Month         0.163407
season        0.159659
windspeed     0.115110
Weekday       0.038969
holiday       0.007783
workingday   -0.040445
weather      -0.134168
humidity     -0.333237
Name: count, dtype: float64

可以看到对租赁数量的影响因素中:时段>温度>湿度>年份>月份等。

下一分部将用可视化对租赁的影响进行进一步分析。

原文地址:https://www.cnblogs.com/iforger/p/10818748.html

时间: 2024-08-01 23:41:46

共享单车需求分析(一)的相关文章

共享单车需求分析(二)

三.可视化分析 各个时间段单车的租赁变化 考虑到在所给的变量中,时间变量比较多,因此首先考虑各个时间段,单车的租赁情况. 首先看看,2011年和2012年,两年中每个月平均使用情况 1 #首先看一下整体的租赁 2 fig = plt.subplots(figsize=(15,15)) 3 4 ax1 = plt.subplot2grid((4,2), (0,0), colspan=2) 5 df1 = train_2.groupby(['Month', 'Year']).mean().unsta

聊一聊共享单车

1.共享单车的模式用户交押金,然后骑车,按照骑车时间进行计费.其实,严格意义上来讲,这还并不属于共享经济,更像分时租赁. 2.共享单车的用户人群 & 特征用户人群:80后.90后的低频打车人群,其中学生.白领偏多用户特征:年轻群体.接受新兴事物能力强,追求时尚:城市节奏生活快,白领.学生等时间紧张,交通拥堵现象严重:中低端消费人群,追求性价比:城市污染问题日益严重,追求环保出行方式 3.满足需求:主要满足了用户 短途出行的需求,具体如下:固定需求:固定线路:上学/放学.上班/下班,从学校.公司等

爬虫获取mobike共享单车信息

背景:端午节假期的时候参加了学校的数学建模比赛,题目是关于共享单车的供需匹配问题,需要获得共享单车的数量和时空分布情况. 在苦苦找寻数据无果的情况下决定自己用爬虫对天津地区的mobike进行统计. 在网上找到了这篇爬虫的代码,本着少造轮子的基本原则,我选择了这个代码进行统计,这里记录一下历程,方便日后查阅. 先上原作者github地址:git clone https://github.com/derekhe/mobike-crawler.python3环境,爬取的是微信小程序,之前是可以爬手机客

共享单车APP定制为什么深受大学生依赖?

随着最近共享单车APP获得融资的消息,现在街头随处可见那些共享单车的踪迹.是什么原因催生了这些单车的发展,为什么这些单车APP会这么深受大学生依赖呢?广州APP开发品向科技跟大家详细解释下原因. 单车共享APP为何应以校园作为切入口 1.使用率高:相较于其他的用户群体来说,由于大学校园相对比较大,学生们上课.赶时间时都需要骑单车.而且学生们在校园与校园之间游走时骑单车要方便很多.就以广州大学城为例,骑单车比等公交车的要方便多. 2.相对比较诚信:相对比来说,学生群体的诚信度是比较高的. 3.市场

共享单车也玩山寨!还能做哪些突破底线的事儿?

在大众的印象中,山寨虽然早已成为常态,但其模仿的对象往往是成熟的产品或者服务.将后者照搬过来改头换面,借助后者的影响力,去蹭一波热点,以最快的速度捞钱,是山寨的最大特点.但没想到的是,就在方兴未艾的共享单车领域,竟然也出现了山寨事件! 这一山寨事件,是某创业企业对ofo小黄车进行copy,让人傻傻难辨真假.那么问题来了,为了能在火爆的共享单车领域占有一席之地,部分共享单车企业未来还会做出哪些突破底线,一切向钱看的事儿呢? 从头到脚的山寨!让人目瞪口呆 近日,四川广安街头蹭蹭蹭地冒出一批共享单车.

共享单车“残废”之后,怎么处理才是上上策?

自共享单车诞生之后,关于它的争议.诋毁.赞扬.痛批等或褒或贬的声音从未停止.但不管怎样,似乎都无法让共享单车高歌猛进的态势停下来.如今,共享单车的火爆是其他共享经济细分项目所无法比拟的.而在凑齐了"赤橙黄绿青蓝紫",甚至土豪金.纯黑等多种颜色之后,这些花花绿绿的单车"残废"之后如何处理也被摆上了日程. 修理成本高.修理时间长.回收价格极低.修理速度不如投放新车速度--这些都是共享单车"残废"之后必须面对的问题.为此,将"残废"

扶共享单车

我,一名来深圳的程序员,住在城中村.今天和来深出差的发小散步,聊了很多心得.23:50,在回宿舍的路上,一群人走在前面,其中一个不知是有意还是无意就顺手推到了一排共享单车,然后笑着离去. 对此,我暂时就不发表当时的心理活动了.当我走到横躺在路边的单车旁,便一个一个扶起了这些平时给我带来方便的单车们.在这我就想表达,我以后会尽自己的一些能力,扶起路边倒下的共享单车.最后也 希望看到这篇日记的朋友们能和我做一样的事--扶起平时给我们带来方便的单车.

全民围剿!共享单车窘境下该怎么挽回民心

虽然当下共享经济项目层出不穷,但其中最引人注目.潜力最大,且对大众生活影响最广的当属共享单车.在过去的一两年时间中,共享单车从零开始以最短的时间在国内彻底火爆.而在满足大众短途出行刚需的同时,资本的热度也让共享单车"昏了头". 其中最典型的,就是像扔钱一样疯狂在城市中投放单车.似乎投放单车数量的多少,直接与自身的实力.所占市场的份额等挂钩.而由此造成的严重后果,是共享单车成为城市的负面"标签"--影响交通.污染环境.安全风险--由此,全国多个城市开始对共享单车进行&

关于共享单车的供电问题如何解决?

摩拜一代,后轮上的发电机. 给后轮上安装一个发电花鼓,然后在正常骑行的时候少工作或者不工作,在刹车的时候满负荷工作,所以这种车骑的时候稍微重一点,而且刹车的时候手感和一般自行车不太一样: 一般自行车,无论你多用力捏闸,这种摩擦减速的特性不会被改变的一点是:车速越快,制动效果越差,停车时,制动效果最强.制动力与车速成反比关系.这是一般自行车,实际上也是所有通过摩擦产生制动效果的机械的共有特性. 然而摩拜单车的后轮制动效果,从感受上来说,几乎是反过来的:车速越快,制动效果越强劲,停车时,完全感受不到