Este arquivo é um R Markdown Notebook. Uma das formas de exibição de resultados em [R] e um padrão muito utilizado para Storytelling de Dados.

Começando do básico

Este curso tem por objetivo apresentar os conceitos introdutórios para uso e aprendizagem da linguagem R.

Tipos de Dados [R]

Os tipos de dados no R muitas vezes também são chamados de Estruturas de R. As estruturas em R são os modos como os diferentes tipos de variáveis podem ser arranjadas para otimizar a manipulação das mesmas e a atribuição de atividades computacionais sobre as mesmas.

Vetores

Vetores são os arranjos de dados mais fundamentais do R, vetores são arrays de elemtos (componentes) de mesmo tipo.

meu_vetor = c (1,5,6)
meu_vetor
## [1] 1 5 6
class(meu_vetor)
## [1] "numeric"
outro_vetor = c (1,5,"a")
outro_vetor
## [1] "1" "5" "a"
class(outro_vetor)
## [1] "character"

Podemos verificar o elemento meu_vetor 1, 5, 6, assim como seu tipo numeric.

Um vetor pode conter um vetor de caracteres de qualquer tipo:

sul = c("Porto Alegre", "RS", "Curitiba", "PR", "Florianópolis", "SC")

Os dados de um vetor podem ser recuperados por sua posição:

sul[1]
## [1] "Porto Alegre"
sul[2]
## [1] "RS"
paste("A capidal do", sul[2], "é", sul[1], sep = " " )
## [1] "A capidal do RS é Porto Alegre"

Vetores Numéricos

Vetores numéricos são as mesmas estruturas de vetores, com a facilidade adicional de poderem ser criados utilizando sintaxes numéricas, tais como atribuição de sequencias, intervallos, cálculos, etc.

Sequências:

sequencia1 = seq(10,30)
sequencia1
##  [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
sequencia2 = 10:30
sequencia2
##  [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Sequência com passos:

sequencia3 = seq(10, 30, 2)
sequencia3
##  [1] 10 12 14 16 18 20 22 24 26 28 30

Replicação de vetores:

original = c(1, 3 , 5)
original
## [1] 1 3 5
repeticao1 = rep(original, 3)
repeticao1
## [1] 1 3 5 1 3 5 1 3 5
n = c(3,5,7)
repeticao2 = rep(original, n)
repeticao2
##  [1] 1 1 1 3 3 3 3 3 5 5 5 5 5 5 5

Matrizes

O conceito de matriz é o mesmo aplicado no estudo matemático de matrizes, em que as matrizes são objetos de dimensão m*n contendo dados do mesmo tipo. Assim como os vetores numéricos, as matrizes podem ser criadas utilizando atribuições dentro de lógicas computacionais como a criação de uma matriz 5x4 com valores de 5 a 100, com passo de 5:

matriz_numerica = seq(5, 100, 5)
matriz_numerica
##  [1]   5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95
## [20] 100
dim(matriz_numerica) = c(5,4)
matriz_numerica
##      [,1] [,2] [,3] [,4]
## [1,]    5   30   55   80
## [2,]   10   35   60   85
## [3,]   15   40   65   90
## [4,]   20   45   70   95
## [5,]   25   50   75  100

Uma vez criada uma matriz, as operações com matrizes podem ser realizadas, como a transposta, obtida pela função t():

t(matriz_numerica)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    5   10   15   20   25
## [2,]   30   35   40   45   50
## [3,]   55   60   65   70   75
## [4,]   80   85   90   95  100

Uma maneira mais prática de criar matrizes é pela função matriz() que recebe como parametros os valoes e a dimensão da mesma:

matriz = matrix(seq(5, 100, 5), nrow = 5)
matriz
##      [,1] [,2] [,3] [,4]
## [1,]    5   30   55   80
## [2,]   10   35   60   85
## [3,]   15   40   65   90
## [4,]   20   45   70   95
## [5,]   25   50   75  100

Por default a função matrix() preenche os valores da matriz coluna a coluna, para contornar isso, pode ser utilizado o parâmetro byrow, passando o valor T = true que gera am atriz por linhas:

matriz = matrix(seq(5, 100, 5), nrow = 5, byrow = T)
matriz
##      [,1] [,2] [,3] [,4]
## [1,]    5   10   15   20
## [2,]   25   30   35   40
## [3,]   45   50   55   60
## [4,]   65   70   75   80
## [5,]   85   90   95  100

Recuperando um componente específico da matriz passando posição linhaxcoluna:

matriz[3,2]
## [1] 50

Fatores

Listas

Listas e Estatísticas

Data Frames

Estruturas de dados

Retangulares

Dados retangulares são os conjuntos de dados que estamos habituados a manipular diárimente por meio de tabelas, planilhas eletrônicas, bancos de dados, etc. Podem ser entendidos como dados retangulares todo conjunto de dados constituidos dentro de um arranjo de linhas e colunas. Assim podemos possuir conjuntos retangulares em que todos valores são de mesmo tipo como no caso de matrizes, ou mesmo conjuntos retangulares com valores de tipos variádos como em tabelas e planilhas, onde as linhas representam as unidades de análise e as colunas seus atributos.

