pacman::p_load(readr, readxl,knitr, kableExtra, MASS, ggcorrplot)

Cargamos bases de datos

dibas = "D:/Centro_geo/C02_SIG/proyecto_final/"

# Cargar la base de datos principal
bd <- read_csv(paste0(dibas,"c01_exploracion_datos/analisis_r/bd_ent_socioeconomico_2020.csv"),show_col_types = FALSE)

# Cargar el diccionario de variables
dic_bd <- read_csv(paste0(dibas,"c01_exploracion_datos/analisis_r/diccionario_bd.csv"),show_col_types = FALSE)
# Mostrar la tabla de la base de datos principal
kable(head(bd), format = "html", table.attr = "style='width:100%;'") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F) %>%
  scroll_box(width = "100%", height = "400px")
aa_cen aa_cve_ent aa_pobtot20 al_caal al_paal cs_cgin cs_ring cv_ccvi cv_pcvi cv_vhac ga_plm5 ga_porb pz_cpbr i_cpex i_cpmo i_crze i_inma pz_inmn i_irsl i_pnnv pz_pobr pz_ppbr i_ppex ip_pvin ie_nesc ip_pism ip_inc ip_int ip_pibc ip_pibe re_p15a re_p15b re_p15m re_p6ae re_pana re_pse re_psp re_ptot sb_csbv sb_psbv sb_pvae sb_pvdd sb_pvdi sb_pvdl sb_pvdr sb_pvdt sb_pvee sb_pves sb_pvpt se_c1cs se_c3cs se_cass ss_casa se_cvcs se_p1cs se_p3cs ss_pasa se_pass ss_psds se_pvcl se_pvcs se_pvdc ie_pcom ie_pint ie_pele ie_pagu ie_psan ed_phind ed_pasi ed_crean ed_esex ed_desp
AGU 1 1425607 2.1 17.4 0.4 0.8 2.6 4.0 13.1 21.3 0.17 1.8 3.3 1.7 2.2 22.2 0.8 0.2 33.4 392042 27.5 2.7 9.4 2302 58.5 3.028 4316774 142703 204726 2.1 23.5 1059395 5.0 21833 68530 159005 249368 3.1 2.1 0.6 0.6 38.9 13.0 5.4 4.0 0.3 0.6 0.8 1.7 3.2 1.9 2.4 1.6 57.3 9.1 20.2 42.7 18.4 54.1 29.7 6.8 64.025 74.025 74.425 72.400 70.400 0.0 73.60 0.40 1.900 5.733333
BCN 2 3769020 2.2 12.7 0.4 0.5 2.4 6.8 14.6 8.5 0.73 1.9 3.4 1.8 2.2 21.4 0.8 0.4 31.7 870644 23.1 1.7 6.4 4554 73.6 2.323 8755674 152317 553650 1.8 24.6 2949750 6.5 52736 199904 470015 722655 2.7 5.0 2.1 3.5 30.1 17.3 5.1 6.4 0.8 0.7 2.0 1.8 3.3 1.9 2.4 1.7 61.9 10.0 24.0 46.9 22.2 49.6 38.8 5.6 73.200 73.700 73.775 67.575 65.400 1.3 74.32 -0.78 1.925 5.366667
BCS 3 798447 2.2 22.7 0.4 0.9 2.7 11.4 18.6 10.3 9.05 2.1 3.6 1.9 2.4 21.5 0.8 0.4 31.8 218774 27.4 3.5 7.0 1336 45.5 2.257 1802259 151590 121986 2.3 23.9 618726 4.2 14089 41905 90080 146074 3.0 9.4 5.0 2.6 37.9 31.5 8.2 10.5 1.2 1.3 4.7 1.9 3.4 2.1 2.6 1.7 61.2 13.1 17.4 40.4 16.2 54.5 33.9 5.4 65.850 67.800 73.075 68.450 63.400 0.1 77.40 0.18 1.650 5.333333
CAM 4 928363 2.9 24.5 0.5 6.0 3.3 13.5 30.0 29.9 1.72 2.5 3.5 2.1 3.0 17.8 0.7 0.9 20.0 450256 48.5 11.9 6.3 2274 70.0 2.514 2334258 481697 481995 5.9 29.7 694979 6.4 39910 66664 100167 206741 2.9 33.5 4.0 5.1 56.2 22.7 16.0 13.1 1.4 3.6 2.7 2.3 3.4 2.5 2.9 1.9 73.7 28.0 21.0 58.4 21.9 66.3 25.2 16.1 49.875 44.850 73.550 67.925 64.425 2.9 76.16 -1.16 2.525 6.166667
COA 5 3146771 2.1 15.2 0.4 0.9 2.5 2.8 13.5 10.0 0.90 1.9 3.3 1.8 2.0 22.5 0.8 0.2 38.5 742638 23.6 2.3 11.3 5513 60.0 4.011 12621481 166389 535558 1.7 21.3 2359455 5.0 38298 124955 351877 515130 2.8 3.2 1.0 1.2 42.3 13.4 3.3 4.1 0.3 0.7 0.8 1.8 3.3 2.0 2.4 1.6 50.2 8.4 21.6 34.0 19.0 59.1 26.6 8.4 56.800 56.050 73.450 60.500 45.750 0.0 74.92 0.08 2.325 5.200000
COL 6 731391 2.3 16.6 0.4 0.7 2.7 7.4 15.3 13.5 0.31 2.0 3.5 1.8 2.3 21.5 0.8 0.5 31.0 203327 27.8 2.7 6.5 1480 59.7 1.953 1428050 128953 101248 3.4 27.7 567729 6.0 18792 49976 89670 158438 2.9 7.9 0.7 0.5 41.5 24.8 6.6 8.7 0.5 0.8 2.5 1.8 3.4 2.0 2.5 1.7 62.5 11.6 19.0 47.0 16.8 60.2 34.7 8.7 63.200 67.075 73.325 72.775 68.100 0.1 77.32 -0.20 4.450 5.433333
# Mostrar la tabla del diccionario de variables
kable(head(dic_bd), format = "html", table.attr = "style='width:100%;'") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F) %>%
  scroll_box(width = "100%", height = "400px")
