共享单车数据分析

人工智能27

目录

1.加载包和读取数据

2.数据预处理

3.生成假设

4.假设检验

5.决策树

6.开始建模

kaggle网站(Bike Sharing Demand | Kaggle)提供了某城市的共享单车2011年到2012年的数据集。该数据集包括了租车日期,租车季节,租车天气,租车气温,租车空气湿度等数据。本次将使用r对这一数据集进行探索性分析,我觉得这个目标就是——​​​​​​​ 季节、天气、温度等这些因素是如何影响共享单车使用率的?

1.加载包和读取数据

首先加载包:

library(readr) # 文件读写
library(ggplot2) # 数据可视化
library(ggthemes) # 数据可视化
library(scales) # 把图形弄的更漂亮的,并提供用于自动地确定用于轴和图例符和标签的方法

library(plyr) #可以进行类似于数据透视表的操作,将数据分割成更小的数据,
#对分割后的数据进行些操作,最后把操作的结果汇总。比如提取首字母,提取姓氏.等等

library(stringr) # 字符串的操作
library(InformationValue) # 算IV跟WOE用的,即高价值数据和信息权重
library(MLmetrics) # 衡量回归,分类和排名表现的评估指标的集合,交叉验证的时候用
library(rpart) # 回归树的方法,用来预测缺失的数据
library(randomForest) # 随机森林
library(dplyr) # 数据操作

library(e1071) # 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,
#通常用来进行模式识别、分类以及回归分析,文中predict就是这个包的

library(Amelia) # 多重插补(MI)是一种基于重复模拟的处理缺失值的方法。在面对复杂的
#缺失值问题时,MI是最常选用的方法,它将从一个包含缺失值的数据集中生成一组完整的数据集

library(party) # 递归分区的计算工具箱。包的核心是ctree(),这是一个条件推理树的实现,
#它将树结构的回归模型嵌入到一个明确的条件推理过程理论中。
#这种非参数类的回归树适用于各种回归问题,包括名义,序数,数字,检查以及多变量响应变量和协变量的任意测量量表。
#基于条件推理树,cforest()提供了布里曼随机森林的实现。

library(gbm) # 广义增强回归模型.Adaboost是提升树(boosting tree),
#所谓“提升树”就是把“弱学习算法”提升(boost)为“强学习算法”.

library(class) # 各种分类功能 包括KNN,学习向量量化和自组织图。

#决策树要用到的包
library(rattle) #这些库将用于为决策树模型提供良好的可视化绘图
library(rpart.plot)#绘制“rpart”模型:“plot.rpart”的增强版本
library(RColorBrewer)#配色方案

然后读取数据:

#setwd是设定workspace路径的意思
setwd("E:/ShareBike")
train<-read.csv("train.csv") test<-read.csv("test.csv")< code></-read.csv("train.csv")>

2.数据预处理

2.1观察数据并填充

观测数据,发现测试数据比训练数据少了后面3个观测分别是casual,registered,count。

怎么办呢?那就在测试数据里加上这3列数值:

#&#x5728;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x91CC;&#x52A0;&#x4E0A;&#x7F3A;&#x5931;&#x7684;&#x4E09;&#x4E2A;&#x503C;
test$registered<-0 test$casual<-0 test$count<-0 data<-rbind(train,test)< code></-0>

用str()看看这里面都包含什么数据

str(data)

共享单车数据分析

可以看出共有观测17379条,12个变量,数据字典如下:

日期时间(datetime):日期和时间以"mm-dd- yyyy hh:mm:ss"格式

季节(season):1为春,2为夏,3为秋,4为冬

假期(holiday):1/0

工作日(workingday):1/0

天气(weather):四类天气

  1. 清除,几朵云,部分多云,部分多云
  2. 迷雾+多云,雾+破碎的云雾,雾+少云,雾
  3. 轻雪和雨+雷暴+分散的云彩,小雨+分散的云彩
  4. 大雨+冰托盘+雷雨+雾,雪+雾

温度(temp):每小时摄氏温度

温度(atemp):像是一种加过权重之后的温度,反正跟temp是强正相关

湿度(humidity):湿度

风速(windspeed):风速

casual :休闲用户

registered:注册用户

count:共计数

2.2找出缺失值

table(is.na(data))

共享单车数据分析

意思就是说没有缺失值!

