Análisis de datos bivariados

En clase discutimos sobre las posibles técnicas de análisis cuando queremos comprender un fenómeno a través de más de una dimension observada. Definimos a los estudios bivariados como aquellos en los que se involucra el estudio de dos variables simultaneas en cualquiera de sus formas:

  • Dos variables cualitativas (tablas de contingencia).
  • Dos variables cuantitativas (correlación).
  • Una variable cuantitativa y una variable cualitativa (prueba de medias).

En este documento se repasan los conceptos con algunos ejemplos y se explican las sentencias para llevar a cabo el análisis en R (se proveen los códigos y las salidas para que puedas comparar tu trabajo con el documento). Pero recuerden que podrán usar cualquier software. Por ejemplo, acá hay un ejemplo en Excel.

En el documento vamos a trabajar con datos de alquileres. Lo primero que vamos a hacer es cargarlo y evaluar que no tenga valores faltantes. La extensión del archivo es csv (valores separados por coma) así que vamos a usar una función para importar estos tipos de archivos. Con header = TRUE le indicamos que la base de datos tiene encabezados y con el argumento dec = . indicamos que

# Cargamos las librerías que vamos a usar durante el análisis

# Recordemos instalar la librería si es la primera vez que la usamos
# install.packages("dplyr")
library(dplyr)

# Vamos a indicarle a R que a los numeros chicos no los presente en notación científica
options(scipen = 999)


# Importamos los datos
departamentos <- read.csv("datos_departamentos.csv", header = TRUE, dec = ".")

# Mostrar la estructura de los datos
str(departamentos)
## 'data.frame':    300 obs. of  3 variables:
##  $ tipo_departamento: chr  "Monoambiente" "Monoambiente" "Monoambiente" "Monoambiente" ...
##  $ alquiler         : num  3986 4551 4740 4323 4035 ...
##  $ metros_cuadrados : num  27.2 28.8 37.8 30.4 30.6 ...

Vamos a estudiar si existen casos nulos. Para ello usamos la función is.na() acompañada de un table para tabular la cantidad de nulos:

table(is.na(departamentos))
## 
## FALSE 
##   900

La salida indica que de los 900 casos, ninguno es nulo. Si los hubiese, R nos indicaría bajo la leyenda TRUE = Cantidad de casos nulos en el conjunto de datos.

Análisis descriptivo univariado

La correlación mide la relación lineal entre dos variables. Si la correlación es positiva, significa que a medida que una variable aumenta, la otra también lo hace. En cambio, si es negativa, una variable disminuye cuando la otra aumenta. Existen alternativas para la falta de linealidad.

Antes de estudiar la correlación, es una buena prácticar realizar un análisis univariado:

# Le pido a R que me presente 2 gráficos en una sola fila
par(mfrow = c(1, 2)) 

# Estudiamos la distribución de los precios de alquileres
hist(departamentos$alquiler, col = "steelblue2", main = "Precios de alquileres", xlab = "$", ylab = "Frecuencia")

# Estudiamos la distribución de los m2
hist(departamentos$metros_cuadrados, col = "firebrick1", main = "Metros cuadrados", xlab = "m2", ylab = "Frecuencia")

En general, notamos que las distribuciones son simétricas, con un promedio de alquiler de de $30,875 (y desvío de $7422.6). Sin embargo, el 25 % de los departamentos más baratos asume un alquiler de hasta $27,584 (1er cuartil), mientras que el 25 % de departamentos más caros tienen un valor de como mínimo $38,075 (3er cuartil), lo cual sugiere una dispersión interesante de los precios. Podríamos calcular las estadísticas por tipo de departamento con ayuda del paquete dplyr de la siguiente manera:

Análisis descriptivo por categoría

# Cargar la librería dplyr
library(dplyr)

# Tabla 1: Estadísticas descriptivas para el alquiler
estadisticas_alquiler <- departamentos %>%
  group_by(tipo_departamento) %>%
  summarise(
    Min_Alquiler = min(alquiler),
    Max_Alquiler = max(alquiler),
    Promedio_Alquiler = mean(alquiler),
    Desvio_Alquiler = sd(alquiler)
  )
