共享单车租用频次分析



作者简介Introduction

邬书豪,车联网数据挖掘工程师 ,R语言中文社区专栏作者。微信ID:tsaiedu

知乎专栏:https://www.zhihu.com/people/wu-shu-hao-67/activities


往期回顾

kaggle:数据科学社区调查报告(附学习视频)

kaggle:员工离职预测(附学习视频)

Kaggle:纽约的士旅程数据简要分析

Kaggle:R可视化分析美国枪击案(附数据集和代码)

2016年底以来,国内共享单车突然就火爆了起来。在街头,仿佛一夜之间,共享单车已经到了“泛滥”的地步,各大城市路边排满各种颜色的共享单车(忽如一夜春风来,千街万道单车来)。除了较早入局的摩拜单车、ofo外,整个2016年至少有25个新的共享单车品牌汹涌入局,其中甚至还包括电动自行车共享品牌。在Kaggle里面有一个关于共享单车的数据集,今天我们就探索一下美国华盛顿共享单车的租赁量......


一、导入+简单探索数据


## 导入分析所需的程序包
library(Rmisc)          # multiplot()
library(ggplot2)        # ggplot()
library(lubridate)      # ymd_hms()
library(dplyr)          # group_by() / %>% / summarise()
library(corrplot)       # corrplot.mixed()

options(scipen = 20)    # 避免绘图时使用科学计数法表示某一个数值

# 导入数据
bike <- read.csv("E:\\NEW_R\\shuhaoge\\共享单车\\train.csv")

str(bike)       # 查看数据集的基本结构
summary(bike)   # 计算各个变量的主要描述性统计量




首先,根据str()对数据集结构的简单探索,我们发现我们的数据有10886行,12列,除了租用时间点是因子型数据,其他都是数值型。对于我们以后的探索分析,我们需要对datetime变量进行拆分重塑,weather/season两个变量进行数据的重编码。其次,从summary()中我们发现最少的租赁次数(count)是1个。其他详细探索就看下文吧......


二、数据重塑

## 重编码变量,从而在描述性分析是看起来直观
table(bike$season)      # 查看season的取值
table(bike$weather)     # 查看weather的取值

# 修正这两个变量的取值
bike$season  <- factor(bike$season, labels = c("Spring", "Summer", "Fall", "Winter"))
bike$weather <- factor(bike$weather, labels = c("Good", "Normal", "Bad", "Very Bad"))
table(bike$season)
table(bike$weather)

# ymd_hms将因子型变量(datetime)转换为POSIXct对象,并且提取其中的小时转化为因子型
bike$hour <- factor(hour(ymd_hms(bike$datetime)))

bike <- bike[-c(10, 11)] # 剔除casual和registered两列
head(bike)

从展示出来的数据重塑后的前六行,大家肯定也就了解上面重塑的作用了,对我们后续的可视化提供了不少直观性。


三、描述性分析

在描述性分析这一部分呢,我会给大家探索出hour、season、holiday、working和weather这几个变量与其对应的平均租车频数的关系。另外针对几个连续性变量,我绘制了一张相关系数图来展示相关性。

## 探索不同时间段的平均租车频次

p1 <-
 bike %>%
 group_by(hour) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = hour, y = mcount, fill = hour)) +
   geom_bar(stat = 'identity') +
   guides(fill = 'none') +
   theme_minimal()
p1



根据上面的条形图,我们可以清晰地看出一天内存在两个租车高峰期,分别是早上8-9点和下午5-7点,很明显是我们上班族的上下班高峰期。从中可以得知上班族为共享单车行业贡献了多少力量!!!

## 探索不同季节的平均租车频次

p2 <-
 bike %>%
 group_by(season) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = reorder(season, mcount), y = mcount, fill = season)) +
   geom_bar(stat = 'identity') +
   labs(x = 'senson', y = 'mcount') +
   guides(fill = 'none') +
   theme_minimal()

p2

p3 <-

 bike %>%
 group_by(season) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = reorder(season, mcount), y = mcount, fill = season)) +
   geom_bar(stat = 'identity', width = 1) +
   coord_polar(theta = "y") +
   labs(x = 'senson', y = 'mcount') +
   guides(fill = 'none') +
   theme_minimal()

p3

multiplot(p2, p3, cols = 2)


这两个图传达的意义是一样的,我使用两种绘图方式,只是为了方便大家去对比这两种图,并且学会这两种图的绘制方式。根据这两个图得知,春天每小时平均租车次数最少,大概115次;秋天每小时平均租车次数最多,几乎是春天的一倍,达到了230次左右。