\label{fig:1} Tipos de Variáveis

Tipos de Variáveis

Não retangulares

Tipos de dados são os mais variados indo de json a formatos NoSQL.

library(RJSONIO)
modelo = fromJSON("data/modelo.json")
modelo
## $name
## [1] "Customer"
## 
## $description
## [1] "A Customer model representing our customers."
## 
## $base
## [1] "User"
## 
## $idInjection
## [1] FALSE
## 
## $strict
## [1] TRUE
## 
## $options
## named list()
## 
## $properties
## named list()
## 
## $hidden
## $hidden[[1]]
## NULL
## 
## 
## $validations
## $validations[[1]]
## NULL
## 
## 
## $relations
## named list()
## 
## $acls
## $acls[[1]]
## NULL
## 
## 
## $scopes
## named list()
## 
## $indexes
## named list()
## 
## $methods
## $methods[[1]]
## NULL
## 
## 
## $http
##          path 
## "/foo/mypath"
\label{fig:figs}

pessoa = fromJSON("data/pessoa.json")
pessoa
## $ID
## [1] "1" "2" "3" "4" "5" "6" "7" "8"
## 
## $Name
## [1] "Rick"     "Dan"      "Michelle" "Ryan"     "Gary"     "Nina"     "Simon"   
## [8] "Guru"    
## 
## $Salary
## [1] "623.3"  "515.2"  "611"    "729"    "843.25" "578"    "632.8"  "722.5" 
## 
## $StartDate
## [1] "1/1/2012"   "9/23/2013"  "11/15/2014" "5/11/2014"  "3/27/2015" 
## [6] "5/21/2013"  "7/30/2013"  "6/17/2014" 
## 
## $Dept
## [1] "IT"         "Operations" "IT"         "HR"         "Finance"   
## [6] "IT"         "Operations" "Finance"
\label{fig:figs}

Tais dados a depender da estruturação, podem ser transformados em dados tabulares, por meio de

Carga de Dados

Dados CSV

