Simulacion de Variable

Author

Raulito073(c)

Introducción

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 cientifica
options(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 edad
names(df) <- c("edad", "hombres", "mujeres")

#eliminamos las filas 109 a 114, no contienen datos
df <- df[-c(109:114),]

#eliminamos filas 87, 103 y 108 son sumatorios de otras filas
df <- 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 numerico
df$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 ggplot
ggplot(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 hombres

df <- 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 mujeres
df <- 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 ggplot
ggplot(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 hombres
total_hombres <- sum(df$hombres)
total_hombres
[1] 24090261
#miramos el numero total de mujeres
total_mujeres <- sum(df$mujeres)
total_mujeres
[1] 25037226
#el total de poblacion
total_poblacion <- total_hombres + total_mujeres
total_poblacion
[1] 49127487
#porcentaje de hombres sobre el total de la poblacion
porcentaje_hombres <- (total_hombres / total_poblacion) * 100
porcentaje_hombres
[1] 49.03622
#porcentaje de mujeres sobre el total de la poblacion
porcentaje_mujeres <- (total_mujeres / total_poblacion) * 100
porcentaje_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 mujer
sexo <- c()
sexo <- factor(sexo, levels = c("Hombre", "Mujer"))

n <- 20000

sexo_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 ggplot
ggplot(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).