2.3绘制频率表

了解数值变量的分布,然后生成数值变量的频率表。画出每个数值变量的直方图并进行分析。

[En]

Understand the distribution of numerical variables, and then generate a frequency table of numerical variables. Draw a histogram of each numeric variable and analyze it.

#&#x7ED8;&#x5236;&#x6BCF;&#x4E2A;&#x89C2;&#x6D4B;&#x7684;&#x76F4;&#x65B9;&#x56FE;&#x5E76;&#x5206;&#x6790;
#&#x56DB;&#x884C;&#x4E24;&#x5217;
par(mfrow=c(4,2))
#&#x5BBD;&#x5EA6;&#x548C;&#x957F;&#x5EA6;
par(mar = rep(2, 4))
hist(data$season)
hist(data$weather)
hist(data$humidity)
hist(data$holiday)
hist(data$workingday)
hist(data$temp)
hist(data$atemp)
hist(data$windspeed)

共享单车数据分析

通过观察上图可以看出一些影响:

  1. 四季的影响不大
  2. 天气的影响比较大,从好到不好,自行车的使用量越来越低
  3. 当假期为0,工作日为1时自行车的使用量就比较大
  4. 温度太高或者太低了都会影响使用量
  5. 风速从5到20这个时候自行车使用量比较大,可以推测在这个风速里骑车是比价愉悦的

2.4将离散型转换为因子型的(季节,天气,假期,工作日),否则无法画图

data$season=as.factor(data$season)
data$weather=as.factor(data$weather)
data$holiday=as.factor(data$holiday)
data$workingday=as.factor(data$workingday)

3.生成假设

现在你已经对数据有了大致的了解,让我们根据一些基本经验对自行车的使用做出一些假设:

[En]

Now that you have a general understanding of the data, let's make some assumptions about bicycle usage based on some basic experience:

  1. 24小时趋势:上下班高峰期使用量就很高。晚上10点到凌晨4点需求低
  2. 一周趋势:平日用车比节假日高
  3. 有雨有雪:与晴天相比,下雨(雪)天的自行车需求将会下降。同样,较高的湿度会降低需求,反之亦然。
  4. 温度影响:温度适宜的情况下使用量必加大
  5. 注册用户与时间:由于注册用户数量随着时间的推移得增多,总需求应该趋向于升高

4.假设检验

下面来逐一分析上面的假设检验

4.1每日趋势:

data$hour=substr(data$datetime,12,13)
data$hour=as.factor(data$hour)

画图,判断假设是否正确

#&#x628A;&#x8BAD;&#x7EC3;&#x7684;&#x524D;20&#x5929;&#x548C;&#x6D4B;&#x8BD5;&#x7684;&#x540E;10&#x5929;&#x5DE6;&#x53F3;&#x63D0;&#x51FA;&#x6765;
train=data[as.integer(substr(data$datetime,9,10))<20,] test="data[as.integer(substr(data$datetime,9,10))">19,]
#&#x4E00;&#x884C;&#x4E00;&#x5217;&#xFF0C;&#x5426;&#x5219;&#x8FD8;&#x662F;4&#x884C;2&#x5217;
par(mfrow=c(1,1))
#&#x753B;&#x56FE;
boxplot(train$count~train$hour,xlab="hour", ylab="count of users")</20,]>

共享单车数据分析

可以看出和我们的假设差不多:

上下班时间是用车高峰,而低谷期是在晚上10点到次日凌晨6点。其他时间为平均用车量。

4.2注册用户和临时用户

(1)临时用户

boxplot(train$casual~train$hour,xlab="hour", ylab="count of users")

共享单车数据分析

可以看出: 临时用户倾向于在白天的时候随便用用,用户粘性不高,基本上都是平均值。

(2)注册用户:

boxplot(train$registered~train$hour,xlab="hour", ylab="count of users")

共享单车数据分析

注册用户更倾向于上下班高峰期用。

仔细观察这2个图,你可能会发现,这2图有一些异常值,应该不是由错误导致的。我猜测他们可能是同一群人骑自行车但是未注册的结果,为了处理这些离群值,将使用对数变换:

boxplot(log(train$count)~train$hour,xlab="hour",ylab="log(count)")

共享单车数据分析

4.3一周趋势