# Mostrar las tablas
print(estadisticas_alquiler)
## # A tibble: 3 × 5
##   tipo_departamento Min_Alquiler Max_Alquiler Promedio_Alquiler Desvio_Alquiler
##   <chr>                    <dbl>        <dbl>             <dbl>           <dbl>
## 1 Dos ambientes           10850.       18568.            15014.           1492.
## 2 Monoambiente             3333.        5848.             4448.            523.
## 3 Un ambiente              6390.       10567.             8498.            843.

Por otro lado, los metros cuadrados presentan una distribución algo más dispersa, con una mediana de 52.86 m² (y desvíos de 15.01). Los departamentos más cercanos al promedio rondan entre 43.98 m² a 65.08 m² (rango intercuartil). Esto sugiere que, aunque los precios están distribuidos de manera relativamente simétrica, los metros cuadrados muestran una mayor amplitud en los tamaños, dado que su variabilidad relativa es mayor (27 %r respecto al promedio en el caso de los m2 y 23 % respecto al promedio del monto de alquiler).

# Tabla 2: Estadísticas descriptivas para los metros cuadrados
estadisticas_metros_cuadrados <- departamentos %>%
  group_by(tipo_departamento) %>%
  summarise(
    Min_m2 = min(metros_cuadrados),
    Max_m2 = max(metros_cuadrados),
    Promedio_m2 = mean(metros_cuadrados),
    Desvio_m2 = sd(metros_cuadrados)
  )

# Imprimir la tabla
print(estadisticas_metros_cuadrados)
## # A tibble: 3 × 5
##   tipo_departamento Min_m2 Max_m2 Promedio_m2 Desvio_m2
##   <chr>              <dbl>  <dbl>       <dbl>     <dbl>
## 1 Dos ambientes       43.4   94.0        71.1      9.89
## 2 Monoambiente        18.5   40.9        30.5      4.56
## 3 Un ambiente         37.7   66.1        50.8      6.65

Notamos que si separamos la muestra en grupos hay notables diferencias en los estadísticos interpretados. Si hubiesemos hecho un boxplot podríamos haberlo notado:

# Dos gráficos en una fila y 2 columnas
par(mfrow=c(1,2))

# Primero, ordenamos los tipos de departamento según el tamaño promedio (metros cuadrados).
# Utilizamos la función factor() para reordenar las categorías de la variable "tipo".

departamentos$tipo <- factor(departamentos$tipo_departamento, 
                             levels = c("Monoambiente", "Un Ambiente", "Dos Ambientes"))

# Boxplot para el alquiler por tipo de departamento
# Creamos un gráfico de caja (boxplot) que muestra cómo varía el alquiler según el tipo de departamento.
# Los colores lightblue, lightgreen y lightpink permiten diferenciar los grupos visualmente.

boxplot(alquiler ~ tipo_departamento, data = departamentos,
        main = "Alquileres",
        xlab = "Tipo de Departamento", ylab = "Alquiler",
        col = c("lightblue", "lightgreen", "lightpink"))

# Boxplot para los metros cuadrados por tipo de departamento
# Este gráfico de caja muestra la distribución de los metros cuadrados según el tipo de departamento.

boxplot(metros_cuadrados ~ tipo_departamento, data = departamentos,
        main = "Metros cuadrados",
        xlab = "Tipo de Departamento", ylab = "Metros Cuadrados",
        col = c("lightblue", "lightgreen", "lightpink"))

El boxplot también nos permite identificar casos atípicos. Por ejemplo existen ambientes notablemente grandes respecto al resto, y también se identifica rapidamente un monoambiente bastante más barato que los demás. Se podría profundizar en este análisis.

Análisis de correlación

Ahora bien, lo que nos interesa es saber como afectan los metros cuadrados al precio de los departamentos. Con el análisis descriptivo por grupos ya podemos notar que el tipo de departamento condiciona los montos promedios tanto en metros cuadrados como en precios, por lo que es algo a tener en cuenta.

