--- title: "CleaningTheData" author: "Juan Felipe Múnera" date: "3/4/2020" output: html_document: css: Format.css --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ```{r} library(dplyr) ``` - OBJECTID: id de cada registro. - X: coordenada. - Y: coordenada. - RADICADO: código emitido por la secretaría de movilidad de Medellín. - FECHA. - HORA. - DIA. - PERIODO: año del siniestro. - CLASE: tipo de accidente - DIRECCION. - DIRECCION_ENC. - CBML: Código de ubicación del predio en la ciudad. - TIPO_GEOCOD. - GRAVEDAD: repercusiones del accidente - BARRIO. - COMUNA. - DISENO: clasificación del lugar del accidente. - DIA_NOMBRE. - MES. ## Carga bases ```{r} ##Lectura de las 6 bases de datos desde el drectorio getwd() #CHECKEAR QUE EL DIRECTORIO SEA EL DONDE ESTA EL ARCHIVO files_names= list.files(pattern="*.csv", path = paste(getwd(),"/datasets/Original",sep="")) path <- paste(getwd(),"/datasets/Original/",files_names[-6],sep="") ##Lectura de los datos 2014-2018. df <- do.call(rbind, lapply(path, function(x) read.csv(x, stringsAsFactors = FALSE,encoding = "UTF-8", ) )) #La estructura de los datos del 2019 es diferente df_2019 <- read.csv(paste(getwd(),"/datasets/Original/",files_names[6],sep=""), header=T, encoding="UTF-8") colnames(df)[1] <- gsub('X.U.FEFF.','',colnames(df)[1]) colnames(df_2019)[1] <- gsub('X.U.FEFF.','',colnames(df_2019)[1]) ``` ```{r} #Seleccionamos las columnas relevantes cols <- c("OBJECTID", "RADICADO", "CLASE", "GRAVEDAD", "BARRIO", "COMUNA", "TIPO_GEOCOD", "FECHA", "HORA", "DIA", "MES", "PERIODO", "DIA_NOMBRE", "COMUNA") ## Creando base completa df_accidentes <- rbind(df[,cols], df_2019[,cols]) ``` ## Depuración de datos Solo son relevantes los accidentes en el área metropolitana. ```{r} ## Se eliminan accidentes de la zona rural (284 observaciones) temp <- df_accidentes[df_accidentes$TIPO_GEOCOD!="ZONA RURAL",] df_accidentes[df_accidentes$GRAVEDAD == "CON MUERTO",]$GRAVEDAD <- "MUERTO" df_accidentes[df_accidentes$CLASE == "Caída Ocupante" | df_accidentes$CLASE == "Caída de Ocupante",]$CLASE <- "Caida Ocupante" df_accidentes[df_accidentes$CLASE == "",]$CLASE <- "Otro" df_accidentes[df_accidentes$CLASE == "Choque " | df_accidentes$CLASE == 'Choque y Atropello',]$CLASE <- "Choque" temp <- df_accidentes df_accidentes <- temp %>% mutate_at(c("CLASE", "GRAVEDAD"), as.factor) remove(temp) ``` ```{r} dups <- df_accidentes[duplicated(df_accidentes[,"RADICADO"]),] dups2 <- df_accidentes[duplicated(df_accidentes[,"OBJECTID"]),] ``` ## Selección de accidentes de las 16 comunas: ```{r} comunas <- count(df_accidentes, COMUNA) #EN su mayoria las comunas con menos de 4 accidentes son tabulaciones erroneas d eun barreo o hacen referencia a zonas que no pertenecen a las 16 comunas principales de medellín comunas_relevantes <- head(comunas[order(-comunas$n),][1], 16) ## Las 16 más accidentadas corresponden al área metropolitana df_accidentes <- filter(df_accidentes, COMUNA %in% unlist(comunas_relevantes)) ``` ## Corrección de barrios ```{r} barrios <-c("Aures No. 2", "Asomadera No. 1" ,"Barrio de Jesús","B. Cerro El Volador" ,"Berlin","Bomboná No. 1","Campo Valdés No.2","Manrique Central No.1","Manrique Central No.2","Moscú No.1","Moscú No.2", "Nueva Villa de La Iguaná","Santa María de Los Ángeles","Santo Domingo Savio No.1","Versalles No.1","Versalles No.2","Villa Liliam") reemplazo <- c("Aures No.2", "Asomadera No.1", "Barrios de Jesús","B. Cerro El Volador" ,"Berlín","Bomboná No.1","Campo Valdés No. 2","Manrique Central No. 1","Manrique Central No. 2","Moscú No. 1","Moscú No. 2", "Nueva Villa de la Iguaná","Santa María de los Ángeles","Santo Domingo Savio No. 1","Versalles No. 1","Versalles No. 2","Villa Lilliam") for(i in (1:length(barrios))){ df_accidentes[!is.na(df_accidentes$BARRIO) & df_accidentes$BARRIO == barrios[i],]$BARRIO = reemplazo[i] } ``` ##NA inspection De momento opto por remover los NA, luego podemos ver si es preferible realiza imputaciones. ```{r} df_accidentes[df_accidentes == ""] <- NA na_DF <- df_accidentes[rowSums(is.na(df_accidentes)) > 0,]# Las columnas con NA son diseño (gran mayoria) y clase final.df<- na.omit(df_accidentes[,-2]) #DF sin NAs temp <- filter(final.df, BARRIO=="0" | BARRIO=="Sin Nombre") final.df <- filter(final.df, BARRIO!="0" & BARRIO!="Sin Nombre") ``` ```{r} write.csv(final.df, "Datasets/base_Depurada.csv", row.names=F) ``` ## Creación de conjunto de datos ```{r} df_mens <- final.df %>% group_by(COMUNA, BARRIO, PERIODO, MES, CLASE)%>% summarise(N.accidentes = n()) df_mens <- tidyr::spread(df_mens, 5, 6) df_mens[is.na(df_mens)] <- 0 df_mens$nro.accidentes <- apply(df_mens[,5:10], 1, sum) # Añadiendo identificador df_mens <- df_mens %>% mutate( cod = paste(COMUNA, BARRIO, PERIODO, MES, sep="") ) temp <- unique(df_mens[, 1:2]) temp <- tidyr::crossing(temp, data.frame(PERIODO= rep(c(2014:2019), each=12),MES = rep(1:12, 6))) temp <- temp %>% mutate( Atropello=0, 'Caida Ocupante'=0, Choque=0, Incendio = 0, Otro=0, Volcamiento=0, nro.accidentes = 0, cod = paste(COMUNA, BARRIO, PERIODO, MES, sep="") ) temp <- temp[!(temp$cod %in% df_mens$cod),] ## corrigiendo error random? temp$PERIODO2 <- temp$PERIODO; df_mens$PERIODO2 <- df_mens$PERIODO df_mens_complete <- rbind(df_mens[-c(3,12)], temp[-c(3,12)]) ``` ```{r} #cHEQUEO ##temP3 <- df_mens_complete %>% group_by(COMUNA, BARRIO) %>% summarise(n= n()) ``` ```{r} colnames(df_mens_complete) <- c(colnames(df_mens_complete)[1:10],"PERIODO") df_mens_complete$Otro <- df_mens_complete$Otro + df_mens_complete$Incendio df_mens_complete <- df_mens_complete[,-7] write.csv(df_mens_complete[c(1:2, 10, 3:9)], file("Datasets/base_mensual_barrios_y_comunas.csv", encoding="UTF-8"),row.names = F) ``` ```{r} sum(with(df_mens_complete, nro.accidentes-Volcamiento-Otro-Choque-Atropello) - df_mens_complete$`Caida Ocupante`) ```