Trabajo Práctico Final Opinión Pública

MGAIE - UNTREF

Author

Betsabé Cohen

Introducción

Las elecciones 2015 significaron una ruptura en la historia de la joven democracia argentina: por primera vez fue elegido un presidente que no pertenecía ninguno de los partidos tradicionales argentinos (el peronismo y el radicalismo). Dirigente del club deportivo Boca Jr. e intendente del distrito más rico de Argentina (la Ciudad de Buenos Aires), Mauricio Macri supo cohesionar bajo su fuerza (Cambiemos) una oposición consolidada como producto de una alianza con el radicalismo.

Esto, sumado al desgaste de la coalición oficialista cuya ruptura llevo a Sergio Massa (UNA) a presentarse con una fuerza independiente y a conflictos internos dentro del propio oficialismo (Frente para la Victoria - FpV)

Las elecciones primarias, abiertas, simultáneas y obligatorias (PASO) se realizaron el 9 de agosto. Con este sistema, todos los partidos realizan elecciones primarias en las mismas elecciones generales. Durante las PASO todos los partidos deben participar ya sea que presenten una o múltiples listas de candidatos. Los ciudadanos pueden votar por cualquier candidato de cualquier partido, pero solo pueden emitir un voto. El candidato más votado de los partidos que obtengan el 1,50% o más de los votos válidos puede presentarse en las elecciones generales.

La mayoría de las encuestas daban como ganador a Daniel Scioli (FpV), pero el resultado le deparó una primera minoría muy estrecha que dio por ganador a Mauricio Macri (Cambiemos) que obtuvo 34,15 % y en tercer lugar Sergio Massa (UNA) con 21,39 %

En este trabajo práctico para la materia Investigación Electoral y de Opinión Pública Aplicada y sobre la base de los materiales entregados (Cuestionario y Bases de Resultados de los Estudios Electorales de Córdoba Capital y Partidos d3el GBA para Base Individuos EPH) realizamos las siguientes actividades propuestas:

1- Procesar las bases de datos de manera independiente aplicando el método de ponderación iterativa visto en clase (Parámetros en Base EPH).

2- En base a los indicadores relevados evaluar el potencial electoral de los principales candidatos a Presidente (Macri y Scioli)

3- Seleccionar un conjunto de indicadores que den cuenta de al menos dos de las perspectivas teóricas vistas en la bibliografía sobre comportamiento electoral y evaluar el impacto de dichos indicadores en la decisión de voto utilizando al menos dos herramientas de análisis. Comparar los resultados obtenidos entre ambas ciudades.

ETL

Importación y tranf. CBA

Se importa y transforma la base de la encuesta CBA y como vemos en el resumen de resultados hay muy pocos casos perdidos.

En la columna top_counts {skimr} ya nos ofrece algunos resúmenes: hay 198 casos que creen que la economía del país empeoró en los últimos 2 años respecto de la fecha de la encuesta, 143 perciben lo mismo respecto de sus economías familiares y los posicionamientos paren mantenerse en el centro tanto respecto de los espacios o corrientes políticas como del kirchnerismo y el peronismo… pero no nos adelantemos y dejemos estas observaciones para nuestra etapa exploratoria.

Ver código
## importación y etiquetado de encuesta CBA
df_cba <- read_sav("Consigna y materiales TP1/Bases de datos/CORDOBA_FINAL.sav") |> 
  mutate(UA = as.numeric(UA),
  EDAD = factor(EDAD,
                levels = c(1:4), 
                labels = c("18-29","30-49","50-65",">65"), 
                ordered = T),
  SEXO = factor(SEXO,
                levels = c(1:2),
                labels = c("Varón","Mujer"), 
                ordered = T),
  NIV_EDUCATIVO = factor( NIV_EDUCATIVO,
                          levels = (1:5),
                          labels = c("Primario completo",
                                     "Secundario incompleto o completo",
                                     "Terciario no univ. incompleto",
                                     "Terciario no univ. completo",
                                     "Universitario incompleto o completo"),
                          ordered = T),
  VOTO_CANDIDATO = case_when(
    VOTO_CANDIDATO == 1 ~ "Daniel Scioli",
    VOTO_CANDIDATO == 2 ~ "Mauricio Macri",
    VOTO_CANDIDATO == 3 ~ "Sergio Massa",
    VOTO_CANDIDATO == 4 ~ "Margarita Stolbizer",
    VOTO_CANDIDATO == 5 ~ "Nicolas Del Caño",
    VOTO_CANDIDATO == 6 ~ "Adolfo Rodriguez Saa",
    VOTO_CANDIDATO == 8 ~ "Ninguno / En Blanco",
    VOTO_CANDIDATO == 9 ~ "No Sabe"),
  VOTO_ACOTADO = case_when(
    VOTO_ACOTADO == 1 ~ "Daniel Scioli",
    VOTO_ACOTADO == 2 ~ "Mauricio Macri",
    VOTO_ACOTADO == 3 ~ "Sergio Massa",
    VOTO_ACOTADO == 8 ~ "Ninguno / En Blanco",
    VOTO_ACOTADO == 9 ~ "No Sabe"),
  JAMAS_VOTARIA = case_when(
    JAMAS_VOTARIA == 1 ~ "Daniel Scioli",
    JAMAS_VOTARIA == 2 ~ "Mauricio Macri",
    JAMAS_VOTARIA == 3 ~ "Sergio Massa",
    JAMAS_VOTARIA == 8 ~ "Ninguno / En Blanco",
    JAMAS_VOTARIA == 9 ~ "No Sabe"),
  GESTION_CRISTINA = factor(GESTION_CRISTINA,
                            levels = c(1,2,9),
                            labels = c("Desaprueba","Aprueba","No sabe"),
                            ordered = T),
  ECONOMIA_PAIS_2_AÑOS = factor(ECONOMIA_PAIS_2_AÑOS,
                                levels = c(1:3,9),
                                labels = c("Mejoró","Empeoró","Se mantuvo igual","No sabe"),
                                ordered = T),
  ECONOMIA_FLIAR_2_AÑOS = factor(ECONOMIA_FLIAR_2_AÑOS,
                                levels = c(1:3,9),
                                labels = c("Mejoró","Empeoró","Se mantuvo igual","No sabe"),
                                ordered = T),
  CONTINUIDAD_O_CAMBIO = factor(CONTINUIDAD_O_CAMBIO,
                                levels = c(1:3,9),
                                labels = c("Mantener políticas actuales","Mantener algunas y cambiar otras","Cambiar todas","No sabe"),
                                ordered = T),
  REPRESENTACION_DEL_CAMBIO = case_when(
    REPRESENTACION_DEL_CAMBIO == 1 ~ "Sergio Massa",
    REPRESENTACION_DEL_CAMBIO == 2 ~ "Mauricio Macri",
    REPRESENTACION_DEL_CAMBIO == 3 ~ "Daniel Scioli",
    REPRESENTACION_DEL_CAMBIO == 8 ~ "Ninguno",
    REPRESENTACION_DEL_CAMBIO == 9 ~ "No sabe"),
  AGENDA_DE_TEMAS = case_when(
    AGENDA_DE_TEMAS == 1 ~ "Seguridad",
    AGENDA_DE_TEMAS == 2 ~ "Economía",
    AGENDA_DE_TEMAS == 3 ~ "Respeto de instituciones",
    AGENDA_DE_TEMAS == 4 ~ "Educacion, asistencia social, salud",
    AGENDA_DE_TEMAS == 5 ~ "Empleo",
    AGENDA_DE_TEMAS == 9 ~ "No sabe"
  ),
  PERCEPCION_DE_GANADOR = case_when(
    PERCEPCION_DE_GANADOR == 1 ~ "Daniel Scioli",
    PERCEPCION_DE_GANADOR == 2 ~ "Mauricio Macri",
    PERCEPCION_DE_GANADOR == 3 ~ "Sergio Massa",
    PERCEPCION_DE_GANADOR == 4 ~ "Otro",
    PERCEPCION_DE_GANADOR == 9 ~ "No sabe"
  ),
  INFLUENCIA_DE_CRISTINA_EN_SCIOLI = factor(INFLUENCIA_DE_CRISTINA_EN_SCIOLI,
                                            levels = c(1:4,9),
                                            labels = c("Ninguna","Poca","Bastante","Mucha","No sabe"),
                                            ordered = T),
  POSICIONAMIENTO_ESPACIAL = factor(POSICIONAMIENTO_ESPACIAL,
                                    levels = c(1:5,9),
                                    labels = c("Totalmente de izquierda",
                                               "Más izquierda que derecha",
                                               "Ni de izquierda ni de derecha",
                                               "Más de derecha que de izquierda",
                                               "Totalmente de derecha",
                                               "No sabe"),
                                           ordered = T),
  POSICIONAMIENTO_RESPECTO_PERONISMO = factor(POSICIONAMIENTO_RESPECTO_PERONISMO,
                                              levels = c(1:3,9),
                                              labels = c("Peronista","Antiperonista","Ni peronista ni anti peronista","No sabe"),
                                                     ordered = T),
  POSICIONAMIENTO_RESPECTO_KIRCHNERISMO = factor(POSICIONAMIENTO_RESPECTO_KIRCHNERISMO,
                                                 levels = c(1:3,9),
                                                 labels = c("Kirchnerista","Anti kirchnerista","Ni kirchnerista ni anti kirchnerista","No sabe"),
                                                        ordered = T),
  VOTACION_PASO = case_when(
    VOTACION_PASO == 0 ~ "No Sabe",
    VOTACION_PASO == 1 ~ "Daniel Scioli",
    VOTACION_PASO == 2 ~ "Sergio Massa",
    VOTACION_PASO == 3 ~ "Mauricio Macri",
    VOTACION_PASO == 4 ~ "José Manuel De La Sota",
    VOTACION_PASO == 5 ~ "Margarita Stolbizer",
    VOTACION_PASO == 6 ~ "Rodriguez Saa",
    VOTACION_PASO == 8 ~ "Otros",
    VOTACION_PASO == 9 ~ "Blanco / No voto"),
  NE_CBA = factor(NE_CBA,
                  levels = c(1:3),
                  labels = c("P. Completa","Sec. Comp-Terc. Inc","Terc/Univ. Completo"), 
                  ordered = T)
  )|>
  clean_names()


skim(df_cba)
Data summary
Name df_cba
Number of rows 320
Number of columns 20
_______________________
Column type frequency:
character 7
factor 12
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
voto_candidato 0 1 7 20 0 8 0
voto_acotado 0 1 7 19 0 5 0
jamas_votaria 0 1 7 19 0 5 0
representacion_del_cambio 0 1 7 14 0 5 0
agenda_de_temas 1 1 6 35 0 6 0
percepcion_de_ganador 0 1 4 14 0 5 0
votacion_paso 0 1 5 22 0 8 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
edad 0 1.00 TRUE 4 50-: 103, 30-: 96, 18-: 64, >65: 57
sexo 0 1.00 TRUE 2 Muj: 179, Var: 141
niv_educativo 0 1.00 TRUE 5 Uni: 120, Sec: 70, Ter: 58, Ter: 38
gestion_cristina 0 1.00 TRUE 3 Des: 210, Apr: 84, No : 26
economia_pais_2_anos 3 0.99 TRUE 4 Emp: 198, Se : 57, Mej: 48, No : 14
economia_fliar_2_anos 0 1.00 TRUE 4 Emp: 143, Se : 97, Mej: 63, No : 17
continuidad_o_cambio 0 1.00 TRUE 4 Man: 180, Cam: 75, Man: 42, No : 23
influencia_de_cristina_en_scioli 1 1.00 TRUE 5 Muc: 118, Bas: 102, Poc: 47, No : 31
posicionamiento_espacial 0 1.00 TRUE 6 Ni : 202, No : 37, Más: 36, Más: 20
posicionamiento_respecto_peronismo 0 1.00 TRUE 4 Ni : 207, Per: 47, Ant: 34, No : 32
posicionamiento_respecto_kirchnerismo 0 1.00 TRUE 4 Ni : 135, Ant: 124, Kir: 33, No : 28
ne_cba 0 1.00 TRUE 3 Ter: 158, Sec: 128, P. : 34

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ua 0 1 160.5 92.52 1 80.75 160.5 240.25 320 ▇▇▇▇▇

Importación y tranf. GBA

Se importa y transforma la base de la encuesta GBA y como vemos en el resumen de resultados ya sabemos que la variable influencia_de_cristina_en_scioli tiene una 77% de casos válidos. Analicemos los casos perdidos para resolver su imputación.

Ver código
df_gba <- read_sav("Consigna y materiales TP1/Bases de datos/GBA_FINAL.sav") |> 
  mutate(UA = as.numeric(UA),
  EDAD = factor(EDAD,
                levels = c(1:4), 
                labels = c("18-29","30-49","50-65",">65"),
                ordered = T),
   SEXO = factor(SEXO,
                levels = c(1:2),
                labels = c("Varón","Mujer"),
                ordered = T),
  NIV_EDUCATIVO = factor( NIV_EDUCATIVO,
                          levels = (1:5),
                          labels = c("Primario completo",
                                     "Secundario incompleto o completo",
                                     "Terciario no univ. incompleto",
                                     "Terciario no univ. completo",
                                     "Universitario incompleto o completo"),
                          ordered = T),
  VOTO_CANDIDATO = case_when(
    VOTO_CANDIDATO == 1 ~ "Daniel Scioli",
    VOTO_CANDIDATO == 2 ~ "Mauricio Macri",
    VOTO_CANDIDATO == 3 ~ "Sergio Massa",
    VOTO_CANDIDATO == 4 ~ "Margarita Stolbizer",
    VOTO_CANDIDATO == 5 ~ "Nicolas Del Caño",
    VOTO_CANDIDATO == 6 ~ "Adolfo Rodriguez Saa",
    VOTO_CANDIDATO == 8 ~ "Ninguno / En Blanco",
    VOTO_CANDIDATO == 9 ~ "No Sabe"),
  VOTO_ACOTADO = case_when(
    VOTO_ACOTADO == 1 ~ "Daniel Scioli",
    VOTO_ACOTADO == 2 ~ "Mauricio Macri",
    VOTO_ACOTADO == 3 ~ "Sergio Massa",
    VOTO_ACOTADO == 8 ~ "Ninguno / En Blanco",
    VOTO_ACOTADO == 9 ~ "No Sabe"),
  JAMAS_VOTARIA = case_when(
    JAMAS_VOTARIA == 1 ~ "Daniel Scioli",
    JAMAS_VOTARIA == 2 ~ "Mauricio Macri",
    JAMAS_VOTARIA == 3 ~ "Sergio Massa",
    JAMAS_VOTARIA == 8 ~ "Ninguno / En Blanco",
    JAMAS_VOTARIA == 9 ~ "No Sabe"),
  GESTION_CRISTINA = factor(GESTION_CRISTINA,
                            levels = c(1,2,9),
                            labels = c("Desaprueba","Aprueba","No sabe"),
                            ordered = T),
  ECONOMIA_PAIS_2_AÑOS = factor(ECONOMIA_PAIS_2_AÑOS,
                                levels = c(1:3,9),
                                labels = c("Mejoró","Empeoró","Se mantuvo igual","No sabe"),
                                ordered = T),
  ECONOMIA_FLIAR_2_AÑOS = factor(ECONOMIA_FLIAR_2_AÑOS,
                                levels = c(1:3,9),
                                labels = c("Mejoró","Empeoró","Se mantuvo igual","No sabe"),
                                ordered = T),
  CONTINUIDAD_O_CAMBIO = factor(CONTINUIDAD_O_CAMBIO,
                                levels = c(1:3,9),
                                labels = c("Mantener políticas actuales","Mantener algunas y cambiar otras","Cambiar todas","No sabe"),
                                ordered = T),
  REPRESENTACION_DEL_CAMBIO = case_when(
    REPRESENTACION_DEL_CAMBIO == 1 ~ "Sergio Massa",
    REPRESENTACION_DEL_CAMBIO == 2 ~ "Mauricio Macri",
    REPRESENTACION_DEL_CAMBIO == 3 ~ "Daniel Scioli",
    REPRESENTACION_DEL_CAMBIO == 8 ~ "Ninguno",
    REPRESENTACION_DEL_CAMBIO == 9 ~ "No sabe"),
  AGENDA_DE_TEMAS = case_when(
    AGENDA_DE_TEMAS == 1 ~ "Seguridad",
    AGENDA_DE_TEMAS == 2 ~ "Economía",
    AGENDA_DE_TEMAS == 3 ~ "Respeto de instituciones",
    AGENDA_DE_TEMAS == 4 ~ "Educacion, asistencia social, salud",
    AGENDA_DE_TEMAS == 5 ~ "Empleo",
    AGENDA_DE_TEMAS == 9 ~ "No sabe"
  ),
  PERCEPCION_DE_GANADOR = case_when(
    PERCEPCION_DE_GANADOR == 1 ~ "Daniel Scioli",
    PERCEPCION_DE_GANADOR == 2 ~ "Mauricio Macri",
    PERCEPCION_DE_GANADOR == 3 ~ "Sergio Massa",
    PERCEPCION_DE_GANADOR == 4 ~ "Otro",
    PERCEPCION_DE_GANADOR == 9 ~ "No sabe"
  ),
  INFLUENCIA_DE_CRISTINA_EN_SCIOLI = factor(INFLUENCIA_DE_CRISTINA_EN_SCIOLI,
                                            levels = c(1:4,9),
                                            labels = c("Ninguna","Poca","Bastante","Mucha","No sabe"),
                                            ordered = T),
  POSICIONAMIENTO_ESPACIAL = factor(POSICIONAMIENTO_ESPACIAL,
                                    levels = c(1:5,9),
                                    labels = c("Totalmente de izquierda",
                                               "Más izquierda que derecha",
                                               "Ni de izquierda ni de derecha",
                                               "Más de derecha que de izquierda",
                                               "Totalmente de derecha",
                                               "No sabe"),
                                           ordered = T),
  POSICIONAMIENTO_RESPECTO_PERONISMO = factor(POSICIONAMIENTO_RESPECTO_PERONISMO,
                                              levels = c(1:3,9),
                                              labels = c("Peronista","Antiperonista","Ni peronista ni anti peronista","No sabe"),
                                                     ordered = T),
  POSICIONAMIENTO_RESPECTO_KIRCHNERISMO = factor(POSICIONAMIENTO_RESPECTO_KIRCHNERISMO,
                                                 levels = c(1:3,9),
                                                 labels = c("Kirchnerista","Anti kirchnerista","Ni kirchnerista ni anti kirchnerista","No sabe"),
                                                        ordered = T),
  # VOTACION_PASO EN ESTE SAV SE LLAMA VOTO_PASO SE CAMBIA EL NOMBRE EN LA TRANSFORMACION Y LUEGO SE ELIMINA VOTO_PASO
  VOTACION_PASO = case_when(
    VOTO_PASO == 0 ~ "No Sabe",
    VOTO_PASO == 1 ~ "Daniel Scioli",
    VOTO_PASO == 2 ~ "Sergio Massa",
    VOTO_PASO == 3 ~ "Mauricio Macri",
    VOTO_PASO == 4 ~ "José Manuel De La Sota",
    VOTO_PASO == 5 ~ "Margarita Stolbizer",
    VOTO_PASO == 6 ~ "Rodriguez Saa",
    VOTO_PASO == 8 ~ "Otros",
    VOTO_PASO == 9 ~ "Blanco / No voto"),
  NE_BSAS = factor(NE_BSAS,
                  levels = c(1:3),
                  labels = c("P. Completa","Sec. Comp-Terc. Inc","Terc/Univ. Completo"),
                  ordered = T))|>
  clean_names()

df_gba$voto_paso <- NULL

df_gba <- df_gba |> 
  relocate(ne_bsas, .after = votacion_paso)

skim(df_gba)
Data summary
Name df_gba
Number of rows 373
Number of columns 20
_______________________
Column type frequency:
character 7
factor 12
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
voto_candidato 0 1.00 7 20 0 8 0
voto_acotado 1 1.00 7 19 0 5 0
jamas_votaria 2 0.99 7 19 0 5 0
representacion_del_cambio 0 1.00 7 14 0 5 0
agenda_de_temas 0 1.00 6 35 0 6 0
percepcion_de_ganador 0 1.00 4 14 0 5 0
votacion_paso 0 1.00 5 22 0 8 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
edad 0 1.00 TRUE 4 50-: 168, 30-: 94, 18-: 60, >65: 51
sexo 0 1.00 TRUE 2 Muj: 196, Var: 177
niv_educativo 0 1.00 TRUE 5 Sec: 139, Pri: 80, Ter: 64, Uni: 61
gestion_cristina 0 1.00 TRUE 3 Des: 192, Apr: 145, No : 36
economia_pais_2_anos 0 1.00 TRUE 4 Emp: 177, Mej: 110, Se : 80, No : 6
economia_fliar_2_anos 3 0.99 TRUE 4 Emp: 134, Se : 124, Mej: 103, No : 9
continuidad_o_cambio 3 0.99 TRUE 4 Man: 199, Man: 88, Cam: 73, No : 10
influencia_de_cristina_en_scioli 83 0.78 TRUE 4 Bas: 149, Poc: 74, Nin: 38, No : 29
posicionamiento_espacial 0 1.00 TRUE 6 Ni : 224, No : 47, Más: 39, Tot: 28
posicionamiento_respecto_peronismo 0 1.00 TRUE 4 Ni : 209, Per: 124, Ant: 23, No : 17
posicionamiento_respecto_kirchnerismo 0 1.00 TRUE 4 Ni : 151, Ant: 110, Kir: 100, No : 12
ne_bsas 0 1.00 TRUE 3 Sec: 203, Ter: 90, P. : 80

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ua 0 1 187 107.82 1 94 187 280 373 ▇▇▇▇▇

