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 CBAdf_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_PASOVOTACION_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 <-NULLdf_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
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.
# 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 graficodf_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.
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
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ónselect(-.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.
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
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 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%)
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
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")
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 sociodemograficoseph_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
# Sexoeph_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 outputas.numeric() names(eph_sexo_cba) <-c("Varón","Mujer")# Edadeph_edad_cba <- eph_edad |>filter(edad !=18) |>#se filtran los menores de 18 ya que aparentemente no fueron entrevistados o no hay casosmutate(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 educativoeph_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 listadotargets_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 listadonames(targets_cba) <-c("sexo","edad","ne_cba")targets_cba
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.
[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.
#convertimos el df_cba en dataframedf_gba <-as.data.frame(df_gba)# creacion de ponderacionweights_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 ponderaciondf_gba$pondera_eph <-unlist(weights_gba[1])# resultado de ponderación para voto_acotadodf_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 pisospiso_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 techostecho_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 potencialpotencial_cba <-left_join(piso_cba,techo_cba, by ="candidates") |>#Unimos ambos y calculamos el potencialarrange(desc(piso_perc_pond)) |># ordenamos por pisofilter(!is.na(techo_perc_pond)) |># sacamos a les candidates sin techomutate(voto_potencial_pond =100- (piso_perc_pond + techo_perc_pond)) #eliminar tablas intermediasrm(piso_cba,techo_cba)#pivotear y graficarpotencial_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 pisospiso_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 techostecho_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 potencialpotencial_gba <-left_join(piso_gba,techo_gba, by ="candidates") |>#Unimos ambos y calculamos el potencialarrange(desc(piso_perc_pond)) |># ordenamos por pisofilter(!is.na(techo_perc_pond)) |># sacamos a les candidates sin techomutate(voto_potencial_pond =100- (piso_perc_pond + techo_perc_pond)) #eliminar tablas intermediasrm(piso_gba,techo_gba)#pivotear y graficarpotencial_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 Ballotagecandidates_en_disputa <-c("Daniel Scioli", "Mauricio Macri")df_cba %>%# volvemos a armar los pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_cba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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 pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_cba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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
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ónmodelo_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 coefficientsempty_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:
# seleccion de variables importantes para cba para explicar el voto oficialistamodelo_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.
# 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))
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 modelofit_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_ephweighted_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)
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 ponderamodelo_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 iddata_train <- dplyr::select(data_train, -ua)data_test <- dplyr::select(data_test, -ua)# seteo la semillaset.seed(124)fit <-rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculorpart.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 iddata_train <- dplyr::select(data_train, -ua)data_test <- dplyr::select(data_test, -ua)# seteo la semillaset.seed(124)fit <-rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculorpart.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),'%'))
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 clustersk <-3# Definir número de iteracionesn_iter <-100# Definir vector de semillasseeds <-c(123, 456, 789, 321, 654, 987)# Matriz de resultadosresult_matrix <-matrix(0, nrow =length(seeds), ncol = k)# Loop sobre las semillasfor (i inseq_along(seeds)) {# Fijar la semillaset.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 resultadosprint(result_matrix)
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 Ballotagecandidates_en_disputa <-c("Daniel Scioli", "Mauricio Macri")df_cba %>%filter(cluster =='cluster_1') |># volvemos a armar los pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_cba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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 pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_cba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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 pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_cba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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
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ónmodelo_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 coefficientsempty_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:
# seleccion de variables importantes para gba para explicar el voto oficialistamodelo_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.
# 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.
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 modelofit_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_ephweighted_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)
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 ponderamodelo_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 iddata_train <- dplyr::select(data_train, -ua)data_test <- dplyr::select(data_test, -ua)# seteo la semillaset.seed(258)fit <-rpart(voto_oficialista ~., data = data_train, weights = pondera_eph) # incluimos el ponderador en el cálculorpart.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.
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 clustersk <-3# Definir número de iteracionesn_iter <-100# Definir vector de semillasseeds <-c(123, 456, 789, 321, 654, 987)# Matriz de resultadosresult_matrix <-matrix(0, nrow =length(seeds), ncol = k)# Loop sobre las semillasfor (i inseq_along(seeds)) {# Fijar la semillaset.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 resultadosprint(result_matrix)
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 Ballotagecandidates_en_disputa <-c("Daniel Scioli", "Mauricio Macri")df_gba %>%filter(cluster =='cluster_1') |># volvemos a armar los pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_gba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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 pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(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 pisosmutate(votaria =ifelse(voto_candidato =="No Sabe", voto_acotado, voto_candidato), # Imputar como indecisos a quienes no votan candidatos en disputavotaria =ifelse(!(votaria %in% candidates_en_disputa), "Indecisos", votaria), # Imputar como votos en disputa a quienes no votan a los candidatos competidoresjamas_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 votariagroup_by(votaria, jamas_votaria) %>%summarise(n_pond =sum(pondera_eph)) %>%# Dar vueltapivot_wider(names_from = jamas_votaria, values_from = n_pond, values_fill =0) %>%as.tibble() |># Armar porcentajesmutate(across(c('En disputa','Mauricio Macri','Daniel Scioli'), ~round(. /sum(df_gba$pondera_eph) *100, 2))) |># acomodar y embellecer tablarelocate('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.