acidentes2016 = read.csv("data/acidentes-2016.csv", header = T, sep = ";")
head(acidentes2016)
##       ID LONGITUDE  LATITUDE                         LOG1                 LOG2
## 1 623243 -51.23386 -30.08521                     R ARAPEI           R COMANDAI
## 2 622413 -51.23195 -30.10831    R PADRE JOAO BATISTA REUS          R JOAO MORA
## 3 622460 -51.21203 -30.04587                   AV DO LAMI                     
## 4 622540 -51.18561 -30.03446           AV DR NILO PECANHA R CARLOS TREIN FILHO
## 5 622181 -51.09736 -30.13143 ESTR JOAO DE OLIVEIRA REMIAO                     
## 6 622232 -51.22502 -30.04690                  AV IPIRANGA                     
##   PREDIAL1      LOCAL     TIPO_ACID                                 LOCAL_VIA
## 1        0 Cruzamento ATROPELAMENTO                     R ARAPEI & R COMANDAI
## 2        0 Cruzamento  ABALROAMENTO   R PADRE JOAO BATISTA REUS & R JOAO MORA
## 3        0 Logradouro ATROPELAMENTO                                AV DO LAMI
## 4        0 Cruzamento        CHOQUE AV DR NILO PECANHA & R CARLOS TREIN FILHO
## 5     8487 Logradouro        CHOQUE         8487 ESTR JOAO DE OLIVEIRA REMIAO
## 6      320 Logradouro       COLISAO                           320 AV IPIRANGA
##   QUEDA_ARR       DATA           DATA_HORA     DIA_SEM  HORA FERIDOS FERIDOS_GR
## 1         0 2016-01-01 2016-01-01T14:30:00 SEXTA-FEIRA 14:30       1          0
## 2         0 2016-01-01 2016-01-01T16:45:00 SEXTA-FEIRA 16:45       0          0
## 3         0 2016-01-01 2016-01-01T16:30:00 SEXTA-FEIRA 16:30       1          0
## 4         0 2016-01-01 2016-01-01T05:45:00 SEXTA-FEIRA 05:45       0          0
## 5         0 2016-01-01 2016-01-01T12:00:00 SEXTA-FEIRA 12:00       0          0
## 6         0 2016-01-02 2016-01-02T15:35:00      SABADO 15:35       0          0
##   MORTES MORTE_POST FATAIS AUTO TAXI LOTACAO ONIBUS_URB ONIBUS_MET ONIBUS_INT
## 1      0          0      0    1    0       0          0          0          0
## 2      0          0      0    2    0       0          0          0          0
## 3      0          0      0    0    0       0          0          0          0
## 4      0          0      0    1    0       0          0          0          0
## 5      0          1      1    1    0       0          0          0          0
## 6      0          0      0    1    0       0          0          0          1
##   CAMINHAO MOTO CARROCA BICICLETA OUTRO   TEMPO NOITE_DIA   FONTE  BOLETIM
## 1        0    0       0         0     0     BOM       DIA DEPTRAN    56416
## 2        0    0       0         0     0 NUBLADO       DIA    EPTC   294286
## 3        0    1       0         0     0     BOM       DIA DEPTRAN    13316
## 4        0    0       0         0     0     BOM     NOITE    EPTC   291292
## 5        0    0       0         0     0     BOM       DIA DEPTRAN      216
## 6        0    0       0         0     0     BOM       DIA     DDT 10031116
##   REGIAO DIA MES  ANO FX_HORA CONT_ACID CONT_VIT UPS CONSORCIO CORREDOR
## 1    SUL   1   1 2016      14         1        1   5                  0
## 2    SUL   1   1 2016      16         1        0   1                  0
## 3 CENTRO   1   1 2016      16         1        1   5                  0
## 4  LESTE   1   1 2016       5         1        0   1                  0
## 5  LESTE   1   1 2016      12         1        1  13                  0
## 6 CENTRO   2   1 2016      15         1        0   1                  0
dim(acidentes2016)
## [1] 12515    44
length(acidentes2016$ID)
## [1] 12515
names(acidentes2016)
##  [1] "ID"         "LONGITUDE"  "LATITUDE"   "LOG1"       "LOG2"      
##  [6] "PREDIAL1"   "LOCAL"      "TIPO_ACID"  "LOCAL_VIA"  "QUEDA_ARR" 
## [11] "DATA"       "DATA_HORA"  "DIA_SEM"    "HORA"       "FERIDOS"   
## [16] "FERIDOS_GR" "MORTES"     "MORTE_POST" "FATAIS"     "AUTO"      
## [21] "TAXI"       "LOTACAO"    "ONIBUS_URB" "ONIBUS_MET" "ONIBUS_INT"
## [26] "CAMINHAO"   "MOTO"       "CARROCA"    "BICICLETA"  "OUTRO"     
## [31] "TEMPO"      "NOITE_DIA"  "FONTE"      "BOLETIM"    "REGIAO"    
## [36] "DIA"        "MES"        "ANO"        "FX_HORA"    "CONT_ACID" 
## [41] "CONT_VIT"   "UPS"        "CONSORCIO"  "CORREDOR"
acidentes2016[1,]
##       ID LONGITUDE  LATITUDE     LOG1       LOG2 PREDIAL1      LOCAL
## 1 623243 -51.23386 -30.08521 R ARAPEI R COMANDAI        0 Cruzamento
##       TIPO_ACID             LOCAL_VIA QUEDA_ARR       DATA           DATA_HORA
## 1 ATROPELAMENTO R ARAPEI & R COMANDAI         0 2016-01-01 2016-01-01T14:30:00
##       DIA_SEM  HORA FERIDOS FERIDOS_GR MORTES MORTE_POST FATAIS AUTO TAXI
## 1 SEXTA-FEIRA 14:30       1          0      0          0      0    1    0
##   LOTACAO ONIBUS_URB ONIBUS_MET ONIBUS_INT CAMINHAO MOTO CARROCA BICICLETA
## 1       0          0          0          0        0    0       0         0
##   OUTRO TEMPO NOITE_DIA   FONTE BOLETIM REGIAO DIA MES  ANO FX_HORA CONT_ACID
## 1     0   BOM       DIA DEPTRAN   56416    SUL   1   1 2016      14         1
##   CONT_VIT UPS CONSORCIO CORREDOR
## 1        1   5                  0
acidentes2016[1,11]
## [1] 2016-01-01
## 366 Levels: 2016-01-01 2016-01-02 2016-01-03 2016-01-04 ... 2016-12-31
acidentes2016[20:30,11]
##  [1] 2016-01-03 2016-01-03 2016-01-03 2016-01-03 2016-01-03 2016-01-03
##  [7] 2016-01-03 2016-01-03 2016-01-03 2016-01-03 2016-01-03
## 366 Levels: 2016-01-01 2016-01-02 2016-01-03 2016-01-04 ... 2016-12-31
table(acidentes2016$CONSORCIO)
## 
##                                                          CARRIS 
##                           11740                             182 
##                 CARRIS - CARRIS                         CONORTE 
##                               1                              21 
##                   MAIS (LOTE 6) MAIS (LOTE 6) - CARRIS - MAIS ( 
##                              63                               1 
##                    MOB (LOTE 1)                    MOB (LOTE 2) 
##                             125                              64 
##                   N?O INFORMADO                             STS 
##                              13                              22 
##                          UNIBUS              VIA LESTE (LOTE 5) 
##                              19                              76 
##  VIA LESTE (LOTE 5) - MOB (LOTE  VIA LESTE (LOTE 5) - VIA LESTE 
##                               1                               1 
##               VIVA SUL (LOTE 3)      VIVA SUL (LOTE 3) - CARRIS 
##                             104                               1 
##               VIVA SUL (LOTE 4) 
##                              81
table(acidentes2016$FATAIS, acidentes2016$AUTO)
##    
##        0    1    2    3    4    5    7
##   0 1389 5364 5033  550   86    4    1
##   1   36   41    6    0    1    0    0
##   2    0    3    1    0    0    0    0
table(acidentes2016$TIPO_ACID, acidentes2016$AUTO)
##                
##                    0    1    2    3    4    5    7
##   ABALROAMENTO   429 3129 2509   98   15    3    0
##   ATROPELAMENTO  411  449   10    0    0    0    0
##   CAPOTAGEM        4   22    9    1    0    0    0
##   CHOQUE          88  493  345   69   11    1    0
##   COLISAO        146 1205 2153  381   61    0    1
##   EVENTUAL        37   82   12    1    0    0    0
##   INCENDIO         1    4    0    0    0    0    0
##   QUEDA          308   18    0    0    0    0    0
##   TOMBAMENTO       1    6    2    0    0    0    0