Avancemos con el análisis de correlación. En primer lugar, es interesante estudiar la distribución bivariada:

# Crear gráfico de dispersión entre alquiler y metros cuadrados
# Utilizamos la función plot() para mostrar la relación entre ambas variables y añadimos la recta de regresión

plot(departamentos$metros_cuadrados, departamentos$alquiler,
     main = "Relación entre Alquiler y Metros Cuadrados",
     xlab = "Metros Cuadrados", ylab = "Alquiler",
     pch = 19, col = "blue")

Podemos notar que la correlación es fuerte y positiva (0.94). Lo observamos además en el diagrama de dispersión.

# Calcular y mostrar la correlación entre alquiler y metros cuadrados
correlacion <- cor(departamentos$metros_cuadrados, departamentos$alquiler)
print(paste("La correlación entre metros cuadrados y alquiler es:", round(correlacion, 2)))
## [1] "La correlación entre metros cuadrados y alquiler es: 0.94"

Sin embargo, se puede observar la presencia de los grupos en este gráfico. Hagamos lo mismo pero pintando con distintos colores los grupos:

# Asignamos colores para cada tipo de departamento
colors <- c("Monoambiente" = "steelblue", "Un ambiente" = "seagreen", "Dos ambientes" = "firebrick1")

# Crear el gráfico de dispersión con los grupos pintados
plot(departamentos$metros_cuadrados, departamentos$alquiler,
     col = colors[departamentos$tipo_departamento], pch = 19,
     main = "Relación entre Alquiler y Metros Cuadrados por Tipo de Departamento",
     xlab = "Metros Cuadrados", ylab = "Alquiler")

# Añadir una leyenda para los colores
legend("topleft", legend = names(colors), col = colors, pch = 19)

Parece que, en realidad, el tipo de departamento influye notablemente en la relación que existe entre los metros cuadrados y el precio del alquiler. Observemoslo con más detalle usando la librería ggplot2:

# Instalamos la librería (si es la primera vez que la usamos)
# install.packages("ggplot2")
library(ggplot2)

# Asignamos colores para cada tipo de departamento
colors <- c("Monoambiente" = "steelblue", "Un ambiente" = "seagreen", "Dos ambientes" = "firebrick1")

# Crear el gráfico con ggplot, facetas por tipo de departamento y la recta de regresión
ggplot(departamentos, aes(x = metros_cuadrados, y = alquiler, color = tipo_departamento)) +
  geom_point() +                                  # Puntos de datos
  geom_smooth(method = "lm", se = FALSE) +        # Añadir la recta de regresión
  facet_wrap(~tipo_departamento, scales = "free") + # Crear cuadrícula por tipo de departamento
  scale_color_manual(values = colors) +           # Aplicar los colores definidos
  labs(title = "Relación entre Alquiler y Metros Cuadrados por Tipo de Departamento",
       x = "Metros Cuadrados", y = "Alquiler", color = "Tipo de departamento") +  # Etiquetas de los ejes y el título
  theme_minimal()                                 # Aplicar un tema minimalista

Acá podemos notar que la variable metros cuadrados está relacionada con los precios de los alquileres de forma positiva y fuerte, aunque en los departamentos de dos ambientes esa fuerza es mayor (0.78) que, por ejemplo, en los monoambientes (0.38).

Ahora bien, si estos casos son una muestra posible y probabilística de todos los departamentos, podríamos asegurarnos que esa correlación sea distinta de 0 a través de una prueba de hipótesis:

  • Hipótesis nula: La correlación es 0, formalmente (\(\rho =0\))
  • Hipótesis alternativa: La correlación es distinta de 0, formalmente (\(\rho \neq 0\))

La función cor.test() nos permitirá hacer inferencia sobre el parámetro de correlación en cada caso:

# Separar los datos en tres subconjuntos
datos_monoambiente <- subset(departamentos, tipo_departamento == "Monoambiente")
datos_un_ambiente <- subset(departamentos, tipo_departamento == "Un ambiente")
datos_dos_ambientes <- subset(departamentos, tipo_departamento == "Dos ambientes")

# Aplicar la prueba de correlación a cada subconjunto
cor_monoambiente <- cor.test(datos_monoambiente$alquiler, datos_monoambiente$metros_cuadrados)
cor_un_ambiente <- cor.test(datos_un_ambiente$alquiler, datos_un_ambiente$metros_cuadrados)
cor_dos_ambientes <- cor.test(datos_dos_ambientes$alquiler, datos_dos_ambientes$metros_cuadrados)

# Mostrar los resultados de las correlaciones
cat("Correlación para Monoambiente:\n", cor_monoambiente$estimate[1])
## Correlación para Monoambiente:
##  0.3843749

En los monoambientes la correlación estimada es 0.38 y es, con una confianza del 99 %, distinta de 0 $p-valor < 0.01. En otras palabras, hay evidencia estadística para rechazar la hipótesis de no correlación al 99 %. El intervalo de confianza del coeficiente de correlación indica que la correlación poblacional se encuentra entre 0.20 y 0.54.

Otra pregunta que nos podríamos hacer es: ¿Es el promedio de precios de los departamentos de un ambiente significativamente distinto del promedio de alquiler de un dos ambientes? para eso podemos usar una prueba t. Esta prueba parte de las siguientes hipótesis:

  • H0: Las diferencias de medias de ambos grupos son 0. Formalmente \(\mu_1 - \mu_2 = 0\)
  • H1: Las diferencias de medias de ambos grupos son distintas de 0. Formalmente \(\mu_1 - \mu_2 \neq 0\)

Aunque se podrían definir hipótesis alternativas unilaterales:

  • H1: Las diferencias de medias de ambos grupos son mayores de 0. Formalmente \(\mu_1 - \mu_2 > 0\)
  • H1: Las diferencias de medias de ambos grupos son menores de 0. Formalmente \(\mu_1 - \mu_2 < 0\)

Hay algunos supuestos bastante restrictivos en esta prueba: es importante que las variancias de ambas distribuciones sean iguales y que las distribuciones poblacionales sean normales.

Podemos usar la función t.test() para realizar la prueba. Tener en cuenta que si no se tratan de muestras independientes (por ejemplo, si son las mismas unidades observadas antes y después de que suceda algo) hay que modificar la prueba. En este caso no hay problema, porque un departamento puede ser de un ambiente o de dos ambientes, correspondiendo a dos grupos, a priori, independientes.

t.test(datos_un_ambiente$alquiler, datos_dos_ambientes$alquiler)
## 
##  Welch Two Sample t-test
## 
## data:  datos_un_ambiente$alquiler and datos_dos_ambientes$alquiler
## t = -38.01, df = 156.36, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6854.325 -6177.132
## sample estimates:
## mean of x mean of y 
##  8498.082 15013.810

Notamos que el promedio de alquiler en los departamentos de un ambiente es de $8498 mientras que en los de dos ambientes es de $15013 y las medias son significativamente distintas. Concretamente, hay evidencia estadística para rechazar la premisa de que los promedios entre ambos grupos sean iguales. La diferencia entre el promedio de los de un ambiente con los de dos ambientes en la población \((\mu_1-\mu_2)\) está entre $-6854 y $-6177.

Esto significa que el promedio de costo de los departamentos de dos ambientes son entre $6177 y $6854 más grandes que el promedio de costo de los departamentos de un ambiente.

  • Actividad: Realizar el análisis de correlación para los departamentos de 1 ambiente y los departamentos de 2 ambientes. Evaluar si las medias de alquiler de los monoambientes y de los departamentos de un ambiente son significativamente distintas.

Análisis de regresión

Hasta ahora estudiamos si existe o no una relación lineal entre las variables m2 y las variables precio de alquiler y tipo de departamento y concluimos en que sí, existe. Sin embargo, no estudiamos el efecto de alguna de las variables sobre otras.

Una herramienta para estimar el efecto de una variable sobre otra es la regresión lineal. Técnicamente, nos permite capturar la variabilidad conjunta entre dos o más variables y descomponerla, para entender qué valores esperar en una de ellas dado el valor de la otra.

En este caso, la pregunta que buscamos responder es: ¿Qué precio deberíamos esperar si el departamento tiene X m2?.

La regresión es una técnica usada para investigar y modelar la relación entre una variable dependiente (también llamada variable de respuesta) y una o más variables independientes (también conocidas como predictores o explicativas). Su principal objetivo es predecir o estimar el valor de la variable dependiente en función de las variables independientes.

Regresión lineal simple

La regresión lineal simple es la forma más básica de regresión (y el caballo de troya del machine learning, según Sosa Escudero) y examina la relación entre una sola variable independiente y una variable dependiente. Esta relación se asume como lineal, es decir, se busca una recta que mejor ajuste los datos.
Recordemos la función lineal de matemática:

\[y = \alpha + \beta x\] Denominábamos \(\alpha\) a la ordenada al origen (el valor de \(y\) para \(x = 0\)) y \(\beta\) la pendiente, o el efecto sobre \(y\) de incrementar en una unidad \(x\). La regresión lineal se basa en esta idea, el desafío es encontrar el mejor valor de \(\alpha\) y \(\beta\) que reduce las diferencias entre todos los puntos observados y una recta.

Para entender mejor esta idea vamos a ingresar a esta página, seleccionar el conjunto de datos 1, y mover los puntos para observar como se ajusta la recta que describe la relación de los datos, para reducir las diferencias entre los puntos. El proceso de estimación para encontrar los mejores parámetros mayormente usado se denomina estimación por Mínimo cuadrados ordinarios (MCO). Se puede hacer en la mayoría de los programas de cálculo, incluyendo Excel.

Interpretación de regresión en economía

En economía veíamos que la demanda estaba relacionada negativamente con los precios. En general, modelabamos su comportamiento de la siguiente manera:

\[Q(p) = A + B.P\] Donde \(Q(p)\) es la cantidad demandada a un determinado precio, \(A\) es la cantidad demandada si el precio fuese 0, y \(B\) representa cuantas unidades se adquieren a un precio \(p\).

Podríamos estimar el valor de \(A\) y \(B\) con una regresión lineal. Supongamos que tenemos datos históricos de cantidades adquiridas y precios (a los cuales le realizamos un tratamiento previo para quitar el componente inflacionario). Ajustamos la regresión y obtenemos que los coeficientes son \(A = 500\) y \(B = -20\). ¿Cómo lo interpretamos?

Cuando el precio es 0 \((P = 0)\) las cantidades adquiridas son 500. Por otro lado, al incrementarse el precio en una unidad monetaria \((\Delta P=1)\) las cantidades demandadas se reducen en 20 unidades.

Las variables que se utilizan como explicativas (independientes) o explicadas (dependientes) en un modelo de regresión dependen del objetivo del análisis y de la naturaleza de los datos. Es más lógico pensar que el precio de un departamento va a variar de acuerdo a los metros cuadrados construidos, a pensar en que el precio de los metros cuadrados construídos va a variar de acuerdo al precio de alquiler.

El problema es que la regresión no va a poder identificar esa causalidad, por lo que es un criterio del investigador definir el rol de cada variable en el análisis.

  • Si la emisión monetaria causa inflación o si la inflación es la que motiva la emisión monetaria para no reducir la demanda agregada es una discusión constante. Los métodos posibles nos permiten entender la dinámica conjunta entre la inflación y la emisión monetaria, pero no asegurar una causalidad. Los fenómenos económicos son tan complejos, que dificilmente la estadística permite hacer generalizaciones o pensar leyes aplicables en cualquier momento y en cualquier lugar. Sí es una gran herramienta.

Regresión en R

Para ajustar una regresión en R y calcular los parámetros usamos la función lm(). Cuando queremos estimar los parámetros poblacionales debemos corroborar una serie de supuestos:

  • La relación entre las variables debe ser lineal, los errores no deben estar correlacionados y deben distribuírse normal, la varianza debe ser constante, y otros requisitos que provocan que existan muchas herramientas para el análisis de regresión.

En el curso nos vamos a concentrar en estimar los parámetros. Con el símbolo ~ indicamos la relación entre las variables. En este caso queremos modelar el precio en función de los metros cuadrados:

# Realizamos el ajuste del modelo
regresion_monoambientes = lm(alquiler ~ metros_cuadrados, data = datos_monoambiente)

# Pedimos un resumen del modelo
summary(regresion_monoambientes)
## 
## Call:
## lm(formula = alquiler ~ metros_cuadrados, data = datos_monoambiente)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -953.67 -341.75  -43.75  290.32 1645.20 
## 
## Coefficients:
##                  Estimate Std. Error t value          Pr(>|t|)    
## (Intercept)       3106.01     329.07   9.439 0.000000000000002 ***
## metros_cuadrados    44.05      10.69   4.122 0.000078734442499 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 485.4 on 98 degrees of freedom
## Multiple R-squared:  0.1477, Adjusted R-squared:  0.139 
## F-statistic: 16.99 on 1 and 98 DF,  p-value: 0.00007873

El resumen del modelo nos arroja la siguiente información:

  • El valor del intercepto \(\alpha\) (la ordenada al origen) es 3106.01. Es decir, si los metros cuadrados fuesen 0, el valor del monoambiente sería $3106.01. Aunque no tiene sentido teórico en este caso, es importante mantener el intercepto para capturar mejor la relación entre los datos.

  • El valor del coeficiente \(\beta\) es 44.05. Es decir que los incrementos de un metro cuadrado \((1 m^2)\) se asocian a variaciones promedio de $44.05 en el precio del alquiler. Pensemos en que estamos modelando los promedios, y no los valores exactos.

  • El error estandar (Std. Error) nos indica la variabilidad de esa estimación.

  • Los valores expuestos en la columna P(>|t|) indican que el valor del intercepto y de la pendiente son significativamente distintas de 0.

  • El valor de Adjusted R-squared indica que la variabilidad del precio explica en un 13.9 % de los precios. Es una porcentaje bastante bajo (era esperable entre 0.6 y 0.8), por lo que si nuestro interés es pronosticar el precio deberíamos incluir otras variables (si el departamento tiene o no pileta, jardin, etc. O la ubicación). Hoy se usan otras medidas para estudiar el ajuste del modelo con mayor intensidad computacional (ej. RMSE por validación cruzada).

Nuestra ecuación quedaría definida entonces de la siguiente forma:
\[Precio = 3106 + 44.05.M2\] Podemos conocer además los intervalos de confianza, identificando que el aumento en un metro cuadrado provoca un cambio promedio que oscila entre $22.84 y $65.26 (con una confianza del 95%).

confint(regresion_monoambientes, level = .95)
##                       2.5 %     97.5 %
## (Intercept)      2452.99223 3759.03440
## metros_cuadrados   22.84312   65.26255

Por último, estudiemos si este efecto es similar en los departamentos de un ambiente y de dos ambientes:

regresion_unoambiente = lm(alquiler ~ metros_cuadrados, data = datos_un_ambiente)
regresion_dosambientes = lm(alquiler ~ metros_cuadrados, data = datos_dos_ambientes)

confint(regresion_unoambiente, level = .95)
##                       2.5 %     97.5 %
## (Intercept)      4101.23816 6346.97295
## metros_cuadrados   42.49326   86.29377
confint(regresion_dosambientes, level = .95)
##                      2.5 %    97.5 %
## (Intercept)      5229.5872 7899.6573
## metros_cuadrados  100.2946  137.5148