## 探索不同季节不同时间段平均租车频次

p4 <-
 bike %>%
   group_by(season, hour) %>%
   summarise(mcount = mean(count)) %>%
   ggplot(aes(x = hour, y = mcount, colour = season)) +
     geom_line(aes(group = season)) +
     theme_bw() +
     geom_point()
p4


这个折线图可以完美地展示出不同季节内不同时间段的平均租车频次,生动形象,简单粗暴!!!以后大家遇到类似的探索分析,也可以尝试使用这种绘图方式去生动形象地传达信息。

## 探索不同天气平均租车频次

p5 <-
 bike %>%
 group_by(weather) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = reorder(weather, mcount), y = mcount, fill = weather)) +
   geom_bar(stat = 'identity') +
   labs(x = 'weather') +
   guides(fill = 'none') +
   theme_minimal()

p5


p6 <-

 bike %>%
 group_by(weather) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = reorder(weather, mcount), y = mcount, fill = weather)) +
   geom_bar(stat = 'identity', width = 1) +
   coord_polar(theta = "y") +
   labs(x = 'senson', y = 'mcount') +
   guides(fill = 'none') +
   theme_minimal()

p6


multiplot(p5, p6, cols = 2)



根据条形图和极坐标图可以看出,好天气的每小时平均租车频次最多,超过了200次;最低的就是Bad天气时,大概平均租车频次是120次。细心的读者肯定会发现,Very Bad天气居然高于Bad天气的平均租车频次,会感到出乎意料。那么我告诉大家,这个是由于数据量导致的,因为只有一个Very Bad天气的个样本。下面我给大家绘制一副折线图去验证这个原因。

## 探索不同天气不同时间段平均租车频次

p7 <-
 bike %>%
 group_by(weather, hour) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = hour, y = mcount, colour = weather)) +
   geom_line(aes(group = weather)) +
   theme_bw() +
   geom_point()
p7


首先先看那个Very Bad天气的那个样本点,发现只有一个点。也就是说两年的记录内一共发生了一次在特别恶劣的天气中租车的事件,通过对样本的查看,发现其发生在2012年1月9号的下午6-7点之间。也就是说在这个非常恶劣的天气下的下班时间,有一个上班族“被逼无奈”骑着共享单车回的家。啥也不说了,为他默哀三秒钟......默哀结束后继续分析我们的折线图,这幅图同样是简单粗暴的展示了不同天气下不同时间段的平均租车频次。总之就是:天气好的时候大家才可能骑共享单车去想自己要去的地方。

## 探索是否假期和是否工作日时的平均租车频次

# 探索是否假期的平均租车频次
p8 <-
 bike %>%
 group_by(holiday) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = factor(holiday), y = mcount, fill = factor(holiday))) +
   geom_bar(stat = 'identity') +
   guides(fill = 'none') +
   labs(x = 'holiday') +
   theme_minimal()

p8


# 探索是否工作日的平均租车频次

p9 <-
 bike %>%
 group_by(workingday) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = factor(workingday), y = mcount, fill = factor(workingday))) +
   geom_bar(stat = 'identity') +
   guides(fill = 'none') +
   labs(x = 'workingday') +
   theme_minimal()
p9

multiplot(p8, p9, cols = 2)


上面两幅图中分别是是否假期和是否工作日与平均租车频次的对比,发现差距并不大。也就是说虽然假期和其他非工作日的样本相对少一些,但是无论是哪种情况,平均的租车频次几乎是稳定不变的。

# 探索是否假期时不同时间段平均租车频次

p10 <-
 bike %>%
 group_by(holiday, hour) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = hour, y = mcount, colour = factor(holiday))) +
   geom_line(aes(group = factor(holiday))) +
   geom_point() +
   theme_bw()
p10



从折线图中可以发现,假期(1)时的租车高峰时下午一点左右和六点左右,早上的8点左右的租车频次降低了不少。非假期(0)时的租车高峰期就是早上8点左右和下午的6点左右,即上班族的上下班高峰期。

## 探索是否工作日不同时间段平均租车频次

p11 <-
 bike %>%
 group_by(workingday, hour) %>%
 summarise(mcount = mean(count)) %>%
 ggplot(aes(x = hour, y = mcount, colour = factor(workingday))) +
   geom_line(aes(group = factor(workingday))) +
   theme_bw() +
   geom_point()