Tratamiento de casos perdidos

Con la ayuda del paquete {mice} trabajamos con los casos perdidos.

CBA

Exploramos los casos perdidos de CBA

En el siguiente gráfico vemos que de las 320 observaciones 315 están completas la siguiente fila dice que a 3 personas les faltaba responder solo la pregunta sobre la economia del pais, 1 la de la influencia de CFK y a otra persona le falta su respuesta en agenda de temas. Decidimos imputarle los valores de mayor frecuencia

Ver código
mice::md.pattern(df_cba, rotate.names = TRUE)

    ua edad sexo niv_educativo voto_candidato voto_acotado jamas_votaria
315  1    1    1             1              1            1             1
3    1    1    1             1              1            1             1
1    1    1    1             1              1            1             1
1    1    1    1             1              1            1             1
     0    0    0             0              0            0             0
    gestion_cristina economia_fliar_2_anos continuidad_o_cambio
315                1                     1                    1
3                  1                     1                    1
1                  1                     1                    1
1                  1                     1                    1
                   0                     0                    0
    representacion_del_cambio percepcion_de_ganador posicionamiento_espacial
315                         1                     1                        1
3                           1                     1                        1
1                           1                     1                        1
1                           1                     1                        1
                            0                     0                        0
    posicionamiento_respecto_peronismo posicionamiento_respecto_kirchnerismo
315                                  1                                     1
3                                    1                                     1
1                                    1                                     1
1                                    1                                     1
                                     0                                     0
    votacion_paso ne_cba agenda_de_temas influencia_de_cristina_en_scioli
315             1      1               1                                1
3               1      1               1                                1
1               1      1               1                                0
1               1      1               0                                1
                0      0               1                                1
    economia_pais_2_anos  
315                    1 0
3                      0 1
1                      1 1
1                      1 1
                       3 5
Ver código
# df_cba |>
#   tabyl(economia_pais_2_anos) #"Empeoró"

df_cba$economia_pais_2_anos[is.na(df_cba$economia_pais_2_anos)] <- "Empeoró"

# df_cba |>
#   tabyl(influencia_de_cristina_en_scioli) #"Mucha"

df_cba$influencia_de_cristina_en_scioli[is.na(df_cba$influencia_de_cristina_en_scioli)] <- "Mucha"

# df_cba |>
#   tabyl(agenda_de_temas) #"Economía"

df_cba$agenda_de_temas[is.na(df_cba$agenda_de_temas)] <- "Economía"

GBA

En el siguiente gráfico vemos que de las 373 observaciones 283 están completas la siguiente fila dice que a 82 personas les faltaba responder solo influencia_de_cristina_en_scioli, la siguiente fila nos indica que a 3 personas le falta solo la variable continuidad o cambia, a 2 solo les falta techo, etrc. etc. Es decir tenemos 5 patrones de casos perdidos en donde el más relevante es ‘influencia_de_cristina_en_scioli’ y en el resto de los casos.

En los casos de las variables perdidas imputaremos el valor más frecuente para cada serie y lo reducimos a un solo patrón a resolver.

Ver código
mice::md.pattern(df_gba, rotate.names = TRUE)

    ua edad sexo niv_educativo voto_candidato gestion_cristina
283  1    1    1             1              1                1
82   1    1    1             1              1                1
3    1    1    1             1              1                1
2    1    1    1             1              1                1
2    1    1    1             1              1                1
1    1    1    1             1              1                1
     0    0    0             0              0                0
    economia_pais_2_anos representacion_del_cambio agenda_de_temas
283                    1                         1               1
82                     1                         1               1
3                      1                         1               1
2                      1                         1               1
2                      1                         1               1
1                      1                         1               1
                       0                         0               0
    percepcion_de_ganador posicionamiento_espacial
283                     1                        1
82                      1                        1
3                       1                        1
2                       1                        1
2                       1                        1
1                       1                        1
                        0                        0
    posicionamiento_respecto_peronismo posicionamiento_respecto_kirchnerismo
283                                  1                                     1
82                                   1                                     1
3                                    1                                     1
2                                    1                                     1
2                                    1                                     1
1                                    1                                     1
                                     0                                     0
    votacion_paso ne_bsas voto_acotado jamas_votaria economia_fliar_2_anos
283             1       1            1             1                     1
82              1       1            1             1                     1
3               1       1            1             1                     1
2               1       1            1             1                     0
2               1       1            1             0                     1
1               1       1            0             1                     0
                0       0            1             2                     3
    continuidad_o_cambio influencia_de_cristina_en_scioli   
283                    1                                1  0
82                     1                                0  1
3                      0                                1  1
2                      1                                1  1
2                      1                                1  1
1                      1                                0  3
                       3                               83 92
Ver código
# df_gba |>
#   tabyl(voto_acotado) #"Daniel Scioli"

df_gba$voto_acotado[is.na(df_gba$voto_acotado)] <- "Daniel Scioli"


# df_gba |>
#   tabyl(jamas_votaria) #"Daniel Scioli"

df_gba$jamas_votaria[is.na(df_gba$jamas_votaria)] <- "Daniel Scioli"

# df_gba |>
#   tabyl(economia_fliar_2_anos) #"Empeoró"

df_gba$economia_fliar_2_anos[is.na(df_gba$economia_fliar_2_anos)] <- "Empeoró"

# df_gba |>
#   tabyl(continuidad_o_cambio) #"Mantener algunas y cambiar otras"

df_gba$continuidad_o_cambio[is.na(df_gba$continuidad_o_cambio)] <- "Mantener algunas y cambiar otras"

Como podemos ver hay diferencias significativas en la distribución de ambos grupos (los que tienen el caso perdido y los que no)

Ver código
result <- df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, ua) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  pivot_wider(names_from = es_missing, values_from = count) %>%
  mutate(No = ifelse(is.na("No"),0,1),
         Si = ifelse(is.na("Si"),0,1)) |> 
  chisq.test()


# Realizar el grafico
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  ggplot(aes(x = ua, fill = es_missing)) +
  geom_histogram(position = "identity", bins = 10) +
  labs(x = "Categoría", y = "Count") +
  annotate("text", x = Inf, y = Inf, label = paste("p =", result$p.value), hjust = 1, vjust = 1, size = 4, 
           data = data.frame(es_missing = "No")) +
  facet_wrap(~ es_missing) +
  # Etiquetas de ejes y 
  labs(title = "Casos perdidos de variable Influencia de Cristina en Scioli",
      caption = "Fuente: elaboración propia en base a datos proporionados por la Cátedra",
      fill = "Es nulo")+
  theme_fivethirtyeight()+
  theme(plot.title = element_text(size = 16, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank())

Exploramos la distribución de casos perdidos para las variables que consideramos que podrían estar influyendo en una no respuesta (si es que la no respuesta fuese un valor que desde codificación se haya olvidado reportar) y así descartar que se deba a otra situación azarosa.

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, sexo) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = sexo, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Sexo según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, edad) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = edad, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Edad según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, niv_educativo) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = niv_educativo, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "niv_educativo según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, posicionamiento_espacial) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = posicionamiento_espacial, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Posicionamiento espacial según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  ggthemes::theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, posicionamiento_respecto_peronismo) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = posicionamiento_respecto_peronismo, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Posicionamiento respecto Peronismo según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, posicionamiento_respecto_kirchnerismo) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = posicionamiento_respecto_kirchnerismo, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Posicionamiento respecto Kirchnerismo según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  ggthemes::theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, gestion_cristina) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = gestion_cristina, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Evaluacion gestion CFK según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  ggthemes::theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, continuidad_o_cambio) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = continuidad_o_cambio, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Continuidad_o_cambio según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  ggthemes::theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Ver código
df_gba %>%
  mutate(es_missing = ifelse(is.na(influencia_de_cristina_en_scioli), "Si", "No")) %>%
  group_by(es_missing, votacion_paso) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100) %>%
  ggplot(aes(x = votacion_paso, y = percentage, fill = es_missing)) +
  geom_bar(stat = "identity", position = "identity") +
  facet_wrap(~ es_missing) +
  labs(title = "Continuidad_o_cambio según Casos perdidos de variable Influencia de Cristina en Scioli",
       caption = "Fuente: elaboración propia en base a datos proporcionados por la Cátedra",
       fill = "Es nulo",
       y = "Porcentaje") +
  ggthemes::theme_fivethirtyeight() +
  theme(plot.title = element_text(size = 10, face = "bold"),
        legend.position = "bottom",
        strip.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

Los casos perdidos para la variable Influencia de Cristina en Scioli, parecen ser: - bastante más antikirchneristas que aquellos casos en los que no tenemos respuesta - con una mayor desaprobación de la gestión de CFK - que votaron a Scioli en menos del 20% (vs. más del 40% que son los que no son nulos) - con un perfil más femenino

Sin embargo no parece haber ninguna variable que esté determinando completamente la falta de casos.

Imputación missing

Procedemos a la imputación de vuelta con el paquete {mice}

Creamos un objeto específico de este paquete (mids) al cual llamamos imp el cual contiene un conjunto de datos de imputación múltiple incluyendo el dataframe original, los valores imputados en cada iteración (que por defecto son 5), la cantidad de valores faltantes, la cantidad de iteraciones, etc. En el siguiente gráfico podemos ver como trabajo cada iteración. El gráfico muestra la media (izquierda) y la desviación estándar (derecha) de los valores imputados únicamente. Lo que buscamos es que los flujos se entremezclen y estén libres de cualquier tendencia en las iteraciones posteriores, tal cual se observa.

Ver código
imp <- mice(df_gba, seed = 123, print = F)
plot(imp)

Exploramos el método de imputación y comprobamos que se utilizó “polr”, que pmputa datos faltantes en una variable categórica mediante regresión politómica es decir una regresión logística multinomial.

La función aplica repetidamente la regresión logística en las divisiones sucesivas, en un modelo que también se conoce como modelo de enlace acumulativo y que toma del paquete MASS

Ver código
imp$meth
                                   ua                                  edad 
                                   ""                                    "" 
                                 sexo                         niv_educativo 
                                   ""                                    "" 
                       voto_candidato                          voto_acotado 
                                   ""                                    "" 
                        jamas_votaria                      gestion_cristina 
                                   ""                                    "" 
                 economia_pais_2_anos                 economia_fliar_2_anos 
                                   ""                                    "" 
                 continuidad_o_cambio             representacion_del_cambio 
                                   ""                                    "" 
                      agenda_de_temas                 percepcion_de_ganador 
                                   ""                                    "" 
     influencia_de_cristina_en_scioli              posicionamiento_espacial 
                               "polr"                                    "" 
   posicionamiento_respecto_peronismo posicionamiento_respecto_kirchnerismo 
                                   ""                                    "" 
                        votacion_paso                               ne_bsas 
                                   ""                                    "" 

Ahora asignamos la imputación seleccionando una de las iteraciones y observamos los resultados

Ver código
imp <- mice(df_gba, seed = 123, print = FALSE)
df_imputed <- complete(imp, action = "long", include = TRUE)

df_imputed <- df_imputed %>%
  filter(.imp == 1) %>%  # Filtrar solo los valores imputados de la primera iteración
  select(-.imp)  # Eliminar la columna .imp generada por complete()

df_imputed |> 
  tabyl(influencia_de_cristina_en_scioli ) |> 
  adorn_pct_formatting() |> 
  gt() |> 
  tab_header("Datos imputados") |> 
  cols_label(influencia_de_cristina_en_scioli = "Influencia de CFK en Scioli") |> 
  comunicacion::gt_theme_dnmye() 
Datos imputados
Influencia de CFK en Scioli n percent
Ninguna 47,0 12.6%
Poca 86,0 23.1%
Bastante 201,0 53.9%
Mucha 0,0 0.0%
No sabe 39,0 10.5%
Ver código
df_gba |> 
  tabyl(influencia_de_cristina_en_scioli )|> 
  adorn_pct_formatting() |> 
  gt() |> 
  tab_header("Datos sin imputar") |> 
  cols_label(influencia_de_cristina_en_scioli = "Influencia de CFK en Scioli") |> 
  comunicacion::gt_theme_dnmye() 
Datos sin imputar
Influencia de CFK en Scioli n percent valid_percent
Ninguna 38,0 10.2% 13.1%
Poca 74,0 19.8% 25.5%
Bastante 149,0 39.9% 51.4%
Mucha 0,0 0.0% 0.0%
No sabe 29,0 7.8% 10.0%
/// 83,0 22.3% -

Los resultados nos parecen satisfactorios por lo que procedemos a tomar la imputación obtenida.

Ver código
df_gba <- df_imputed
rm(df_imputed,imp)

df_gba$.id <- NULL

Análisis exploratorio previo

Antes de aplicar el ponderador realizamos unas frecuencias simples para cada una de las bases

Córdoba

En el caso de CBA se observa una muestra equilibrada en sexo y edad en la que casi 4 de cada 10 entrevistados tiene al menos un nivel universitario incompleto. Por amplia mayoría (46,9%) si fuese la fecha de las elecciones los entrevistados hubieran votado a Macri, dato que aumenta al 48,4% en el caso acotar la cantidad de candidatos sugeridos (es decir 9.6 puntos por encima de lo que finalmente obtuvo). Consecuentemente el 63,4% jamás votaría a Scioli y un 65,6% desaprueba la gestión de su compañera de partido y presidenta por aquel entonces CFK. La mitad de los entrevistados consideran que su economía empeoró en los últimos 10 años y 6 de cada 10 consideran que lo mismo aconteció con la economía del país. A pesar de ello el 56,2% espera un cambio moderado: se debería mantener algunas y cambiar otras y este cambio lo representa Mauricio Macri para el 47,2%. La percepción de un ganador se encuentra es ínfima entre Daniel Scioli (36,6%) y Mauricio Macri (37,5%). En las PASO los entrevistados dicen haber votado en un 32,5% a Macri y tan solo un 16,6% voto a Scioli abriendo paso a fuerzas locales como José Manuel De La Sota (9,7%) El posicionamiento hacia el centro (por encima del 60%) se observa tanto respecto a lo espacial como del peronismo y cae al 42,2% en relación al kirchnerismo

Ver código
#| output: asis

variables_seleccionadas <- df_cba |> select(!c("ua","ne_cba")) |> 
  colnames()

for (var in variables_seleccionadas) {
  table_data <- df_cba  |> 
    tabyl(var) |> 
    adorn_pct_formatting()
    
    
   print(table_data)
}
  edad   n percent
 18-29  64   20.0%
 30-49  96   30.0%
 50-65 103   32.2%
   >65  57   17.8%
  sexo   n percent
 Varón 141   44.1%
 Mujer 179   55.9%
                       niv_educativo   n percent
                   Primario completo  34   10.6%
    Secundario incompleto o completo  70   21.9%
       Terciario no univ. incompleto  58   18.1%
         Terciario no univ. completo  38   11.9%
 Universitario incompleto o completo 120   37.5%
       voto_candidato   n percent
 Adolfo Rodriguez Saa   7    2.2%
        Daniel Scioli  75   23.4%
  Margarita Stolbizer  13    4.1%
       Mauricio Macri 150   46.9%
     Nicolas Del Caño   5    1.6%
  Ninguno / En Blanco  14    4.4%
              No Sabe  13    4.1%
         Sergio Massa  43   13.4%
        voto_acotado   n percent
       Daniel Scioli  74   23.1%
      Mauricio Macri 155   48.4%
 Ninguno / En Blanco  24    7.5%
             No Sabe  20    6.2%
        Sergio Massa  47   14.7%
       jamas_votaria   n percent
       Daniel Scioli 203   63.4%
      Mauricio Macri  77   24.1%
 Ninguno / En Blanco  13    4.1%
             No Sabe  15    4.7%
        Sergio Massa  12    3.8%
 gestion_cristina   n percent
       Desaprueba 210   65.6%
          Aprueba  84   26.2%
          No sabe  26    8.1%
 economia_pais_2_anos   n percent
               Mejoró  48   15.0%
              Empeoró 201   62.8%
     Se mantuvo igual  57   17.8%
              No sabe  14    4.4%
 economia_fliar_2_anos   n percent
                Mejoró  63   19.7%
               Empeoró 143   44.7%
      Se mantuvo igual  97   30.3%
               No sabe  17    5.3%
             continuidad_o_cambio   n percent
      Mantener políticas actuales  42   13.1%
 Mantener algunas y cambiar otras 180   56.2%
                    Cambiar todas  75   23.4%
                          No sabe  23    7.2%
 representacion_del_cambio   n percent
             Daniel Scioli  55   17.2%
            Mauricio Macri 151   47.2%
                   Ninguno  36   11.2%
                   No sabe  31    9.7%
              Sergio Massa  47   14.7%
                     agenda_de_temas  n percent
                            Economía 83   25.9%
 Educacion, asistencia social, salud 67   20.9%
                              Empleo 30    9.4%
                             No sabe 23    7.2%
            Respeto de instituciones 61   19.1%
                           Seguridad 56   17.5%
 percepcion_de_ganador   n percent
         Daniel Scioli 117   36.6%
        Mauricio Macri 120   37.5%
               No sabe  55   17.2%
                  Otro   7    2.2%
          Sergio Massa  21    6.6%
 influencia_de_cristina_en_scioli   n percent
                          Ninguna  21    6.6%
                             Poca  47   14.7%
                         Bastante 102   31.9%
                            Mucha 119   37.2%
                          No sabe  31    9.7%
        posicionamiento_espacial   n percent
         Totalmente de izquierda  15    4.7%
       Más izquierda que derecha  36   11.2%
   Ni de izquierda ni de derecha 202   63.1%
 Más de derecha que de izquierda  20    6.2%
           Totalmente de derecha  10    3.1%
                         No sabe  37   11.6%
 posicionamiento_respecto_peronismo   n percent
                          Peronista  47   14.7%
                      Antiperonista  34   10.6%
     Ni peronista ni anti peronista 207   64.7%
                            No sabe  32   10.0%
 posicionamiento_respecto_kirchnerismo   n percent
                          Kirchnerista  33   10.3%
                     Anti kirchnerista 124   38.8%
  Ni kirchnerista ni anti kirchnerista 135   42.2%
                               No sabe  28    8.8%
          votacion_paso   n percent
       Blanco / No voto  23    7.2%
          Daniel Scioli  53   16.6%
 José Manuel De La Sota  31    9.7%
    Margarita Stolbizer  18    5.6%
         Mauricio Macri 104   32.5%
                  Otros  33   10.3%
          Rodriguez Saa  25    7.8%
           Sergio Massa  33   10.3%

GBA

GBA muestra equilibrada por sexo pero con lo que a priori pareciera una leve concentración en el tramo etario 50-65 (45%) y un nivel socio-educativo de educación media (37,3%). A diferencia de Córdoba Mauricio Macri obtiene una intención de 29,8% puntos detrás de Daniel Scioli con el 38,6%. Esta diferencia se ajusta al acotar el listado de candidatos en las que Macri logra alcanzar una intención de voto del 31,6%. El rechazo también es como en el caso de Córdoba liderado por el peronismo, aunque no por mucho: Daniel Scioli obtiene 44,8% y con tan solo unos puntos de diferencia Mauricio Macri 39,4%. Si bien la mitad de los bonaerenses desaprueba la gestión de CFK en un contexto donde se evalúa un deterioro tanto de la economía del país (47,5%), 3 de cada 10 entrevistados declaran que su economía familiar se mantuvo igual (33,2%) o incluso mejoró en el (27,6%) y como en el caso de la docta la mitad (54,2%) comprenden que se debería optar por mantener algunas políticas y cambiar otras. Y es en este punto donde si bien Macri lleva la delantera como agente de este cambio (34,0%), no se aleja tanto del peronista Daniel Scioli (31,4%) y Massa aparece como un candidato significativo (22,0%) ambos importantes líderes bonaerenses. Respecto de la percepción de quién ganará Scioli lleva una clara ventaja con el 46,4% superando ampliamente a Macri (25,5%). Los posicionamientos parecen distribuir de manera bastante similar a los bonaerenses que a los cordobeses: un alineamiento bastante marcado hacia el centro respecto de los espacios de izquierda o derecha (60,1%), que no es Ni peronista ni anti peronista (56,0%) pero más reducido respecto del kirchnerismo (40,5%)

Ver código
variables_seleccionadas <- df_gba |> select(!c("ua","ne_bsas")) |> 
  colnames()

for (var in variables_seleccionadas) {
  table_data <- df_cba  |> 
    tabyl(var) |> 
    adorn_pct_formatting()
    
    
   print(table_data)
}
  edad   n percent
 18-29  64   20.0%
 30-49  96   30.0%
 50-65 103   32.2%
   >65  57   17.8%
  sexo   n percent
 Varón 141   44.1%
 Mujer 179   55.9%
                       niv_educativo   n percent
                   Primario completo  34   10.6%
    Secundario incompleto o completo  70   21.9%
       Terciario no univ. incompleto  58   18.1%
         Terciario no univ. completo  38   11.9%
 Universitario incompleto o completo 120   37.5%
       voto_candidato   n percent
 Adolfo Rodriguez Saa   7    2.2%
        Daniel Scioli  75   23.4%
  Margarita Stolbizer  13    4.1%
       Mauricio Macri 150   46.9%
     Nicolas Del Caño   5    1.6%
  Ninguno / En Blanco  14    4.4%
              No Sabe  13    4.1%
         Sergio Massa  43   13.4%
        voto_acotado   n percent
       Daniel Scioli  74   23.1%
      Mauricio Macri 155   48.4%
 Ninguno / En Blanco  24    7.5%
             No Sabe  20    6.2%
        Sergio Massa  47   14.7%
       jamas_votaria   n percent
       Daniel Scioli 203   63.4%
      Mauricio Macri  77   24.1%
 Ninguno / En Blanco  13    4.1%
             No Sabe  15    4.7%
        Sergio Massa  12    3.8%
 gestion_cristina   n percent
       Desaprueba 210   65.6%
          Aprueba  84   26.2%
          No sabe  26    8.1%
 economia_pais_2_anos   n percent
               Mejoró  48   15.0%
              Empeoró 201   62.8%
     Se mantuvo igual  57   17.8%
              No sabe  14    4.4%
 economia_fliar_2_anos   n percent
                Mejoró  63   19.7%
               Empeoró 143   44.7%
      Se mantuvo igual  97   30.3%
               No sabe  17    5.3%
             continuidad_o_cambio   n percent
      Mantener políticas actuales  42   13.1%
 Mantener algunas y cambiar otras 180   56.2%
                    Cambiar todas  75   23.4%
                          No sabe  23    7.2%
 representacion_del_cambio   n percent
             Daniel Scioli  55   17.2%
            Mauricio Macri 151   47.2%
                   Ninguno  36   11.2%
                   No sabe  31    9.7%
              Sergio Massa  47   14.7%
                     agenda_de_temas  n percent
                            Economía 83   25.9%
 Educacion, asistencia social, salud 67   20.9%
                              Empleo 30    9.4%
                             No sabe 23    7.2%
            Respeto de instituciones 61   19.1%
                           Seguridad 56   17.5%
 percepcion_de_ganador   n percent
         Daniel Scioli 117   36.6%
        Mauricio Macri 120   37.5%
               No sabe  55   17.2%
                  Otro   7    2.2%
          Sergio Massa  21    6.6%
 influencia_de_cristina_en_scioli   n percent
                          Ninguna  21    6.6%
                             Poca  47   14.7%
                         Bastante 102   31.9%
                            Mucha 119   37.2%
                          No sabe  31    9.7%
        posicionamiento_espacial   n percent
         Totalmente de izquierda  15    4.7%
       Más izquierda que derecha  36   11.2%
   Ni de izquierda ni de derecha 202   63.1%
 Más de derecha que de izquierda  20    6.2%
           Totalmente de derecha  10    3.1%
                         No sabe  37   11.6%
 posicionamiento_respecto_peronismo   n percent
                          Peronista  47   14.7%
                      Antiperonista  34   10.6%
     Ni peronista ni anti peronista 207   64.7%
                            No sabe  32   10.0%
 posicionamiento_respecto_kirchnerismo   n percent
                          Kirchnerista  33   10.3%
                     Anti kirchnerista 124   38.8%
  Ni kirchnerista ni anti kirchnerista 135   42.2%
                               No sabe  28    8.8%
          votacion_paso   n percent
       Blanco / No voto  23    7.2%
          Daniel Scioli  53   16.6%
 José Manuel De La Sota  31    9.7%
    Margarita Stolbizer  18    5.6%
         Mauricio Macri 104   32.5%
                  Otros  33   10.3%
          Rodriguez Saa  25    7.8%
           Sergio Massa  33   10.3%

Antes de realizar las ponderaciones iteradas por las variables socio demográficas (propuestas por la Cátedra), observamos la distribución de estos cruces en ambas muestras y que son nuestro punto de partida

Voto segun sociodemográficas CBA

Ver código
df_cba |> 
  tabyl(voto_candidato,sexo) |> 
  adorn_totals('col') |> 
  arrange(desc(as.numeric(Total))) |> 
  adorn_percentages('col') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**A quien votaria si hoy fuese 25/10 por sexo**"),
                 subtitle = "Córdoba") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (320).") |> 
  comunicacion::gt_theme_dnmye()
