Presentamos una forma de simular una variable como la edad, basandose en los parámetros reales de dicha variable, para estimar los datos de una población n.
Nos descargamos los datos que nos interesan de la página web del INE. Se puede buscar como piramide de población, y edad, por tramos, nacional, entre hombres y mujeres.
Una vez que tengamos los datos en la forma que queremos, podemos cargar el archivo. Para este ejemplo ademas usamos la libreria tidyverse. La ruta de carga será diferente en cada caso:
library(readxl)library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.2 ✔ tibble 3.3.0
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#eliminamos la notacion cientificaoptions(scipen =999)df <-read_excel("C:/Users/Tester/OneDrive - UNED/Escritorio/Autoaprendizaje/Datos para blog/piramide de poblacion INE total H-M.xlsx")
New names:
• `` -> `...2`
• `` -> `...3`
names(df) <-c("texto", "valor")
Warning: The `value` argument of `names<-()` must have the same length as `x` as of
tibble 3.0.0.
Warning: The `value` argument of `names<-()` can't be empty as of tibble 3.0.0.
View (df)
Depuración
Ahora necesitamos mirar y trabajar el dataframe, de forma que todo esté coherente a la hora de analizar datos.
#eliminamos las seis primereas filas que no contienen datos df <- df[-c(1:6),]#eliminamos la fila qe contiene los titulos df <- df[-c(1),]#cambiamos de nombre las variables por sexo y edadnames(df) <-c("edad", "hombres", "mujeres")#eliminamos las filas 109 a 114, no contienen datosdf <- df[-c(109:114),]#eliminamos filas 87, 103 y 108 son sumatorios de otras filasdf <- df[-c(87, 103, 108),]#cambiamos la columna de edad a formato numérico, eliminando el texto " años"df$edad <-as.numeric(gsub(" ?años?", "", df$edad))#cambiamos las variables hombre y mujer a formato numericodf$hombres <-as.numeric(df$hombres)df$mujeres <-as.numeric(df$mujeres)View (df)
De esta forma, ya tenemos una base para poder trabajar.
Una primera visualización
Usamos las librerías de ggplot2 incluidas en tidyverse, para revisar las variables de la edad de lso hombres y las mujeres, y ver la forma de su distribución:
#miramos la distribucion de edad respecto a los hombres y las mujeres con ggplotggplot(df, aes(x = edad)) +geom_line(aes(y = hombres, color ="Hombres")) +geom_line(aes(y = mujeres, color ="Mujeres")) +labs(title ="Distribución de edad por sexo",x ="Edad",y ="Número de personas") +scale_color_manual(values =c("blue", "red")) +theme_minimal() +theme(legend.title =element_blank())
Esta es la forma a imitar para nuestra nueva variable.
Creando las variables
Seguimos usando los comandos de tidyverse, y creamos (copiamos) dos nuevas variables dependientes de los datos anteriores:
#nueva variable: distribucion de la edad de los hombres #respecto a la edad en % sobre el total de hombresdf <- df %>%mutate(distribucion_hombres = hombres /sum(hombres) *100)#nueva variable: distribucion de la edad de las mujeres#respecto a la edad en % sobre el total de mujeresdf <- df %>%mutate(distribucion_mujeres = mujeres /sum(mujeres) *100)View(df)#confirmamos que anbas variables suman 100%sum(df$distribucion_hombres)
[1] 100
sum(df$distribucion_mujeres)
[1] 100
Si todo va bien, nos ha creado unas columnas nuevas en el dataframe, con el porcentaje de cada edad. Vemos la suma para comprobar que no hay error y todos los datos estan incluidos.
Las nuevas variables son dependientes de las anteriores, lueog deben tomar la misma forma:
#miramos la distribucion de edad respecto a los hombres y las mujeres con ggplotggplot(df, aes(x = edad)) +geom_line(aes(y = distribucion_hombres, color ="Hombres")) +geom_line(aes(y = distribucion_mujeres, color ="Mujeres")) +labs(title ="Distribución de edad por sexo en porcentaje",x ="Edad",y ="Porcentaje de personas") +scale_color_manual(values =c("blue", "red")) +theme_minimal() +theme(legend.title =element_blank())
Obtenemos algunos datos más de nuestro df:
#miramos el numero total de hombrestotal_hombres <-sum(df$hombres)total_hombres
[1] 24090261
#miramos el numero total de mujerestotal_mujeres <-sum(df$mujeres)total_mujeres
[1] 25037226
#el total de poblaciontotal_poblacion <- total_hombres + total_mujerestotal_poblacion
[1] 49127487
#porcentaje de hombres sobre el total de la poblacionporcentaje_hombres <- (total_hombres / total_poblacion) *100porcentaje_hombres
[1] 49.03622
#porcentaje de mujeres sobre el total de la poblacionporcentaje_mujeres <- (total_mujeres / total_poblacion) *100porcentaje_mujeres
[1] 50.96378
Y con todos estos datos, creamos nuestra variable. En este caso n=20000; cambiando n, cambiaremos la cantidad de datos de la muestra a simular.
Se crea un df con edades separadas aleatorias, por hombres y mujeres.
#nueva variable tipo factor como sexo, factores hombre o mujersexo <-c()sexo <-factor(sexo, levels =c("Hombre", "Mujer"))n <-20000sexo_vec <-sample(c("Hombre", "Mujer"), n, replace =TRUE,prob =c(porcentaje_hombres, porcentaje_mujeres))edad_vec <-ifelse( sexo_vec =="Hombre",sample(df$edad, n, replace =TRUE, prob = df$distribucion_hombres),sample(df$edad, n, replace =TRUE, prob = df$distribucion_mujeres))sim <-data.frame(edad = edad_vec,sexo =factor(sexo_vec, levels =c("Hombre", "Mujer")))View (sim)
Y comprobamos de forma gráfica los datos obtenidos de la edad sobre el factor:
#miramos la distribucion de edad respecto a los hombres y las mujeres con ggplotggplot(sim, aes(x = edad)) +geom_density(aes(color = sexo), fill =NA) +labs(title ="Distribución de edad por sexo en la simulación",x ="Edad",y ="Densidad") +scale_color_manual(values =c("blue", "red")) +theme_minimal() +theme(legend.title =element_blank())
[1] 4
The echo: false option disables the printing of code (only output is displayed).