Dados DBF

acidentes2019 = library(foreign)
acidentes = read.dbf("data/acidentes.dbf")
head(acidentes)
##       ID LONGITUDE LATITUDE                   LOG1         LOG2 PREDIAL1
## 1 660953         0        0        AV ASSIS BRASIL         <NA>     6699
## 2 660956         0        0     R DR BARROS CASSAL         <NA>      411
## 3 660959         0        0 AV FABIO ARAUJO SANTOS         <NA>     1500
## 4 660962         0        0            AV IPIRANGA         <NA>     8799
## 5 660963         0        0        AV ASSIS BRASIL         <NA>      164
## 6 661175         0        0            AV IPIRANGA R SAO MANOEL        0
##        LOCAL    TIPO_ACID                   LOCAL_VIA QUEDA_ARR       DATA
## 1 Logradouro ABALROAMENTO        6699 AV ASSIS BRASIL         0 2019-01-01
## 2 Logradouro ABALROAMENTO      411 R DR BARROS CASSAL         0 2019-01-01
## 3 Logradouro       CHOQUE 1500 AV FABIO ARAUJO SANTOS         0 2019-01-01
## 4 Logradouro      COLISAO            8799 AV IPIRANGA         0 2019-01-01
## 5 Logradouro ABALROAMENTO         164 AV ASSIS BRASIL         0 2019-01-01
## 6 Cruzamento ABALROAMENTO  AV IPIRANGA & R SAO MANOEL         0 2019-01-01
##       DIA_SEM  HORA FERIDOS FERIDOS_GR MORTES MORTE_POST FATAIS AUTO TAXI
## 1 TERCA-FEIRA 02:45       1          0      0          0      0    3    0
## 2 TERCA-FEIRA 07:36       1          0      0          0      0    2    0
## 3 TERCA-FEIRA 16:50       4          0      0          0      0    1    0
## 4 TERCA-FEIRA 19:00       5          0      0          0      0    3    0
## 5 TERCA-FEIRA 22:15       1          0      0          0      0    1    0
## 6 TERCA-FEIRA 04:10       0          0      0          0      0    2    0
##   LOTACAO ONIBUS_URB ONIBUS_MET ONIBUS_INT CAMINHAO MOTO CARROCA BICICLETA
## 1       0          0          0          0        0    0       0         0
## 2       0          0          0          0        0    0       0         0
## 3       0          0          0          0        0    0       0         0
## 4       0          0          0          0        0    0       0         0
## 5       0          0          0          0        0    1       0         0
## 6       0          0          0          0        0    0       0         0
##   OUTRO TEMPO NOITE_DIA   FONTE BOLETIM REGIAO DIA MES  ANO FX_HORA CONT_ACID
## 1     0   BOM     NOITE DEPTRAN  000219  NORTE   1   1 2019       2         1
## 2     0   BOM       DIA DEPTRAN  000519 CENTRO   1   1 2019       7         1
## 3     0   BOM       DIA DEPTRAN  000919    SUL   1   1 2019      16         1
## 4     0   BOM     NOITE DEPTRAN  001119  LESTE   1   1 2019      19         1
## 5     0   BOM     NOITE DEPTRAN  001219  NORTE   1   1 2019      22         1
## 6     0   BOM     NOITE    EPTC  230995  LESTE   1   1 2019       4         1
##   CONT_VIT UPS CONSORCIO CORREDOR
## 1        1   5      <NA>        0
## 2        1   5      <NA>        0
## 3        1   5      <NA>        0
## 4        1   5      <NA>        0
## 5        1   5      <NA>        0
## 6        0   1      <NA>        0
table(acidentes$TIPO_ACID)
## 
##  ABALROAMENTO ATROPELAMENTO     CAPOTAGEM        CHOQUE       COLISAO 
##          4077           526            30           615          2280 
##      EVENTUAL      INCENDIO         QUEDA    TOMBAMENTO 
##           118             3           214            15
table(acidentes$TIPO_ACID, acidentes$FATAIS)
##                
##                    0    1    2
##   ABALROAMENTO  4068    9    0
##   ATROPELAMENTO  502   24    0
##   CAPOTAGEM       29    1    0
##   CHOQUE         608    6    1
##   COLISAO       2273    6    1
##   EVENTUAL       118    0    0
##   INCENDIO         3    0    0
##   QUEDA          213    1    0
##   TOMBAMENTO      15    0    0
table(acidentes$TIPO_ACID, acidentes$REGIAO)
##                
##                 CENTRO LESTE NAO IDENTIFICADO NORTE  SUL
##   ABALROAMENTO     779  1131                3  1265  899
##   ATROPELAMENTO     94   128                1   171  132
##   CAPOTAGEM          4    15                0     1   10
##   CHOQUE            94   215                0   154  152
##   COLISAO          371   758                0   627  524
##   EVENTUAL          18    34                0    36   30
##   INCENDIO           0     2                0     1    0
##   QUEDA             27    49                1    68   69
##   TOMBAMENTO         0     6                0     4    5
table(acidentes$REGIAO, acidentes$NOITE_DIA)
##                   
##                     DIA NOITE
##   CENTRO            993   393
##   LESTE            1765   573
##   NAO IDENTIFICADO    4     1
##   NORTE            1734   591
##   SUL              1307   512
acid_regiao = table(acidentes$REGIAO, acidentes$NOITE_DIA)

