拓端tecdat|R语言大数据分析纽约市的311万条投诉统计可视化与时间序列分析
原文链接:http://tecdat.cn/?p=9800
原文出处:拓端数据部落公众号
介绍
本文并不表示R在数据分析方面比Python更好或更快速,我本人每天都使用两种语言。这篇文章只是提供了比较这两种语言的机会。
本文中的 数据 每天都会更新,我的文件版本更大,为4.63 GB。
CSV文件包含纽约市的311条投诉。它是纽约市开放数据门户网站中最受欢迎的数据集。
数据工作流程
install.packages("devtools")
library("devtools")
install_github("ropensci/plotly")
library(plotly)
需要创建一个帐户以连接到plotly API。或者,可以只使用默认的ggplot2图形。
set_credentials_file("DemoAccount", "lr1c37zw81") ## Replace contents with your API Key
使用dplyr在R中进行分析
假设已安装sqlite3(因此可通过终端访问)。
$ sqlite3 data.db # Create your database
$.databases # Show databases to make sure it works
$.mode csv
$.import <filename> <tablename>
# Where filename is the name of the csv & tablename is the name of the new database table
$.quit
将数据加载到内存中。
library(readr)
# data.table, selecting a subset of columns
time_data.table <- system.time(fread('/users/ryankelly/NYC_data.csv', select = c('Agency', 'Created Date','Closed Date', 'Complaint Type', 'Descriptor', 'City'), showProgress = T))
kable(data.frame(rbind(time_data.table, time_data.table_full, time_readr)))
user.self | sys.self | elapsed | user.child | sys.child | |
---|---|---|---|---|---|
time_data.table | 63.588 | 1.952 | 65.633 | 0 | 0 |
time_data.table_full | 205.571 | 3.124 | 208.880 | 0 | 0 |
time_readr | 277.720 | 5.018 | 283.029 | 0 | 0 |
我将使用data.table读取数据。该 fread
函数大大提高了读取速度。
关于dplyr
默认情况下,dplyr查询只会从数据库中提取前10行。
library(dplyr) ## Will be used for pandas replacement# Connect to the database
db <- src_sqlite('/users/ryankelly/data.db')
db
数据处理的两个最佳选择(除了R之外)是:
- 数据表
- dplyr
预览数据
# Wrapped in a function for display purposes
head_ <- function(x, n = 5) kable(head(x, n))head_(data)
Agency | CreatedDate | ClosedDate | ComplaintType | Descriptor | City |
---|---|---|---|---|---|
NYPD | 04/11/2015 02:13:04 AM | Noise - Street/Sidewalk | Loud Music/Party | BROOKLYN | |
DFTA | 04/11/2015 02:12:05 AM | Senior Center Complaint | N/A | ELMHURST | |
NYPD | 04/11/2015 02:11:46 AM | Noise - Commercial | Loud Music/Party | JAMAICA | |
NYPD | 04/11/2015 02:11:02 AM | Noise - Street/Sidewalk | Loud Talking | BROOKLYN | |
NYPD | 04/11/2015 02:10:45 AM | Noise - Street/Sidewalk | Loud Music/Party | NEW YORK |
选择几列
ComplaintType | Descriptor | Agency |
---|---|---|
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Senior Center Complaint | N/A | DFTA |
Noise - Commercial | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
ComplaintType | Descriptor | Agency |
---|---|---|
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Senior Center Complaint | N/A | DFTA |
Noise - Commercial | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Noise - Commercial | Loud Music/Party | NYPD |
HPD Literature Request | The ABCs of Housing - Spanish | HPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Street Condition | Plate Condition - Noisy | DOT |
使用WHERE过滤行
ComplaintType | Descriptor | Agency |
---|---|---|
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Noise - Commercial | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
使用WHERE和IN过滤列中的多个值
ComplaintType | Descriptor | Agency |
---|---|---|
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Noise - Commercial | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
Noise - Street/Sidewalk | Loud Music/Party | NYPD |
Noise - Street/Sidewalk | Loud Talking | NYPD |
在DISTINCT列中查找唯一值
## City
## 1 BROOKLYN
## 2 ELMHURST
## 3 JAMAICA
## 4 NEW YORK
## 5
## 6 BAYSIDE
使用COUNT(*)和GROUP BY查询值计数
# dt[, .(No.Complaints = .N), Agency]
#setkey(dt, No.Complaints) # setkey index's the dataq <- data %>% select(Agency) %>% group_by(Agency) %>% summarise(No.Complaints = n())
head_(q)
Agency | No.Complaints |
---|---|
3-1-1 | 22499 |
ACS | 3 |
AJC | 7 |
ART | 3 |
CAU | 8 |
使用ORDER和-排序结果
数据库中有多少个城市?
# dt[, unique(City)]q <- data %>% select(City) %>% distinct() %>% summarise(Number.of.Cities = n())
head(q)
## Number.of.Cities
## 1 1818
让我们来绘制10个最受关注的城市
City | No.Complaints |
---|---|
BROOKLYN | 2671085 |
NEW YORK | 1692514 |
BRONX | 1624292 |
766378 | |
STATEN ISLAND | 437395 |
JAMAICA | 147133 |
FLUSHING | 117669 |
ASTORIA | 90570 |
Jamaica | 67083 |
RIDGEWOOD | 66411 |
- 用
UPPER
转换CITY格式。
CITY | No.Complaints |
---|---|
BROOKLYN | 2671085 |
NEW YORK | 1692514 |
BRONX | 1624292 |
766378 | |
STATEN ISLAND | 437395 |
JAMAICA | 147133 |
FLUSHING | 117669 |
ASTORIA | 90570 |
JAMAICA | 67083 |
RIDGEWOOD | 66411 |
投诉类型(按城市)
# Plot result
plt <- ggplot(q_f, aes(ComplaintType, No.Complaints, fill = CITY)) + geom_bar(stat = 'identity') + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))plt
第2部分时间序列运算
提供的数据不适合SQLite的标准日期格式。
在SQL数据库中创建一个新列,然后使用格式化的date语句重新插入数据 创建一个新表并将格式化日期插入原始列名。
使用时间戳字符串过滤SQLite行:YYYY-MM-DD hh:mm:ss
# dt[CreatedDate < '2014-11-26 23:47:00' & CreatedDate > '2014-09-16 23:45:00',
# .(ComplaintType, CreatedDate, City)]q <- data %>% filter(CreatedDate < "2014-11-26 23:47:00", CreatedDate > "2014-09-16 23:45:00") %>%select(ComplaintType, CreatedDate, City)head_(q)
ComplaintType | CreatedDate | City |
---|---|---|
Noise - Street/Sidewalk | 2014-11-12 11:59:56 | BRONX |
Taxi Complaint | 2014-11-12 11:59:40 | BROOKLYN |
Noise - Commercial | 2014-11-12 11:58:53 | BROOKLYN |
Noise - Commercial | 2014-11-12 11:58:26 | NEW YORK |
Noise - Street/Sidewalk | 2014-11-12 11:58:14 | NEW YORK |
使用strftime从时间戳中拉出小时单位
# dt[, hour := strftime('%H', CreatedDate), .(ComplaintType, CreatedDate, City)]q <- data %>% mutate(hour = strftime('%H', CreatedDate)) %>% select(ComplaintType, CreatedDate, City, hour)head_(q)
ComplaintType | CreatedDate | City | hour |
---|---|---|---|
Noise - Street/Sidewalk | 2015-11-04 02:13:04 | BROOKLYN | 02 |
Senior Center Complaint | 2015-11-04 02:12:05 | ELMHURST | 02 |
Noise - Commercial | 2015-11-04 02:11:46 | JAMAICA | 02 |
Noise - Street/Sidewalk | 2015-11-04 02:11:02 | BROOKLYN | 02 |
Noise - Street/Sidewalk | 2015-11-04 02:10:45 | NEW YORK | 02 |
汇总时间序列
首先,创建一个时间戳记四舍五入到前15分钟间隔的新列
# Using lubridate::new_period()
# dt[, interval := CreatedDate - new_period(900, 'seconds')][, .(CreatedDate, interval)]q <- data %>% mutate(interval = sql("datetime((strftime('%s', CreatedDate) / 900) * 900, 'unixepoch')")) %>% select(CreatedDate, interval)head_(q, 10)
CreatedDate | interval |
---|---|
2015-11-04 02:13:04 | 2015-11-04 02:00:00 |
2015-11-04 02:12:05 | 2015-11-04 02:00:00 |
2015-11-04 02:11:46 | 2015-11-04 02:00:00 |
2015-11-04 02:11:02 | 2015-11-04 02:00:00 |
2015-11-04 02:10:45 | 2015-11-04 02:00:00 |
2015-11-04 02:09:07 | 2015-11-04 02:00:00 |
2015-11-04 02:05:47 | 2015-11-04 02:00:00 |
2015-11-04 02:03:43 | 2015-11-04 02:00:00 |
2015-11-04 02:03:29 | 2015-11-04 02:00:00 |
2015-11-04 02:02:17 | 2015-11-04 02:00:00 |
绘制2003年的结果
拓端tecdat|R语言大数据分析纽约市的311万条投诉统计可视化与时间序列分析相关推荐
- R语言大数据分析纽约市的311万条投诉统计可视化与时间序列分析
介绍 本文并不表示R在数据分析方面比Python更好或更快速,我本人每天都使用两种语言.这篇文章只是提供了比较这两种语言的机会. 本文中的 数据 每天都会更新,我的文件版本更大,为4.63 GB. ...
- 拓端tecdat|R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险
最近我们被客户要求撰写关于冠心病风险的研究报告,包括一些图形和统计输出. 相关视频:R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险 逻辑回归Logistic模型原理和R语言分类预测冠 ...
- 拓端tecdat|R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测
最近我们被客户要求撰写关于LOESS(局部加权回归)的研究报告,包括一些图形和统计输出. 这篇文章描述了一种对涉及季节性和趋势成分的时间序列的中点进行建模的方法.我们将对一种叫做STL的算法进行研究, ...
- 拓端tecdat|R语言线性回归和时间序列分析北京房价影响因素可视化案例
最近我们被客户要求撰写关于北京房价影响因素的研究报告,包括一些图形和统计输出. 目的 房价有关的数据可能反映了中国近年来的变化: 人们得到更多的资源(薪水),期望有更好的房子 人口众多 独生子女政策: ...
- 拓端tecdat|R语言向量误差修正模型 (VECMs)分析长期利率和通胀率影响关系
最近我们被客户要求撰写关于向量误差修正模型的研究报告,包括一些图形和统计输出. 向量自回归模型估计的先决条件之一是被分析的时间序列是平稳的.但是,经济理论认为,经济变量之间在水平上存在着均衡关系,可以 ...
- 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
广义相加模型(GAM:Generalized Additive Model),它模型公式如下:有p个自变量,其中X1与y是线性关系,其他变量与y是非线性关系,我们可以对每个变量与y拟合不同关系,对X2 ...
- 拓端tecdat|bilibili视频流量数据潜望镜
最近我们被客户要求撰写关于bilibili视频流量的研究报告,包括一些图形和统计输出. 最新研究表明,中国有超过7亿人在观看在线视频内容.Bilibili,被称为哔哩哔哩或简称为B站,是中国大陆第二个 ...
- 拓端tecdat荣获2022年度51CTO博主之星
相信技术,传递价值,这是51CTO每一个技术创作者的动力与信念,2022 年度,拓端tecdat 作为新锐的数据分析咨询公司,在51CTO平台上,不断的输出优质的技术文章,分享前沿创新技术,输出最佳生 ...
- 拓端tecdat荣获掘金社区入驻新人奖
2021年7月,由掘金发起了"入驻成长礼"颁奖活动.本次活动邀请到知名开发者.服务机构代表等业界人士. 据了解,掘金社区"新入驻创作者礼"主要对已经积累了一定历 ...
- R语言与数据分析练习:使用ARIMA模型预测网站访问量
R语言与数据分析练习:使用ARIMA模型预测网站访问量 使用ARIMA模型预测网站访问量 一.实验背景: 随着流量的增大,某网站的数据信息量也在以一定的幅度增长 基于该网站2016年9月~2017年2 ...
最新文章
- 用数据分析蔡徐坤1亿转发量幕后推手被封后能否动摇饭圈文化?
- shardingjdbc每月分表_shardingjdbc分库分表测试
- 转:各种专题图实现的C#源代码
- 计算机比赛的评分办法,汉字录入比赛评分规则方案
- 如何传date参数_如何使用Python获取指定股票的5/15/30/60分钟线数据?
- Oracle入门(十三B)之高级查询(上)
- Ubuntu关于apt-get remove与apt-get purge
- 3 MM配置-企业结构-定义-定义库存地点
- 书屋(一):读《世界是平的》有感
- 使用springMVC提供的CommonsMultipartResolver文件解析器,实现文件轻松上传
- MSSql使用SQL语句快速查看表对的就说明,及表字段描述及字段类型
- MineCraft note
- 深度学习与计算机视觉教程(7) | 神经网络训练技巧 (下)(CV通关指南·完结)
- 【HAVENT原创】Firebase 相关操作及代码示例
- 微信推送封面尺寸_微信公众号文章封面图尺寸应该是多大?
- 翻译软件-好用的翻译软件-免费翻译软件大全
- 海康威视摄像头断后与8芯网线连接方法
- Excel去掉函数错误值#VALUE!的方法
- 好消息:部分银行磁条卡更换芯片卡
- java与javax的区别