p11


可知,是否工作日对租车频次的影响远比是否假期的影响大。在非工作日时,人们的租车频次只有一个高峰期(中午到下午的四点左右),但是这个高峰期相对平缓。

## 探索几个连续性变量与租车频次的相关系数

cor(bike[c(6:9, 10)]) %>%
 corrplot.mixed()

这个相关系数图中,我们发现temp和atemp的相关系数达到了惊人的0.98,大概猜测temp是由atemp经过某种变换得到了。其次就是看图的最后一行,count与temp和atemp程较弱的正相关,与humidity呈现较弱的负相关,与windspeed几乎不相关。这也不难解释,这些连续性自变量就是有关温度、湿度和风速的数值,相对来说不会对租车频次产生较大的影响,除非是极端的温度、湿度和风速。

总结:这篇文章主要内容就是描述性分析,绘制一些图去生动形象的描述各个变量的关系。相对而言,图比数值对于视觉的冲击较大,大家可以多尝试用图去传达数据。


 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

相关课程推荐


Kaggle十大案例精讲课程(连载中)

☟☟☟ 戳阅读原文,即刻加入课程。

Cyclistic 是一家虚构的公司,提供自行车共享设施。该公司有两大类骑手:休闲骑手和年度会员。休闲骑手是使用单程通行证和全天通行证的人。年度会员有一年的通行证可以使用自行车。 描述性分析 我已经分别使用每个月的数据透视表进行了初步分析。 数据透视表 1:这描述了每个工作日的骑行次数和平均骑行时长。 数据透视表 2:这分析了每种可骑行类型(即停放自行车、经典自行车和电动自行车)的骑行次数和平均骑行长度。 数据透视表 3:它比较了每个成员类型(即休闲和年度)的乘车次数和平均乘车时间。 数据透视表 4:这显示了整个月的平均和最大骑行长度。 数据透视表 5:该表记录了每个起点站的骑行次数和平均骑行长度。 我已经整理了每个月的这些摘要,并放在一个电子表格中,以确定每月和季节性的分析。我发现的一些有趣的事实和趋势如下: 最长的骑行发生在 2021 年 6 月至 7 月,创下大约 38 天的记录! 一年中的几个月,即 5 月到 9 月,自行车骑行的次数很高,7 月本身记录了 822k 的峰值。 11 月至 2 月见证了低乘车人数。2 月创下了最低的降幅,仅有 5 万次骑行。 Streeter Dr & Grand Ave 是最受欢迎的起点站,一个月内乘坐次数高达 15,000 次。 每月比较 其他一些重要的观察结果是: 经典自行车是最受欢迎的选择,每 3 次骑行中就有 2 次使用经典自行车。 停放自行车是骑行超过 1 小时的人的最爱。 休闲骑手的平均骑行长度高于年度会员。几乎是后者的两倍。 周六和周日的骑行次数最多。这两天的平均骑行时间也创下了历史新高。 使用 SQL 进行年视图分析 我将使用 SQL 合并所有的月度数据来做一个整体的年度分析。我将使用 Microsoft SQL Server 来执行所有数据库操作。 所有分步查询都可以在这里找到bikesharecasestudy.sql。请务必查看bikeShareCaseStudyReport.docx以查看所有重要数据和输出。 该分析揭示了年度会员和休闲骑手之间的一些有趣趋势。以下是分析。 年末会员的乘车份额增加(超过 50%),加上临时会员的乘车份额下降。最大值记录在 1 月 (80%)。 休闲骑手的平均骑行时长是年度骑手的两倍多。 年度会员在一年内记录的乘车次数多于休闲骑手。 周六的骑行次数和平均骑行时长最高,其次是周六和周五。周末生意兴隆。 经典自行车是这两种骑手中最喜欢的类型。停靠自行车是最不受欢迎的。此外,休闲会员选择经典自行车进行长途骑行。 临时会员通常更喜欢周末而不是工作日。年度车手则相反,他们在所有日子里的人数都很高,周日大幅下降。 使用 R 进行年视图分析 对于使用 R 的分析,我使用了 4 个季度的数据 - 2019 年的 Q2、Q3、Q4 和 2020 年的 Q1 。可以在此处找到用于清理、合并、分析和可视化的脚本R_script.R。 分享 此阶段是将要向利益相关者展示的重要和相关信息可视化。 年度会员和休闲骑手之间最显着的区别之一是他们在工作日的运营模式。 有报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值