#&#x628A;date$datetime&#x7684;&#x5E74;&#x6708;&#x65E5;&#x62C6;&#x51FA;&#x6765;
date<-substr(data$datetime,1,10) #拆出来之后转换成星期 days<-weekdays(as.date(date)) data$day<-days< code></-substr(data$datetime,1,10)>

注册用户画图:

#&#x753B;&#x6CE8;&#x518C;&#x7528;&#x6237;&#x7684;&#x56FE;
boxplot(data$registered~data$day,xlab="day", ylab="users")

共享单车数据分析

临时用户画图

#&#x753B;&#x4E34;&#x65F6;&#x7528;&#x6237;&#x7684;&#x56FE;
boxplot(data$casual~data$day,xlab="day", ylab="users")

共享单车数据分析

可以看出星期六星期天的临时用户是增加的。

4.4雨(雪)的影响

在变量中虽然没有专门的雨量数据,但是在天气(weather)这里面有响应的因素,3里有小雨(雪),4里有大雨(雪)。

(1)画图,天气和注册用户的关系

boxplot(train$registered~train$weather,xlab="weather", ylab="registered users")

共享单车数据分析

(2)画图,天气和休闲用户的关系

boxplot(train$casual~train$weather,xlab="weather", ylab="casual users")

共享单车数据分析

从图中可以看出非常符合我们的预期(常识嘛,呵呵!)

4.5温度,风速和湿度影响

由于温度、风速和温度的数据不是离散的,而是连续的,所以我们使用相关性来检验假设。

[En]

Since the data of temperature, wind speed and temperature are not discrete but continuous, we use correlation to test the hypothesis.

温度,风速和湿度的相关关系:

sub<-data.frame(train$registered,train$casual,train$count,train$temp,train$humidity,train$atemp,train$windspeed) subt<-cor(sub)< code></-data.frame(train$registered,train$casual,train$count,train$temp,train$humidity,train$atemp,train$windspeed)>

如下表:

共享单车数据分析

从表中可以看出,温度和注册,休闲,总计这三个变量差不多都是正相关关系,而湿度和风速跟这三兄弟的关系就不是很大了。温度和atemp是高度相关。

4.6 时间影响

看看时间对于用户数的影响。

随着时间的推移,用户数的变化:

data$year=substr(data$datetime,1,4)
data$year=as.factor(data$year)
train=data[as.integer(substr(data$datetime,9,10))<20,] test="data[as.integer(substr(data$datetime,9,10))">19,]
boxplot(train$count~train$year,xlab="&#x5E74;", ylab="&#x7528;&#x6237;&#x603B;&#x91CF;")</20,]>

共享单车数据分析

结论是用户数增加。

5.决策树

让我们用决策树来增加模型的预测能力。

画图:关于小时的决策树的图

#&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x8F6C;&#x6362;&#x7C7B;&#x578B;
train$hour=as.integer(train$hour)
#&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x8F6C;&#x6362;&#x7C7B;&#x578B;
test$hour=as.integer(test$hour)
#&#x7528;&#x5C0F;&#x65F6;&#x751F;&#x6210;&#x51B3;&#x7B56;&#x6811;
d=rpart(registered~hour,data=train)
#&#x753B;&#x56FE;
fancyRpartPlot(d)

共享单车数据分析

查看节点,手动添加仓位(注册用户)

data=rbind(train,test)
data$dp_reg=0
data$dp_reg[data$hour<8]=1 data$dp_reg[data$hour>=22]=2
data$dp_reg[data$hour>9 & data$hour<18]=3 data$dp_reg[data$hour="=8]=4" | data$hour="=21]=6"></18]=3></8]=1>

添加仓位(休闲用户)

b=rpart(casual~hour,data=train)
fancyRpartPlot(b)

共享单车数据分析

#&#x624B;&#x52A8;&#x6DFB;&#x52A0;
data$dp_cas=0
data$dp_cas[data$hour==9]=1
data$dp_cas[data$hour<=8]=2 data$dp_cas[data$hour>=10&data$hour<=19]=3 data$dp_cas[data$hour>=20]=4</=19]=3></=8]=2>

温度(注册用户)

t=rpart(registered~temp,data=train)
fancyRpartPlot(t)

共享单车数据分析