Podemos notar que los aumentos en una unidad de los metros cuadrados de los departamentos de dos ambientes tienen efectos mayores sobre el precio. Concretamente, un incremento en una unidad de metros cuadrados aumenta el precio en un promedio que oscila los $100.3 y los $137.5 (Confianza del 95 %).

Problemas que pueden surgir al momento de ajustar una regresión:

  • La variable respuesta no se distribuye normal. Posible solución: si la variable es asimétrica a la derecha, se puede transformar la variable dependiente con un logaritmo natural. Esto cambia la interpretación del modelo. Otra opción es usar regresiónes lineales generalizadas.

  • Existen casos atípicos (outliers o valores extremos) o hay heteroscedasticidad. Posible solución: estudiar los atípicos para decidir si conservarlos o no. Utilizar regresiones robustas o ponderadas. Incorporar el efecto del tiempo si hay autocorrelación en los errores.

Análisis de datos categóricos

El análisis de datos categóricos implica técnicas para estudiar distribuciones conjuntas entre variables cualitativas, representan categorías o etiquetas. Por ejemplo, si estás analizando la presencia de una marca de clientes en distintos barrios de Buenos Aires, tenés variables categóricas como “barrio” (Palermo, Caballito, Belgrano, etc.) y “Primera marca nombrada” (Coca Cola, Pepsi, Etc.).

El objetivo es entender cómo se distribuyen esas categorías y si hay relaciones entre ellas. Las tablas de contingencia y algunas pruebas como el chi-cuadrado permiten ver si la presencia de la marca en todos los barrios es igual. También podés usar gráficos como barras apiladas, diagramas de mosaico o mapas de calor para visualizar esas relaciones.

Ojo! una prueba para estudiar si dos variables están asociadas, nos informa si están asociadas o no, pero no la dirección de esa asociación (causalidad).

Análisis categóricos de opinión pública

Supongamos que querés analizar cómo diferentes grupos votan en las elecciones municipales según su barrio, nivel educativo, y edad. Se realizan 1000 encuestas en 5 barrios y se consulta a cada encuestado el nivel educativo, la edad y el candidato de interés. Se vuelca el conjunto de datos en una matriz de datos:

head(datos)
##     Barrio Nivel_Educativo  Edad Candidato_Votado
## 1 Barrio 3       Terciario 18-30      Candidato C
## 2 Barrio 3   Universitario 31-50      Candidato C
## 3 Barrio 2      Secundario 31-50      Candidato A
## 4 Barrio 2       Terciario   51+      Candidato C
## 5 Barrio 3   Universitario 18-30      Candidato B
## 6 Barrio 5       Terciario   51+      Candidato B

Nos vamos a interesar en entender como se distribuye la intención electoral en los distintos barrios. Para ello podemos utilizar una tabla de contingencia. Cuando una variable resulta de más interés que otra (por ejemplo, acá nos interesa más la pretensión de voto) se suelen representar sus categorías en las columnas, mientras que las filas están representadas por las categorías de la otra variable. En R, podríamos armar una tabla de contingencia de la siguiente forma:

# Creo la tabla de contingencia (la primer variable son las filas, la segunda las columnas)
tabla_contingencia <- table(datos$Barrio, datos$Candidato_Votado)

# Mostrar la tabla de contingencia
print(tabla_contingencia)
##           
##            Candidato A Candidato B Candidato C
##   Barrio 1          56          92          55
##   Barrio 2          75          72          57
##   Barrio 3          58          77          65
##   Barrio 4          60          65          66
##   Barrio 5          65          76          61

El paquete Janitor tiene una herramienta denominada tabyl que permite hacer tablas de contingencia del tipo BBB: buenas, bonitas y baratas:

# Importo la librería (instalarla si es la primera vez que la usas: install.packages("janitor")) 
library(janitor)

datos %>% # Fuente de datos
  tabyl(Barrio, Nivel_Educativo) %>% # Selecciono las columnas a cruzar
  adorn_totals("col") %>% # Agrego los totales por columna
  adorn_percentages() %>% # Agrego las proporciones
  adorn_pct_formatting() # Formato porcentaje