prop.table(acid_regiao, margin = 1)
##                   
##                          DIA     NOITE
##   CENTRO           0.7164502 0.2835498
##   LESTE            0.7549187 0.2450813
##   NAO IDENTIFICADO 0.8000000 0.2000000
##   NORTE            0.7458065 0.2541935
##   SUL              0.7185267 0.2814733
prop.table(acid_regiao, margin = 2)
##                   
##                             DIA        NOITE
##   CENTRO           0.1711183870 0.1898550725
##   LESTE            0.3041530243 0.2768115942
##   NAO IDENTIFICADO 0.0006892986 0.0004830918
##   NORTE            0.2988109598 0.2855072464
##   SUL              0.2252283302 0.2473429952
round(prop.table(acid_regiao, margin = 1)*100, 2)
##                   
##                      DIA NOITE
##   CENTRO           71.65 28.35
##   LESTE            75.49 24.51
##   NAO IDENTIFICADO 80.00 20.00
##   NORTE            74.58 25.42
##   SUL              71.85 28.15
round(prop.table(acid_regiao, margin = 2)*100, 2)
##                   
##                      DIA NOITE
##   CENTRO           17.11 18.99
##   LESTE            30.42 27.68
##   NAO IDENTIFICADO  0.07  0.05
##   NORTE            29.88 28.55
##   SUL              22.52 24.73

Dados Excel

library(xlsx)
excel = read.xlsx(file = "data/geo_google_api.xlsx", header = T, sheetIndex = 1)
head(excel)
##   NA.         lat        long       accuracy
## 1   1 -29.9930694 -51.1277254 street_address
## 2   2 -30.0291398 -51.2173594        premise
## 3   3 -30.0957798 -51.2217337        premise
## 4   4 -30.0626225   -51.15133 street_address
## 5   5 -30.0062468 -51.1842183 street_address
## 6   6 -30.0430998  -51.203983   intersection
##                                                                    formatted_address
## 1             Av. Assis Brasil, 6699 - Sarandi, Porto Alegre - RS, 91010-004, Brazil
## 2    R. Dr. Barros Cassal, 411 - Independência, Porto Alegre - RS, 90035-072, Brazil
## 3       Av. Fábio Araújo Santos, 1500 - Nonoai, Porto Alegre - RS, 91720-390, Brazil
## 4          Av. Ipiranga, 8799 - Praia de Belas, Porto Alegre - RS, 90160-092, Brazil
## 5             Av. Assis Brasil, 164 - São João, Porto Alegre - RS, 91010-001, Brazil
## 6 Av. Ipiranga & R. São Manoel - Santa Cecilia, Porto Alegre - RS, 90160-091, Brazil
##     address_type status index     ID LONGITUDE LATITUDE
## 1 street_address     OK     1 660953         0        0
## 2        premise     OK     2 660956         0        0
## 3        premise     OK     3 660959         0        0
## 4 street_address     OK     4 660962         0        0
## 5 street_address     OK     5 660963         0        0
## 6   intersection     OK     6 661175         0        0
##                                          LOG1         LOG2 PREDIAL1      LOCAL
## 1           AV ASSIS BRASIL 6699 Porto Alegre         <NA>     6699 Logradouro
## 2         R DR BARROS CASSAL 411 Porto Alegre         <NA>      411 Logradouro
## 3    AV FABIO ARAUJO SANTOS 1500 Porto Alegre         <NA>     1500 Logradouro
## 4               AV IPIRANGA 8799 Porto Alegre         <NA>     8799 Logradouro
## 5            AV ASSIS BRASIL 164 Porto Alegre         <NA>      164 Logradouro
## 6 AV IPIRANGA and R SAO MANOEL 0 Porto Alegre R SAO MANOEL        0 Cruzamento
##      TIPO_ACID                   LOCAL_VIA QUEDA_ARR       DATA     DIA_SEM
## 1 ABALROAMENTO        6699 AV ASSIS BRASIL         0 2019-01-01 TERCA-FEIRA
## 2 ABALROAMENTO      411 R DR BARROS CASSAL         0 2019-01-01 TERCA-FEIRA
## 3       CHOQUE 1500 AV FABIO ARAUJO SANTOS         0 2019-01-01 TERCA-FEIRA
## 4      COLISAO            8799 AV IPIRANGA         0 2019-01-01 TERCA-FEIRA
## 5 ABALROAMENTO         164 AV ASSIS BRASIL         0 2019-01-01 TERCA-FEIRA
## 6 ABALROAMENTO  AV IPIRANGA & R SAO MANOEL         0 2019-01-01 TERCA-FEIRA
##    HORA FERIDOS FERIDOS_GR MORTES MORTE_POST FATAIS AUTO TAXI LOTACAO
## 1 02:45       1          0      0          0      0    3    0       0
## 2 07:36       1          0      0          0      0    2    0       0
## 3 16:50       4          0      0          0      0    1    0       0
## 4 19:00       5          0      0          0      0    3    0       0
## 5 22:15       1          0      0          0      0    1    0       0
## 6 04:10       0          0      0          0      0    2    0       0
##   ONIBUS_URB ONIBUS_MET ONIBUS_INT CAMINHAO MOTO CARROCA BICICLETA OUTRO TEMPO
## 1          0          0          0        0    0       0         0     0   BOM
## 2          0          0          0        0    0       0         0     0   BOM
## 3          0          0          0        0    0       0         0     0   BOM
## 4          0          0          0        0    0       0         0     0   BOM
## 5          0          0          0        0    1       0         0     0   BOM
## 6          0          0          0        0    0       0         0     0   BOM
##   NOITE_DIA   FONTE BOLETIM REGIAO DIA MES  ANO FX_HORA CONT_ACID CONT_VIT UPS
## 1     NOITE DEPTRAN  000219  NORTE   1   1 2019       2         1        1   5
## 2       DIA DEPTRAN  000519 CENTRO   1   1 2019       7         1        1   5
## 3       DIA DEPTRAN  000919    SUL   1   1 2019      16         1        1   5
## 4     NOITE DEPTRAN  001119  LESTE   1   1 2019      19         1        1   5
## 5     NOITE DEPTRAN  001219  NORTE   1   1 2019      22         1        1   5
## 6     NOITE    EPTC  230995  LESTE   1   1 2019       4         1        0   1
##   CONSORCIO CORREDOR
## 1      <NA>        0
## 2      <NA>        0
## 3      <NA>        0
## 4      <NA>        0
## 5      <NA>        0
## 6      <NA>        0