aspectos criterio variable descripcion
derechos sociales alimentacion al_caal Carencias promedio en carencia por acceso a la alimentación
derechos sociales alimentacion al_paal Porcentaje de poblacion en carencia por acceso a la alimentación
derechos sociales calidad y espacios vivienda cv_ccvi Carencias promedio en carencia por calidad y espacios de la vivienda
derechos sociales calidad y espacios vivienda cv_pcvi Porcentaje de poblacion carencia por calidad y espacios de la vivienda
derechos sociales calidad y espacios vivienda cv_vhac % Viviendas particulares con hacinamiento
clave clave aa_cen Clave 3 letras de entidad

Objetivo 1:

Aqui se genera una matriz de correlacion por CRITERIO, primero definimos dentro de las variables de la variable de rezago educativo, cual es la mas viable, adicionalmente como ya corrimos el stepwise seleccionamos para representar el rezago la varible re_ptot = Poblacion con rezago eduactivo.

# Filtrar las variables del diccionario por criterio
var_rezg <- dic_bd$variable[dic_bd$criterio %in% c("rezago educativo")]

# Crear una base de datos filtrada con estas variables
bd_rezg <- bd[, var_rezg]

# Calcular la matriz de correlacion
mc_rezg <- cor(bd_rezg, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_rezg, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Rezago Educativo",
           colors = c("blue", "white", "red"))

Una vez seleccionada esta variable, se corre la matriz para cada criterio y se selecciona dentro de cada criterio la variable con mayor correlacion a re_ptot.

# Filtrar las variables por criterio
variables_alimentacion <- dic_bd$variable[dic_bd$criterio == "alimentacion"]

# Crear una base de datos filtrada con las variables de alimentacion y re_ptot
bd_filtro <- bd[, c(variables_alimentacion, "re_ptot")]