A quien votaria si hoy fuese 25/10 por sexo
Córdoba
Candidatura Varón Mujer Total
Mauricio Macri 48.9% 45.3% 46.9%
Daniel Scioli 26.2% 21.2% 23.4%
Sergio Massa 7.8% 17.9% 13.4%
Ninguno / En Blanco 5.0% 3.9% 4.4%
Margarita Stolbizer 5.0% 3.4% 4.1%
No Sabe 2.8% 5.0% 4.1%
Adolfo Rodriguez Saa 3.5% 1.1% 2.2%
Nicolas Del Caño 0.7% 2.2% 1.6%
Total 100.0% 100.0% 100.0%
Total respondentes (320).
Datos sin ponderar
Ver código
df_cba |> 
  tabyl(voto_candidato,edad) |> 
  adorn_totals('col') |> 
  arrange(desc(as.numeric(Total))) |> 
  adorn_percentages('col') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**A quien votaria si hoy fuese 25/10 por edad**"),
                 subtitle = "Córdoba") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (320).") |> 
  comunicacion::gt_theme_dnmye()
A quien votaria si hoy fuese 25/10 por edad
Córdoba
Candidatura 18-29 30-49 50-65 >65 Total
Mauricio Macri 51.6% 41.7% 54.4% 36.8% 46.9%
Daniel Scioli 29.7% 31.2% 17.5% 14.0% 23.4%
Sergio Massa 3.1% 10.4% 19.4% 19.3% 13.4%
Ninguno / En Blanco 1.6% 4.2% 1.9% 12.3% 4.4%
Margarita Stolbizer 3.1% 4.2% 1.9% 8.8% 4.1%
No Sabe 7.8% 5.2% 1.0% 3.5% 4.1%
Adolfo Rodriguez Saa 1.6% 1.0% 2.9% 3.5% 2.2%
Nicolas Del Caño 1.6% 2.1% 1.0% 1.8% 1.6%
Total 100.0% 100.0% 100.0% 100.0% 100.0%
Total respondentes (320).
Datos sin ponderar

Composición del tramo etario dentro de cada candidato

Ver código
df_cba |> 
  tabyl(voto_candidato,edad) |> 
  adorn_totals('col') |> 
  adorn_percentages('row') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**Composición etaria del voto de cada candidato**"),
                 subtitle = "Córdoba") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (320).") |> 
  comunicacion::gt_theme_dnmye()
Composición etaria del voto de cada candidato
Córdoba
Candidatura 18-29 30-49 50-65 >65 Total
Adolfo Rodriguez Saa 14.3% 14.3% 42.9% 28.6% 100.0%
Daniel Scioli 25.3% 40.0% 24.0% 10.7% 100.0%
Margarita Stolbizer 15.4% 30.8% 15.4% 38.5% 100.0%
Mauricio Macri 22.0% 26.7% 37.3% 14.0% 100.0%
Nicolas Del Caño 20.0% 40.0% 20.0% 20.0% 100.0%
Ninguno / En Blanco 7.1% 28.6% 14.3% 50.0% 100.0%
No Sabe 38.5% 38.5% 7.7% 15.4% 100.0%
Sergio Massa 4.7% 23.3% 46.5% 25.6% 100.0%
Total 147.3% 242.0% 208.1% 202.7% 800.0%
Total respondentes (320).
Datos sin ponderar
Ver código
df_cba  |> 
  group_by(voto_candidato, niv_educativo)  |> 
  summarise(recuento = n_distinct(ua)) |> 
  mutate(prop = round(recuento/sum(recuento)*100),2) |> 
  ggplot(aes(x = voto_candidato, y = prop, fill = niv_educativo)) +
  geom_col() +
  scale_fill_brewer(palette = "BuPu", direction = 1) +
  labs(x = " ", y = "%", 
       title = "Voto si fuese 25/10 según nivel educativo",
       subtitle = "Córdoba",
       caption = "Base Total respondentes (320). Base sin ponderar",
       fill = "Nivel educativo"
  ) +
  coord_flip() +
  geom_text(aes(label = paste0(prop,"%")), position = position_stack(vjust = 0.5), size = 3)+
  ggthemes::theme_fivethirtyeight()+
  theme(plot.title = element_text(size = 16, face = "bold"),
        strip.background = element_blank(), 
        legend.position = "right",
        legend.direction = "vertical")

Voto segun sociodemográficas GBA

Ver código
df_gba |> 
  tabyl(voto_candidato,sexo) |> 
  adorn_totals('col') |> 
  arrange(desc(as.numeric(Total))) |> 
  adorn_percentages('col') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**A quien votaria si hoy fuese 25/10**"),
                 subtitle = "GBA") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (373).") |> 
  comunicacion::gt_theme_dnmye()
A quien votaria si hoy fuese 25/10
GBA
Candidatura Varón Mujer Total
Daniel Scioli 33.9% 42.9% 38.6%
Mauricio Macri 27.7% 31.6% 29.8%
Sergio Massa 26.6% 16.8% 21.4%
Margarita Stolbizer 5.1% 3.1% 4.0%
No Sabe 2.8% 2.0% 2.4%
Ninguno / En Blanco 1.7% 2.6% 2.1%
Nicolas Del Caño 1.1% 1.0% 1.1%
Adolfo Rodriguez Saa 1.1% 0.0% 0.5%
Total 100.0% 100.0% 100.0%
Total respondentes (373).
Datos sin ponderar

Composición del tramo etario dentro de cada candidato

Ver código
df_gba |> 
  tabyl(voto_candidato,edad) |> 
  adorn_totals('col') |> 
  adorn_percentages('row') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**Composición etaria del voto de cada candidato**"),
                 subtitle = "GBA") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (320).") |> 
  comunicacion::gt_theme_dnmye()
Composición etaria del voto de cada candidato
GBA
Candidatura 18-29 30-49 50-65 >65 Total
Adolfo Rodriguez Saa 0.0% 0.0% 50.0% 50.0% 100.0%
Daniel Scioli 19.4% 25.7% 44.4% 10.4% 100.0%
Margarita Stolbizer 0.0% 13.3% 66.7% 20.0% 100.0%
Mauricio Macri 12.6% 26.1% 44.1% 17.1% 100.0%
Nicolas Del Caño 100.0% 0.0% 0.0% 0.0% 100.0%
Ninguno / En Blanco 25.0% 37.5% 12.5% 25.0% 100.0%
No Sabe 0.0% 33.3% 66.7% 0.0% 100.0%
Sergio Massa 15.0% 25.0% 46.2% 13.8% 100.0%
Total 172.1% 161.0% 330.7% 136.3% 800.0%
Total respondentes (320).
Datos sin ponderar
Ver código
df_gba |> 
  tabyl(voto_candidato,edad) |> 
  adorn_totals('col') |> 
  arrange(desc(as.numeric(Total))) |> 
  adorn_percentages('col') |> 
  adorn_totals() |> 
  adorn_pct_formatting() |> 
  gt() |> 
  gt::tab_header(title = md("**A quien votaria si hoy fuese 25/10 por edad**"),
                 subtitle = "GBA") |> 
  cols_label(voto_candidato = "Candidatura") |> 
  tab_footnote(footnote = "Datos sin ponderar") |> 
  tab_source_note(source_note =  "Total respondentes (373).") |> 
  comunicacion::gt_theme_dnmye()
A quien votaria si hoy fuese 25/10 por edad
GBA
Candidatura 18-29 30-49 50-65 >65 Total
Daniel Scioli 46.7% 39.4% 38.1% 29.4% 38.6%
Mauricio Macri 23.3% 30.9% 29.2% 37.3% 29.8%
Sergio Massa 20.0% 21.3% 22.0% 21.6% 21.4%
Margarita Stolbizer 0.0% 2.1% 6.0% 5.9% 4.0%
No Sabe 0.0% 3.2% 3.6% 0.0% 2.4%
Ninguno / En Blanco 3.3% 3.2% 0.6% 3.9% 2.1%
Nicolas Del Caño 6.7% 0.0% 0.0% 0.0% 1.1%
Adolfo Rodriguez Saa 0.0% 0.0% 0.6% 2.0% 0.5%
Total 100.0% 100.0% 100.0% 100.0% 100.0%
Total respondentes (373).
Datos sin ponderar

Ponderación iterativa

En esta sección aplicamos la técnica de ponderadores iterativos, es decir una pos-estratificación que pondera la muestra de acuerdo a determinadas características poblacionales disponibles y relevantes a los objetivos del estudio, en este caso explicar el voto de las personas. En el caso de que tuviéramos teniendo en cuenta otras perspectivas y fuentes podríamos elaborar otros ponderadores o sumarlos a la iteración.

Para realizarlo seguimos las recomendaciones del politólogo Zachary Hertz en su post Creating Survey Weights in R Using Census Data que realiza un ejercicio similar utilizando los paquetes {survey} y {anesrake}

{anesrake} nos permite tomar como un conjunto de variables/distribuciones paramétricas (o target) organizadas en un objeto lista y ajustar automáticamente la distribución de nuestra encuesta para estas variables. En esta lista, cada elemento representa una variable y es un vector, o un objeto de valores numéricos, donde cada valor numérico es la proporción de la población representada por el nivel dado de la variable.

Al crear ponderaciones con {anesrake} las variables deben tener el mismo nombre tanto para sus datos como para los targets parámetros poblacionales y en el caso de ser variables categóricas (como edad y nivel socio-educativo) deben tener el mismo número de categorías.

En este caso tomaremos los datos poblacionales de la EPH contemporáneos al momento de la encuesta y propuestos por la cátedra en la consigna, pero en caso que así nos lo propusiéramos y tuviéramos acceso a datos de similar representatividad y que consideramos relevantes en la decisión del voto en ese momento también podríamos utilizarlos en nuestra

Obtenemos las tablas con los parámetros poblacionales

Ver código
## importar datos sociodemograficos
eph_sexo <- readxl::read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "sexo")
eph_edad <- readxl::read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "edad")
eph_educa <- readxl::read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "educa")

Creamos un listado de vectores (target) con los parámetros de Córdoba

Ver código
# Sexo
eph_sexo_cba <- eph_sexo  |> 
  adorn_percentages('col')  |> 
  select(sexo, cba) |> 
  mutate(prop = cba)  |> 
  select(sexo, prop) |> 
  as.data.frame()  |> 
  pull(prop) |> # es similar a $. y permite nombrar el output
  as.numeric() 

names(eph_sexo_cba) <- c("Varón","Mujer")

# Edad
eph_edad_cba <- eph_edad |> 
  filter(edad !=18) |> #se filtran los menores de 18 ya que aparentemente no fueron entrevistados o no hay casos
  mutate(edad = case_when(edad <=29 ~ 1,
                          edad <=49 ~ 2,
                          edad <=65 ~ 3,
                          edad >65 ~ 4)) |>
  mutate (edad = factor(edad,
                levels = c(1:4), 
                labels = c("18-29","30-49","50-65",">65"),
                ordered = T)) |> 
  select('edad','cba') |> 
  group_by(edad) |> 
  summarise(n = sum(cba)) |> 
  mutate(prop = n/sum(n)) |> 
  select(edad, prop)|> 
  as.data.frame() |> 
  pull(prop) |> 
  as.numeric() 
  
names(eph_edad_cba) <- c("18-29","30-49","50-65",">65")

# Nivel educativo
eph_ne_cba <- eph_educa %>%
  mutate(ne_cba = factor(nivel_educativo,
                         levels = c("Sin instrucción", "Primaria Incompleta (incluye educación especial)", "Primaria Completa",
                                    "Secundaria Incompleta", "Secundaria Completa", "Superior Universitaria Incompleta",
                                    "Superior Universitaria Completa"),
                         labels = c("P. Completa", "P. Completa", "P. Completa", "Sec. Comp-Terc. Inc", "Sec. Comp-Terc. Inc",
                                    "Terc/Univ. Completo", "Terc/Univ. Completo"),
                         ordered = TRUE)) |> 
  select(ne_cba,cba) |> 
  group_by(ne_cba) |> 
  summarise(n= sum(cba)) |> 
  mutate(prop = n/sum(n)) |> 
  select(!n) |> 
  pull(prop) |> 
  as.numeric()

names(eph_ne_cba) <- c("P. Completa", "Sec. Comp-Terc. Inc", "Terc/Univ. Completo")

# Armar el listado
targets_cba <- list(eph_sexo_cba,eph_edad_cba,eph_ne_cba)

# Indicar los mismos nombres de variable que tiene en el df para cada elemento del listado
names(targets_cba) <- c("sexo","edad","ne_cba")

targets_cba
$sexo
    Varón     Mujer 
0.4667904 0.5332096 

$edad
    18-29     30-49     50-65       >65 
0.2817004 0.3795721 0.2026046 0.1361230 

$ne_cba
        P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo 
          0.2382054           0.3958940           0.3659006 

Debido a un tema de compatibilidad con el paquete {anesrake} convertimos en data.frame nuestra tabla df_cba que está como tibble

Ver código
#convertimos el df_cba en dataframe
df_cba <-  as.data.frame(df_cba)
str(df_cba)
'data.frame':   320 obs. of  20 variables:
 $ ua                                   : num  1 2 3 4 5 6 7 8 9 10 ...
 $ edad                                 : Ord.factor w/ 4 levels "18-29"<"30-49"<..: 2 3 2 1 3 1 3 3 3 1 ...
 $ sexo                                 : Ord.factor w/ 2 levels "Varón"<"Mujer": 2 2 2 2 1 1 1 1 2 2 ...
 $ niv_educativo                        : Ord.factor w/ 5 levels "Primario completo"<..: 2 2 5 5 5 5 5 5 2 5 ...
 $ voto_candidato                       : chr  "Sergio Massa" "Sergio Massa" "Mauricio Macri" "Mauricio Macri" ...
 $ voto_acotado                         : chr  "Mauricio Macri" "Sergio Massa" "Mauricio Macri" "Mauricio Macri" ...
 $ jamas_votaria                        : chr  "Daniel Scioli" "Daniel Scioli" "Daniel Scioli" "Daniel Scioli" ...
 $ gestion_cristina                     : Ord.factor w/ 3 levels "Desaprueba"<"Aprueba"<..: 1 1 1 1 3 1 1 1 1 1 ...
 $ economia_pais_2_anos                 : Ord.factor w/ 4 levels "Mejoró"<"Empeoró"<..: 3 2 2 2 2 2 2 2 2 1 ...
 $ economia_fliar_2_anos                : Ord.factor w/ 4 levels "Mejoró"<"Empeoró"<..: 2 2 3 2 3 2 2 3 2 1 ...
 $ continuidad_o_cambio                 : Ord.factor w/ 4 levels "Mantener políticas actuales"<..: 3 3 2 2 2 2 3 2 2 2 ...
 $ representacion_del_cambio            : chr  "Sergio Massa" "Sergio Massa" "Mauricio Macri" "Mauricio Macri" ...
 $ agenda_de_temas                      : chr  "Seguridad" "Economía" "Educacion, asistencia social, salud" "Economía" ...
 $ percepcion_de_ganador                : chr  "Sergio Massa" "Sergio Massa" "Daniel Scioli" "Mauricio Macri" ...
 $ influencia_de_cristina_en_scioli     : Ord.factor w/ 5 levels "Ninguna"<"Poca"<..: 3 3 4 3 3 4 4 3 3 2 ...
 $ posicionamiento_espacial             : Ord.factor w/ 6 levels "Totalmente de izquierda"<..: 3 1 3 3 4 3 3 3 4 4 ...
 $ posicionamiento_respecto_peronismo   : Ord.factor w/ 4 levels "Peronista"<"Antiperonista"<..: 3 3 3 3 3 3 3 2 3 4 ...
 $ posicionamiento_respecto_kirchnerismo: Ord.factor w/ 4 levels "Kirchnerista"<..: 2 2 2 2 3 2 3 2 3 3 ...
 $ votacion_paso                        : chr  "Sergio Massa" "Sergio Massa" "Mauricio Macri" "Mauricio Macri" ...
 $ ne_cba                               : Ord.factor w/ 3 levels "P. Completa"<..: 2 2 3 3 3 3 3 3 2 3 ...