Dados XML

#install.packages("XML")
library(XML)
library(methods)
empregados <- xmlParse(file = "data/dep_pessoal.xml")
empregados
## <?xml version="1.0"?>
## <RECORDS>
##   <EMPLOYEE>
##     <ID>1</ID>
##     <NAME>Rick</NAME>
##     <SALARY>623.3</SALARY>
##     <STARTDATE>1/1/2012</STARTDATE>
##     <DEPT>IT</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>2</ID>
##     <NAME>Dan</NAME>
##     <SALARY>515.2</SALARY>
##     <STARTDATE>9/23/2013</STARTDATE>
##     <DEPT>Operations</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>3</ID>
##     <NAME>Michelle</NAME>
##     <SALARY>611</SALARY>
##     <STARTDATE>11/15/2014</STARTDATE>
##     <DEPT>IT</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>4</ID>
##     <NAME>Ryan</NAME>
##     <SALARY>729</SALARY>
##     <STARTDATE>5/11/2014</STARTDATE>
##     <DEPT>HR</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>5</ID>
##     <NAME>Gary</NAME>
##     <SALARY>843.25</SALARY>
##     <STARTDATE>3/27/2015</STARTDATE>
##     <DEPT>Finance</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>6</ID>
##     <NAME>Nina</NAME>
##     <SALARY>578</SALARY>
##     <STARTDATE>5/21/2013</STARTDATE>
##     <DEPT>IT</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>7</ID>
##     <NAME>Simon</NAME>
##     <SALARY>632.8</SALARY>
##     <STARTDATE>7/30/2013</STARTDATE>
##     <DEPT>Operations</DEPT>
##   </EMPLOYEE>
##   <EMPLOYEE>
##     <ID>8</ID>
##     <NAME>Guru</NAME>
##     <SALARY>722.5</SALARY>
##     <STARTDATE>6/17/2014</STARTDATE>
##     <DEPT>Finance</DEPT>
##   </EMPLOYEE>
## </RECORDS>
## 
empregados <- xmlToDataFrame("data/dep_pessoal.xml")
empregados
##   ID     NAME SALARY  STARTDATE       DEPT
## 1  1     Rick  623.3   1/1/2012         IT
## 2  2      Dan  515.2  9/23/2013 Operations
## 3  3 Michelle    611 11/15/2014         IT
## 4  4     Ryan    729  5/11/2014         HR
## 5  5     Gary 843.25  3/27/2015    Finance
## 6  6     Nina    578  5/21/2013         IT
## 7  7    Simon  632.8  7/30/2013 Operations
## 8  8     Guru  722.5  6/17/2014    Finance

Web Scraping | Crawler

Chance de Gol

library(tibble)
library(httr)
library(rvest)
## Loading required package: xml2
## 
## Attaching package: 'rvest'
## The following object is masked from 'package:XML':
## 
##     xml
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
library(stringr)
library(purrr)
## 
## Attaching package: 'purrr'
## The following object is masked from 'package:rvest':
## 
##     pluck
ano <- 2018
cdg_url <- sprintf('http://www.chancedegol.com.br/br%02d.htm', ano - 2000)
cdg_html <- cdg_url %>%
  httr::GET() %>%
  httr::content('text', encoding = 'latin1') %>%
  xml2::read_html() %>%
  rvest::html_node('table')

