Relación entre numérica y categórica

Estos son todos los paquetes que necesitaremos, entre ellos el paquete unvotes (Voeten 2017):

#recordad que los paquetes deben estar previamente instalados
library(unvotes)
library(dplyr)
library(tidyr)
library(readr)
library(ggplot2)
library(stringr)
library(readxl)
library(countrycode)

En esta sección nos interesa la base de datos Democracy Dataset (DD) (Cheibub, Gandhi, and Vreeland 2010), que se puede descargar desde un archivo Excel que encuentra en la página web de José Antonio Cheibub. Hemos creado el marco de datos DData, que contiene la variable democracy. Esta variable toma el valor 1 cuando es democracia y 0 cuando no lo es.

download.file("https://uofi.box.com/shared/static/d27425539c9d662a7041.xls", "dd.xls")
DDdata <- read_xls("dd.xls") %>%
  filter(year > 1945) %>%
  mutate(iso2c = countrycode(uncode, "un", "iso2c")) %>%
  select(iso2c, country = ctryname, year, democracy, un_continent_name)

AVISO!: Si tenéis problemas con la función anterior, descargad manualmente el archivo, ubicadlo en vuestro directorio de trabajo con el nombre dd.xls y proseguid con el código para crear la función DDdata.

Si visualizamos DDdata obtenemos el siguiente resultado:

iso2cstandardized_countrycountryyeardemocracyun_continent_name
AFAfghanistanAfghanistan19460Asia
ALAlbaniaAlbania19460Europe
ARArgentinaArgentina19461Americas
AUAustraliaAustralia19461Oceania
ATAustriaAustria19461Europe
BEBelgiumBelgium19461Europe
BTBhutanBhutan19460Asia
BOBoliviaBolivia19460Americas
BRBrazilBrazil19461Americas
BGBulgariaBulgaria19460Europe

Diferencia de medias

Cuando queramos mirar la asociación entre una variable independiente categórica y una dependiente numérica utilizaremos la diferencia de medias. La idea detrás de este procedimiento es simple: cogemos dos distribuciones numéricas y nos preguntamos: ¿tienen la misma media o no? En nuestro ejemplo, la pregunta que nos haremos es: ¿las democracias votaban diferente que las no democracias en 1946? Necesitaremos datos del voto en la ONU y también información sobre si el país es o no una democracia:

  1. Voto en la ONU: A partir de un_roll_calls y un_votes hemos creado el marco de datos un_year_mean, donde obtenemos la media de votos a favor de cada país por año. Si la variable mean es cercana a 1 significa que el país votó a favor la mayoría de las veces. Sí es cercana a 0 significa que votó principalmente en contra.
un_year_mean <- un_roll_calls %>%
  separate(date, "year", extra = "drop") %>%
  inner_join(un_votes) %>%
  mutate(year = as.numeric(year), 
         vote = if_else(vote == "yes", 1, 0)) %>%
  group_by(year, country, country_code) %>%
  summarize(mean = mean(vote))
yearcountrycountry_codemean
1946AfghanistanAF0.4117647
1946ArgentinaAR0.6976744
1946AustraliaAU0.5581395
1946BelarusBY0.4418605
1946BelgiumBE0.6046512
1946Bolivia (Plurinational State of)BO0.6976744
1946BrazilBR0.6046512
1946CanadaCA0.6428571
1946ChileCL0.6046512
1946ColombiaCO0.3095238
  1. Democracia: Unimos el marco de datos un_year_mean con el marco de datos DDdata, donde ya tenemos la variable democracy dicotomizada. La pasaremos a vector de carácter, que tenga las categorías Democracy y No Democracy.
un_dd_year <- un_year_mean %>%
  inner_join(DDdata, by = c("country_code" = "iso2c", "year" = "year")) %>%
  select(country = country.x, country_code, year, mean, democracy,
         continent = un_continent_name) %>%
  mutate(democracy = if_else(democracy == 1, "Democracy", "No democracy"))

Fijémonos con el nuevo marco de datos un_dd_year. Tenemos:

  • La variable categórica independiente democracy.
  • La variable numérica dependiente mean.
countrycountry_codeyearmeandemocracycontinent
AfghanistanAF19460.4117647No democracyAsia
ArgentinaAR19460.6976744DemocracyAmericas
AustraliaAU19460.5581395DemocracyOceania
BelgiumBE19460.6046512DemocracyEurope
Bolivia (Plurinational State of)BO19460.6976744No democracyAmericas
BrazilBR19460.6046512DemocracyAmericas
CanadaCA19460.6428571DemocracyAmericas
ChileCL19460.6046512DemocracyAmericas
ColombiaCO19460.3095238DemocracyAmericas
Costa RicaCR19460.6388889DemocracyAmericas

Visualizar

Hay varias maneras de visualizar una diferencia de medias. Podemos, por ejemplo, utilizar un diagrama de barras (geom_col()) en el que la altura de las barras represente la media de cada categoría. Otra manera es con un punto que represente la media de cada grupo y una barra horizontal que represente el intervalo de confianza. Hemos añadido las observaciones detrás con un geom_jitter() que representa las observaciones coloreadas por continente.

un_dd_year %>%
  filter(year == 1946) %>% #filtramos por 1946
  ggplot(aes(x = democracy, y = mean)) +
  geom_jitter(aes(col = continent), alpha = 0.8, width = 0.25) + #las observaciones 
  stat_summary(fun.data = mean_se,
               fun.args = list(mult = 1.96), 
               size = 0.45,
               col = "red") + #media y interval de confianza
  scale_color_brewer(type = "qual", palette = 6) +
  theme_classic()

Cuantificar

En la diferencia de medias podemos hacernos tres preguntas:

  1. ¿Hay diferencia en la media de la variable dependiente según las categorías de la variable independiente desde un punto de vista estadístico?
  2. ¿Cuánta diferencia hay entre una media y la otra desde un punto de vista estadístico?
  3. ¿Qué correlación hay entre las dos variables?

Podemos responder a las dos preguntas primeras con el t.test(). En primer lugar, filtramos por 1946 y dicotomiza con 1 y 0 la variable categórica (necesario para poder realizar el test).

un_dd_year_1946 <- un_dd_year %>%
  filter(year == 1946) %>%
  mutate(democracy = if_else(democracy == "Democracy", 1, 0))

t.test(un_dd_year_1946$mean, un_dd_year_1946$democracy)
## 
##  Welch Two Sample t-test
## 
## data:  un_dd_year_1946$mean and un_dd_year_1946$democracy
## t = 0.23618, df = 49.996, p-value = 0.8143
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.1319858  0.1671619
## sample estimates:
## mean of x mean of y 
## 0.5920561 0.5744681

El p-valor, muy superior a 0.05, nos responde a la primera pregunta: no hay diferencia. En la segunda pregunta encontramos respuesta en los números -0.1319858 y 0.1671619: nos indican el intervalo en que queremos con un 95% de confianza que se moverá la diferencia de medias.

Finalmente, podemos saber la correlación con la función cor():

cor(un_dd_year_1946$mean, un_dd_year_1946$democracy)
## [1] 0.1303807

Referencias

Cheibub, José Antonio, Jennifer Gandhi, and James Raymond Vreeland. 2010. Democracy and Dictatorship Revisited.” Public Choice 143 (2-1): 67–101.
Voeten, Erik. 2017. Data and Analyses of Voting in the UN General Assembly.” In Routledge Handbook of International Organization, edited by Bob Reinalda. London: Routledge.
Previous
Next