Ahora con la función anesrake creamos los ponderadores. La función tiene un primer parámetro (inputter) donde indicamos el target al cual queremos llegar, dataframe (con los datos de nuestra encuesta), case id donde debemos identificar el id de los casos y type donde le indicamos de qué forma de se debe utilizar las variables de ponderación. Hay cinco opciones disponibles entre las cuales se elije "nolim" ya que todas las variables especificadas en target se incluirán en el procedimiento de ponderación. A los fines de poder ver cómo se realizan las iteraciones sumamos también el parámetroverbose = TRUE (el cual es optativo). Así podemos ver que el algoritmo realiza 23 iteraciones hasta ajustar nuestra muestra a los parámetros indicados.

Ver código
weights_cba <- anesrake(inputter = targets_cba, dataframe = df_cba, caseid = df_cba$ua, type = "nolim", verbose = TRUE) 
[1] "Raking...Iteration 1"
[1] "Current iteration changed total weights by 128.302149114808"
[1] "Raking...Iteration 2"
[1] "Current iteration changed total weights by 36.1994646067181"
[1] "Raking...Iteration 3"
[1] "Current iteration changed total weights by 6.92518882427255"
[1] "Raking...Iteration 4"
[1] "Current iteration changed total weights by 1.40072147245333"
[1] "Raking...Iteration 5"
[1] "Current iteration changed total weights by 0.299529581237332"
[1] "Raking...Iteration 6"
[1] "Current iteration changed total weights by 0.0534873480026485"
[1] "Raking...Iteration 7"
[1] "Current iteration changed total weights by 0.00714955071329126"
[1] "Raking...Iteration 8"
[1] "Current iteration changed total weights by 0.000905894066602075"
[1] "Raking...Iteration 9"
[1] "Current iteration changed total weights by 0.000187745466680322"
[1] "Raking...Iteration 10"
[1] "Current iteration changed total weights by 3.82944153264897e-05"
[1] "Raking...Iteration 11"
[1] "Current iteration changed total weights by 8.24512320135584e-06"
[1] "Raking...Iteration 12"
[1] "Current iteration changed total weights by 1.50794707187707e-06"
[1] "Raking...Iteration 13"
[1] "Current iteration changed total weights by 2.06781080036578e-07"
[1] "Raking...Iteration 14"
[1] "Current iteration changed total weights by 2.51755558622335e-08"
[1] "Raking...Iteration 15"
[1] "Current iteration changed total weights by 5.15116566068841e-09"
[1] "Raking...Iteration 16"
[1] "Current iteration changed total weights by 1.04614256146718e-09"
[1] "Raking...Iteration 17"
[1] "Current iteration changed total weights by 2.26242080625383e-10"
[1] "Raking...Iteration 18"
[1] "Current iteration changed total weights by 4.2446768322435e-11"
[1] "Raking...Iteration 19"
[1] "Current iteration changed total weights by 6.0134119905797e-12"
[1] "Raking...Iteration 20"
[1] "Current iteration changed total weights by 7.07045533232531e-13"
[1] "Raking...Iteration 21"
[1] "Current iteration changed total weights by 1.46271883494364e-13"
[1] "Raking...Iteration 22"
[1] "Current iteration changed total weights by 3.27515792264421e-14"
[1] "Raking...Iteration 23"
[1] "Current iteration changed total weights by 4.42978986825437e-14"
[1] "Raking converged in 23 iterations"

Si observamos un resumen del objeto creado por anesrake nos brinda además de los ponderadores (almacenados en el elemento convergence) más información acerca del proceso de ponderación automática respecto del target como el efecto sobre el diseño (general.design.effect) y el peso de ponderación y desviación respecto de la muestra original para cada una de las variables y sus categorías

Ver código
summary(weights_cba)
$convergence
[1] "Complete convergence was achieved after 23 iterations"

$base.weights
[1] "No Base Weights Were Used"

$raking.variables
[1] "sexo"   "edad"   "ne_cba"

$weight.summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.4179  0.6166  0.8382  1.0000  1.2098  3.8018 

$selection.method
[1] "variable selection conducted using _nolim_ - discrepancies selected using _total_."

$general.design.effect
[1] 1.361843

$sexo
         Target Unweighted N Unweighted %    Wtd N     Wtd % Change in %
Varón 0.4667904          141     0.440625 149.3729 0.4667904   0.0261654
Mujer 0.5332096          179     0.559375 170.6271 0.5332096  -0.0261654
Total 1.0000000          320     1.000000 320.0000 1.0000000   0.0523308
      Resid. Disc. Orig. Disc.
Varón            0   0.0261654
Mujer            0  -0.0261654
Total            0   0.0523308

$edad
         Target Unweighted N Unweighted %     Wtd N     Wtd % Change in %
18-29 0.2817004           64     0.200000  90.14413 0.2817004  0.08170039
30-49 0.3795721           96     0.300000 121.46306 0.3795721  0.07957207
50-65 0.2026046          103     0.321875  64.83347 0.2026046 -0.11927041
>65   0.1361230           57     0.178125  43.55934 0.1361230 -0.04200205
Total 1.0000000          320     1.000000 320.00000 1.0000000  0.32254492
      Resid. Disc. Orig. Disc.
18-29 0.000000e+00  0.08170039
30-49 0.000000e+00  0.07957207
50-65 2.775558e-17 -0.11927041
>65   0.000000e+00 -0.04200205
Total 2.775558e-17  0.32254492

$ne_cba
                       Target Unweighted N Unweighted %     Wtd N     Wtd %
P. Completa         0.2382054           34      0.10625  76.22573 0.2382054
Sec. Comp-Terc. Inc 0.3958940          128      0.40000 126.68609 0.3958940
Terc/Univ. Completo 0.3659006          158      0.49375 117.08818 0.3659006
Total               1.0000000          320      1.00000 320.00000 1.0000000
                     Change in %  Resid. Disc.  Orig. Disc.
P. Completa          0.131955420  2.775558e-17  0.131955420
Sec. Comp-Terc. Inc -0.004105981  5.551115e-17 -0.004105981
Terc/Univ. Completo -0.127849439 -5.551115e-17 -0.127849439
Total                0.263910840  1.387779e-16  0.263910840

Agregamos a nuestra base de datos el resultado de la imputación como ponderador en la variable pondera_eph y observamos la diferencia de las distribuciones sin ponderar y con los datos ponderados.

Ver código
df_cba$pondera_eph  <- unlist(weights_cba[1])

df_cba %>%
  group_by(voto_acotado) %>%
  summarise(n = n_distinct(ua),
            n_pond = sum(pondera_eph)) %>%
  mutate("%" = paste0(round(n / sum(n)*100,2),"%"),
         "% pond" = paste0(round(n_pond / sum(n_pond)*100,2),"%")) |> 
  gt() |> 
  tab_header(title = "Voto acotado poderado y sin poderar",
             subtitle = "Córdoba") |> 
  comunicacion::gt_theme_dnmye() |> 
  cols_label(voto_acotado = "Voto acotado")
Voto acotado poderado y sin poderar
Córdoba
Voto acotado n n_pond % % pond
Daniel Scioli 74 80,5 23.12% 25.16%
Mauricio Macri 155 150,5 48.44% 47.02%
Ninguno / En Blanco 24 24,8 7.5% 7.74%
No Sabe 20 26,3 6.25% 8.21%
Sergio Massa 47 37,9 14.69% 11.86%

Repetimos todos estos pasos para la muestra de GBA

Ver código
### Targets GBA

# Sexo
eph_sexo_gba <- eph_sexo  |> 
  adorn_percentages('col')  |> 
  select(sexo, gba) |> 
  mutate(prop = gba)  |> 
  select(sexo, prop) |> 
  as.data.frame()  |> 
  pull(prop) |> # es similar a $. y permite nombrar el output
  as.numeric() 

names(eph_sexo_gba) <- c("Varón","Mujer")

# Edad
eph_edad_gba <- eph_edad |> 
  filter(edad !=18) |> #se filtran los menores de 18 ya que aparentemente no fueron entrevistados o no hay casos
  mutate(edad = case_when(edad <=29 ~ 1,
                          edad <=49 ~ 2,
                          edad <=65 ~ 3,
                          edad >65 ~ 4)) |>
  mutate (edad = factor(edad,
                levels = c(1:4), 
                labels = c("18-29","30-49","50-65",">65"),
                ordered = T)) |> 
  select('edad','gba') |> 
  group_by(edad) |> 
  summarise(n = sum(gba)) |> 
  mutate(prop = n/sum(n)) |> 
  select(edad, prop)|> 
  as.data.frame() |> 
  pull(prop) |> 
  as.numeric() 
  
names(eph_edad_gba) <- c("18-29","30-49","50-65",">65")

# Nivel educativo
eph_ne_gba <- eph_educa %>%
  mutate(ne_bsas = factor(nivel_educativo,
                         levels = c("Sin instrucción", "Primaria Incompleta (incluye educación especial)", "Primaria Completa",
                                    "Secundaria Incompleta", "Secundaria Completa", "Superior Universitaria Incompleta",
                                    "Superior Universitaria Completa"),
                         labels = c("P. Completa", "P. Completa", "P. Completa", "Sec. Comp-Terc. Inc", "Sec. Comp-Terc. Inc",
                                    "Terc/Univ. Completo", "Terc/Univ. Completo"),
                         ordered = TRUE)) |> 
  select(ne_bsas,gba) |> 
  group_by(ne_bsas) |> 
  summarise(n= sum(gba)) |> 
  mutate(prop = n/sum(n)) |> 
  select(!n) |> 
  pull(prop) |> 
  as.numeric()

names(eph_ne_gba) <- c("P. Completa", "Sec. Comp-Terc. Inc", "Terc/Univ. Completo")

# Armar el listado
targets_gba <- list(eph_sexo_gba,eph_edad_gba,eph_ne_gba)

# Indicar los mismos nombres de variable que tiene en el df para cada elemento del listado
names(targets_gba) <- c("sexo","edad","ne_bsas")

targets_gba
$sexo
   Varón    Mujer 
0.479009 0.520991 

$edad
    18-29     30-49     50-65       >65 
0.2524552 0.4031634 0.2174784 0.1269029 

$ne_bsas
        P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo 
          0.3258950           0.4614199           0.2126851 
Ver código
#convertimos el df_cba en dataframe
df_gba <-  as.data.frame(df_gba)

# creacion de ponderacion
weights_gba <- anesrake(inputter = targets_gba, dataframe = df_gba, caseid = df_gba$ua, type = "nolim", verbose = TRUE) 
[1] "Raking...Iteration 1"
[1] "Current iteration changed total weights by 163.402567353402"
[1] "Raking...Iteration 2"
[1] "Current iteration changed total weights by 41.4885204725556"
[1] "Raking...Iteration 3"
[1] "Current iteration changed total weights by 11.0271444747947"
[1] "Raking...Iteration 4"
[1] "Current iteration changed total weights by 2.9704897043436"
[1] "Raking...Iteration 5"
[1] "Current iteration changed total weights by 0.824222322682923"
[1] "Raking...Iteration 6"
[1] "Current iteration changed total weights by 0.22987989402422"
[1] "Raking...Iteration 7"
[1] "Current iteration changed total weights by 0.0642345577372977"
[1] "Raking...Iteration 8"
[1] "Current iteration changed total weights by 0.0179575174661372"
[1] "Raking...Iteration 9"
[1] "Current iteration changed total weights by 0.00502093319830799"
[1] "Raking...Iteration 10"
[1] "Current iteration changed total weights by 0.00140391021252645"
[1] "Raking...Iteration 11"
[1] "Current iteration changed total weights by 0.000392553565149778"
[1] "Raking...Iteration 12"
[1] "Current iteration changed total weights by 0.000109763976302746"
[1] "Raking...Iteration 13"
[1] "Current iteration changed total weights by 3.06917112944394e-05"
[1] "Raking...Iteration 14"
[1] "Current iteration changed total weights by 8.58188084090772e-06"
[1] "Raking...Iteration 15"
[1] "Current iteration changed total weights by 2.39962780168579e-06"
[1] "Raking...Iteration 16"
[1] "Current iteration changed total weights by 6.70973392513652e-07"
[1] "Raking...Iteration 17"
[1] "Current iteration changed total weights by 1.87614646485201e-07"
[1] "Raking...Iteration 18"
[1] "Current iteration changed total weights by 5.24599749751609e-08"
[1] "Raking...Iteration 19"
[1] "Current iteration changed total weights by 1.46686297552989e-08"
[1] "Raking...Iteration 20"
[1] "Current iteration changed total weights by 4.1015975615899e-09"
[1] "Raking...Iteration 21"
[1] "Current iteration changed total weights by 1.14683673668736e-09"
[1] "Raking...Iteration 22"
[1] "Current iteration changed total weights by 3.20690862753992e-10"
[1] "Raking...Iteration 23"
[1] "Current iteration changed total weights by 8.96922536242073e-11"
[1] "Raking...Iteration 24"
[1] "Current iteration changed total weights by 2.50460763240312e-11"
[1] "Raking...Iteration 25"
[1] "Current iteration changed total weights by 7.01616542642114e-12"
[1] "Raking...Iteration 26"
[1] "Current iteration changed total weights by 1.94155802546447e-12"
[1] "Raking...Iteration 27"
[1] "Current iteration changed total weights by 5.92526028242446e-13"
[1] "Raking...Iteration 28"
[1] "Current iteration changed total weights by 1.79689596535582e-13"
[1] "Raking...Iteration 29"
[1] "Current iteration changed total weights by 6.8889338677991e-14"
[1] "Raking...Iteration 30"
[1] "Current iteration changed total weights by 4.413136522885e-14"
[1] "Raking...Iteration 31"
[1] "Current iteration changed total weights by 5.56776846849516e-14"
[1] "Raking converged in 31 iterations"
Ver código
#asignación de ponderacion
df_gba$pondera_eph  <- unlist(weights_gba[1])

# resultado de ponderación para voto_acotado
df_gba %>%
  group_by(voto_acotado) %>%
  summarise(n = n_distinct(ua),
            n_pond = sum(pondera_eph)) %>%
  mutate("%" = paste0(round(n / sum(n)*100,2),"%"),
         "% pond" = paste0(round(n_pond / sum(n_pond)*100,2),"%")) |> 
  gt() |> 
  tab_header(title = "Voto acotado poderado y sin poderar",
             subtitle = "Córdoba") |> 
  comunicacion::gt_theme_dnmye() |> 
  cols_label(voto_acotado = "Voto acotado")
Voto acotado poderado y sin poderar
Córdoba
Voto acotado n n_pond % % pond
Daniel Scioli 142 140,8 38.07% 37.75%
Mauricio Macri 118 107,1 31.64% 28.71%
Ninguno / En Blanco 19 24,7 5.09% 6.63%
No Sabe 15 17,5 4.02% 4.69%
Sergio Massa 79 82,9 21.18% 22.23%

Potencial electoral

En esta sección evaluamos el potencial electoral de los dos principales candidatos Mauricio Macri y Daniel Scioli.

El potencial teórico se mide en función de la intención de voto y conocimiento. Debido que no contamos con el conocimiento aquí solamente tomaremos la intención de voto tomando como referencia el siguiente esquema que vimos en clases:

El techo es la totalidad de votos posibles (100) menos el porcentaje obtenido en jamas_votaria

El piso es nuestra variable voto_candidato (votante decidido)el cual crece al reemplazar el No sé son el candidato mencionado en el voto_acotado . Para diferenciarlo

De esta manera quienes indicaron su indecisión lo han hecho tanto de manera espontánea como forzada.

El potencial de crecimiento teóricamente posible es por lo tanto los votos es 100 menos la sumatoria de piso posible y su techo.

En los siguientes gráficos podemos ver el piso, techo y el potencial para cada provincia sobre los porcentajes ponderados de votos

Potencial Córdoba

Ver código
# tabla pisos
piso_cba <- df_cba |> 
   mutate(piso = ifelse(voto_candidato == "No Sabe",voto_acotado,voto_candidato)) |>
   group_by(piso) |> 
   summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(piso_perc_pond = round(n_pond / sum(n_pond)*100,2)) |> 
  rename(candidates = piso) |> 
   select(candidates,piso_perc_pond)


#tabla techos
techo_cba <- df_cba |> 
   group_by(jamas_votaria) |> 
   summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(techo_perc_pond = round(n_pond / sum(n_pond)*100,2)) |> 
  rename(candidates = jamas_votaria) |> 
  select(candidates,techo_perc_pond)


# unir todo en una tabla y calcular voto potencial
potencial_cba <- left_join(piso_cba,techo_cba, by = "candidates") |> #Unimos ambos y calculamos el potencial
  arrange(desc(piso_perc_pond)) |> # ordenamos por piso
  filter(!is.na(techo_perc_pond)) |> # sacamos a les candidates sin techo
  mutate(voto_potencial_pond = 100 - (piso_perc_pond + techo_perc_pond)) 

#eliminar tablas intermedias
rm(piso_cba,techo_cba)
  
#pivotear y graficar
potencial_cba |> 
  pivot_longer(!candidates, names_to = "tipo_de_voto", values_to = "prop") |> 
  mutate(tipo_de_voto = factor(tipo_de_voto,
                               levels = c("techo_perc_pond","voto_potencial_pond","piso_perc_pond"),
                               labels = c("Techo","Potencial","Piso" ),
                               ordered = T)) |> 
  #filter(candidates %in% c('Mauricio Macri','Daniel Scioli')) |> 
  ggplot() +
  aes(x = candidates, y = prop, fill = tipo_de_voto) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Potencial de voto en Córdoba Macri y Scioli",
    caption = "Datos ponderados según EPH.",
    fill = "Tipo de voto"
  ) +
  scale_fill_manual(values = c("#ef5350","#039be5","#4fbb73")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Potencial GBA

Ver código
# tabla pisos
piso_gba <- df_gba |> 
   mutate(piso = ifelse(voto_candidato == "No Sabe",voto_acotado,voto_candidato)) |>
   group_by(piso) |> 
   summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(piso_perc_pond = round(n_pond / sum(n_pond)*100,2)) |> 
  rename(candidates = piso) |> 
   select(candidates,piso_perc_pond)


#tabla techos
techo_gba <- df_gba |> 
   group_by(jamas_votaria) |> 
   summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(techo_perc_pond = round(n_pond / sum(n_pond)*100,2)) |> 
  rename(candidates = jamas_votaria) |> 
  select(candidates,techo_perc_pond)


# unir todo en una tabla y calcular voto potencial
potencial_gba <- left_join(piso_gba,techo_gba, by = "candidates") |> #Unimos ambos y calculamos el potencial
  arrange(desc(piso_perc_pond)) |> # ordenamos por piso
  filter(!is.na(techo_perc_pond)) |> # sacamos a les candidates sin techo
  mutate(voto_potencial_pond = 100 - (piso_perc_pond + techo_perc_pond)) 
  
#eliminar tablas intermedias
rm(piso_gba,techo_gba)

#pivotear y graficar
potencial_gba |> 
  pivot_longer(!candidates, names_to = "tipo_de_voto", values_to = "prop") |> 
  mutate(tipo_de_voto = factor(tipo_de_voto,
                               levels = c("techo_perc_pond","voto_potencial_pond","piso_perc_pond"),
                               labels = c("Techo","Potencial","Piso" ),
                               ordered = T)) |> 
  #filter(candidates %in% c('Mauricio Macri','Daniel Scioli')) |> 
  ggplot() +
  aes(x = candidates, y = prop, fill = tipo_de_voto) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Potencial de voto en Buenos Aires de Macrio y Scioli",
    caption = "Datos ponderados según EPH.",
    fill = "Tipo de voto"
  ) +
  scale_fill_manual(values = c("#ef5350","#039be5","#4fbb73")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Potencial cruzado

Suponiendo un escenario de ballotage una forma de analizar y polarizar este potencial es realizar un análisis de potencial cruzado en el cual se calcula el porcentaje de votos en disputa entre ambos candidatos identificándolo como el caudal de votos a otros candidatos así como el caudal de indecisos.

De esta manera y como podemos obsrevar en las tablas siguientes, mientras que en la provincia de Córdoba Scioli obtiene una intención de voto de 20.73 puntos porcentuales, con un 4.44 en disputa frente al candidato Macri que tiene una intención de 41.17 con un 3.50. potencial, mientras que en la provincia de Buenos Aires Sclioli obtiene el 35.41 con un 7.04 en disputa superadondo a Macri que obtiene el 30.24 con un potencial de 3.12

Ver código
# vector con los candidatos seleccionados para disputa en Ballotage
candidates_en_disputa <- c("Daniel Scioli", "Mauricio Macri")

df_cba %>%
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_cba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 20.73 0.00 4.44
Indecisos 3.88 17.28 7.90
Mauricio Macri 0.00 41.17 3.50
Ver código
df_gba %>%
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_cba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Buenos Aires")
Potencial Cruzado Macri vs. Scioli
Provincia de Buenos Aires
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 35.41 0.00 7.04
Indecisos 12.06 15.78 9.44
Mauricio Macri 0.00 30.24 3.12

Acerca de los modelos de análisis

En clase observamos tres grandes enfoques en torno a este proceso de decisión del voto opracionalizadas en diferentes variables:

Enfoque sociológico: basado en una perspectiva más tradional sociodemográfica donde el elector construye su decisión en función de las posición y características de su grupo/s de pertenencia (etario, de género, gegráfico, etc). En este sentido las decisiones son analizadas como un reflejo de la conformidad con las normas y prácticas sociales predominantes en estos grupos.

Enfoque psicosocial: que introduce una explicación de la decisión del elector en función de su identificación y predisposición de acuerdo a mapas cognitivos.

Enfoque racional o económico: que comprende el voto desde un abordaje racionalidad con arreglo a fines en la cual se maximice el beneficio ya ya sea por su cercanía a una en términos ideológicos de la propuesta / agenda (o lo que llamamos un modelo espacial), o porque comprende que los actores políticos en disputa son responsables directos de la economía y vota en función de la evaluación de la misma tanto de manera retrospectiva como prospectiva (pocket voting)

De acuerdo a uno u otro enfoque se prioriza la elección de determinadas variables.

Teniendo en cuenta el contexto de la campaña, en el cual el macrismo se presenta como una propuesta de cambio moderada o continuidad con cambios (y que se refleja en alguna de las opiniones que ya vimos arriba en nuestro análisis descriptivo), seleccionamos un conjunto de indicadores que dan cuenta por un lado de la perspectiva psicosocial poniendo el acento en qué representaba este aspecto de una necesidad de cambio y el posicionamiento frente al oficialismo en sus diferentes facetas.

Por otro lado analizamos una perspectiva más racional vinculada a una decisión económica y los temas de agenda por detrás del voto.

A continuación, observamos la contribución de estas variables en el voto al oficialista utilizando árboles de decisión y clusters que permitan segmentar y explicar el voto.

Análisis Córdoba

Selección de variables

Primero seleccionamos las variables de acuerdo a cada modelo y construimos a partir de la votación nuestra variable dicotómica objetivo de voto_oficialista

Ver código
modelo_psicosocial_racional_economico <- df_cba |> 
  mutate(voto = factor(ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato))) |>
  mutate(voto_oficialista = factor(ifelse(voto == "Daniel Scioli" , "Si", "No"))) |> 
  select(posicionamiento_espacial,
         posicionamiento_respecto_peronismo,
         posicionamiento_respecto_kirchnerismo,
         continuidad_o_cambio,
         representacion_del_cambio,
         influencia_de_cristina_en_scioli,
         economia_pais_2_anos, 
         economia_fliar_2_anos,
         agenda_de_temas,
         voto_oficialista,
         pondera_eph,
         ua)