# Calcular la matriz de correlacion
matriz_correlacion <- cor(bd_filtro, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(matriz_correlacion, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Alimentacion vs re_ptot",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_espacios <- dic_bd$variable[dic_bd$criterio == "calidad y espacios vivienda"]

# Crear una base de datos filtrada con las variables de alimentacion y re_ptot
bd_cev <- bd[, c(var_espacios, "re_ptot")]

# Calcular la matriz de correlacion
mc_cev <- cor(bd_cev, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_cev, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Calidad y vivienda y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_cs <- dic_bd$variable[dic_bd$criterio == "cohesion social"]

# Crear una base de datos filtrada con estas variables
bd_cs <- bd[, c(var_cs, "re_ptot")]

# Calcular la matriz de correlacion
mc_cs <- cor(bd_cs, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_cs, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Cohesion social y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_gdcap <- dic_bd$variable[dic_bd$criterio == "grado accesibilidad"]

# Crear una base de datos filtrada con estas variables
bd_gd <- bd[, c(var_gdcap, "re_ptot")]

# Calcular la matriz de correlacion
mc_gd <- cor(bd_gd, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_gd, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Grado accesibilidad y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_inper <- dic_bd$variable[dic_bd$criterio == "ingreso per capita"]

# Crear una base de datos filtrada con estas variables
bd_inper <- bd[, c(var_inper, "re_ptot")]

# Calcular la matriz de correlacion
mc_inper <- cor(bd_inper, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_inper, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Ingreso y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_pbrz <- dic_bd$variable[dic_bd$criterio == "pobreza"]

# Crear una base de datos filtrada con estas variables
bd_pbrz <- bd[, c(var_pbrz, "re_ptot")]

# Calcular la matriz de correlacion
mc_pbrz <- cor(bd_pbrz, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_pbrz, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Pobreza y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_seg <- dic_bd$variable[dic_bd$criterio == "seguridad social"]

# Crear una base de datos filtrada con estas variables
bd_seg <- bd[, c(var_seg, "re_ptot")]

# Calcular la matriz de correlacion
mc_seg <- cor(bd_seg, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_seg, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Seguridad social y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_sv <- dic_bd$variable[dic_bd$criterio == "servicios basicos vivienda"]

# Crear una base de datos filtrada con estas variables
bd_sv <- bd[, c(var_sv, "re_ptot")]

# Calcular la matriz de correlacion
mc_sv <- cor(bd_sv, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_sv, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Servicios basicos vivienda y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_sal <- dic_bd$variable[dic_bd$criterio == "servicios de salud"]

# Crear una base de datos filtrada con estas variables
bd_sal <- bd[, c(var_sal, "re_ptot")]

# Calcular la matriz de correlacion
mc_sal <- cor(bd_sal, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_sal, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Servicios salud y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_infra <- dic_bd$variable[dic_bd$criterio == "infraestructura educativa"]

# Crear una base de datos filtrada con estas variables
bd_infra <- bd[, c(var_infra, "re_ptot")]

# Calcular la matriz de correlacion
mc_infra <- cor(bd_infra, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_infra, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Infraestructura y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Filtrar las variables
var_edu <- dic_bd$variable[dic_bd$criterio == "educativo"]

# Crear una base de datos filtrada con estas variables
bd_edu <- bd[, c(var_edu, "re_ptot")]

# Calcular la matriz de correlacion
mc_edu <- cor(bd_edu, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(mc_edu, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma: Eduacion y Rezago Educativo",
           colors = c("blue", "white", "red"))

# Seleccionar las variables especificas
variables_correlacion <- c("re_ptot", "al_caal", "cv_ccvi", "cs_ring", 
                           "ga_porb", "ip_pibe", "pz_pobr", 
                           "se_pvcs", "sb_pvdr", "ss_pasa", "ie_nesc", "ed_phind")

# Filtrar las variables de interes en la base de datos
bd_filtro <- bd[, variables_correlacion]

# Calcular la matriz de correlacion
matriz_correlacion <- cor(bd_filtro, use = "pairwise.complete.obs")

# Generar el correlograma
ggcorrplot(matriz_correlacion, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma variables socioeconomicas vs rezago educativo",
           colors = c("red", "white", "blue"))

Objetivo 2

Una vez que se tienen las variables por criterio con mayor correlacion para predecir el rezago educativo, entonces se identifica cual es la significancia estadistica en terminos de valor de p mediante el stepwise. El stepwise es una tecnica para la seleccion de variables en modelos de regresion. Su objetivo es encontrar un conjunto optimo de variables predictoras, eliminando aquellas que no aportan significativamente al modelo. El valor de p indica la probabilidad de obtener los resultados observados si la variable realmente no tuviera ningun efecto (es decir, si la hipotesis nula fuera verdadera).

# Preparar el modelo inicial (modelo nulo) y completo
modelo_nulo <- lm(re_ptot  ~ 1, data = bd) 

# Ajustar el modelo completo de regresian lineal
modelo_completo <- lm(re_ptot ~ 
                        al_caal  + cv_ccvi + cs_ring + 
                        ga_porb  + ip_pibe + se_pvcs + 
                        sb_pvdr  + ss_pasa + ie_nesc + 
                        ed_phind, data = bd)

# Mostrar un resumen del modelo
summary(modelo_completo)
## 
## Call:
## lm(formula = re_ptot ~ al_caal + cv_ccvi + cs_ring + ga_porb + 
##     ip_pibe + se_pvcs + sb_pvdr + ss_pasa + ie_nesc + ed_phind, 
##     data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -184997  -61440   -3848   64573  252361 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -8.700e+04  3.491e+05  -0.249   0.8056    
## al_caal     -6.050e+04  2.025e+05  -0.299   0.7681    
## cv_ccvi     -1.087e+05  1.703e+05  -0.638   0.5301    
## cs_ring      1.801e+03  7.292e+03   0.247   0.8073    
## ga_porb     -1.471e+04  1.015e+04  -1.449   0.1621    
## ip_pibe      1.271e-01  6.007e-02   2.115   0.0465 *  
## se_pvcs      5.973e+03  7.166e+03   0.834   0.4139    
## sb_pvdr      1.322e+04  7.671e+03   1.724   0.0994 .  
## ss_pasa      8.415e+03  7.669e+03   1.097   0.2849    
## ie_nesc      1.223e+02  7.405e+00  16.513 1.66e-13 ***
## ed_phind    -1.888e+04  1.171e+04  -1.613   0.1218    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 129800 on 21 degrees of freedom
## Multiple R-squared:  0.9787, Adjusted R-squared:  0.9686 
## F-statistic: 96.58 on 10 and 21 DF,  p-value: 3.011e-15
# Aplicar la seleccion stepwise
modelo_stepwise <- step(modelo_nulo, 
                        scope = list(lower = modelo_nulo, upper = modelo_completo), 
                        direction = "both")  # "both" para hacia adelante y hacia atras
## Start:  AIC=865.23
## re_ptot ~ 1
## 
##            Df  Sum of Sq        RSS    AIC
## + ie_nesc   1 1.5182e+13 1.4383e+12 788.92
## + ss_pasa   1 7.3925e+12 9.2277e+12 848.40
## + ip_pibe   1 4.2704e+12 1.2350e+13 857.73
## + se_pvcs   1 3.1704e+12 1.3450e+13 860.46
## + al_caal   1 2.9619e+12 1.3658e+13 860.95
## + sb_pvdr   1 1.8782e+12 1.4742e+13 863.39
## + cs_ring   1 1.8499e+12 1.4770e+13 863.45
## + ed_phind  1 1.5620e+12 1.5058e+13 864.07
## + cv_ccvi   1 1.3578e+12 1.5262e+13 864.50
## + ga_porb   1 1.1573e+12 1.5463e+13 864.92
## <none>                   1.6620e+13 865.23
## 
## Step:  AIC=788.92
## re_ptot ~ ie_nesc
## 
##            Df  Sum of Sq        RSS    AIC
## + ga_porb   1 8.7721e+11 5.6106e+11 760.80
## + ed_phind  1 7.7809e+11 6.6018e+11 766.00
## + ip_pibe   1 5.4821e+11 8.9006e+11 775.56
## + cs_ring   1 4.9271e+11 9.4557e+11 777.50
## + cv_ccvi   1 4.3672e+11 1.0016e+12 779.34
## + al_caal   1 4.2478e+11 1.0135e+12 779.72
## + sb_pvdr   1 2.9451e+11 1.1438e+12 783.59
## <none>                   1.4383e+12 788.92
## + se_pvcs   1 1.0465e+10 1.4278e+12 790.69
## + ss_pasa   1 4.6936e+09 1.4336e+12 790.81
## - ie_nesc   1 1.5182e+13 1.6620e+13 865.23
## 
## Step:  AIC=760.8
## re_ptot ~ ie_nesc + ga_porb
## 
##            Df  Sum of Sq        RSS    AIC
## + ip_pibe   1 7.8316e+10 4.8274e+11 757.98
## <none>                   5.6106e+11 760.80
## + ed_phind  1 2.6788e+10 5.3427e+11 761.23
## + cv_ccvi   1 2.6257e+10 5.3480e+11 761.26
## + al_caal   1 1.7521e+10 5.4354e+11 761.78
## + ss_pasa   1 1.1140e+10 5.4992e+11 762.15
## + cs_ring   1 6.8602e+09 5.5420e+11 762.40
## + se_pvcs   1 1.9339e+09 5.5913e+11 762.69
## + sb_pvdr   1 4.8505e+07 5.6101e+11 762.79
## - ga_porb   1 8.7721e+11 1.4383e+12 788.92
## - ie_nesc   1 1.4902e+13 1.5463e+13 864.92
## 
## Step:  AIC=757.98
## re_ptot ~ ie_nesc + ga_porb + ip_pibe
## 
##            Df  Sum of Sq        RSS    AIC
## <none>                   4.8274e+11 757.98
## + ss_pasa   1 1.9983e+10 4.6276e+11 758.63
## + ed_phind  1 1.8241e+10 4.6450e+11 758.75
## + sb_pvdr   1 6.3197e+09 4.7643e+11 759.56
## + cv_ccvi   1 5.8839e+09 4.7686e+11 759.59
## + al_caal   1 4.0742e+09 4.7867e+11 759.71
## + se_pvcs   1 2.1856e+09 4.8056e+11 759.84
## + cs_ring   1 1.9469e+09 4.8080e+11 759.86
## - ip_pibe   1 7.8316e+10 5.6106e+11 760.80
## - ga_porb   1 4.0732e+11 8.9006e+11 775.56
## - ie_nesc   1 8.9948e+12 9.4775e+12 851.25
# Resumen del modelo stepwise
summary(modelo_stepwise)
## 
## Call:
## lm(formula = re_ptot ~ ie_nesc + ga_porb + ip_pibe, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -228316  -89529   -9312   72305  304714 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -5.782e+04  4.367e+04  -1.324    0.196    
## ie_nesc      1.246e+02  5.454e+00  22.841  < 2e-16 ***
## ga_porb     -2.826e+04  5.814e+03  -4.861 4.06e-05 ***
## ip_pibe      1.176e-01  5.517e-02   2.131    0.042 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 131300 on 28 degrees of freedom
## Multiple R-squared:  0.971,  Adjusted R-squared:  0.9678 
## F-statistic:   312 on 3 and 28 DF,  p-value: < 2.2e-16
# Variables seleccionadas
modelo_stepwise$coefficients
##   (Intercept)       ie_nesc       ga_porb       ip_pibe 
## -5.781537e+04  1.245739e+02 -2.825792e+04  1.175775e-01
# Extraer los nombres de las variables seleccionadas en el modelo stepwise
variables_seleccionadas <- names(coef(modelo_stepwise))[-1]  # Excluye el intercepto

# Filtrar las descripciones correspondientes en dic_bd
descripciones <- dic_bd[dic_bd$variable %in% variables_seleccionadas, c("variable", "descripcion")]

# Mostrar la tabla en un formato mas legible
kable(descripciones, format = "html", table.attr = "style='width:100%;'") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F) %>%
  scroll_box(width = "100%", height = "300px")
variable descripcion
ga_porb Porcentaje de población con GACP bajo o muy bajo
ie_nesc Numero de escuelas por estado
ip_pibe Producto interno bruto por estado
# Generar predicciones del modelo
predicciones <- predict(modelo_stepwise)

# Crear el grafico: valores reales vs predicciones
plot(bd$re_ptot, predicciones, 
     main = "Prediccion vs Valores Observados", 
     xlab = "Valores Observados (re_ptot)", 
     ylab = "Valores Predichos", 
     col = "blue", 
     pch = 20)
abline(0, 1, col = "red")  # Linea de referencia

# Filtrar la base de datos para incluir solo las variables seleccionadas
var_sel <- bd[, variables_seleccionadas]

# Calcular la matriz de correlacion
mc_rez <- round(cor(var_sel, use = "pairwise.complete.obs"),2)

# Generar el correlograma
ggcorrplot(mc_rez, 
           type = "lower", 
           lab = TRUE, 
           title = "Correlograma variables signficativas vs rezago educativo",
           colors = c("red", "white", "blue"))

# Guardar la matriz en un archivo para futuras consultas
#write.csv(mc_rez, paste0(dibas, "rezago_matriz_correlacion.csv"))