#&#x6DFB;&#x52A0;&#x6CE8;&#x518C;
data$temp_reg=0
data$temp_reg[data$temp<13]=1 data$temp_reg[data$temp>=13&data$temp<23]=2 data$temp_reg[data$temp>=23&data$temp<30]=3 data$temp_reg[data$temp>=30]=4</30]=3></23]=2></13]=1>

温度(休闲用户)

t1=rpart(casual~temp,data=train)
fancyRpartPlot(t1)

共享单车数据分析

#&#x6DFB;&#x52A0;&#x4F11;&#x95F2;
data$temp_cas=0
data$temp_cas[data$temp<15]=1 data$temp_cas[data$temp>=15&data$temp<23]=2 data$temp_cas[data$temp>=23&data$temp<30]=3 data$temp_cas[data$temp>=30]=4</30]=3></23]=2></15]=1>

添加年份:首先在这里提取月份,然后根据每季度一个职位建立8个职位

[En]

Add year: first extract the month here, and then build 8 positions according to one position per quarter

#&#x63D0;&#x53D6;&#x6708;&#x4EFD;
data$month=substr(data$datetime,6,7)
data$month=as.factor(data$month)
train=data[as.integer(substr(data$datetime,9,10))<20,] test="data[as.integer(substr(data$datetime,9,10))">19,]
#&#x8F6C;&#x6362;&#x7C7B;&#x578B;
data$month=as.integer(data$month)</20,]>
#&#x624B;&#x52A8;&#x6DFB;&#x52A0;
data$year_part[data$year=='2011']=1
data$year_part[data$year=='2011' & data$month>3]=2
data$year_part[data$year=='2011' & data$month>6]=3
data$year_part[data$year=='2011' & data$month>9]=4
data$year_part[data$year=='2012']=5
data$year_part[data$year=='2012' & data$month>3]=6
data$year_part[data$year=='2012' & data$month>6]=7
data$year_part[data$year=='2012' & data$month>9]=8
table(data$year_part)

共享单车数据分析

日期:创建一个变量,有"平日"、"周末"和"假日"

data$day_type=""
data$day_type[data$holiday==0 & data$workingday==0]="weekend"
data$day_type[data$holiday==1]="holiday"
data$day_type[data$holiday==0 & data$workingday==1]="working day"

周末:为周末创建一个独立的变量

data$weekend=0
data$weekend[data$day=="Sunday" | data$day=="Saturday" ]=1

6.开始建模

首先把character的数据类型都转换成factor,否则随机森林不支持。

data$day=as.factor(data$day)
data$day_type=as.factor(data$day_type)

我们此前由于注册、休闲、统计等原因进行了分析。这三个向量有很多自然的异常值,因此我们在这里将它们全部转换为对数。

[En]

We have previously analyzed due to registration, leisure, counting. These three vectors have a lot of natural outliers, so here we convert them all to logarithms.

#&#x53D6;&#x5BF9;&#x6570;
data$logreg<-log(data$registered+1) data$logcas<-log(data$casual+1)< code></-log(data$registered+1)>

加1是为了处理注册和休闲这俩观测的0值。

#&#x5C06;data&#x91CC;&#x7684;&#x6240;&#x6709;&#x89C2;&#x6D4B;&#x548C;&#x7C7B;&#x578B;&#x7EDF;&#x7EDF;&#x8D4B;&#x503C;&#x7ED9;train&#xFF0C;test
train=data[as.integer(substr(data$datetime,9,10))<20,] test="data[as.integer(substr(data$datetime,9,10))">19,]</20,]>

预测

