Analizar un conjunto de datos por medio de estadísticos descriptivos y gráficos, y obtener conclusiones y/o propuestas de lo observado.
df=read.csv("C:/Users/parcs/OneDrive/Escritorio/ipn/Cursos/R-Básico/natalidad.csv")
dim(df)
## [1] 2162535 44
names(df)
## [1] "ent_regis" "mun_regis" "loc_regis" "tloc_regis" "ent_resid"
## [6] "mun_resid" "loc_resid" "tloc_resid" "ent_ocurr" "mun_ocurr"
## [11] "loc_ocurr" "tloc_ocurr" "sexo" "edad_reg" "edad_madn"
## [16] "edad_padn" "dia_nac" "mes_nac" "ano_nac" "dia_reg"
## [21] "mes_reg" "ano_reg" "edad_madr" "edad_padr" "tipo_nac"
## [26] "orden_part" "lugar_part" "q_atendio" "hijos_vivo" "hijos_sobr"
## [31] "edociv_mad" "escol_mad" "escol_pad" "act_mad" "act_pad"
## [36] "pos_mad" "pos_pad" "sitlab_mad" "sitlab_pad" "fue_prese"
## [41] "hora_nac" "minuto_nac" "comparecio" "dis_re_oax"
La descripción de cada atributo la tenemos en la siguiente tabla:
| Atributo | Descripción |
|---|---|
| Ent_regis | Entidad de registro |
| Mun_regis | Municipio de registro |
| Loc_regis | Localidad de registro |
| Tloc_regis | Tamaño de localidad de registro |
| Ent_resid | Entidad de residencia habitual de la madre |
| Mun_resid | Municipio de residencia habitual de la madre |
| Loc_resid | Localidad de residencia habitual de la madre |
| Tloc_resid | Tamaño de localidad de residencia de la madre |
| Ent_ocurr | Entidad de ocurrencia |
| Mun_ocurr | Municipio de ocurrencia |
| Loc_ocurr | Localidad de ocurrencia |
| Tloc_ocurr | Tamaño de localidad de ocurrencia |
| Sexo Sexo | del registrado |
| Edad_reg | Edad del registrado |
| Edad_madn | Edad de la madre al momento del nacimiento |
| Edad_padn | Edad del padre al momento del nacimiento |
| Dia_nac | Día de ocurrencia |
| Mes_nac | Mes de ocurrencia |
| Ano_nac | Año de ocurrencia |
| Dia_reg | Día de registro |
| Mes_reg | Mes de registro |
| Ano_reg | Año de registro |
| Edad_madr | Edad de la madre al momento del registro |
| Edad_padr | Edad del padre al momento del registro |
| Tipo_nac | Tipo de nacimiento |
| Orden_part | Orden del nacimiento o parto |
| Lugar_part | Lugar de atención del parto |
| Q_atendio | Persona que atendió el parto |
| Hijos_vivo | Número de hijos nacidos vivos |
| Hijos_sobr | Número de hijos sobrevivientes |
| Edociv_mad | Estado conyugal (civil) de la madre |
| Escol_mad | Nivel de escolaridad de la madre (escolaridad) |
| Escol_pad | Nivel de escolaridad del padre (escolaridad) |
| Act_mad | Condición de actividad económica de la madre |
| Act_pad | Condición de actividad económica del padre |
| Pos_mad | Posición en el trabajo de la madre |
| Pos_pad | Posición en el trabajo del padre |
| Sitlab_mad | Situación laboral de la madre |
| Sitlab_pad | Situación laboral del padre |
| Fue_prese | Condición de sobrevivencia del registrado |
| Hora_nac | Hora del nacimiento |
| Minuto_nac | Minuto del nacimiento |
| Comparecio | Compareció (declarante) |
| Dis_re_oax | Distrito de registro de Oaxaca |
Elijo cuatro atributos para analizar: escolaridad de la madre, edad de la madre al nacimiento, estado civil de la madre al registrar y entidad de residencia habitual de la madre.
Comenzaré con el resumen estadístico de los datos de escolaridad de la madre
summary(df$escol_mad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 5.000 5.000 5.588 6.000 9.000
Podemos ver que la escolaridad se muestra con valores numéricos del 1 al 9 y que la distribución es:
table(df$escol_mad)
##
## 1 2 3 4 5 6 7 8 9
## 45001 34081 27629 285644 774973 497386 283993 25262 188566
Es mejor si lo vemos con un gráfico
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(df, aes(x = escol_mad)) +
geom_bar(fill = "deeppink4") +
labs(title = "Distribución del Nivel de Escolaridad de la Madre",
x = "Nivel de Escolaridad",
y = "Frecuencia")
Los números representan las siguientes categorías:
| Valor | Categoría |
|---|---|
| 1 | Sin escolaridad |
| 2 | De 1 a 3 años de primaria |
| 3 | De 4 a 5 años de primaria |
| 4 | Primaria completa |
| 5 | Secundaria o equivalente |
| 6 | Preparatoria o equivalente |
| 7 | Profesional |
| 8 | Otra |
| 9 | No especificada |
Como podemos ver si queremos utilizar estos datos necesitamos hacer la limpieza de los datos en relación a escolaridad (8) “Otra” y (9) “No especificada”.
Para ello pienso que será mejor omitir los datos relacionados a esas categorías:
df_limpio <- df[df$escol_mad != 8 & df$escol_mad != 9, ]
Verificamos que se haya realizado correctamente
table(df_limpio$escol_mad)
##
## 1 2 3 4 5 6 7
## 45001 34081 27629 285644 774973 497386 283993
Ahora veamos el porcentaje de cada nivel de escolaridad en relación a los datos “limpios”:
prop.table(table(df_limpio$escol_mad)) * 100
##
## 1 2 3 4 5 6 7
## 2.309275 1.748903 1.417812 14.658130 39.768575 25.523899 14.573407
Podemos ver que el 39% de las madres tienen escolaridad de secundaria y el 25% tiene escolaridad de preparatoria. Pocas madres tienen menos escolaridad que la primaria terminada.
Se me ocurre que pueda haber relación entre la escolaridad de la madre y su edad al momento del nacimiento
Pero como sabemos los datos no se encuentran limpios, ahora el rango de edad es de 10 a 50, pero además se colocó el 99 en los casos que no se conoce la edad, pienso que lo más justo para los datos es retirar esos registros:
df_limpio2 <- df_limpio[df_limpio$edad_madn != 99, ]
Vemos que efectivamente se han retirado esos registros:
table(df_limpio2$edad_madn)
##
## 10 11 12 13 14 15 16 17 18 19 20
## 79 98 199 1068 5878 19915 44938 68387 94036 104458 109495
## 21 22 23 24 25 26 27 28 29 30 31
## 111332 112368 115099 113268 110441 105994 100071 94377 86833 80646 73981
## 32 33 34 35 36 37 38 39 40 41 42
## 66287 58777 52339 46626 39487 32085 26153 20143 15377 11040 7264
## 43 44 45 46 47 48 49 50
## 4627 2588 1494 763 439 264 201 332
Podemos observar el histograma
ggplot(df_limpio2, aes(x = factor(edad_madn))) +
geom_bar(fill = "firebrick") +
labs(title = "Histograma de edad de la madre",
x = "Edad de la madre",
y = "Frecuencia")
Observamos los estadísticos básicos:
summary(df_limpio2$edad_madn)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.00 21.00 25.00 25.85 30.00 50.00
Mostramos la relación entre el promedio de edad de la madre y su escolaridad:
media_edad <-aggregate(edad_madn ~ escol_mad, data = df_limpio2, FUN = mean)
ggplot(media_edad, aes(x = factor(escol_mad), y = edad_madn)) +
geom_bar(stat = "identity", fill = "chocolate") +
labs(title = "Media de la Edad de la Madre por Nivel de Escolaridad",
x = "Nivel de Escolaridad",
y = "Media de la Edad de la Madre")
Me pareció interesante ver si esa es la edad que más se repetía por nivel de escolaridad, por lo que busqué como calcular la moda en R, encontré una función que calcula la moda y la utilicé:
get_mode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
moda_edad <- aggregate(edad_madn ~ escol_mad, data = df_limpio2, FUN = get_mode)
ggplot(moda_edad, aes(x = factor(escol_mad), y = edad_madn)) +
geom_bar(stat = "identity", fill = "cadetblue3") +
labs(title = "Moda de la Edad de la Madre por Nivel de Escolaridad",
x = "Nivel de Escolaridad",
y = "Moda de la Edad de la Madre")
En este gráfico podemos ver los valores que más se repiten como edad de la madre al tener un hijo cuando no se tiene escolaridad o cuando sólo se estudió la primaria o secundaria es de menos de 20 años.
También podemos ver que la edad para las mujeres que deciden tener hijos cuando han sido profesionistas es alrededor de los 30 años.
Creo que también será interesante considerar la escolaridad de la madre y la relación con su estado civil.
Los datos de estado civil vienen en las siguientes categorías:
| Valor | Categoría |
|---|---|
| 1 | Soltera |
| 2 | Casada |
| 3 | Unión libre |
| 4 | Separada |
| 5 | Divorciada |
| 6 | Viuda |
| 9 | No especificado |
En este caso, considero que lo más justo es retirar los datos relacionados a la categoría “no especificado”.
df_limpio_civ <- df_limpio[df_limpio$edociv_mad != 9, ]
Podemos ver los resultados de la limpieza:
table(df_limpio_civ$edociv_mad)
##
## 1 2 3 4 5 6
## 247360 595743 1085260 4913 1612 1711
Veamos el histograma
ggplot(df_limpio_civ, aes(x = factor(edociv_mad))) +
geom_bar(fill = "chartreuse3") +
labs(title = "Histograma del estado civil",
x = "Estado civil",
y = "Frecuencia")
Vemos los estadísticos básicos:
summary(df_limpio_civ$edociv_mad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.444 3.000 6.000
Mostramos la relación entre la moda de estado civil de la madre y su escolaridad:
aggregate(edociv_mad ~ escol_mad, data = df_limpio_civ, FUN = median)
Como se puede apreciar la mediana indica que la para casi cualquier escolaridad las madres se encuentran en unión libre, mientras que solo para aquellas con estudios profesionales lo típico es que se encuentren casadas.
Podemos comparar estos resultados con la forma contraria, es decir, que probemos el nivel de escolaridad por cada estado civil:
aggregate(escol_mad ~ edociv_mad, data = df_limpio_civ, FUN = median)
Como podemos ver para cada estado civil la escolaridad es de secundaria predominantemente, sólo para las madres casadas la escolaridad es de preparatoria.
Ahora si vemos la relación entre edad de la madre y estado civil tenemos lo siguiente:
moda_edociv <- aggregate(edad_madn ~ edociv_mad, data = df_limpio_civ, FUN = get_mode)
ggplot(moda_edociv, aes(x = factor(edociv_mad), y = edad_madn)) +
geom_bar(stat = "identity", fill = "coral2") +
labs(title = "Moda de la edad de la madre por estado civil",
x = "Estado civil",
y = "Moda de edad")
Como podemos apreciar en la gráfica el estado civil contra edad de la madre, las mujeres divorciadas con mayor frecuencia son las que cuentan con mayor edad, seguidas de las mujeres casadas; en contraste las mujeres más jóvenes al momento de tener un hijo son con mayor frecuencia las solteras o las separadas.
Considero que los datos de residencia de la madre pueden relacionarse a la escolaridad o a la edad de la madre para obtener conclusiones interesantes.
Los datos de residencia habitual de la madre vienen dados por las siguientes categorías
| Valor | Categoría | Valor | Categoría |
|---|---|---|---|
| 01 | Aguascalientes | 02 | Baja California |
| 03 | Baja California Sur | 04 | Campeche |
| 05 | Coahuila de Zaragoza | 06 | Colima |
| 07 | Chiapas | 08 | Chihuahua |
| 09 | Ciudad de México | 10 | Durango |
| 11 | Guanajuato | 12 | Guerrero |
| 13 | Hidalgo | 14 | Jalisco |
| 15 | México | 16 | Michoacán de Ocampo |
| 17 | Morelos | 18 | Nayarit |
| 19 | Nuevo León | 20 | Oaxaca |
| 21 | Puebla | 22 | Querétaro |
| 23 | Quintana Roo | 24 | San Luis Potosí |
| 25 | Sinaloa | 26 | Sonora |
| 27 | Tabasco | 28 | Tamaulipas |
| 29 | Tlaxcala | 30 | Veracruz de Ignacio de la Llave |
| 31 | Yucatán | 32 | Zacatecas |
| 33 | Estados Unidos de Norteamérica | 34 | Otros países de América Latina |
| 35 | Otros países |
Aplicamos los estadísticos básicos
summary(df$ent_resid)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 11.00 15.00 16.48 22.00 35.00
No me parece que sea necesario realizar una la limpieza de los datos
Mostramos el histograma de los datos:
ggplot(df, aes(x = factor(ent_resid))) +
geom_bar(fill = "darkorchid3") +
labs(title = "Histograma de la entidad de residencia de la madre",
x = "Entidad de residencia",
y = "Frecuencia")
Podemos ver la relación que hay entre la moda de escolaridad de la madre y la entidad de residencia
mediana_esc <- aggregate(escol_mad ~ ent_resid, data = df_limpio2, FUN = median)
moda_esc <- aggregate(escol_mad ~ ent_resid, data = df_limpio2, FUN = get_mode)
mediana_esc$Tipo <- "Mediana"
moda_esc$Tipo <- "Moda"
df_comparacion <- rbind(mediana_esc, moda_esc)
ggplot(df_comparacion, aes(x = factor(ent_resid), y = escol_mad, fill = Tipo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Mediana y moda de la escolaridad de la madre por entidad",
y = "Nivel de Escolaridad",
x = "Entidad de la madre") +
scale_fill_manual(values = c("Mediana" = "steelblue", "Moda" = "orange"))
Como podemos ver en este análisis, comparé la mediana y la moda porque dan resultados distintos entre las entidades, aunque en general lo más común es que las madres tengan sólo secundaria terminada.
En relación a la moda podemos decir que las madres de Chiapas con mayor frecuencia tienen sólo primaria terminada, mientras que las madres con residencia en otros países con mayor frecuencia tienen profesión.
Ahora, en términos de la mediana, tenemos que en la Ciudad de México, en Baja California Sur y las madres de otros países tienen escolaridad de preparatoria.
Hay varias conclusiones que puedo remarcar a partir del análisis realizado.
Lo más común (39%) es que las madres tienen escolaridad de secundaria.
Típicamente la edad de la madre con estudios de primaria o secundaria es de menos de 20 años.
La edad típica de las madres profesionistas es alrededor de los 30 años.
Lo común es que las madres se encuentran en unión libre independientemente de la escolaridad, con excepción de las que cuentan con estudios profesionales que típicamente se encuentran casadas.
Sólo para las madres casadas la escolaridad predominante es de preparatoria, para los demás estados civiles la escolaridad es de secundaria.
Las mujeres divorciadas con mayor frecuencia son las que cuentan con mayor edad, seguidas de las mujeres casadas; en contraste las mujeres más jóvenes al momento de tener un hijo son con mayor frecuencia las solteras o las separadas.
Las madres de Chiapas con mayor frecuencia tienen sólo primaria terminada, mientras que las madres con residencia en otros paises con mayor frecuencia tienen profesión.
La tendencia es que en la Ciudad de México, en Baja California Sur y las madres de otros países tienen escolaridad de preparatoria.
Además, me gustaría remarcar que al realizar el análisis me di cuenta que los datos sin registro de escolaridad tenían relación a los datos sin registro de edad, pienso que serán los datos de niños que no se conoce bien quien fue su madre al ser niños tal vez huérfanos o algo parecido.
Me pareció muy útil conocer la facilidad de procesamiento que nos proporciona R, creo que me ha gustado mucho conocerlo y poderlo aplicar a un análisis de datos, pienso que es muy breve el tiempo de un curso para conocer todas las herramientas y funciones que tiene un lenguaje, pero supero mis expectativas y espero poder seguir usándolo para mis futuras clases.
Le agradezco compartir sus conocimientos Dr. Ricardo, gracias.