Analisis de correlación

Si tomamos las variables de ambos modelos podemos ver que hay una combinación de factores entre ambos modelos que resultan significativa (abriendo el juego a un análisis mucho más rico que sólo trabajar con un modelo u otro y concentrándonos entre la interacción de los mismos): por un lado la cuestión de quién representa el cambio (0.72), luego la disposición a la continuidad o cambio (0.69) y el posicionamiento frente al kirchnerismo (0.67) (que asociamos a explicaciones psico sociales) y por otro la economía familiar (0.70), y del país(0.64) en los últimos 2 años.

Ver código
# seleccion de variables para correlación
modelo_psicosocial_racional_economico_cor <- modelo_psicosocial_racional_economico %>% 
  dplyr::select(-c("ua","pondera_eph")) %>% 
  mutate(across(everything(), as.character)) %>% 
  mutate(across(everything(), as.factor))

# Initialize empty matrix to store coefficients


empty_m <- matrix(ncol = length(modelo_psicosocial_racional_economico_cor),
                  nrow = length(modelo_psicosocial_racional_economico_cor),
                  dimnames = list(names(modelo_psicosocial_racional_economico_cor),
                                  names(modelo_psicosocial_racional_economico_cor)))



cor_matrix_1 <- calculate_cramer(empty_m ,modelo_psicosocial_racional_economico_cor)

corrplot::corrplot(cor_matrix_1, method = 'number',tl.col = "darkgray",number.cex=0.60, tl.cex = 0.75)

Hacemos un breve análisis exploratorio de las variables de ambas sobre el voto oficialista en el cual podemos observar que el voto cordobés al oficialismo sobre estas variables es decir:

representacion_del_cambio 0.72 (psicosocial) economia_fliar_2_anos 0.70 (economica) continuidad_o_cambio 0.69 (psicosocial) posicionamiento_respecto_kirchnerismo 0.67 (psicosocial) economia_pais_2_anos 0.64 (economica)

Ver código
# seleccion de variables importantes para cba para explicar el voto oficialista
modelo_cba <- df_cba |> 
  mutate(voto = factor(ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato))) |>
  mutate(voto_oficialista = factor(ifelse(voto == "Daniel Scioli" , "Si", "No"))) |> 
  select(representacion_del_cambio,
         economia_fliar_2_anos,
         continuidad_o_cambio,
         posicionamiento_respecto_kirchnerismo,
         economia_pais_2_anos, 
         voto_oficialista,
         pondera_eph,
         ua)
Variables psicosociales

En el modelo que hemos creado la representacion_del_cambio que como vimos tiene una correlación con voto oficialista de 0.72 nos muestra que quienes consideran que quien representa el cambio es Scioli votan al oficialismo en un 70% de los casos y por la negativa explica el voto en el 95% de los casos cuando se vota a Macri. Sin embargo, tenemos que tener en cuenta que el voto oficialista está compuesto en la mitad de los casos (54%) por personas que consideran que el cambio lo representa Daniel Scioli con un 20% que señala que ninguno de los dos lo representa. Mientras que en el voto a la oposición, Macri parece más consolidado como representante de este cambio, en tanto un 58% de los casos lo asocia a su persona, y si bien Massa gana terreno (16%), la proporción de esta acefálía en la representación del cambio es mucho menor. En este sentido el voto a la oposición parece más consolidado reforzando y Mauricio Macri logra capitalizar mucho mejor la representación del cambio. No olvidemos que la fórmula incluso llevaba esta palabra en el nombre de la coalición.

Ver código
modelo_cba|>
  group_by(representacion_del_cambio,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = representacion_del_cambio, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Voto oficialista según representantes del cambio",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_cba|> 
  group_by(voto_oficialista,representacion_del_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = voto_oficialista, 
      y = prop, fill = representacion_del_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Representante del cambio según voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  scale_fill_manual(values = c('Daniel Scioli' = "#2897d4", 
                               'Mauricio Macri'= "#ffce00",
                               'Sergio Massa' = '#f79525',
                               'No sabe'= '#b4beba',
                               'Ninguno'= '#4fbb73')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

La creencia de que se debe mantener una política similar está alineada en un 98% de los casos de un voto oficialista, mientras que cuando empezamos a buscar un cambio ya sea moderado (84%) o total (98%), el voto contra el oficialismo se impone. La interacción del cambio con sus representantes se asocia tanto en el modo Moderado (54%) como en el cambio total (62%) a Mauricio Macri

Ver código
modelo_cba|> 
  group_by(continuidad_o_cambio,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = continuidad_o_cambio, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Vota al oficialismo"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_cba|> 
  group_by(voto_oficialista,continuidad_o_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = voto_oficialista, 
      y = prop, fill = continuidad_o_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  scale_fill_manual(values = c('Mantener políticas actuales' = "#2e7d33", 
                               'Mantener algunas y cambiar otras'= "#f9a822",
                               'Cambiar todas' = '#ef5350',
                               'No sabe'= '#b4beba')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_cba|> 
  group_by(continuidad_o_cambio,representacion_del_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = continuidad_o_cambio, 
      y = prop, fill = representacion_del_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = F)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  coord_flip()+
  scale_fill_manual(values = c('Daniel Scioli' = "#2897d4", 
                               'Mauricio Macri'= "#ffce00",
                               'Sergio Massa' = '#f79525',
                               'No sabe'= '#b4beba',
                               'Ninguno'= '#4fbb73')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 10))

El posicionamiento frente al Kirchnerismo es otro factor importante (0.67) en su correlación como variable explicativa del voto oficialista. porque correlaciona directamente. Recordemos que Córdoba hay un 43% que se consideraba Ni kirchnerista ni anti kirchnerista y como podemos observar tanto dentro de este grupo como dentro de los indecisos (que conforman el 12%) el voto es no oficialista.

Ver código
modelo_cba|> 
  group_by(posicionamiento_respecto_kirchnerismo) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100))
# A tibble: 4 × 3
  posicionamiento_respecto_kirchnerismo n_pond  prop
  <ord>                                  <dbl> <dbl>
1 Kirchnerista                              33    10
2 Anti kirchnerista                        112    35
3 Ni kirchnerista ni anti kirchnerista     137    43
4 No sabe                                   38    12
Ver código
modelo_cba|> 
  group_by(posicionamiento_respecto_kirchnerismo,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = posicionamiento_respecto_kirchnerismo, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento K y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Tipo de voto"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Variables económicas

La variable que mayor correlación mostró frente al voto oficialista en Córdoba fue economia_fliar_2_anos (0.70.) y en menor medida la de la economía del país (0.64). Como podemos ver ambas variables tienen un comportamiento casi idéntico. En el 70% de los casos en que la economía familiar mejoró en los últimos 2 años votarán, al oficialismo en el 79% de los casos. Se revisa entonces una posible multicolinealidad y al comprobar la misma, se elimina la variable de menor correlación.

Ver código
modelo_cba|>
  group_by(economia_fliar_2_anos,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = economia_fliar_2_anos, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Economía familiar segun voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_cba|>
  group_by(economia_pais_2_anos,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = economia_pais_2_anos, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Economía del país segun voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
table(modelo_cba$economia_fliar_2_anos, modelo_cba$economia_pais_2_anos)
                  
                   Mejoró Empeoró Se mantuvo igual No sabe
  Mejoró               36      13               14       0
  Empeoró               4     128                9       2
  Se mantuvo igual      7      58               31       1
  No sabe               1       2                3      11
Ver código
chisq.test(modelo_cba$economia_fliar_2_anos, modelo_cba$economia_pais_2_anos)

    Pearson's Chi-squared test

data:  modelo_cba$economia_fliar_2_anos and modelo_cba$economia_pais_2_anos
X-squared = 306.71, df = 9, p-value < 2.2e-16
Ver código
modelo_cba$economia_pais_2_anos <- NULL

Analisis de correspondencia múltiple

En este análisis de correspondencia múltiple podemos ver que el modelo podemos ver que las primeras 4 dimensiones explican el 58% de la varianza del modelo, y ya en las primeras dos dimensiones vemos una clara correlación de las categorías correspondientes a los indecisos para todas las variables y son algunas de las categorías que más contribuyen al modelo. A priori los indecisos parecen ser un grupo bastante consolidado y con un peso claro dentro del modelo, siendo la variable de continuidad frente al cambio en combinación con el posicionamiento frente al kirchnerismo aquellas que más contribuyen. A partir de ello parece distinguirse una relación entre la continuidad un posicionamiento favorable al oficialismo kirchnerista donde la representación del cambio por parte de Daniel Scioli está presente pero de manera más débil a lo que vemos entre las categorías vinculadas claramente a una perspectiva más macrista donde contribuyen con cierta fuerza son el posicionamiento Anti kirchnerista y que tiene a Mauricio Macri como protagonista del cambio el cual debe ser total y donde por último la economía familiar en los últimos 2 años empeoró. Muy cercano en su contribución a los auto valores de estas categorías (y que son las que menos contribuyen a la dimensión 1 y 2) encontramos una falta de representación donde la economía familiar se mantuvo y no se definen como kirchnerista o anti kirchnerista.

Ver código
# construimos el modelo
fit_MCA <- modelo_cba |> 
  select(-c(pondera_eph,ua,voto_oficialista)) |> # excluimos al ponderador la ua y la variable a predecir
  FactoMineR::MCA(ncp = 6, graph = F)

# Calcular estadísticas ponderadas usando pondera_eph
weighted_scores <- fit_MCA$ind$coord * modelo_cba$pondera_eph

# Hago un summary con los valores ponderados las primeras tres dimensiones tienen una varianza acumulada del 49.43 
summary(fit_MCA, quali.sup = NULL, quanti.sup = weighted_scores)

Call:
FactoMineR::MCA(X = select(modelo_cba, -c(pondera_eph, ua, voto_oficialista)),  
     ncp = 6, graph = F) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               0.681   0.586   0.340   0.279   0.252   0.225   0.181
% of var.             20.940  18.028  10.466   8.583   7.745   6.922   5.575
Cumulative % of var.  20.940  38.968  49.434  58.018  65.763  72.685  78.260
                       Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13
Variance               0.174   0.144   0.125   0.100   0.094   0.071
% of var.              5.344   4.425   3.847   3.071   2.882   2.172
Cumulative % of var.  83.603  88.028  91.875  94.946  97.828 100.000

Individuals (the 10 first)
                                                    Dim.1    ctr   cos2  
1                                                | -0.703  0.227  0.166 |
2                                                | -0.703  0.227  0.166 |
3                                                | -0.498  0.114  0.171 |
4                                                | -0.613  0.172  0.318 |
5                                                | -0.267  0.033  0.028 |
6                                                | -0.613  0.172  0.318 |
7                                                | -0.545  0.136  0.170 |
8                                                | -0.498  0.114  0.171 |
9                                                | -0.418  0.080  0.155 |
10                                               |  0.246  0.028  0.033 |
                                                  Dim.2    ctr   cos2    Dim.3
1                                                -0.291  0.045  0.029 |  0.789
2                                                -0.291  0.045  0.029 |  0.789
3                                                -0.266  0.038  0.049 | -0.221
4                                                -0.322  0.055  0.088 |  0.313
5                                                -0.078  0.003  0.002 | -1.045
6                                                -0.322  0.055  0.088 |  0.313
7                                                -0.279  0.041  0.044 |  0.326
8                                                -0.266  0.038  0.049 | -0.221
9                                                -0.222  0.026  0.044 | -0.330
10                                               -0.286  0.044  0.044 | -0.370
                                                    ctr   cos2  
1                                                 0.572  0.209 |
2                                                 0.572  0.209 |
3                                                 0.045  0.034 |
4                                                 0.090  0.083 |
5                                                 1.003  0.426 |
6                                                 0.090  0.083 |
7                                                 0.098  0.061 |
8                                                 0.045  0.034 |
9                                                 0.100  0.097 |
10                                                0.126  0.075 |

Categories (the 10 first)
                                                    Dim.1    ctr   cos2 v.test
representacion_del_cambio_Daniel Scioli          |  1.516 14.510  0.477 12.335
representacion_del_cambio_Mauricio Macri         | -0.525  4.780  0.246 -8.866
representacion_del_cambio_Ninguno                |  0.132  0.072  0.002  0.837
representacion_del_cambio_No sabe                |  0.330  0.387  0.012  1.930
representacion_del_cambio_Sergio Massa           | -0.405  0.886  0.028 -3.004
economia_fliar_2_anos_Mejoró                     |  1.606 18.649  0.632 14.200
economia_fliar_2_anos_Empeoró                    | -0.586  5.645  0.278 -9.414
economia_fliar_2_anos_Se mantuvo igual           | -0.206  0.474  0.019 -2.432
economia_fliar_2_anos_No sabe                    |  0.160  0.050  0.001  0.676
continuidad_o_cambio_Mantener políticas actuales |  2.159 22.474  0.704 14.988
                                                    Dim.2    ctr   cos2 v.test
representacion_del_cambio_Daniel Scioli          | -0.322  0.759  0.021 -2.618
representacion_del_cambio_Mauricio Macri         | -0.311  1.942  0.086 -5.243
representacion_del_cambio_Ninguno                |  0.062  0.018  0.000  0.394
representacion_del_cambio_No sabe                |  2.075 17.802  0.462 12.140
representacion_del_cambio_Sergio Massa           | -0.042  0.011  0.000 -0.312
economia_fliar_2_anos_Mejoró                     | -0.388  1.267  0.037 -3.434
economia_fliar_2_anos_Empeoró                    | -0.193  0.707  0.030 -3.092
economia_fliar_2_anos_Se mantuvo igual           | -0.021  0.005  0.000 -0.243
economia_fliar_2_anos_No sabe                    |  3.177 22.876  0.566 13.440
continuidad_o_cambio_Mantener políticas actuales | -0.500  1.402  0.038 -3.474
                                                    Dim.3    ctr   cos2 v.test
representacion_del_cambio_Daniel Scioli          | -0.286  1.035  0.017 -2.329
representacion_del_cambio_Mauricio Macri         |  0.225  1.748  0.045  3.791
representacion_del_cambio_Ninguno                | -0.502  2.081  0.032 -3.190
representacion_del_cambio_No sabe                |  0.295  0.618  0.009  1.723
representacion_del_cambio_Sergio Massa           | -0.196  0.416  0.007 -1.455
economia_fliar_2_anos_Mejoró                     |  0.324  1.514  0.026  2.861
economia_fliar_2_anos_Empeoró                    |  0.418  5.736  0.141  6.709
economia_fliar_2_anos_Se mantuvo igual           | -0.829 15.311  0.299 -9.765
economia_fliar_2_anos_No sabe                    |  0.016  0.001  0.000  0.067
continuidad_o_cambio_Mantener políticas actuales |  0.392  1.479  0.023  2.718
                                                  
representacion_del_cambio_Daniel Scioli          |
representacion_del_cambio_Mauricio Macri         |
representacion_del_cambio_Ninguno                |
representacion_del_cambio_No sabe                |
representacion_del_cambio_Sergio Massa           |
economia_fliar_2_anos_Mejoró                     |
economia_fliar_2_anos_Empeoró                    |
economia_fliar_2_anos_Se mantuvo igual           |
economia_fliar_2_anos_No sabe                    |
continuidad_o_cambio_Mantener políticas actuales |

Categorical variables (eta2)
                                                   Dim.1 Dim.2 Dim.3  
representacion_del_cambio                        | 0.562 0.481 0.080 |
economia_fliar_2_anos                            | 0.676 0.583 0.307 |
continuidad_o_cambio                             | 0.753 0.640 0.424 |
posicionamiento_respecto_kirchnerismo            | 0.731 0.640 0.550 |
Ver código
# calculo de autovalores ponderados
autovalores <- (sum(weighted_scores^2)) / (nrow(modelo_cba) - 1)


fviz_screeplot(fit_MCA,"variance", geom = c("bar", "line"), addlabels = T, title = "Scree Plot MCA Modelo Córdoba")

Ver código
fviz_mca_var(fit_MCA,col.var="contrib",gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = F)  + 
theme_gray()

Ver código
fit_MCA$var$contrib |>
  as.data.frame() |>
  rownames_to_column('variables') |>
  arrange(desc(`Dim 2`))
                                                                    variables
1                                                continuidad_o_cambio_No sabe
2                               posicionamiento_respecto_kirchnerismo_No sabe
3                                               economia_fliar_2_anos_No sabe
4                                           representacion_del_cambio_No sabe
5                     posicionamiento_respecto_kirchnerismo_Anti kirchnerista
6                                    representacion_del_cambio_Mauricio Macri
7                            continuidad_o_cambio_Mantener políticas actuales
8                          posicionamiento_respecto_kirchnerismo_Kirchnerista
9                                                economia_fliar_2_anos_Mejoró
10                                         continuidad_o_cambio_Cambiar todas
11                                    representacion_del_cambio_Daniel Scioli
12                                              economia_fliar_2_anos_Empeoró
13                      continuidad_o_cambio_Mantener algunas y cambiar otras
14 posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista
15                                          representacion_del_cambio_Ninguno
16                                     representacion_del_cambio_Sergio Massa
17                                     economia_fliar_2_anos_Se mantuvo igual
          Dim 1        Dim 2        Dim 3       Dim 4        Dim 5        Dim 6
1   0.089015633 24.674020586 6.538135e-01  0.01754120  0.001760157 3.739839e-01
2   0.268783236 23.704043343 1.585909e+00  0.85565020  0.025781530 2.721449e-01
3   0.049758326 22.875848518 9.906951e-04  0.20940995  0.004789922 2.666919e+00
4   0.387218670 17.802385386 6.179983e-01  0.60472087  1.174180361 1.446680e-01
5   6.216577298  2.150610686 1.146663e+01  1.95524105  0.264543898 6.569719e+00
6   4.780176495  1.941557961 1.748271e+00  5.03137525 14.351036307 1.645305e+00
7  22.473651149  1.402191731 1.478653e+00  0.84274828  0.063982870 1.417852e-01
8  20.379910492  1.390886488 4.100771e+00  0.02516878  0.063522424 4.397979e-01
9  18.648610725  1.266819918 1.514332e+00  0.27070791  0.663464430 4.185811e-01
10  3.826706088  0.880114662 1.668024e+01 13.19560322  0.115230220 4.214800e+00
11 14.510313474  0.759283023 1.035074e+00  2.90366932  0.010040431 6.171328e-02
12  5.644970596  0.707191304 5.736272e+00  0.24544531  1.672153180 2.065372e+01
13  1.285675217  0.357658835 1.233924e+01  8.04064412  0.012528114 2.978021e+00
14  0.006166149  0.052314337 2.323317e+01  3.38496736  0.296397178 9.132278e+00
15  0.071646107  0.018462300 2.081294e+00 62.11557600  1.521337482 1.629060e-05
16  0.886334342  0.011111160 4.163389e-01  0.16180643 74.672038436 5.086950e+00
17  0.474486003  0.005499762 1.531100e+01  0.13972473  5.087213059 4.519959e+01

Árbol de decisión

Este mismo relato podemos observarlo a través de un árbol de decisión en donde en el nodo raíz (root) con un error ponderado del 29%. En la primera di división se ubica la variable “economia_fliar_2_anos”, que se divide en tres categorías: “Empeoró”, “No sabe” y “Se mantuvo igual”. Estas categorías se utilizan para dividir el conjunto de datos en dos subgrupos: Si la economía familiar empeoró, la mayoría de las personas (aproximadamente el 95%) votaron en contra del oficialismo, Si no sabe como estuvo la economía familiar o se mantuvo igual, la mayoría de las personas (aproximadamente el 80%) votan a favor del oficialismo. A partir de ahí se abre otro nodo en el cual si la economía familiar mejoró, entra a jugar la variable “representacion_del_cambio” que se divide en varias categorías.: si la representación del cambio es “Mauricio Macri”, “No sabe” o “Sergio Massa” (es decir el no oficialismo y los indecisos), la mayoría de las personas (aproximadamente el 98%) votan en contra del oficialismo y si la representación del cambio es “Daniel Scioli” o “Ninguno”, la mayoría de las personas (el 45%) votan al oficialismo.

Ver código
#str(modelo_cba)

# Aplicamos tranformaciones y elimina pondera

modelo_cba <- modelo_cba |> 
  mutate(across(c(posicionamiento_respecto_kirchnerismo,
                  continuidad_o_cambio,representacion_del_cambio,
                  economia_fliar_2_anos), ~as.character(.))) |> 
  mutate(across(c(posicionamiento_respecto_kirchnerismo,
                  continuidad_o_cambio,
                  representacion_del_cambio,
                  economia_fliar_2_anos), ~as.factor(.)))

#str(modelo_cba)

data_train <- modelo_cba %>% dplyr::sample_frac(.8)
data_test  <- dplyr::anti_join(modelo_cba, data_train, by = 'ua') # se debe tener un id
data_train <- dplyr::select(data_train, -ua)
data_test <- dplyr::select(data_test, -ua)

# seteo la semilla
set.seed(124)
fit <- rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculo
rpart.plot(fit)

Si bien no es nuestro objeto observamos la prueba de precisión del modelo.

Ver código
predict_unseen <-predict(fit, data_test, type = 'class')
table_mat <- table(data_test$voto_oficialista, predict_unseen)
table_mat
    predict_unseen
     No Si
  No 45  7
  Si  1 11
Ver código
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
print(paste('Precisión de la prueba', round((accuracy_Test)*100),'%'))
[1] "Precisión de la prueba 88 %"

Dicotomizando este modelo para mejorar su precisión y la profundidad del árbol se observa ahora un primer nodo que parte inicialmente en torno a la variable de preferencia de continuidad o no de las políticas actuales: quienes elijan Mantener políticas actuales terminan votando en un 73% de los casos al oficialismo de Daniel Scioli. Entre quienes no elijen mantener las políticas actuales se abren dos caminos vinculados a la capacidad de representación del cambio por parte del candidato oficialista, lo cual alcanza solo al 9% de la muestra. Cuando la representación del cambio queda acéfala (ninguno representa al cambio) entra a jugar lo que sucedió en la economía familiar en los últimos dos años. Este relato parece coherente con las tablas de distribución ponderada que vistas anteriormente.

Ver código
library(fastDummies)
modelo_cba_dummies <- dummy_cols(modelo_cba, select_columns = c(
  "posicionamiento_respecto_kirchnerismo", 
  "continuidad_o_cambio", 
  "representacion_del_cambio",
  "economia_fliar_2_anos"
)) 

modelo_cba_dummies <- modelo_cba_dummies %>%
  mutate(across(`posicionamiento_respecto_kirchnerismo_Anti kirchnerista`:`representacion_del_cambio_Sergio Massa`, as.factor)) |> 
  select(voto_oficialista:`economia_fliar_2_anos_Se mantuvo igual`)

modelo_cba_dummies <- modelo_cba_dummies |> 
  rename(AntiK = `posicionamiento_respecto_kirchnerismo_Anti kirchnerista`,
         Ni_k_ni_no_K = `posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista`,
         Kirchnerista = posicionamiento_respecto_kirchnerismo_Kirchnerista,
         posiciona_NS = `posicionamiento_respecto_kirchnerismo_No sabe`,
         cmabio_total = `continuidad_o_cambio_Cambiar todas`,
         cambio_parcial = `continuidad_o_cambio_Mantener algunas y cambiar otras`,
         no_cambio = `continuidad_o_cambio_Mantener políticas actuales`,
         representa_DS = `representacion_del_cambio_Daniel Scioli`,
         representa_MM = `representacion_del_cambio_Mauricio Macri`,
         representa_SM = `representacion_del_cambio_Sergio Massa`,
         representa_No_Sabe = `representacion_del_cambio_No sabe`)


#str(modelo_cba)

data_train <- modelo_cba_dummies %>% dplyr::sample_frac(.8)
data_test  <- dplyr::anti_join(modelo_cba_dummies, data_train, by = 'ua') # se debe tener un id
data_train <- dplyr::select(data_train, -ua)
data_test <- dplyr::select(data_test, -ua)

# seteo la semilla
set.seed(124)
fit <- rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculo
rpart.plot(fit)

Ver código
fit
n= 256 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 256 71.7798000 No (0.72595059 0.27404941)  
   2) no_cambio=0 223 36.7094500 No (0.83770821 0.16229179)  
     4) representa_DS=0 197 17.5192000 No (0.91310888 0.08689112)  
       8) representacion_del_cambio_Ninguno=0 172  6.0774000 No (0.96372402 0.03627598) *
       9) representacion_del_cambio_Ninguno=1 25 11.4418000 No (0.66436571 0.33563429)  
        18) economia_fliar_2_anos_Empeoró>=0.5 12  0.0000000 No (1.00000000 0.00000000) *
        19) economia_fliar_2_anos_Empeoró< 0.5 13  6.6058280 Si (0.36602193 0.63397807) *
     5) representa_DS=1 26  5.3814430 Si (0.21900984 0.78099016) *
   3) no_cambio=1 33  0.6583532 Si (0.01842645 0.98157355) *
