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)
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:
- Voto en la ONU: A partir de
un_roll_calls
yun_votes
hemos creado el marco de datosun_year_mean
, donde obtenemos la media de votos a favor de cada país por año. Si la variablemean
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 |
- Democracia: Unimos el marco de datos
un_year_mean
con el marco de datosDDdata
, donde ya tenemos la variabledemocracy
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:
- ¿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?
- ¿Cuánta diferencia hay entre una media y la otra desde un punto de vista estadístico?
- ¿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