Librerías
Para realizar la manipulación de los datos cargamos la librería tidyverse la cual nos permite manipular nuestros datos.
Lectura y verificación de datos
Cargamos la base de datos a un data frame llamado df_Muertes:
Revisamos la estructura del data frame:
## 'data.frame': 41867 obs. of 10 variables:
## $ anio : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ coddivipola : int 15001 15001 99524 50001 50001 50001 50001 50006 50001 50001 ...
## $ sexo : Factor w/ 3 levels "Femenino","Indeterminado",..: 3 3 3 3 3 1 3 3 3 3 ...
## $ edad : int 22 40 20 19 31 51 20 31 28 35 ...
## $ estcivil : int 5 5 5 9 9 1 5 6 2 1 ...
## $ estcivilnombre: Factor w/ 7 levels "Dos o mas años conviviendo",..: 5 5 5 7 7 1 5 3 2 1 ...
## $ niveledu : int 9 2 3 99 2 2 2 3 99 2 ...
## $ niveledunombre: Factor w/ 14 levels "Basica primaria",..: 11 1 2 12 1 1 1 2 12 1 ...
## $ cbas1 : Factor w/ 358 levels "X610","X614",..: 39 158 300 163 163 163 186 158 158 178 ...
## $ nbas1 : Factor w/ 154 levels "","AGRESION CON DISPARO DE ARMA CORTA: AREA INDUSTRIAL Y DE LA CONSTRUCCION",..: 112 12 91 12 12 12 33 12 12 35 ...
Realizamos una vista previa de los datos:
## anio coddivipola sexo edad estcivil estcivilnombre niveledu
## 1 2010 15001 Masculino 22 5 Estaba soltero(a) 9
## 2 2010 15001 Masculino 40 5 Estaba soltero(a) 2
## 3 2010 99524 Masculino 20 5 Estaba soltero(a) 3
## 4 2010 50001 Masculino 19 9 Sin informacion 99
## 5 2010 50001 Masculino 31 9 Sin informacion 2
## 6 2010 50001 Femenino 51 1 Dos o mas años conviviendo 2
## niveledunombre cbas1
## 1 Profesional X700
## 2 Basica primaria X954
## 3 Basica secundaria Y249
## 4 Sin informacion X959
## 5 Basica primaria X959
## 6 Basica primaria X959
## nbas1
## 1 LESION AUTOINFLIGIDA INTENCIONALMENTE POR AHORCAMIENTO
## 2 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 3 DISPARO DE OTRAS ARMAS DE FUEGO
## 4 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 5 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 6 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
Al revisar la estructura y la vista previa de los datos observamos que debido a que la base de datos es un archivo CSV se toma la variable coddivipola como una variable de tipo integer y por tal motivo elimina el cero a la izquierda por tanto debemos de cambiar el tipo de variable a carácter y corregimos los datos que no tienen el 0 (cero) a la izquierda:
df_Muertes$coddivipola <- as.character(df_Muertes$coddivipola)
df_Muertes$coddivipola <- gsub("5001","05001",df_Muertes$coddivipola, fixed = TRUE)
df_Muertes$coddivipola <- gsub("5002","05002",df_Muertes$coddivipola, fixed = TRUE)
df_Muertes$coddivipola <- gsub("5004","05004",df_Muertes$coddivipola, fixed = TRUE)La base de muertes violentas tiene 41867 filas y 10 columnas y los nombres de sus variables son los siguientes:
## [1] "anio" "coddivipola" "sexo" "edad"
## [5] "estcivil" "estcivilnombre" "niveledu" "niveledunombre"
## [9] "cbas1" "nbas1"
Limpieza de los datos
Eliminamos las variables estcivil y cbas1 ya que no aportan imformación valiosa a los lectores de la base de datos:
Modificamos el nombre de las columnas para un mayor entendimiento y manipulación de las variables:
En la variable CodNivelEdu el código 13 indica que la persona no tiene nivel de escolaridad, en concordancia con los otros códigos, lo debemos cambiar por 0 (cero). El código 99 indica que no hay información sobre el nivel de escolaridad del ciudadano y por tal motivo lo debemos cambiar por valor nulo o vacío:
df_Muertes$CodNivelEdu<-gsub("13","0",df_Muertes$CodNivelEdu, fixed = TRUE)
df_Muertes$CodNivelEdu<-gsub("99","",df_Muertes$CodNivelEdu, fixed = TRUE)En las variables EstadoCivil y ClasNivelEdu debemos cambiar el valor “Sin información” por valor nulo o vacío:
df_Muertes$EstadoCivil <- gsub("Sin informacion","",df_Muertes$EstadoCivil, fixed = TRUE)
df_Muertes$ClasNivelEdu <- gsub("Sin informacion","",df_Muertes$ClasNivelEdu, fixed = TRUE)Verificamos los valores únicos de la variable EstadoCivil:
## [1] "Estaba soltero(a)" ""
## [3] "Dos o mas años conviviendo" "Estaba casado(a)"
## [5] "Dos o menos años conviviendo" "Estaba separado(a) o divorciado(a)"
## [7] "Estaba viudo(a)"
Posteriormente, realizamos cambios para mejorar los datos:
df_Muertes$EstadoCivil <- gsub("Estaba soltero(a)","Soltero(a)", df_Muertes$EstadoCivil, fixed = TRUE)
df_Muertes$EstadoCivil <- gsub("Estaba viudo(a)","Viudo(a)", df_Muertes$EstadoCivil, fixed = TRUE)
df_Muertes$EstadoCivil <- gsub("Estaba casado(a)","Casado(a)", df_Muertes$EstadoCivil, fixed = TRUE)
df_Muertes$EstadoCivil <- gsub("Estaba separado(a) o divorciado(a)","Separado(a)", df_Muertes$EstadoCivil, fixed = TRUE)Mejoramiento de la base de datos
Definimos categorías para los grupos poblacionales de la siguiente manera:
- Niño o Niña de 0 a 11 años
- Adolescente de 12 a 17 años
- Joven de 18 a 28 años
- Adulto de 29 a 59 años
- Mayor de 60 en adelante.
Creamos una nueva variable llamada GrupoPoblacional, utilizando el vector numérico de la Edad y lo agrupamos en intervalos según los grupos de edades anteriores:
GrupoPoblacional <- cut(df_Muertes$Edad, breaks = c(0,11,17,28,59,200), labels = c("Niño(a)","Adolescente","Joven","Adulto(a)","Mayor"))
df_Muertes$GrupoPoblacional <- GrupoPoblacionalPara identificar el departamento y municipio de las muertes debemos cargar otro data frame con la información DIVIPOLA:
Revisamos la estructura del data frame:
## 'data.frame': 1122 obs. of 4 variables:
## $ Codigo.Departamento: int 5 41 41 76 20 68 17 85 15 41 ...
## $ Codigo.Municipio : int 5002 41006 41013 76243 20011 68013 17013 85010 15720 41016 ...
## $ Nombre.Departamento: Factor w/ 33 levels "Amazonas","Antioquia",..: 2 19 19 31 13 28 9 11 8 19 ...
## $ Nombre.Municipio : Factor w/ 1036 levels "A<81>brego","A<8d>quira",..: 3 7 9 261 11 12 13 14 850 16 ...
Realizamos una vista previa de los datos:
## Codigo.Departamento Codigo.Municipio Nombre.Departamento Nombre.Municipio
## 1 5 5002 Antioquia Abejorral
## 2 41 41006 Huila Acevedo
## 3 41 41013 Huila Agrado
## 4 76 76243 Valle del Cauca El a<81>guila
## 5 20 20011 Cesar Aguachica
## 6 68 68013 Santander Aguada
Al revisar la estructura y la vista previa de los datos observamos que debido a que la base de datos es un archivo CSV se toma la variable Codigo.Municipio como una variable de tipo integer y por tal motivo elimina el cero a la izquierda por tanto debemos de cambiar el tipo de variable a carácter y corregimos los datos que no tienen el 0 (cero) a la izquierda:
df_divipola$Codigo.Municipio <- as.character(df_divipola$Codigo.Municipio)
df_divipola$Codigo.Municipio <- gsub("5001","05001",df_divipola$Codigo.Municipio, fixed = TRUE)
df_divipola$Codigo.Municipio <- gsub("5002","05002",df_divipola$Codigo.Municipio, fixed = TRUE)
df_divipola$Codigo.Municipio <- gsub("5004","05004",df_divipola$Codigo.Municipio, fixed = TRUE)Procedemos ahora a cruzar los dos data frame con la función merge:
Revisamos nuevamente la estrctura de las variables del data frame:
## [1] "Cod_Territorio" "Anio" "Genero"
## [4] "Edad" "EstadoCivil" "CodNivelEdu"
## [7] "ClasNivelEdu" "DesMuerte" "GrupoPoblacional"
## [10] "Codigo.Departamento" "Nombre.Departamento" "Nombre.Municipio"
Eliminamos las variables que ya no son útiles:
Renombramos nuevamente las variables:
Reordenamos las variables:
Verificamos la estructura final y los datos:
## 'data.frame': 41867 obs. of 10 variables:
## $ Anio : int 2011 2011 2012 2011 2011 2011 2011 2011 2011 2011 ...
## $ Departamento : Factor w/ 33 levels "Amazonas","Antioquia",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Municipio : Factor w/ 1036 levels "A<81>brego","A<8d>quira",..: 515 515 515 515 515 515 515 515 515 515 ...
## $ Genero : Factor w/ 3 levels "Femenino","Indeterminado",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ Edad : int 37 55 19 30 47 18 21 14 30 20 ...
## $ GrupoPoblacional: Factor w/ 5 levels "Niño(a)","Adolescente",..: 4 4 3 4 4 3 3 2 4 3 ...
## $ EstadoCivil : chr "Soltero(a)" "" "Soltero(a)" "" ...
## $ CodNivelEdu : chr "" "" "" "" ...
## $ ClasNivelEdu : chr "" "" "" "" ...
## $ DesMuerte : Factor w/ 154 levels "","AGRESION CON DISPARO DE ARMA CORTA: AREA INDUSTRIAL Y DE LA CONSTRUCCION",..: 12 12 12 58 1 12 12 12 28 12 ...
## Anio Departamento Municipio Genero Edad GrupoPoblacional EstadoCivil
## 1 2011 Antioquia Medellin Masculino 37 Adulto(a) Soltero(a)
## 2 2011 Antioquia Medellin Masculino 55 Adulto(a)
## 3 2012 Antioquia Medellin Masculino 19 Joven Soltero(a)
## 4 2011 Antioquia Medellin Masculino 30 Adulto(a)
## 5 2011 Antioquia Medellin Masculino 47 Adulto(a) Separado(a)
## 6 2011 Antioquia Medellin Masculino 18 Joven Soltero(a)
## CodNivelEdu ClasNivelEdu DesMuerte
## 1 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 2 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 3 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
## 4 AGRESION POR AHORCAMIENTO
## 5
## 6 AGRESION CON DISPARO DE OTRAS ARMAS DE FUEGO
Finalmente, exportamos los datos: