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.
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 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.
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