Esta é parte da programação para um trabalho de análise de custo de acidente de trânsito. Seu resultado pode ser conferido na notícia.

Documentei parte da análise como tutorial de como manipular sua base de dados de maneira rápida, limpa e eficiente.

Os recentes pacotes dplyr e tidyr foram amplamente utilizados neste trabalho. Aconselho também o uso do pacote datatable.

Primeiros passos

Primeiramente, vamos visualizar os dados previamente carregados:

glimpse(acidentes)
## Observations: 388,896
## Variables: 35
## $ Código.Ocorrência         (int) 635992, 635995, 635995, 636000, 6360...
## $ Ano                       (int) 2010, 2010, 2010, 2010, 2010, 2010, ...
## $ Causa.Acidente            (chr) "Ingestão de álcool", "Falta de aten...
## $ Horário                   (chr) "00:20:00", "00:50:00", "00:50:00", ...
## $ Classificação.Acidente    (chr) "Sem vítimas", "Com vítimas feridas"...
## $ Condição.Meteorológica    (chr) "Chuva", "Nublado", "Nublado", "Igno...
## $ Colisão.Objeto.Fixo       (chr) "Meio Fio", "Não Houve", "Não Inform...
## $ Equipamento.Segurança     (chr) "Sim", "Ignorado", "Não Aplicável", ...
## $ Fase.Dia                  (chr) "Plena noite", "Plena noite", "Plena...
## $ Uso.Solo                  (chr) "Urbano", "Urbano", "Urbano", "Urban...
## $ UF                        (chr) "GO", "SC", "SC", "AL", "AL", "RS", ...
## $ Traçado.Via               (chr) "Reta", "Reta", "Reta", "Reta", "Ret...
## $ Sentido.Via               (chr) "Decrescente", "Decrescente", "Decre...
## $ Tipo.Acidente             (chr) "Saída de Pista", "Atropelamento de ...
## $ Tipo.Pista                (chr) "Dupla", "Simples", "Simples", "Simp...
## $ BR                        (int) 60, 101, 101, 316, 316, 116, 116, 31...
## $ KM                        (int) 936, 1013, 1013, 2775, 2775, 2089, 2...
## $ Município                 (chr) "Anapolis", "Picarras", "Picarras", ...
## $ Dano.Patrimonio.Ambiental (chr) "FALSO", "FALSO", "FALSO", "FALSO", ...
## $ Dano.Patrimonio.Terceiro  (chr) "FALSO", "FALSO", "FALSO", "FALSO", ...
## $ Dano.Patrimonio.União     (chr) "FALSO", "FALSO", "FALSO", "FALSO", ...
## $ Tipo.Envolvido            (chr) "Condutor", "Condutor", "Pedestre", ...
## $ Estado.Físico             (chr) "Ileso", "Ferido Ignorado", "Ferido ...
## $ Categoria.CNH             (chr) "AB", "Não Informado", "Não Informad...
## $ Idade                     (int) 35, -1, 49, 38, 46, 52, 23, 30, 53, ...
## $ Sexo                      (chr) "Masculino", "Inválido", "Masculino"...
## $ Produto.Perigoso          (chr) "Inválido", "Inválido", "Não Informa...
## $ Tipo.Veículo              (chr) "Automóvel", "Automóvel", "Não se Ap...
## $ Ano.Fabricação.Veiculo    (int) 1993, 0, -3, 2008, 2006, 0, 2008, 20...
## $ Marca                     (chr) "Gm/Vectra Cd                       ...
## $ Qtd..Ocorrência           (int) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
## $ Qtd..Feridos.Leves        (int) 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, ...
## $ Qtd..Feridos.Graves       (int) 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, ...
## $ Qtd..Mortos               (int) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ Qtd..Ilesos               (int) 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, ...

Agora, vamos selecionar as variáveis a serem utilizadas na análise, ordená-las e alterar seus nomes para melhor uso:

acidentes <-
  acidentes %>%
  arrange(Código.Ocorrência) %>%
  select(Código.Ocorrência, Classificação.Acidente,
         Qtd..Feridos.Leves, Qtd..Feridos.Graves, Qtd..Mortos, Qtd..Ilesos,
         Tipo.Veículo, UF, Tipo.Envolvido,
         BR, Causa.Acidente) 

names(acidentes) <- 
  c("ocorrencia","classificacao","feridoleve",
    "feridograve",'morto','ileso','veiculo','uf','desc_envolvido',
    'br','causa')

Organizar a base

Organizar a sua base de dados é um passo importante para qualquer análise e que muitas vezes é deixado de lado. Este documento trabalha basicamente a manipulaçao de uma base de dados.

A tabela abaixo nos mostra algo comum em bases de dados. Entradas excedentes ao esperado. Existem apenas três classificações de acidente. Perceba que a entrada no banco de dados trouxe algumas classificações a mais.

Verificou-se que a inputaçao Ignorado se tratava de acidentes sem vítimas.

table(acidentes$classificacao)
## 
##  Com vítimas fatais Com vítimas feridas            Ignorado 
##               21848              148055                1131 
##         Sem vítimas 
##              217862
acidentes <- 
  acidentes %>%
  mutate(classificacao =
           iconv(classificacao, to = 'ASCII//TRANSLIT')) %>% #tirar acentos
  mutate(classificacao =
           tolower(classificacao)) %>% #tudo minusculo
  mutate(classificacao = 
           ifelse(classificacao %in% c('ignorado'),
                  'sem vitimas', classificacao))  

table(acidentes$classificacao)
## 
##  com vitimas fatais com vitimas feridas         sem vitimas 
##               21848              148055              218993

Importante ressaltar:

Fuja de loops para transformar sua base. Dê preferência a análises vetorizadas são muito mais eficientes e limpas.

Agora o processo se repete para a descriçao dos envolvidos no acidente. Irei usar esta variável apenas como referencial para evitar a recontagem de um carro no acidente. Mais para frente ficará mais claro.

table(acidentes$desc_envolvido)
## 
##  Cavaleiro   Condutor Passageiro   Pedestre 
##         86     321206      61562       6042
acidentes <-
  acidentes %>%  
  mutate(envolvimento = 
           ifelse(desc_envolvido == 'Condutor', 1, 0))

Algumas outras alterações forma feitas, mas para compactar o documento não foram documentadas aqui.

De cabeça para baixo

Antes de revirar nossa base vamos observar como está até agora com as nossas alterações:

head(acidentes, 10)
##    ocorrencia       classificacao feridoleve feridograve morto ileso
## 1      635992         sem vitimas          0           0     0     1
## 2      635995 com vitimas feridas          0           0     0     0
## 3      635995 com vitimas feridas          1           0     0     0
## 4      636000 com vitimas feridas          0           1     0     0
## 5      636000 com vitimas feridas          0           0     0     1
## 6      636003 com vitimas feridas          0           1     0     0
## 7      636003 com vitimas feridas          0           0     0     1
## 8      636004 com vitimas feridas          1           0     0     0
## 9      636004 com vitimas feridas          0           0     0     1
## 10     636008         sem vitimas          0           0     0     1
##           veiculo uf desc_envolvido  br                       causa
## 1       AUTOMOVEL GO       Condutor  60          Ingestão de álcool
## 2       AUTOMOVEL SC       Condutor 101            Falta de atenção
## 3  SEM_INFORMACAO SC       Pedestre 101            Falta de atenção
## 4     MOTOCICLETA AL       Condutor 316            Falta de atenção
## 5       AUTOMOVEL AL       Condutor 316            Falta de atenção
## 6       BICICLETA RS       Condutor 116            Falta de atenção
## 7       AUTOMOVEL RS       Condutor 116            Falta de atenção
## 8     MOTOCICLETA PA       Condutor 316 Desobediência à sinalização
## 9       AUTOMOVEL PA       Condutor 316 Desobediência à sinalização
## 10      AUTOMOVEL MG       Condutor 381     Velocidade incompatível
##    envolvimento
## 1             1
## 2             1
## 3             0
## 4             1
## 5             1
## 6             1
## 7             1
## 8             1
## 9             1
## 10            1