##    Barrio Primario Secundario Terciario Universitario  Total
##  Barrio 1    23.2%      27.1%     30.5%         19.2% 100.0%
##  Barrio 2    25.5%      27.0%     24.5%         23.0% 100.0%
##  Barrio 3    31.0%      16.0%     24.0%         29.0% 100.0%
##  Barrio 4    27.2%      27.2%     24.6%         20.9% 100.0%
##  Barrio 5    19.3%      25.7%     26.7%         28.2% 100.0%

Podemos notar que el candidato A tiene una intención de voto mayor en el barrio Paraná XVI y en la zona oeste, mientras que el candidato B tiene mayor presencia en San Agustin y Centro. Podemos observar estas distribuciones de forma gráfica:

# Gráfico de barras apiladas para ver la distribución de votos por candidato según el nivel educativo
ggplot(datos, aes(x = Barrio, fill = Candidato_Votado)) +
  geom_bar(position = "fill") + # Genero barras apiladas
  labs(title = "Distribución de Votos por Nivel Educativo",
       x = "Barrio", y = "Proporción de Votos",
       fill = "Candidato") + #Cambio tiulos y leyendas
  theme_minimal() # Establezco un tema minimalista

Recordemos que esto se trata de una muestra, por lo que si se selecciona otra muestra los resultados pueden variar. Para asegurarnos si existen diferencias significativas podemos hacer una prueba basada en el estadístico ji-cuadrado.

Esta prueba es utilizada cuando una muestra considera dos variables. Una variable cuenta con \(r\) categorías (barrio tiene 5, por ejemplo), y la otra variable cuenta con \(c\) (3 candidatos) categorías. El test evalúa si las dos variables son independientes.

  • Repaso de probabilidad: si tenemos dos eventos, A y B, y \(P(A)\) es la probabilidad de que suceda A, \(P(B)\) es la probabilidad de que suceda B, \(P(A \cap B)\) es la probabilidad de que sucedan ambos y se calcula como \(P(A \cap B) = P(A).P(B)\) si A y B son independientes y \(P(A \cap B) = P(A/B).P(B)\) si no son independientes y se lee como: la probabilidad de que sucedan A y B al mismo tiempo es la probabilidad de que suceda A habiendo sucedido B por la probabilidad del suceso B. En la población la probabilidad de A es la proporción de A sobre el total: \(\pi_a\)

En la prueba se plantea la hipótesis nula de independencia. En este caso, significa que las preferencias de voto (candidato votado) son independientes del barrio. Si esta hipótesis es cierta, los votos se distribuirían de manera aleatoria en los barrios.

  • Hipótesis nula: Las variables son independientes (no hay relación entre las variables). Formalmente: \(\pi_{ij}=\pi_{i.}.\pi_{.j}\).

  • Hipótesis alternativa: Las variables no son independientes. Formalmente \(\pi_{ij} \neq \pi_{i.}.\pi_{.j}\) para al menos una celda. Para hacer la prueba en R:

# Test chi-cuadrado para ver la independencia entre las variables
chi_test <- chisq.test(table(datos$Barrio, datos$Candidato_Votado))
print(chi_test)
## 
##  Pearson's Chi-squared test
## 
## data:  table(datos$Barrio, datos$Candidato_Votado)
## X-squared = 9.7654, df = 8, p-value = 0.2819

Como el p-valor es bastante alto (0.28) la mínima probabilidad de equivocarnos si decidimos rechazar la hipótesis nula es bastante alta. Es decir, no hay evidencia para rechazar la independencia de las variables.

Esto quiere decir que no encontramos una relación estadísticamente significativa entre las variables (barrio y candidato votado). Las diferencias observadas entre los votos en cada barrio y los esperados bajo independencia podrían haber ocurrido simplemente por azar.

Actividades propuestas

  • Analizar la demanda global y para los distintos tipos de productos de la base de datos de demanda

  • Analizar si existen relaciones entre el nivel educativo y los votos de los candidatos en el conjunto de datos de elecciones