Ver código
predict_unseen <-predict(fit, data_test, type = 'class')
table_mat <- table(data_test$voto_oficialista, predict_unseen)
table_mat
    predict_unseen
     No Si
  No 49  2
  Si  1 12
Ver código
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
print(paste('Precisión de la prueba', round((accuracy_Test)*100),'%'))
[1] "Precisión de la prueba 95 %"
Ver código
rm(accuracy_Test,autovalores,predict_unseen,table_mat,weighted_scores,fit,fit_MCA,data_test,data_train,modelo_cba,modelo_psicosocial_racional_economico_cor)

Clusters

El análisis de cluster con el algoritmo k-modas nos muestra tres grupos donde estas diferencias entre un perfil totalmente kirchnerista o anti kirchnerista se ven moderados. El voto oficialista (Cluster 3 casos), sostiene la consolidación respecto de la representación de Daniel Scioli, la reticencia frente al cambio sostenida por una mejora en las condiciones económicas personales en los últimos dos años, tal cual ya vimos en el MCA y el árbol. El voto no oficialista donde el cambio es parcial para ambos en esta distribución de la moda pero y han empeorado en su condición económica, pero mientras que para un grupo mayoritario (Cluster 1), Mauricio Macri personifica este cambio parcial, para otra minoría Massa podría personificarlo (Cluster 2).

En el análisis de los clusters vemos que el cluster 1 que representa al 60% tiene una distribución equilibrada por género, a diferencia del cluster 2 (16%) que se distingue por tener un perfil un poco más femenino y con mayor concentración en torno a los 50-65 años, El cluster 3 (25%) parece más joven y con un mayor nivel educativo que los otros dos clusters y en este sentido parece coherente que en la agenda de temas muestre más interés por la problemática educativa que los otros dos clusters.

Ver código
modelo_cba_clusters <-modelo_cba_dummies  |>  dplyr::select(-c(ua,pondera_eph))

modelo_cba_clusters <- modelo_cba_clusters %>%
  mutate(across(economia_fliar_2_anos_Empeoró:`economia_fliar_2_anos_Se mantuvo igual`, as.factor))


# Definir número de clusters
k <- 3

# Definir número de iteraciones
n_iter <- 100

# Definir vector de semillas
seeds <- c(123, 456, 789, 321, 654, 987)

# Matriz de resultados
result_matrix <- matrix(0, nrow = length(seeds), ncol = k)

# Loop sobre las semillas
for (i in seq_along(seeds)) {
  # Fijar la semilla
  set.seed(seeds[i])

  # Aplicar kmodes
  kmodes_result <- klaR::kmodes(modelo_cba_clusters, k, iter.max = n_iter)

  # Guardar el tamaño de los clusters
  result_matrix[i,] <- kmodes_result$size
}

# Imprimir los resultados
print(result_matrix)
     [,1] [,2] [,3]
[1,]  191   57   72
[2,]  132   86  102
[3,]   69  122  129
[4,]  103  143   74
[5,]  160   49  111
[6,]  128   85  107
Ver código
# Seleccion de la semilla que consideramos más estable
selected_seed <- seeds[which.max(result_matrix[, 1])]

# Fijar la semilla seleccionada
set.seed(selected_seed)

# Aplicacion de algoritmo K-Modes con la semilla seleccionada
kmodes_result <- klaR::kmodes(modelo_cba_clusters, k, iter.max = n_iter)

# Guardar el tamaño de los clusters
tamanio_clusters <- as.tibble(kmodes_result$size)

# Explorar los resultados en kmodes_result

kmodes_result$modes %>%
  as.data.frame() %>%
  rownames_to_column('cluster') |> 
  left_join(tamanio_clusters) |> 
  mutate(n = as.character(n)) |> 
  relocate(n, .after = cluster) |> 
  rename("Tamaño" = n) |> 
  pivot_longer(cols = -cluster) |> 
  group_by(cluster) |> 
  pivot_wider(names_from = cluster, values_from = value) |> 
  rename("variables" = "name",
         "Cluster 1"= "1",
         "Cluster 2"= "2",
         "Cluster 3"= "3") |>
  gt() |> 
  tab_header(md("**Clusters para modelo Córdoba**")) |> 
  comunicacion::gt_theme_dnmye() 
Clusters para modelo Córdoba
variables Cluster 1 Cluster 2 Cluster 3
Tamaño 191 57 72
voto_oficialista No No Si
AntiK 0 1 0
Kirchnerista 0 0 0
Ni_k_ni_no_K 0 0 0
posiciona_NS 0 0 0
cmabio_total 0 0 0
cambio_parcial 1 1 0
no_cambio 0 0 1
continuidad_o_cambio_No sabe 0 0 0
representa_DS 0 0 1
representa_MM 1 0 0
representacion_del_cambio_Ninguno 0 0 0
representa_No_Sabe 0 0 0
representa_SM 0 1 0
economia_fliar_2_anos_Empeoró 1 1 0
economia_fliar_2_anos_Mejoró 0 0 1
economia_fliar_2_anos_No sabe 0 0 0
economia_fliar_2_anos_Se mantuvo igual 0 0 0

Se asignan los clusters para poder hacer un análisis descriptivo

Ver código
rm(tamanio_clusters,result_matrix,i,k,n_iter,seeds,selected_seed)

# extraer el cluster
cba_cluster_index <- kmodes_result$cluster %>% as.data.frame() %>% 
  rename("cluster" = ".")

#unirlo a la base
df_cba <- df_cba %>% cbind(cba_cluster_index)

# # chequear que los tamaños esten ok
#table(df_cba$cluster)

# eliminar df intermedios
rm(cba_cluster_index,kmodes_result,modelo_cba_clusters,modelo_cba_dummies)

# renombramos los clusters

df_cba <- df_cba %>% 
  mutate(cluster = case_when(cluster == 1 ~ "cluster_1",
                             cluster == 2 ~ "cluster_2",
                             cluster == 3 ~ "cluster_3"))

Distribución

Ver código
df_cba |>
  group_by(cluster) |>
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |>
  mutate(cluster_prop_pond = round(n_pond / sum(n_pond)*100)) |> 
  gt() |> 
  tab_header(title = md("**Distribución de clusters**"),
             subtitle = "Córdoba" )
Distribución de clusters
Córdoba
cluster n n_pond cluster_prop_pond
cluster_1 191 191 60
cluster_2 57 50 16
cluster_3 72 79 25

Sexo

Ver código
df_cba |> 
  group_by(cluster,sexo) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = sexo) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters CBA segun sexo",
    caption = "Datos ponderados según EPH.",
    fill = "Sexo"
  ) +
  scale_fill_manual(values = c("#039be5","violet")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Edad

Ver código
df_cba |> 
  group_by(cluster,edad) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = edad) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters CBA segun Edad",
    caption = "Datos ponderados según EPH.",
    fill = "Edad"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Purples' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Niv. Educativo

Ver código
df_cba |> 
  group_by(cluster,niv_educativo) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = niv_educativo) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters CBA segun Nivel Educativo",
    caption = "Datos ponderados según EPH.",
    fill = "Nivel educativo"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Greens' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Agenda

Ver código
df_cba |> 
  group_by(cluster,agenda_de_temas) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = agenda_de_temas) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters CBA segun Nivel Educativo",
    caption = "Datos ponderados según EPH.",
    fill = "Agenda"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Set2' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Potencial Cruzado

Ver código
# vector con los candidatos seleccionados para disputa en Ballotage
candidates_en_disputa <- c("Daniel Scioli", "Mauricio Macri")


df_cba %>%
  filter(cluster == 'cluster_1') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_cba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 1")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 1
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 0.58 0.00 0.68
Indecisos 1.30 7.44 7.23
Mauricio Macri 0.00 39.21 3.16
Ver código
df_cba %>%
  filter(cluster == 'cluster_2') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_cba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 2")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 2
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 0.62 0.00 0.00
Indecisos 2.38 9.71 0.67
Mauricio Macri 0.00 1.96 0.35
Ver código
df_cba %>%
  filter(cluster == 'cluster_3') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_cba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 3")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 3
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 19.53 0.00 3.76
Indecisos 0.21 0.13 0.00

Análisis GBA

Selección de variables

Primero seleccionamos las variables de acuerdo a cada modelo y construimos a partir de la votación nuestra variable dicotómica objetivo de voto_oficialista

Ver código
modelo_psicosocial_racional_economico <- df_gba |> 
  mutate(voto = factor(ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato))) |>
  mutate(voto_oficialista = factor(ifelse(voto == "Daniel Scioli" , "Si", "No"))) |> 
  select(posicionamiento_espacial,
         posicionamiento_respecto_peronismo,
         posicionamiento_respecto_kirchnerismo,
         continuidad_o_cambio,
         representacion_del_cambio,
         influencia_de_cristina_en_scioli,
         economia_pais_2_anos, 
         economia_fliar_2_anos,
         agenda_de_temas,
         voto_oficialista,
         pondera_eph,
         ua)

Analisis de correlación

Si tomamos las variables de ambos modelos podemos ver que hay una combinación de factores entre variables de los dos modelos que resultando significativas: por un lado quién representa el cambio (0.71), la continuidad o cambio (0.69) y el posicionamiento frente al kirchnerismo (0.66) (que asociamos a explicaciones psico sociales) y por otro: economía del paìs (0.69), y la familiar (0.61) en los últimos 2 años.

Ver código
# seleccion de variables para correlación
modelo_psicosocial_racional_economico_cor <- modelo_psicosocial_racional_economico %>% 
  dplyr::select(-c("ua","pondera_eph")) %>% 
  mutate(across(everything(), as.character)) %>% 
  mutate(across(everything(), as.factor))

# Initialize empty matrix to store coefficients


empty_m <- matrix(ncol = length(modelo_psicosocial_racional_economico_cor),
                  nrow = length(modelo_psicosocial_racional_economico_cor),
                  dimnames = list(names(modelo_psicosocial_racional_economico_cor),
                                  names(modelo_psicosocial_racional_economico_cor)))



cor_matrix_1 <- calculate_cramer(empty_m ,modelo_psicosocial_racional_economico_cor)

corrplot::corrplot(cor_matrix_1, method = 'number',tl.col = "darkgray",number.cex=0.60, tl.cex = 0.75)

Hacemos un breve análisis exploratorio de las variables de ambas sobre el voto oficialista en el cual podemos observar que el voto bonaerense al oficialismo sobre estas variables es decir:

  • representacion_del_cambio 0.82 (psicosocial)
  • posicionamiento_respecto_kirchnerismo 0.71 (psicosocial)
  • economia_pais_2_anos 0.69 (economica)
  • continuidad_o_cambio 0.66 (psicosocial)
  • economia_fliar_2_anos 0.61 (economica)
Ver código
# seleccion de variables importantes para gba para explicar el voto oficialista
modelo_gba <- df_gba |> 
  mutate(voto = factor(ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato))) |>
  mutate(voto_oficialista = factor(ifelse(voto == "Daniel Scioli" , "Si", "No"))) |> 
  select(representacion_del_cambio,
         posicionamiento_respecto_kirchnerismo,
         economia_pais_2_anos, 
         continuidad_o_cambio,
         economia_fliar_2_anos,
         voto_oficialista,
         pondera_eph,
         ua)
Variables psicosociales

La personificación del cambio es la variable que muestra una mayor correlación con el voto oficialista (0.82) dentro del voto oficialista Scioli logra representar el cambio en el 78% mientras que entre quienes no votan al oficialismo los candidatos, la personificación del cambio se encuentra dividida entre Macri (46%) y Sergio Massa (36%)

El posicionamiento frente al Kirchnerismo es la segunda variable con mayor correlación. De Manera similar a lo que habíamos visto en Córdoba en GBA hay un 42% que no toma una posición ante el kirchnerismo (Ni kirchnerista ni anti kirchnerista). Dentro de este grupo el 72% no votaría al oficialismo.

Siguiendo con las variables psico-sociales encontramos que el posicionamiento frente al cambio correlaciona en 0.66 mostrando que a mayor interés en el cambio, menos probabilidad de votar al oficialismo.

Ver código
modelo_gba|>
  group_by(representacion_del_cambio,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = representacion_del_cambio, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Voto oficialista según representantes del cambio",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_gba|> 
  group_by(voto_oficialista,representacion_del_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = voto_oficialista, 
      y = prop, fill = representacion_del_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Representante del cambio según voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  scale_fill_manual(values = c('Daniel Scioli' = "#2897d4", 
                               'Mauricio Macri'= "#ffce00",
                               'Sergio Massa' = '#f79525',
                               'No sabe'= '#b4beba',
                               'Ninguno'= '#4fbb73')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

El posicionamiento frente al Kirchnerismo es otro factor importante (0.67) en su correlación como variable explicativa del voto oficialista. porque correlaciona directamente. Recordemos que Córdoba hay un 43% que se consideraba Ni kirchnerista ni anti kirchnerista y como se puede observar tanto dentro de este grupo como dentro de los indecisos (que conforman el 12%) el voto es no oficialista.

Ver código
modelo_gba|> 
  group_by(posicionamiento_respecto_kirchnerismo) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100))
# A tibble: 4 × 3
  posicionamiento_respecto_kirchnerismo n_pond  prop
  <ord>                                  <dbl> <dbl>
1 Kirchnerista                             105    28
2 Anti kirchnerista                         94    25
3 Ni kirchnerista ni anti kirchnerista     157    42
4 No sabe                                   17     5
Ver código
modelo_gba|> 
  group_by(posicionamiento_respecto_kirchnerismo,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = posicionamiento_respecto_kirchnerismo, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento K y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Tipo de voto"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_gba|> 
  group_by(continuidad_o_cambio,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = continuidad_o_cambio, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Tipo de voto"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_gba|> 
  group_by(voto_oficialista,continuidad_o_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = voto_oficialista, 
      y = prop, fill = continuidad_o_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  scale_fill_manual(values = c('Mantener políticas actuales' = "#2e7d33", 
                               'Mantener algunas y cambiar otras'= "#f9a822",
                               'Cambiar todas' = '#ef5350',
                               'No sabe'= '#b4beba')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_gba|> 
  group_by(continuidad_o_cambio,representacion_del_cambio) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = continuidad_o_cambio, 
      y = prop, fill = representacion_del_cambio) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = F)+ 
  labs(
    title = "Posicionamiento frente al cambio y voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Posicionamiento frente al cambio") +
  xlab("Vota al oficialismo")+ 
  coord_flip()+
  scale_fill_manual(values = c('Daniel Scioli' = "#2897d4", 
                               'Mauricio Macri'= "#ffce00",
                               'Sergio Massa' = '#f79525',
                               'No sabe'= '#b4beba',
                               'Ninguno'= '#4fbb73')) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 10))

Variables económicas

A diferencia del electorado cordobés, el voto bonaerense muestra una mayor correlación con la economía del país en los últimos dos años (069) que con la familiar (0.61) para explicar el voto oficialista.

Como se vio anteriormente el 42% cree que la economía ha empeorado, y entre ellos ambas variables muestran un comportamiento casi idéntico comportamiento en su distribución: el 94% y el 91% no votaría al oficialismo. La diferencia se observa entre quienes consideran que que se mantuvo igual (25%).

Se confirma la posible multicolinealidad y se conserva la variable con mayor correlación.

Ver código
economia_pais_2_anos <- modelo_gba|>
  group_by(economia_pais_2_anos) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop_economia_pais_2_anos = paste0(round(n_pond / sum(n_pond)*100),'%'))  |> 
  select(economia_pais_2_anos,prop_economia_pais_2_anos)


