Relación entre numérica y categórica

En este apartado aprenderemos a analizar el asociación entre una variable independiente numérica y una variable dependiente categórica. Hay cuatro tipos de asociaciones y cada una se analiza con una técnica diferente:

  • Tabla de contingencia: Entre dos variables categóricas.
  • Diferencia de medias: Entre una variable categórica independiente y una numérica dependiente.
  • Regresión logística: Entre una variable numérica independiente y una categórica dependiente.
  • Regresión: Entre dos variables numéricas.

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:

iso2c standardized_country country year democracy un_continent_name
AF Afghanistan Afghanistan 1946 0 Asia
AL Albania Albania 1946 0 Europe
AR Argentina Argentina 1946 1 Americas
AU Australia Australia 1946 1 Oceania
AT Austria Austria 1946 1 Europe
BE Belgium Belgium 1946 1 Europe
BT Bhutan Bhutan 1946 0 Asia
BO Bolivia Bolivia 1946 0 Americas
BR Brazil Brazil 1946 1 Americas
BG Bulgaria Bulgaria 1946 0 Europe

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))
year country country_code mean
1946 Afghanistan AF 0.4117647
1946 Argentina AR 0.6976744
1946 Australia AU 0.5581395
1946 Belarus BY 0.4418605
1946 Belgium BE 0.6046512
1946 Bolivia (Plurinational State of) BO 0.6976744
1946 Brazil BR 0.6046512
1946 Canada CA 0.6428571
1946 Chile CL 0.6046512
1946 Colombia CO 0.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.
country country_code year mean democracy continent
Afghanistan AF 1946 0.4117647 No democracy Asia
Argentina AR 1946 0.6976744 Democracy Americas
Australia AU 1946 0.5581395 Democracy Oceania
Belgium BE 1946 0.6046512 Democracy Europe
Bolivia (Plurinational State of) BO 1946 0.6976744 No democracy Americas
Brazil BR 1946 0.6046512 Democracy Americas
Canada CA 1946 0.6428571 Democracy Americas
Chile CL 1946 0.6046512 Democracy Americas
Colombia CO 1946 0.3095238 Democracy Americas
Costa Rica CR 1946 0.6388889 Democracy Americas

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