#&#x9884;&#x6D4B;&#x6CE8;&#x518C;&#x7528;&#x6237;&#x7684;&#x5BF9;&#x6570;
set.seed(415)
fit1 <- randomforest(logreg ~ hour +workingday+day+holiday+ day_type +temp_reg+humidity+atemp+windspeed+season+weather+dp_reg+weekend+year+year_part, data="train,importance=TRUE," ntree="250)" pred1="predict(fit1,test)" test$logreg="pred1</code"></->

我的电脑运行速度较慢,这里运算了40分钟......

#&#x9884;&#x6D4B;&#x4F11;&#x95F2;&#x7528;&#x6237;&#x7684;&#x5BF9;&#x6570;
set.seed(415)
fit2 <- randomforest(logcas ~hour + day_type+day+humidity+atemp+temp_cas+windspeed+season+weather+holiday+workingday+dp_cas+weekend+year+year_part, data="train,importance=TRUE," ntree="250)" pred2="predict(fit2,test)" test$logcas="pred2</code"></->

半个小时又过去了.......

写入文件并上传到kaggle网站:

#&#x91CD;&#x65B0;&#x8F6C;&#x6362;&#x9884;&#x6D4B;&#x53D8;&#x91CF;&#xFF0C;&#x7136;&#x540E;&#x5C06;count&#x7684;&#x8F93;&#x51FA;&#x5199;&#x5165;&#x6587;&#x4EF6;
test$registered=exp(test$logreg)-1
test$casual=exp(test$logcas)-1
test$count=test$casual+test$registered
s<-data.frame(datetime=test$datetime,count=test$count) write.csv(s,file="pre3.csv" ,row.names="FALSE)</code"></-data.frame(datetime=test$datetime,count=test$count)>

由于没有排名系统所以只有得分......

得了 0.411111

共享单车数据分析

Original: https://blog.csdn.net/weixin_51297533/article/details/120363471
Author: 分析鬼才
Title: 共享单车数据分析



相关阅读

Title: 【环境配置】在Vscode终端中使用Anaconda3中配置的环境

【环境配置】在Vscode终端中使用Anaconda3中配置的环境

0 前景提要

在学习深度学习时,一直使用的vscode软甲运行的python代码,但是在学习到tensorflow的时候,运行 import tensorflow as tf时,报错

PS C:\Users\xxx\Desktop\english_cx\shen_du_xue_xi\3_1> python first.py
Traceback (most recent call last):
  File "first.py", line 1, in <module>
    import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'

找到了原因是因为

  • 我已经在使用Anaconda,但是是自己新安装Visual Studio Code,没有使用Anaconda中的install下载,所选择的anaconda版本也不带把连着连接起来的配置, *期望达到在Vscode中运行anaconda中所配置的tensorflow环境

至此,先做出一些假设:

  • 已经创建好一个py文件,名为 first.py
  • tensorflow2.0 或者tensorflow2.0-Gpu
  • anaconda-2019.03-py37_0
  • 已经在anaconda中搭建好环境tensorflow2.0和tensorflow2.0-gpu等
    共享单车数据分析

1 安装Python插件

  • 务必要在Vscode中安装python插件
    在扩展中搜索python安装即可
    共享单车数据分析
  • 不然执行不了第二步

; 2 选择anconda中的环境

在Vscode中使用CTRL+P的按钮打开搜索,然后输入 > select interpreter
共享单车数据分析
点击Python:选择解释器
共享单车数据分析
可以看到对应的三个anaconda中的环境,选择自己想要的环境即可,可以看到下面出现变化
共享单车数据分析
至此,Vscode下环境配置完成,和anaconda已经完成链接

3 运行py文件

first.py文件如下:

import tensorflow as tf
boston_housing = tf.keras.datasets.boston_housing

(train_x,train_y),(test_x,test_y) = boston_housing.load_data()
print(1+1)

直接在Vscode中打开一个终端是不行的,虽然它给你激活了对应的环境,但是运行不通
共享单车数据分析
此时,有两种方法

  1. 第一种是按图执行
    共享单车数据分析
    然后就默认启动在所需要的环境,其实是自动执行了激活环境
    共享单车数据分析
    然后可以直接运行py文件
python first.py
  1. 第二种是
    按顺序使用如下命令即可
cmd
activate tensorflow2_0
python first.py

4 参考文献

Original: https://blog.csdn.net/qq_45954434/article/details/121138853
Author: 踏破万里无云
Title: 【环境配置】在Vscode终端中使用Anaconda3中配置的环境

相关文章
特定声音识别检测模块详解 人工智能

特定声音识别检测模块详解

需求解析 对于养宠物的人来说,识别宠物的叫声并根据它的叫声来判断是否出现了异常。宠物叫声一般都比较单一,难度相对较低,准确性有保障。 病人健康检测:通过声音识别,可以检测出人夜晚打呼噜的声音,可以检测...
DAC音频播放 人工智能

DAC音频播放

目录 一、前言 二、使用DAC输出周期2khz的正弦波 三、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出 四、参考资料 一、前言 本博客主要介绍如何用AU获取wav格式的正弦波以及截取到的音频...