economia_fliar_2_anos <- modelo_gba|>
  group_by(economia_fliar_2_anos) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop_economia_fliar_2_anos = paste0(round(n_pond / sum(n_pond)*100),'%')) |> 
  select(prop_economia_fliar_2_anos)

cbind(economia_pais_2_anos,economia_fliar_2_anos) |> 
  rename(situacion = economia_pais_2_anos,
         pais      = prop_economia_pais_2_anos,
         familiar  = prop_economia_fliar_2_anos) |> 
  gt() |> 
  tab_header(md('**Distribución de variables modelo económico**'),
             'GBA') |> 
  tab_footnote('Datos ponderados') |> 
  gt::cols_align(columns = 'situacion',
                 align = 'left')
Distribución de variables modelo económico
GBA
situacion pais familiar
Mejoró 30% 28%
Empeoró 42% 34%
Se mantuvo igual 25% 36%
No sabe 2% 2%
Datos ponderados
Ver código
modelo_gba|>
  group_by(economia_pais_2_anos,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = economia_pais_2_anos, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Economía del país segun voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
modelo_gba|>
  group_by(economia_fliar_2_anos,voto_oficialista) |> 
  summarise(n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot() +
  aes(x = economia_fliar_2_anos, 
      y = prop, fill = voto_oficialista) +
  geom_bar(stat = "identity", 
           position = "stack") +
  geom_text(aes(label = sprintf("%.f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Economía familiar segun voto oficialista",
    caption = "Datos ponderados según EPH.",
    fill = "Voto Oficialista"
  ) +
  coord_flip()+
  scale_fill_manual(values = c(No = "#f9a822", Si = "#2897d4")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Ver código
table(modelo_gba$economia_fliar_2_anos, modelo_gba$economia_pais_2_anos)
                  
                   Mejoró Empeoró Se mantuvo igual No sabe
  Mejoró               81       6               15       1
  Empeoró               6     114               13       4
  Se mantuvo igual     21      51               52       0
  No sabe               2       6                0       1
Ver código
chisq.test(modelo_gba$economia_fliar_2_anos, modelo_gba$economia_pais_2_anos)

    Pearson's Chi-squared test

data:  modelo_gba$economia_fliar_2_anos and modelo_gba$economia_pais_2_anos
X-squared = 243.11, df = 9, p-value < 2.2e-16
Ver código
modelo_gba$economia_fliar_2_anos <- NULL

Analisis de correspondencia múltiple

En este análisis de correspondencia múltiple se observa que las primeras 3 dimensiones del modelo explican el 51% de la varianza. Al graficar las primeras dos dimensiones (que ya explican casi el 40%), se observa un agrupamiento un poco más polarizado de las categorías que el visto en Córdoba.

Ver código
# construimos el modelo
fit_MCA <- modelo_gba |> 
  select(-c(pondera_eph,ua,voto_oficialista)) |> # excluimos al ponderador la ua y la variable a predecir
  FactoMineR::MCA(ncp = 6, graph = F)

# Calcular estadísticas ponderadas usando pondera_eph
weighted_scores <- fit_MCA$ind$coord * modelo_gba$pondera_eph

# Hago un summary con los valores ponderados las primeras tres dimensiones tienen una varianza acumulada del 49.43 
summary(fit_MCA, quali.sup = NULL, quanti.sup = weighted_scores)

Call:
FactoMineR::MCA(X = select(modelo_gba, -c(pondera_eph, ua, voto_oficialista)),  
     ncp = 6, graph = F) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               0.732   0.562   0.348   0.278   0.246   0.216   0.206
% of var.             22.534  17.289  10.720   8.542   7.555   6.641   6.330
Cumulative % of var.  22.534  39.823  50.543  59.085  66.640  73.281  79.610
                       Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13
Variance               0.180   0.157   0.096   0.083   0.077   0.068
% of var.              5.550   4.834   2.964   2.555   2.384   2.103
Cumulative % of var.  85.160  89.995  92.958  95.513  97.897 100.000

Individuals (the 10 first)
                                                                            
1                                                                          |
2                                                                          |
3                                                                          |
4                                                                          |
5                                                                          |
6                                                                          |
7                                                                          |
8                                                                          |
9                                                                          |
10                                                                         |
                                                                            Dim.1
1                                                                          -0.199
2                                                                           1.238
3                                                                           0.138
4                                                                           1.238
5                                                                          -0.797
6                                                                           0.057
7                                                                          -0.797
8                                                                           0.577
9                                                                           1.013
10                                                                         -1.024
                                                                              ctr
1                                                                           0.014
2                                                                           0.561
3                                                                           0.007
4                                                                           0.561
5                                                                           0.232
6                                                                           0.001
7                                                                           0.232
8                                                                           0.122
9                                                                           0.376
10                                                                          0.384
                                                                             cos2
1                                                                           0.017
2                                                                           0.519
3                                                                           0.004
4                                                                           0.519
5                                                                           0.404
6                                                                           0.001
7                                                                           0.404
8                                                                           0.193
9                                                                           0.503
10                                                                          0.440
                                                                            
1                                                                          |
2                                                                          |
3                                                                          |
4                                                                          |
5                                                                          |
6                                                                          |
7                                                                          |
8                                                                          |
9                                                                          |
10                                                                         |
                                                                            Dim.2
1                                                                           0.020
2                                                                          -0.075
3                                                                          -0.210
4                                                                          -0.075
5                                                                          -0.326
6                                                                          -0.188
7                                                                          -0.326
8                                                                           0.000
9                                                                          -0.111
10                                                                         -0.432
                                                                              ctr
1                                                                           0.000
2                                                                           0.003
3                                                                           0.021
4                                                                           0.003
5                                                                           0.051
6                                                                           0.017
7                                                                           0.051
8                                                                           0.000
9                                                                           0.006
10                                                                          0.089
                                                                             cos2
1                                                                           0.000
2                                                                           0.002
3                                                                           0.010
4                                                                           0.002
5                                                                           0.068
6                                                                           0.011
7                                                                           0.068
8                                                                           0.000
9                                                                           0.006
10                                                                          0.078
                                                                            
1                                                                          |
2                                                                          |
3                                                                          |
4                                                                          |
5                                                                          |
6                                                                          |
7                                                                          |
8                                                                          |
9                                                                          |
10                                                                         |
                                                                            Dim.3
1                                                                          -1.279
2                                                                           0.041
3                                                                          -0.327
4                                                                           0.041
5                                                                           0.307
6                                                                          -0.149
7                                                                           0.307
8                                                                          -0.414
9                                                                           0.064
10                                                                          0.977
                                                                              ctr
1                                                                           1.259
2                                                                           0.001
3                                                                           0.082
4                                                                           0.001
5                                                                           0.072
6                                                                           0.017
7                                                                           0.072
8                                                                           0.132
9                                                                           0.003
10                                                                          0.734
                                                                             cos2
1                                                                           0.687
2                                                                           0.001
3                                                                           0.025
4                                                                           0.001
5                                                                           0.060
6                                                                           0.007
7                                                                           0.060
8                                                                           0.099
9                                                                           0.002
10                                                                          0.400
                                                                            
1                                                                          |
2                                                                          |
3                                                                          |
4                                                                          |
5                                                                          |
6                                                                          |
7                                                                          |
8                                                                          |
9                                                                          |
10                                                                         |

Categories (the 10 first)
                                                                            
representacion_del_cambio_Daniel Scioli                                    |
representacion_del_cambio_Mauricio Macri                                   |
representacion_del_cambio_Ninguno                                          |
representacion_del_cambio_No sabe                                          |
representacion_del_cambio_Sergio Massa                                     |
posicionamiento_respecto_kirchnerismo_Kirchnerista                         |
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                    |
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista |
posicionamiento_respecto_kirchnerismo_No sabe                              |
economia_pais_2_anos_Mejoró                                                |
                                                                             Dim.1
representacion_del_cambio_Daniel Scioli                                      1.215
representacion_del_cambio_Mauricio Macri                                    -0.731
representacion_del_cambio_Ninguno                                            0.210
representacion_del_cambio_No sabe                                           -0.452
representacion_del_cambio_Sergio Massa                                      -0.569
posicionamiento_respecto_kirchnerismo_Kirchnerista                           1.314
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                     -0.944
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista  -0.177
posicionamiento_respecto_kirchnerismo_No sabe                               -0.063
economia_pais_2_anos_Mejoró                                                  1.159
                                                                               ctr
representacion_del_cambio_Daniel Scioli                                     15.811
representacion_del_cambio_Mauricio Macri                                     6.211
representacion_del_cambio_Ninguno                                            0.114
representacion_del_cambio_No sabe                                            0.356
representacion_del_cambio_Sergio Massa                                       2.428
posicionamiento_respecto_kirchnerismo_Kirchnerista                          15.806
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      8.979
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.434
posicionamiento_respecto_kirchnerismo_No sabe                                0.004
economia_pais_2_anos_Mejoró                                                 13.534
                                                                              cos2
representacion_del_cambio_Daniel Scioli                                      0.675
representacion_del_cambio_Mauricio Macri                                     0.276
representacion_del_cambio_Ninguno                                            0.004
representacion_del_cambio_No sabe                                            0.011
representacion_del_cambio_Sergio Massa                                       0.091
posicionamiento_respecto_kirchnerismo_Kirchnerista                           0.633
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      0.373
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.021
posicionamiento_respecto_kirchnerismo_No sabe                                0.000
economia_pais_2_anos_Mejoró                                                  0.562
                                                                            v.test
representacion_del_cambio_Daniel Scioli                                     15.845
representacion_del_cambio_Mauricio Macri                                   -10.130
representacion_del_cambio_Ninguno                                            1.156
representacion_del_cambio_No sabe                                           -2.021
representacion_del_cambio_Sergio Massa                                      -5.823
posicionamiento_respecto_kirchnerismo_Kirchnerista                          15.341
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                    -11.780
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista  -2.820
posicionamiento_respecto_kirchnerismo_No sabe                               -0.223
economia_pais_2_anos_Mejoró                                                 14.463
                                                                            
representacion_del_cambio_Daniel Scioli                                    |
representacion_del_cambio_Mauricio Macri                                   |
representacion_del_cambio_Ninguno                                          |
representacion_del_cambio_No sabe                                          |
representacion_del_cambio_Sergio Massa                                     |
posicionamiento_respecto_kirchnerismo_Kirchnerista                         |
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                    |
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista |
posicionamiento_respecto_kirchnerismo_No sabe                              |
economia_pais_2_anos_Mejoró                                                |
                                                                             Dim.2
representacion_del_cambio_Daniel Scioli                                     -0.062
representacion_del_cambio_Mauricio Macri                                    -0.270
representacion_del_cambio_Ninguno                                           -0.177
representacion_del_cambio_No sabe                                            3.092
representacion_del_cambio_Sergio Massa                                      -0.149
posicionamiento_respecto_kirchnerismo_Kirchnerista                          -0.162
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                     -0.417
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.173
posicionamiento_respecto_kirchnerismo_No sabe                                3.004
economia_pais_2_anos_Mejoró                                                 -0.056
                                                                               ctr
representacion_del_cambio_Daniel Scioli                                      0.054
representacion_del_cambio_Mauricio Macri                                     1.103
representacion_del_cambio_Ninguno                                            0.105
representacion_del_cambio_No sabe                                           21.662
representacion_del_cambio_Sergio Massa                                       0.216
posicionamiento_respecto_kirchnerismo_Kirchnerista                           0.314
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      2.284
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.537
posicionamiento_respecto_kirchnerismo_No sabe                               12.915
economia_pais_2_anos_Mejoró                                                  0.041
                                                                              cos2
representacion_del_cambio_Daniel Scioli                                      0.002
representacion_del_cambio_Mauricio Macri                                     0.038
representacion_del_cambio_Ninguno                                            0.003
representacion_del_cambio_No sabe                                            0.513
representacion_del_cambio_Sergio Massa                                       0.006
posicionamiento_respecto_kirchnerismo_Kirchnerista                           0.010
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      0.073
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.020
posicionamiento_respecto_kirchnerismo_No sabe                                0.300
economia_pais_2_anos_Mejoró                                                  0.001
                                                                            v.test
representacion_del_cambio_Daniel Scioli                                     -0.815
representacion_del_cambio_Mauricio Macri                                    -3.740
representacion_del_cambio_Ninguno                                           -0.973
representacion_del_cambio_No sabe                                           13.814
representacion_del_cambio_Sergio Massa                                      -1.523
posicionamiento_respecto_kirchnerismo_Kirchnerista                          -1.894
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                     -5.204
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   2.747
posicionamiento_respecto_kirchnerismo_No sabe                               10.563
economia_pais_2_anos_Mejoró                                                 -0.694
                                                                            
representacion_del_cambio_Daniel Scioli                                    |
representacion_del_cambio_Mauricio Macri                                   |
representacion_del_cambio_Ninguno                                          |
representacion_del_cambio_No sabe                                          |
representacion_del_cambio_Sergio Massa                                     |
posicionamiento_respecto_kirchnerismo_Kirchnerista                         |
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                    |
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista |
posicionamiento_respecto_kirchnerismo_No sabe                              |
economia_pais_2_anos_Mejoró                                                |
                                                                             Dim.3
representacion_del_cambio_Daniel Scioli                                      0.106
representacion_del_cambio_Mauricio Macri                                     0.441
representacion_del_cambio_Ninguno                                           -0.720
representacion_del_cambio_No sabe                                            0.379
representacion_del_cambio_Sergio Massa                                      -0.676
posicionamiento_respecto_kirchnerismo_Kirchnerista                           0.378
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      0.712
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista  -0.749
posicionamiento_respecto_kirchnerismo_No sabe                               -0.255
economia_pais_2_anos_Mejoró                                                  0.300
                                                                               ctr
representacion_del_cambio_Daniel Scioli                                      0.255
representacion_del_cambio_Mauricio Macri                                     4.744
representacion_del_cambio_Ninguno                                            2.796
representacion_del_cambio_No sabe                                            0.526
representacion_del_cambio_Sergio Massa                                       7.213
posicionamiento_respecto_kirchnerismo_Kirchnerista                           2.750
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                     10.734
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista  16.295
posicionamiento_respecto_kirchnerismo_No sabe                                0.150
economia_pais_2_anos_Mejoró                                                  1.909
                                                                              cos2
representacion_del_cambio_Daniel Scioli                                      0.005
representacion_del_cambio_Mauricio Macri                                     0.100
representacion_del_cambio_Ninguno                                            0.042
representacion_del_cambio_No sabe                                            0.008
representacion_del_cambio_Sergio Massa                                       0.129
posicionamiento_respecto_kirchnerismo_Kirchnerista                           0.052
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      0.212
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista   0.382
posicionamiento_respecto_kirchnerismo_No sabe                                0.002
economia_pais_2_anos_Mejoró                                                  0.038
                                                                            v.test
representacion_del_cambio_Daniel Scioli                                      1.387
representacion_del_cambio_Mauricio Macri                                     6.106
representacion_del_cambio_Ninguno                                           -3.959
representacion_del_cambio_No sabe                                            1.696
representacion_del_cambio_Sergio Massa                                      -6.923
posicionamiento_respecto_kirchnerismo_Kirchnerista                           4.413
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                      8.884
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista -11.913
posicionamiento_respecto_kirchnerismo_No sabe                               -0.896
economia_pais_2_anos_Mejoró                                                  3.747
                                                                            
representacion_del_cambio_Daniel Scioli                                    |
representacion_del_cambio_Mauricio Macri                                   |
representacion_del_cambio_Ninguno                                          |
representacion_del_cambio_No sabe                                          |
representacion_del_cambio_Sergio Massa                                     |
posicionamiento_respecto_kirchnerismo_Kirchnerista                         |
posicionamiento_respecto_kirchnerismo_Anti kirchnerista                    |
posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista |
posicionamiento_respecto_kirchnerismo_No sabe                              |
economia_pais_2_anos_Mejoró                                                |

Categorical variables (eta2)
                                                                            
representacion_del_cambio                                                  |
posicionamiento_respecto_kirchnerismo                                      |
economia_pais_2_anos                                                       |
continuidad_o_cambio                                                       |
                                                                           Dim.1
representacion_del_cambio                                                  0.730
posicionamiento_respecto_kirchnerismo                                      0.739
economia_pais_2_anos                                                       0.747
continuidad_o_cambio                                                       0.713
                                                                           Dim.2
representacion_del_cambio                                                  0.520
posicionamiento_respecto_kirchnerismo                                      0.361
economia_pais_2_anos                                                       0.774
continuidad_o_cambio                                                       0.593
                                                                           Dim.3
representacion_del_cambio                                                  0.216
posicionamiento_respecto_kirchnerismo                                      0.417
economia_pais_2_anos                                                       0.269
continuidad_o_cambio                                                       0.491
                                                                            
representacion_del_cambio                                                  |
posicionamiento_respecto_kirchnerismo                                      |
economia_pais_2_anos                                                       |
continuidad_o_cambio                                                       |
Ver código
# calculo de autovalores ponderados
autovalores <- (sum(weighted_scores^2)) / (nrow(modelo_gba) - 1)


fviz_screeplot(fit_MCA,"variance", geom = c("bar", "line"), addlabels = T, title = "Scree Plot MCA Modelo GBA")

Ver código
fviz_mca_var(fit_MCA,col.var="contrib",gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = F)  + 
theme_gray()

Ver código
fit_MCA$var$contrib |>
  as.data.frame() |>
  rownames_to_column('variables') |>
  arrange(desc(`Dim 3`))
                                                                    variables
1  posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista
2                       continuidad_o_cambio_Mantener algunas y cambiar otras
3                                       economia_pais_2_anos_Se mantuvo igual
4                                          continuidad_o_cambio_Cambiar todas
5                     posicionamiento_respecto_kirchnerismo_Anti kirchnerista
6                                      representacion_del_cambio_Sergio Massa
7                            continuidad_o_cambio_Mantener políticas actuales
8                                    representacion_del_cambio_Mauricio Macri
9                                           representacion_del_cambio_Ninguno
10                         posicionamiento_respecto_kirchnerismo_Kirchnerista
11                                                economia_pais_2_anos_Mejoró
12                                               economia_pais_2_anos_No sabe
13                                               economia_pais_2_anos_Empeoró
14                                               continuidad_o_cambio_No sabe
15                                          representacion_del_cambio_No sabe
16                                    representacion_del_cambio_Daniel Scioli
17                              posicionamiento_respecto_kirchnerismo_No sabe
          Dim 1       Dim 2      Dim 3       Dim 4      Dim 5        Dim 6
1   0.434395696  0.53701477 16.2948485  7.22907842  0.9232983 17.396355673
2   0.909721906  0.06954303 15.6352088  0.41375972  5.3778170  1.041715847
3   0.607671128  0.07759199 14.1986491 19.31789516  0.9898835  3.692258646
4   6.690296643  1.20336655 12.6260015  1.27969371  4.2671511  0.423736281
5   8.978644964  2.28356226 10.7340521  2.71411818  0.2122469  3.511908166
6   2.427625241  0.21646102  7.2127464  0.90448451 44.3748576 14.839255697
7  16.275340784  0.08273909  5.5347578  0.02499515  1.8682873  0.709927392
8   6.210571589  1.10320771  4.7437798  2.27432668 20.7957816  6.225743810
9   0.113507155  0.10475769  2.7959288 47.03032652  9.8466866 10.151105908
10 15.805574518  0.31413825  2.7500896  0.31654003  0.1080067  1.509121972
11 13.533776634  0.04061794  1.9093911  5.02124477  0.0910218  1.889291296
12  0.216923893 33.12767899  1.7753831  0.21588786  0.1061972  0.001286058
13 11.145342046  1.18394730  1.4367065  1.21620173  0.7169395  0.046162397
14  0.479293802 25.02398750  1.4212713  0.09215926  0.6188730  0.108231093
15  0.355708599 21.66233469  0.5263548  1.29795353  0.8062545  5.921985287
16 15.811185021  0.05449817  0.2548120  2.09256957  0.1208236  1.447957851
17  0.004420382 12.91455306  0.1500188  8.55876519  8.7758734 31.083956626

Árbol de decisión

La técnica del árbol de decisión no parece a primera vista captar correctamente este proceso…

Ver código
#str(modelo_cba)

# Aplicamos tranformaciones y elimina pondera

modelo_gba <- modelo_gba |> 
  mutate(across(c(posicionamiento_respecto_kirchnerismo,
                  continuidad_o_cambio,representacion_del_cambio,
                  economia_pais_2_anos), ~as.character(.))) |> 
  mutate(across(c(posicionamiento_respecto_kirchnerismo,
                  continuidad_o_cambio,
                  representacion_del_cambio,
                  economia_pais_2_anos), ~as.factor(.)))

#str(modelo_cba)

data_train <- modelo_gba %>% dplyr::sample_frac(.8)
data_test  <- dplyr::anti_join(modelo_gba, data_train, by = 'ua') # se debe tener un id
data_train <- dplyr::select(data_train, -ua)
data_test <- dplyr::select(data_test, -ua)

# seteo la semilla
set.seed(258)
fit <- rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculo
rpart.plot(fit)

Ver código
predict_unseen <-predict(fit, data_test, type = 'class')
table_mat <- table(data_test$voto_oficialista, predict_unseen)
table_mat
    predict_unseen
     No Si
  No 40  2
  Si  6 27
Ver código
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
print(paste('Precisión de la prueba', round((accuracy_Test)*100),'%'))
[1] "Precisión de la prueba 89 %"

Por lo que se realiza una mejora de este modelo dicotomizando las variables, lo cual permite ver con más claridad cómo la representación de DS constituye la variable central.

Ver código
library(fastDummies)
modelo_gba_dummies <- dummy_cols(modelo_gba, select_columns = c(
  "posicionamiento_respecto_kirchnerismo", 
  "continuidad_o_cambio", 
  "representacion_del_cambio",
  "economia_pais_2_anos"
)) 


str(modelo_gba_dummies)
'data.frame':   373 obs. of  24 variables:
 $ representacion_del_cambio                                                 : Factor w/ 5 levels "Daniel Scioli",..: 5 1 3 1 2 5 2 1 1 2 ...
 $ posicionamiento_respecto_kirchnerismo                                     : Factor w/ 4 levels "Anti kirchnerista",..: 3 2 2 2 1 1 1 3 2 1 ...
 $ economia_pais_2_anos                                                      : Factor w/ 4 levels "Empeoró","Mejoró",..: 4 4 1 4 1 4 1 2 2 1 ...
 $ continuidad_o_cambio                                                      : Factor w/ 4 levels "Cambiar todas",..: 2 3 2 3 2 3 2 2 2 1 ...
 $ voto_oficialista                                                          : Factor w/ 2 levels "No","Si": 2 2 2 2 1 1 1 2 2 1 ...
 $ pondera_eph                                                               : num  1.537 0.477 0.836 1.266 1.455 ...
 $ ua                                                                        : num  1 2 3 4 5 6 7 8 9 10 ...
 $ posicionamiento_respecto_kirchnerismo_Anti kirchnerista                   : int  0 0 0 0 1 1 1 0 0 1 ...
 $ posicionamiento_respecto_kirchnerismo_Kirchnerista                        : int  0 1 1 1 0 0 0 0 1 0 ...
 $ posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista: int  1 0 0 0 0 0 0 1 0 0 ...
 $ posicionamiento_respecto_kirchnerismo_No sabe                             : int  0 0 0 0 0 0 0 0 0 0 ...
 $ continuidad_o_cambio_Cambiar todas                                        : int  0 0 0 0 0 0 0 0 0 1 ...
 $ continuidad_o_cambio_Mantener algunas y cambiar otras                     : int  1 0 1 0 1 0 1 1 1 0 ...
 $ continuidad_o_cambio_Mantener políticas actuales                          : int  0 1 0 1 0 1 0 0 0 0 ...
 $ continuidad_o_cambio_No sabe                                              : int  0 0 0 0 0 0 0 0 0 0 ...
 $ representacion_del_cambio_Daniel Scioli                                   : int  0 1 0 1 0 0 0 1 1 0 ...
 $ representacion_del_cambio_Mauricio Macri                                  : int  0 0 0 0 1 0 1 0 0 1 ...
 $ representacion_del_cambio_Ninguno                                         : int  0 0 1 0 0 0 0 0 0 0 ...
 $ representacion_del_cambio_No sabe                                         : int  0 0 0 0 0 0 0 0 0 0 ...
 $ representacion_del_cambio_Sergio Massa                                    : int  1 0 0 0 0 1 0 0 0 0 ...
 $ economia_pais_2_anos_Empeoró                                              : int  0 0 1 0 1 0 1 0 0 1 ...
 $ economia_pais_2_anos_Mejoró                                               : int  0 0 0 0 0 0 0 1 1 0 ...
 $ economia_pais_2_anos_No sabe                                              : int  0 0 0 0 0 0 0 0 0 0 ...
 $ economia_pais_2_anos_Se mantuvo igual                                     : int  1 1 0 1 0 1 0 0 0 0 ...
Ver código
modelo_gba_dummies <- modelo_gba_dummies %>%
  mutate(across(`posicionamiento_respecto_kirchnerismo_Anti kirchnerista`:`representacion_del_cambio_Sergio Massa`, as.factor)) |> 
  select(voto_oficialista:`economia_pais_2_anos_Se mantuvo igual`)

modelo_gba_dummies <- modelo_gba_dummies |> 
  rename(AntiK = `posicionamiento_respecto_kirchnerismo_Anti kirchnerista`,
         Ni_k_ni_no_K = `posicionamiento_respecto_kirchnerismo_Ni kirchnerista ni anti kirchnerista`,
         Kirchnerista = posicionamiento_respecto_kirchnerismo_Kirchnerista,
         posiciona_NS = `posicionamiento_respecto_kirchnerismo_No sabe`,
         cmabio_total = `continuidad_o_cambio_Cambiar todas`,
         cambio_parcial = `continuidad_o_cambio_Mantener algunas y cambiar otras`,
         no_cambio = `continuidad_o_cambio_Mantener políticas actuales`,
         representa_DS = `representacion_del_cambio_Daniel Scioli`,
         representa_MM = `representacion_del_cambio_Mauricio Macri`,
         representa_SM = `representacion_del_cambio_Sergio Massa`,
         representa_No_Sabe = `representacion_del_cambio_No sabe`)




data_train <- modelo_gba_dummies %>% dplyr::sample_frac(.8)
data_test  <- dplyr::anti_join(modelo_gba_dummies, data_train, by = 'ua') # se debe tener un id
data_train <- dplyr::select(data_train, -ua)
data_test <- dplyr::select(data_test, -ua)

# seteo la semilla
set.seed(258)
fit <- rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculo
rpart.plot(fit)

Ver código
#summary(fit)

predict_unseen <-predict(fit, data_test, type = 'class')
table_mat <- table(data_test$voto_oficialista, predict_unseen)
table_mat
    predict_unseen
     No Si
  No 47  1
  Si  6 21
Ver código
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
print(paste('Precisión de la prueba', round((accuracy_Test)*100),'%'))
[1] "Precisión de la prueba 91 %"
Ver código
rm(accuracy_Test,autovalores,predict_unseen,table_mat,weighted_scores,fit,fit_MCA,data_test,data_train,modelo_cba,modelo_psicosocial_racional_economico_cor)

Clusters

Cluster 1 (156 casos), no vota al oficialismo, va por un cambio moderado, representado por Mauricio Macri y que cree que la economía del país empeoró. El Cluster 3 tiene una posición similar pero de corte más anti k que cree que el cambio debe ser total per en entre ellos no queda tan claro que sea Mauricio Macri quien lo representa. El Cluster 2 a favor del oficialismo y de corte k, se ve representado por DS y cree en la continuidad frente al cambio, en pos de que creen que la economía del país mejoro en los últimos 2 años.

Si se realiza un análisis descriptivo de otras variables, se puede ver que a nivel etareo los cluster 1 y 3 muestran una distribución similar mientras que el cluster 2, parece ser levemente más joven con una mayor concentración de personas de 18 a 29 años y con una agenda mucho más marcada en problemas de Educación, asistencia social y salud. Por su parte el cluster 3 es el que muestra el nivel educativo más bajo el 46% tiene el primario incompleto, mientras que para los cluster 1 y 3 son los problemas de seguridad (48% y 49%) los de mayor relevancia.

Ver código
modelo_gba_clusters <-modelo_gba_dummies  |>  dplyr::select(-c(ua,pondera_eph))

modelo_gba_clusters <- modelo_gba_clusters %>%
  mutate(across(economia_pais_2_anos_Empeoró:`economia_pais_2_anos_Se mantuvo igual`, as.factor))


# Definir número de clusters
k <- 3

# Definir número de iteraciones
n_iter <- 100

# Definir vector de semillas
seeds <- c(123, 456, 789, 321, 654, 987)

# Matriz de resultados
result_matrix <- matrix(0, nrow = length(seeds), ncol = k)

# Loop sobre las semillas
for (i in seq_along(seeds)) {
  # Fijar la semilla
  set.seed(seeds[i])

  # Aplicar kmodes
  kmodes_result <- klaR::kmodes(modelo_gba_clusters, k, iter.max = n_iter)

  # Guardar el tamaño de los clusters
  result_matrix[i,] <- kmodes_result$size
}

# Imprimir los resultados
print(result_matrix)
     [,1] [,2] [,3]
[1,]  105  110  158
[2,]   94  165  114
[3,]  114  148  111
[4,]  122  145  106
[5,]  114  143  116
[6,]  156  121   96
Ver código
# Seleccion de la semilla que consideramos más estable
selected_seed <- seeds[which.max(result_matrix[, 1])]

# Fijar la semilla seleccionada
set.seed(selected_seed)

# Aplicacion de algoritmo K-Modes con la semilla seleccionada
kmodes_result <- klaR::kmodes(modelo_gba_clusters, k, iter.max = n_iter)

# Guardar el tamaño de los clusters
tamanio_clusters <- as.tibble(kmodes_result$size)

# Explorar los resultados en kmodes_result

kmodes_result$modes %>%
  as.data.frame() %>%
  rownames_to_column('cluster') |> 
  left_join(tamanio_clusters) |> 
  mutate(n = as.character(n)) |> 
  relocate(n, .after = cluster) |> 
  rename("Tamaño" = n) |> 
  pivot_longer(cols = -cluster) |> 
  group_by(cluster) |> 
  pivot_wider(names_from = cluster, values_from = value) |> 
  rename("variables" = "name",
         "Cluster 1"= "1",
         "Cluster 2"= "2",
         "Cluster 3"= "3") |>
  gt() |> 
  tab_header(md("**Clusters para modelo GBA**")) |> 
  comunicacion::gt_theme_dnmye() 
Clusters para modelo GBA
variables Cluster 1 Cluster 2 Cluster 3
Tamaño 156 121 96
voto_oficialista No Si No
AntiK 0 0 1
Kirchnerista 0 1 0
Ni_k_ni_no_K 1 0 0
posiciona_NS 0 0 0
cmabio_total 0 0 1
cambio_parcial 1 0 0
no_cambio 0 1 0
continuidad_o_cambio_No sabe 0 0 0
representa_DS 0 1 0
representa_MM 1 0 0
representacion_del_cambio_Ninguno 0 0 0
representa_No_Sabe 0 0 0
representa_SM 0 0 0
economia_pais_2_anos_Empeoró 1 0 1
economia_pais_2_anos_Mejoró 0 1 0
economia_pais_2_anos_No sabe 0 0 0
economia_pais_2_anos_Se mantuvo igual 0 0 0

Se asignan los clusters para poder hacer un análisis descriptivo

Ver código
rm(tamanio_clusters,result_matrix,i,k,n_iter,seeds,selected_seed)

# extraer el cluster
gba_cluster_index <- kmodes_result$cluster %>% as.data.frame() %>% 
  rename("cluster" = ".")

#unirlo a la base
df_gba <- df_gba  |>  cbind(gba_cluster_index)

# # chequear que los tamaños esten ok
#table(df_gba$cluster)

# eliminar df intermedios
rm(gba_cluster_index,kmodes_result,modelo_gba_clusters,modelo_gba_dummies)

# renombramos los clusters

df_gba <- df_gba  |>  
  mutate(cluster = case_when(cluster == 1 ~ "cluster_1",
                             cluster == 2 ~ "cluster_2",
                             cluster == 3 ~ "cluster_3"))

Distribución

Ver código
df_gba |>
  group_by(cluster) |>
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |>
  mutate(cluster_prop_pond = round(n_pond / sum(n_pond)*100)) |> 
  gt() |> 
  tab_header(title = md("**Distribución de clusters**"),
             subtitle = "Córdoba" )
Distribución de clusters
Córdoba
cluster n n_pond cluster_prop_pond
cluster_1 156 155 42
cluster_2 121 122 33
cluster_3 96 96 26

Sexo

Ver código
df_gba |> 
  group_by(cluster,sexo) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = sexo) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters gba segun sexo",
    caption = "Datos ponderados según EPH.",
    fill = "Sexo"
  ) +
  scale_fill_manual(values = c("#039be5","violet")) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Edad

Ver código
df_gba |> 
  group_by(cluster,edad) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = edad) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters gba segun Edad",
    caption = "Datos ponderados según EPH.",
    fill = "Edad"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Purples' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Niv. Educativo

Ver código
df_gba |> 
  group_by(cluster,niv_educativo) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = niv_educativo) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters gba segun Nivel Educativo",
    caption = "Datos ponderados según EPH.",
    fill = "Nivel educativo"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Greens' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Agenda

Ver código
df_gba |> 
  group_by(cluster,agenda_de_temas) |> 
  summarise(n = n_distinct(ua),
            n_pond = round(sum(pondera_eph))) |> 
  mutate(prop = round(n_pond / sum(n_pond)*100)) |> 
  ggplot()+
  aes(x = cluster, y = prop, fill = agenda_de_temas) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%.1f%%", prop), y = prop), 
            position = position_stack(vjust = 0.5),
            color = "black", size = 3,
            check_overlap = T)+ 
  labs(
    title = "Clusters gba segun Nivel Educativo",
    caption = "Datos ponderados según EPH.",
    fill = "Agenda"
  ) +
  scale_fill_brewer(direction = 1,palette = 'Set2' ) +
  theme_fivethirtyeight()+ 
  theme(legend.direction = "vertical", legend.position = "right",
        legend.title = element_text(size = 10, face = "bold"),
        axis.text.x = element_text(size = 8, face = "bold"),
        title = element_text(size = 12))