Observe que existem mais de uma entrada para a mesma ocorrência. O nosso estudo precisa de informação por acidente, portanto precisa-se agrupar essas informações.

Além disso, estou interessando na quantidade de cada tipo de veículo envolvido no acidente. Nesse ponto que entra a variável envolvimento que criamos anteriormente.

Pelos dados foi verificado que a entrada de dados é a partir de cada pessoa envolvida. Ou seja, as três entradas da ocorrência 1 se deve ao fato de 3 pessoas estarem envolvidas no acidente. Logo, isso possibilita que na contagem de veículos o mesmo carro seja contado mais de uma vez e para evitarmos isso vamos contar apenas os veículos com valor 1 na variável envolvimento (condutores).

Por fim, gostaria também de contar a quantidade de pessoas segundo sua lesão. Veja a programação explicada passo a passo abaixo:

custoaci <- 
  acidentes %>%
  mutate(veiculo = tolower(veiculo)) %>%
  group_by(ocorrencia, classificacao, uf, br, causa, veiculo) %>%
  summarise(qtd = sum(envolvimento), #contar o numero de vezes que aparece o veiculo (com condutor)
            ileso = sum(ileso),
            feridoleve = sum(feridoleve),
            feridograve = sum(feridograve),
            morto = sum(morto)) %>%
  mutate_each(funs(sum), -c(qtd,veiculo)) %>% # agrupar aplicando soma às linhas
  ungroup() %>%
  spread(veiculo, qtd, fill = 0)  %>%  #transformar a coluna com nome dos veiculos em varias colunas recebendo o valor de qtd
 select(ocorrencia:morto,automovel,motocicleta,bicicleta,
         utilitario,caminhao,onibus,outros,sem_informacao)  %>%  #reordenando as colunas
  arrange(ocorrencia) %>%
  data.frame(.)

Observe a mudança!

head(custoaci, 10)
##    ocorrencia       classificacao uf  br                       causa ileso
## 1      635992         sem vitimas GO  60          Ingestão de álcool     1
## 2      635995 com vitimas feridas SC 101            Falta de atenção     0
## 3      636000 com vitimas feridas AL 316            Falta de atenção     1
## 4      636003 com vitimas feridas RS 116            Falta de atenção     1
## 5      636004 com vitimas feridas PA 316 Desobediência à sinalização     1
## 6      636008         sem vitimas MG 381     Velocidade incompatível     1
## 7      636013 com vitimas feridas RJ 116 Desobediência à sinalização     0
## 8      636017 com vitimas feridas PB 230            Falta de atenção     1
## 9      636018         sem vitimas PB 230            Falta de atenção     2
## 10     636020 com vitimas feridas SC 282     Velocidade incompatível     0
##    feridoleve feridograve morto automovel motocicleta bicicleta utilitario
## 1           0           0     0         1           0         0          0
## 2           1           0     0         1           0         0          0
## 3           0           1     0         1           1         0          0
## 4           0           1     0         1           0         1          0
## 5           1           0     0         1           1         0          0
## 6           0           0     0         1           0         0          0
## 7           0           1     0         0           1         0          0
## 8           1           0     0         1           1         0          0
## 9           0           0     0         2           0         0          0
## 10          2           0     0         1           0         0          0
##    caminhao onibus outros sem_informacao
## 1         0      0      0              0
## 2         0      0      0              0
## 3         0      0      0              0
## 4         0      0      0              0
## 5         0      0      0              0
## 6         0      0      0              0
## 7         0      0      0              0
## 8         0      0      0              0
## 9         0      0      0              0
## 10        0      0      0              0