cores <- cdg_html %>%
  html_nodes(xpath = '//font[@color="#FF0000"]') %>%
  html_text()
cdg_data <- cdg_html %>%
  html_table(header = TRUE) %>%
  setNames(c('dt_jogo', 'mandante', 'placar', 'visitante',
             'p_mandante', 'p_empate', 'p_visitante')) %>% 
  mutate(p_vitorioso = cores) %>% 
  as_tibble() %>% 
  mutate(result = 'OK')


cdg_ano <- function(ano) {
  cdg_url <- sprintf('http://www.chancedegol.com.br/br%02d.htm', ano - 2000)
  
  cdg_html <- cdg_url %>%
    GET() %>%
    content('text', encoding = 'latin1') %>%
    read_html() %>%
    html_node('table')
  
  cores <- cdg_html %>%
    html_nodes(xpath = '//font[@color="#FF0000"]') %>%
    html_text()
  
  cdg_data <- cdg_html %>%
    html_table(header = TRUE) %>%
    setNames(c('dt_jogo', 'mandante', 'placar', 'visitante',
               'p_mandante', 'p_empate', 'p_visitante')) %>% 
    mutate(p_vitorioso = cores) %>% 
    as_tibble() %>% 
    mutate(result = 'OK')
  
  cdg_data
}

cdg_anos <- function(anos) {
  cdg_ano_safe <- failwith(tibble(result = 'erro'), cdg_ano)
  anos %>% 
    setNames(anos) %>% 
    purrr::map_df(cdg_ano_safe, .id = 'ano')
}
d_cdg <- cdg_anos(c(2017, 2018))
## Warning: Deprecated: please use `purrr::possibly()` instead
d_cdg
## # A tibble: 760 x 10
##    ano   dt_jogo mandante placar visitante p_mandante p_empate p_visitante
##    <chr> <chr>   <chr>    <chr>  <chr>     <chr>      <chr>    <chr>      
##  1 2017  13/05/… Flamengo 1x1    Atlético… 56.0 %     21.9 %   22.0 %     
##  2 2017  13/05/… Corinth… 1x1    Chapecoe… 47.9 %     29.9 %   22.1 %     
##  3 2017  14/05/… Bahia    6x2    Atlético… 54.8 %     32.4 %   12.8 %     
##  4 2017  14/05/… Flumine… 3x2    Santos    40.6 %     23.8 %   35.7 %     
##  5 2017  14/05/… Palmeir… 4x0    Vasco     70.1 %     21.5 %   8.4 %      
##  6 2017  14/05/… Cruzeiro 1x0    São Paulo 50.9 %     23.9 %   25.1 %     
##  7 2017  14/05/… Grêmio   2x0    Botafogo  53.9 %     25.2 %   21.0 %     
##  8 2017  14/05/… Ponte P… 4x0    Sport     51.3 %     23.1 %   25.6 %     
##  9 2017  14/05/… Avaí     0x0    Vitória   39.2 %     27.6 %   33.2 %     
## 10 2017  15/05/… Coritiba 4x1    Atlético… 49.4 %     27.2 %   23.4 %     
## # … with 750 more rows, and 2 more variables: p_vitorioso <chr>, result <chr>

Sabesp

link <- 'http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx'
txt <- GET(link)
# tipo pode ser "#__VIEWSTATE" ou "#__EVENTVALIDATION"
pegar_tags <- function(req, tipo) {
  req %>% 
    content('text') %>% 
    read_html() %>% 
    html_node(tipo) %>% 
    html_attr('value')
}

# exemplo
viewstate <- pegar_tags(txt, "#__VIEWSTATE")
eventval <- pegar_tags(txt, "#__EVENTVALIDATION")
sabesp_dados <- function(data, vs, ev) {
  data <- as.Date(data)
  dados <- list(cmbDia = lubridate::day(data), 
                cmbMes = lubridate::month(data), 
                cmbAno = lubridate::year(data), 
                Imagebutton1.x = '0', 
                Imagebutton1.y = '0', 
                '__VIEWSTATE' = vs, 
                '__EVENTVALIDATION' = ev,
                '__VIEWSTATEENCRYPTED' = '')
}

# exemplo
data <- '2017-02-14'
form <- sabesp_dados(data, viewstate, eventval)
# requisicao de busca
result <- POST(link, body = form)
result
## Response [http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx]
##   Date: 2019-11-25 11:12
##   Status: 200
##   Content-Type: text/html; charset=utf-8
##   Size: 43.2 kB
## 
## 
## <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3...
## <html xmlns="http://www.w3.org/1999/xhtml">
## <head><title>
##  Divulgação Informações Mananciais
## </title><link href="estilos.css" rel="stylesheet" type="text/css" /><link hre...
##     <!--[if lte IE 8]>
##         <script language="javascript" type="text/javascript" src="./flot/exca...
##     <![endif]-->
## ...
sabesp_nm_sistemas <- function(r) {
  nomes <- r %>% 
    content('text') %>% 
    read_html() %>% 
    html_nodes('img') %>% 
    html_attr('src') %>% 
    keep(~str_detect(.x, '\\.gif$')) %>% 
    map_chr(~str_match(.x, '/(.+)\\.gif')[, 2])
}
sabesp_conteudo <- function(r) {
  nomes <- sabesp_nm_sistemas(r)
  r %>% 
    content('text') %>% 
    read_html() %>% 
    html_node('#tabDados') %>% 
    html_table(fill = TRUE) %>%
    select(titulo = X1, info = X2) %>%
    filter(titulo != '') %>%
    mutate(lugar = rep(nomes, each = 4)) %>% #View
    mutate(info = info %>% 
             str_extract('[-0-9, %m]+$') %>% 
             str_replace_all('^[^:]+:', '') %>% 
             str_replace_all(',', '.') %>% 
             str_replace_all('[^0-9.]', '') %>%
             as.numeric()) %>% 
    as_tibble()
}