Potencial Cruzado

Ver código
# vector con los candidatos seleccionados para disputa en Ballotage
candidates_en_disputa <- c("Daniel Scioli", "Mauricio Macri")


df_gba %>%
  filter(cluster == 'cluster_1') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_gba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 1")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 1
votaria Mauricio Macri Daniel Scioli En disputa
Daniel Scioli 4.88 0.00 1.31
Indecisos 4.71 6.24 4.31
Mauricio Macri 0.00 16.36 2.44
Ver código
df_gba %>%
  filter(cluster == 'cluster_2') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri'), ~ round(. / sum(df_gba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  #relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 2")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 2
votaria En disputa Mauricio Macri
Daniel Scioli 4.73 25.49
Indecisos 0.00 0.91
Ver código
df_gba %>%
  filter(cluster == 'cluster_3') |> 
  # volvemos a armar los pisos
  mutate(votaria = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato), 
  # Imputar como indecisos a quienes no votan candidatos en disputa
         votaria = ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), 
  # Imputar como votos en disputa a quienes no votan a los candidatos competidores
         jamas_votaria = ifelse((jamas_votaria %in% candidates_en_disputa), jamas_votaria, "En disputa")) %>% 
  # Filtramos los casos raros que dice jamas votaria y votaria al mismo candidato (preguntar por esto)
  filter(!((jamas_votaria == 'Daniel Scioli' & votaria == 'Daniel Scioli') |
           (jamas_votaria == 'Mauricio Macri' & votaria == 'Mauricio Macri'))) |> 
  # Tabla pivot segun votaria y jamas votaria
  group_by(votaria, jamas_votaria) %>%
  summarise(n_pond = sum(pondera_eph)) %>%
  # Dar vuelta
  pivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill = 0) %>%
  as.tibble() |> 
  # Armar porcentajes
  mutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~ round(. / sum(df_gba$pondera_eph) * 100, 2))) |> 
  # acomodar y embellecer tabla
  relocate('En disputa',.after = 'Daniel Scioli') |> 
  gt() |> 
  tab_header(title = "Potencial Cruzado Macri vs. Scioli", 
             subtitle = "Provincia de Córdoba - Cluster 3")
Potencial Cruzado Macri vs. Scioli
Provincia de Córdoba - Cluster 3
votaria Daniel Scioli En disputa Mauricio Macri
Indecisos 7.30 3.79 4.73
Mauricio Macri 9.58 0.24 0.00

Principales hallazgos

A la hora de comprender el voto oficialista en Córdoba y GBA se observan estructuras de descisión similares en torno a una interacción entre variables de los modelos psicosocial y racional económico, pero con leves diferencias. En el caso del electorado de la docta, la variable de continuidad frente al cambio conforma el nodo inicial que quienes elijan Mantener políticas actuales terminan votando en un 73% de los casos al oficialismo de Daniel Scioli. Entre quienes no elijen mantener las políticas actuales se abren dos caminos vinculados a la capacidad de representación del cambio por parte del candidato oficialista, lo cual alcanza solo al 9% de la muestra. Cuando la representación del cambio queda acéfala (ninguno representa al cambio) entra a jugar lo que sucedió en la economía familiar en los últimos dos años, elemento que se vuelve a observar en el análisis de clusters. El voto oficialista (Cluster 3 casos), sostiene la consolidación respecto de la representación de Daniel Scioli, la reticencia frente al cambio sostenida por una mejora en las condiciones económicas personales en los últimos dos años, tal cual ya vimos en el MCA y el árbol. El voto no oficialista donde el cambio es parcial para ambos en esta distribución de la moda pero y han empeorado en su condición económica, pero mientras que para un grupo mayoritario (Cluster 1), Mauricio Macri personifica este cambio parcial, para otra minoría Massa podría personificarlo (Cluster 2).

En el análisis de los clusters vemos que el cluster 1 que representa al 60% tiene una distribución equilibrada por género, a diferencia del cluster 2 (16%) que se distingue por tener un perfil un poco más femenino y con mayor concentración en torno a los 50-65 años, El cluster 3 (25%) parece más joven y con un mayor nivel educativo que los otros dos clusters y en este sentido parece coherente que en la agenda de temas muestre más interés por la problemática educativa que los otros dos clusters.

A diferencia del electorado cordobés, el voto bonaerense muestra una mayor correlación con la economía del país en los últimos dos años (0.69) que con la familiar (0.61) pero la variable central es la capacidad del candidato oficialista de personificar la representación del cambio y que explica en un 98% de probabilidad el acompañamiento al oficialismo. Asimismo, la división en tres clusters muestra que el Cluster 1 (156 casos), no vota al oficialismo, va por un cambio moderado, representado por Mauricio Macri y que cree que la economía del país empeoró. El Cluster 3 tiene una posición similar pero de corte más anti k que cree que el cambio debe ser total per en entre ellos no queda tan claro que sea Mauricio Macri quien lo representa. El Cluster 2 a favor del oficialismo y de corte k, se ve representado por DS y cree en la continuidad frente al cambio, en pos de que creen que la economía del país mejoro en los últimos 2 años.

Si se realiza un análisis descriptivo de otras variables, se puede ver que a nivel etareo los cluster 1 y 3 muestran una distribución similar mientras que el cluster 2, parece ser levemente más joven con una mayor concentración de personas de 18 a 29 años y con una agenda mucho más marcada en problemas de Educación, asistencia social y salud. Por su parte el cluster 3 es el que muestra el nivel educativo más bajo el 46% tiene el primario incompleto, mientras que para los cluster 1 y 3 son los problemas de seguridad (48% y 49%) los de mayor relevancia.