# exemplo
sabesp_conteudo(result)
## # A tibble: 24 x 3
##    titulo                               info lugar              
##    <chr>                               <dbl> <chr>              
##  1 índice armazenado                    62.5 sistemaCantareira  
##  2 pluviometria do dia                   0   sistemaCantareira  
##  3 pluviometria acumulada no mês        50.1 sistemaCantareira  
##  4 pluviometria média histórica do mês 203.  sistemaCantareira  
##  5 índice armazenado                    53.9 sistemaAltoTiete   
##  6 pluviometria do dia                   0   sistemaAltoTiete   
##  7 pluviometria acumulada no mês        54   sistemaAltoTiete   
##  8 pluviometria média histórica do mês 195.  sistemaAltoTiete   
##  9 índice armazenado                    78.9 sistemaGuarapiranga
## 10 pluviometria do dia                   3.4 sistemaGuarapiranga
## # … with 14 more rows
sabesp_dia <- function(data) {
  link <- 'http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx'
  txt <- GET(link)
  viewstate <- pegar_tags(txt, "#__VIEWSTATE")
  eventval <- pegar_tags(txt, "#__EVENTVALIDATION")
  form <- sabesp_dados(data, viewstate, eventval)
  result <- POST(link, body = form)
  d_res <- sabesp_conteudo(result) %>% 
    mutate(result = 'OK')
  return(d_res)
}

# exemplo
sabesp_dia('2017-02-14')
## # A tibble: 24 x 4
##    titulo                               info lugar               result
##    <chr>                               <dbl> <chr>               <chr> 
##  1 índice armazenado                    62.5 sistemaCantareira   OK    
##  2 pluviometria do dia                   0   sistemaCantareira   OK    
##  3 pluviometria acumulada no mês        50.1 sistemaCantareira   OK    
##  4 pluviometria média histórica do mês 203.  sistemaCantareira   OK    
##  5 índice armazenado                    53.9 sistemaAltoTiete    OK    
##  6 pluviometria do dia                   0   sistemaAltoTiete    OK    
##  7 pluviometria acumulada no mês        54   sistemaAltoTiete    OK    
##  8 pluviometria média histórica do mês 195.  sistemaAltoTiete    OK    
##  9 índice armazenado                    78.9 sistemaGuarapiranga OK    
## 10 pluviometria do dia                   3.4 sistemaGuarapiranga OK    
## # … with 14 more rows
sabesp_dias <- function(datas) {
  sabesp_dia_safe <- failwith(tibble(result = 'erro'), sabesp_dia)
  datas %>% 
    setNames(as.character(datas)) %>% 
    purrr::map_df(sabesp_dia_safe, .id = 'data')
}

# exemplo
dts <- as.Date('2017-02-14') - lubridate::days(0:13 * 30)
d_sabesp <- sabesp_dias(dts)
## Warning: Deprecated: please use `purrr::possibly()` instead
d_sabesp
## # A tibble: 336 x 5
##    data       titulo                              info lugar              result
##    <chr>      <chr>                              <dbl> <chr>              <chr> 
##  1 2017-02-14 índice armazenado                   62.5 sistemaCantareira  OK    
##  2 2017-02-14 pluviometria do dia                  0   sistemaCantareira  OK    
##  3 2017-02-14 pluviometria acumulada no mês       50.1 sistemaCantareira  OK    
##  4 2017-02-14 pluviometria média histórica do m… 203.  sistemaCantareira  OK    
##  5 2017-02-14 índice armazenado                   53.9 sistemaAltoTiete   OK    
##  6 2017-02-14 pluviometria do dia                  0   sistemaAltoTiete   OK    
##  7 2017-02-14 pluviometria acumulada no mês       54   sistemaAltoTiete   OK    
##  8 2017-02-14 pluviometria média histórica do m… 195.  sistemaAltoTiete   OK    
##  9 2017-02-14 índice armazenado                   78.9 sistemaGuarapiran… OK    
## 10 2017-02-14 pluviometria do dia                  3.4 sistemaGuarapiran… OK    
## # … with 326 more rows
library(ggplot2)
d_sabesp %>% 
  filter(titulo == 'índice armazenado') %>%
  mutate(data = ymd(data)) %>% 
  ggplot(aes(x = data, y = info, colour = lugar)) +
  geom_line() +
  theme_bw()