1 de octubre de 2014

Tablas de contigencia como herramienta de análisis bivariable

Uno de los objetivos del análisis estadístico es evaluar la existencia de relaciones entre dos variables.

Se dice que dos variables están relacionadas cuando la distribución de los valores de una variable se modifica o presenta cambios asociados a la distribución de los valores de otra variable.

En un análisis bivariable se puede distinguir entre:

  • Variable dependiente o de análisis (Y): Es la variable cuya distribución se quiere explicar.
  • Variable independiente (X): Es la variable que nos puede ayudar a comprender por qué varía la distribución de la variable dependiente

Tabla de contingencia

Cuando trabajamos con variables categóricas o cualitativas (nominales y ordinales), una de las herramientas de análisis son las tablas de contingencia.

Una tabla de contigencia es una tabla de frecuencias cruzadas, que nos permite observar la distribución de los casos en categorías cruzadas de dos variables.

Ejemplo

Para este ejemplo vamos a trabajar con la base de datos de la encuesta sobre "Representación Política y Conflictos" realizada por el Instituto de Opinión Pública de la PUCP en noviembre del 2012.

library(foreign)
conf <- as.data.frame(read.spss("IOP_1112_01_B.sav"))

En esta base de datos podemos identificar dos variables:

  • P2: Interés en la Política
  • NSEGrup: Nivel Socioeconómico del Entrevistado (agrupado)

La pregunta que vamos a tratar de responder es si existe alguna relación entre el NSE y el Interés en la Política. En este ejemplo, el interés en la política será nuestra variable dependiente y el NSE la variable independiente.

Elaborar una tabla de contingencia (1)

El primer paso es mostrar la distribución de frecuencias de nuestras variables:

library(descr)
freq(conf$P2, plot=FALSE)
## conf$P2 
##                 Frequency Percent
## Muy interesado         81   6.733
## Algo interesado       268  22.278
## Poco interesado       538  44.722
## Nada interesado       299  24.855
## NS/NR                  17   1.413
## Total                1203 100.000

Se aprecia que hay algunos casos que son NS/NR que vamos a recodificar como "missing values"

conf$p2r <- conf$P2
conf$p2r[conf$P2=="NS/NR"] <- NA
conf$p2r <- factor(conf$p2r)
freq(conf$p2r, plot=FALSE)
## conf$p2r 
##                 Frequency Percent Valid Percent
## Muy interesado         81   6.733          6.83
## Algo interesado       268  22.278         22.60
## Poco interesado       538  44.722         45.36
## Nada interesado       299  24.855         25.21
## NA's                   17   1.413              
## Total                1203 100.000        100.00

freq(conf$NSEGrup, plot=FALSE)
## conf$NSEGrup 
##       Frequency Percent
## A/B         257   21.36
## C           365   30.34
## D/E         581   48.30
## Total      1203  100.00

Las frecuencias de cada una de nuestras variables se conocen en el análisis de tablas de contigencia como frecuencias marginales.

Elaborar una tabla de contingencia (2)

Una forma rápida y simple para realizar una tabla de contingencia es usar el comando:

table(conf$p2r, conf$NSEGrup)
##                  
##                   A/B   C D/E
##   Muy interesado   29  29  23
##   Algo interesado  72  97  99
##   Poco interesado 101 153 284
##   Nada interesado  53  83 163

Reglas para elaborar y analizar una tabla de contigencia

Para poder ser analizada adecuadamente, una tabla de contigencia debe elaborarse tomando en cuenta las siguientes reglas:

  • Las frecuencias cruzadas deben expresarse en porcentajes
  • Los porcentajes de cada celda de frecuencias cruzadas deben calcularse en función de las categorías de la variable independiente.
    • Si las categorías de la variable independiente están en las columnas, cada columna debe sumar 100%
    • Si las categorías de la variable independiente están en las filas, cada fila debe sumar 100%

Elaborar una tabla de contingencia (3)

Caso en que las categorías de la variable independiente están en las columnas:

tabla1 <- prop.table(table(conf$p2r, conf$NSEGrup), 2)*100
tabla1
##                  
##                         A/B         C       D/E
##   Muy interesado  11.372549  8.011050  4.042179
##   Algo interesado 28.235294 26.795580 17.398946
##   Poco interesado 39.607843 42.265193 49.912127
##   Nada interesado 20.784314 22.928177 28.646749

Elaborar una tabla de contingencia (4)

Caso en que las categorías de la variable independiente están en las filas:

prop.table(table(conf$NSEGrup, conf$p2r), 1)*100
##      
##       Muy interesado Algo interesado Poco interesado Nada interesado
##   A/B      11.372549       28.235294       39.607843       20.784314
##   C         8.011050       26.795580       42.265193       22.928177
##   D/E       4.042179       17.398946       49.912127       28.646749

¿Cómo leer una tabla de contingencia?

Para leer una tabla de contingencia, la regla es comparar los porcentajes de las celdas en el sentido contrario al que fueron calculados. El objetivo es identificar si la distribución de la variable dependiente cambia cuando nos movemos entre las categorías de la variable independiente. Si eso ocurre es un indicador de que ambas variables pueden estar asociadas.

##                  
##                     A/B     C   D/E
##   Muy interesado  11.37  8.01  4.04
##   Algo interesado 28.24 26.80 17.40
##   Poco interesado 39.61 42.27 49.91
##   Nada interesado 20.78 22.93 28.65

Análisis bivariable

Cuando se realiza un análisis bivariable utilizando tablas de contigencia es necesario evaluar los siguientes elementos:

  • Describir cómo cambia la distribución de la variable dependiente entre diversas categorías de la variable independiente.
  • Determinar si la asociación observada es una asociación estadísticamente significativa.
  • Medir la fuerza de la relación entre ambas variables.

Para el segundo paso se usa el estadístico y la prueba de \(X^2\)

Prueba de \(X^2\)

La prueba de \(X^2\) es una prueba de hipótesis no paramétrica. Compara la tabla de contingencia que hemos elaborado con una tabla hipotética de frecuencias esperadas. Esta tabla hipotética representa el supuesto de cómo sería la distribución de frecuencias cruzadas si no existiese una relación entre las dos variables que están en la tabla de contingencia.

Tabla de frecuencias observadas

Esta es la tabla de frecuencias observadas del ejemplo que estamos trabajando. A la tabla le hemos añadido las frecuencias marginales:

t1 <- table(conf$p2r,conf$NSEGrup)
addmargins(t1)
##                  
##                    A/B    C  D/E  Sum
##   Muy interesado    29   29   23   81
##   Algo interesado   72   97   99  268
##   Poco interesado  101  153  284  538
##   Nada interesado   53   83  163  299
##   Sum              255  362  569 1186

Las frecuencias esperadas

Las frecuencias esperadas (\(f_e\)) de una celda de una tabla de contigencia se calculan de la siguiente manera:

\[ \begin{aligned} f_e=(f_{c}\times{}f_{f})/f_t \end{aligned} \] Donde:

  • \(f_c\) es la frecuencia marginal de la columna
  • \(f_f\) es la frecuencia marginal de la fila
  • \(f_t\) es el total de casos de la tabla

Tabla de frecuencias esperadas

En nuestro ejemplo, esta es la tabla de frecuencias observadas:

##                  
##                    A/B    C  D/E  Sum
##   Muy interesado    29   29   23   81
##   Algo interesado   72   97   99  268
##   Poco interesado  101  153  284  538
##   Nada interesado   53   83  163  299
##   Sum              255  362  569 1186

Y esta sería la tabla de frecuencias esperadas:

exp1 <- chisq.test(t1)$expected
exp1
##                  
##                         A/B         C       D/E
##   Muy interesado   17.41568  24.72344  38.86088
##   Algo interesado  57.62226  81.80101 128.57673
##   Poco interesado 115.67454 164.21248 258.11298
##   Nada interesado  64.28752  91.26307 143.44941

Tabla de porcentajes de la tabla de frencuencias esperadas

Si calculamos los porcentajes de las columnas de la tabla de frecuencias esperadas, esta se vería así:

prop.table(exp1, 2)*100
##                  
##                        A/B        C      D/E
##   Muy interesado   6.82968  6.82968  6.82968
##   Algo interesado 22.59696 22.59696 22.59696
##   Poco interesado 45.36256 45.36256 45.36256
##   Nada interesado 25.21079 25.21079 25.21079

Lo que muestra una tabla hipotética donde NO hay asociación entre ambas variables.

La prueba de \(X^2\)

\(X^2\) es una prueba de hipótesis, y como tal se siguen los 5 pasos de toda prueba de hipótesis:

Paso 1

Formular la Hipótesis cero y la Hipótesis alternativa. En este caso la hipótesis cero sostiene que NO hay asociación entre las variables de la tabla, y la hipótesis uno sostiene lo contrario:

H0: \(f_e = f_o\)

H1: \(f_e \neq f_o\)

Paso 2

Seleccionar una distribución de muestreo para H0, en este caso la de \(X^2\)

Paso 3

Seleccionar un nivel de significancia para la prueba. Los usuales son un \(\alpha=0.05\) ó un \(\alpha = 0.01\)

Prueba de \(X^2\) (cont.)

Paso 4

Cálculo del estadístico de la prueba. El estadístico de la prueba de \(X^2\) se calcula de la siguiente manera:

\[ \begin{aligned} X^2=\sum\frac{(f_o-f_e)^2}{f_e} \end{aligned} \]

Paso 5

Decidir si se acepta o rechaza la H0

Se rechaza la hipótesis cero cuando:

  • El estadístico de la prueba cae en la zona \(\alpha\) de la distribución de \(X^2\)
  • La significancia o el p-value del estadístico de la prueba es menor a la significancia o valor \(\alpha\) que hemos fijado en el paso 3.

Cálculo de \(X^2\) en R

En el R para calcular y solicitar la prueba de \(X^2\) se procede de la siguiente manera:

Se pide la tabla de frecuencias observadas en números absolutos:

tabla1 <- table(conf$p2r, conf$NSEGrup)
tabla1
##                  
##                   A/B   C D/E
##   Muy interesado   29  29  23
##   Algo interesado  72  97  99
##   Poco interesado 101 153 284
##   Nada interesado  53  83 163

Se ejecuta la función sobre la tabla creada

chisq.test(tabla1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla1
## X-squared = 38.7519, df = 6, p-value = 8.005e-07

El valor de \(X^2\) para la tabla1 es 38.75 con 6 grados de libertad (df)

En \(X^2\) los grados de libertad son: \(df=(col-1)\times(fil-1)\)

Luego se compara el valor de \(X^2\) de la tabla con el valor crítico de \(X^2\) para una tabla con 6 grados de libertad y para una prueba con un nivel de significancia \(\alpha=0.05\) ó de 5%. Para hallar ese valor crítico se puede pedir:

qchisq(.95, df=6)
## [1] 12.59159

En el siguiente gráfico podemos comparar el valor crítico de \(X^2 = 12.59\) para seis grados de libertad y un \(\alpha=0.05\) con el valor calculado de \(X^2=38.75\) para nuestra tabla:

chisq.test(tabla1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla1
## X-squared = 38.7519, df = 6, p-value = 8.005e-07

La otra forma de tomar una decisión es comparar el p-value o significancia del estadístico de la prueba con el nivel de significancia que hemos establecido para la misma. Notamos que el p-value es mucho menor que nuestro nivel de significancia (0.05), lo que nos lleva a rechazar H0.

Si rechazamos H0, nuestra conclusión es que las variables de nuestra tabla tienen una asociación estadísticamente significativa.

Otro ejemplo

Interés en la política según sexo del entrevistado:

tabla2 <- table(conf$p2r, conf$SEXO)
prop.table(tabla2, 2)*100
##                  
##                   Masculino  Femenino
##   Muy interesado   8.561644  5.149502
##   Algo interesado 25.171233 20.099668
##   Poco interesado 41.952055 48.671096
##   Nada interesado 24.315068 26.079734
chisq.test(tabla2)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla2
## X-squared = 11.7437, df = 3, p-value = 0.008315

qchisq(.95, df=3) # Valor crítico de Chi2 para sig. 0.05
## [1] 7.814728

Otro ejemplo

¿La aprobación presidencial está asociada con el sexo del entrevistado?

tabla3 <- table(conf$P7A, conf$SEXO)
prop.table(tabla3, 2)*100
##             
##              Masculino  Femenino
##   Aprueba    41.116751 37.418301
##   Desaprueba 48.730964 53.104575
##   NS/NR      10.152284  9.477124
chisq.test(tabla3)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla3
## X-squared = 2.3166, df = 2, p-value = 0.314

Requisitos para usar la prueba de \(X^2\)

Esta prueba sólo puede usarse cuando:

  • Por lo menos el 80% de las celdas tienen frecuencias esperadas mayores a 5
  • Ninguna de las celdas tiene frecuencias observadas iguales a cero

Si no se cumplen estos requisitos, el resultado de \(X^2\) no tiene ningún sentido y no se puede interpretar. En estos casos es necesario reducir las dimensiones de la tabla (agrupar categorías), hasta que se cumplan los requisitos de la tabla.

Medidas o coeficientes de asociación

Medidas de asociación para tablas de contingencia

El tercer paso del análisis de tablas de contingencia es medir la fuerza de la asociación entre dos variables categóricas.

Una herramienta para ello son las medidas de asociación. A partir de las pruebas de \(X^2\) podemos calcular tres tipos de medidas de asociación para variables categóricas:

  • El coeficiente Phi (\(\phi\)) : Para tablas 2x2
  • El coeficiente de contingencia: Para tablas de cualquier dimensión
  • La V de Cramer : Para tablas mayores a 2x2

Estos coeficientes miden la asociación entre dos variables categóricas en una escala que va de 0 a 1. Cuanto mayor es el valor del coeficiente, mayor será la asociación.

Uso de medidas de asociación

Veamos las tabla 1 y 2:

prop.table(tabla1, 2)*100
##                  
##                         A/B         C       D/E
##   Muy interesado  11.372549  8.011050  4.042179
##   Algo interesado 28.235294 26.795580 17.398946
##   Poco interesado 39.607843 42.265193 49.912127
##   Nada interesado 20.784314 22.928177 28.646749
prop.table(tabla2, 2)*100
##                  
##                   Masculino  Femenino
##   Muy interesado   8.561644  5.149502
##   Algo interesado 25.171233 20.099668
##   Poco interesado 41.952055 48.671096
##   Nada interesado 24.315068 26.079734

Las medidas de asociación basadas en \(X^2\) se piden con el siguiente comando:

library(vcd)
assocstats(tabla1)
##                     X^2 df   P(> X^2)
## Likelihood Ratio 38.758  6 7.9833e-07
## Pearson          38.752  6 8.0053e-07
## 
## Phi-Coefficient   : 0.181 
## Contingency Coeff.: 0.178 
## Cramer's V        : 0.128
assocstats(tabla2)
##                     X^2 df  P(> X^2)
## Likelihood Ratio 11.793  3 0.0081277
## Pearson          11.744  3 0.0083146
## 
## Phi-Coefficient   : 0.1 
## Contingency Coeff.: 0.099 
## Cramer's V        : 0.1

Medidas de asociación para variables ordinales

Cuando las DOS variables de una tabla de contingencia son ordinales, se puede usar el coeficiente de asociación de Gamma de Goodman y Kruskal. Como en el caso de los coeficientes basados en \(X^2\), Gamma mide la fuerza de la asociación en una escala de 0 a 1. El signo de Gamma nos indica si la relación es directa (+) o inversa (-).

Ejemplo del uso de gamma con la tabla 1

prop.table(tabla1, 2)*100
##                  
##                         A/B         C       D/E
##   Muy interesado  11.372549  8.011050  4.042179
##   Algo interesado 28.235294 26.795580 17.398946
##   Poco interesado 39.607843 42.265193 49.912127
##   Nada interesado 20.784314 22.928177 28.646749
library(vcdExtra)
GKgamma(tabla1)
## gamma        : 0.211 
## std. error   : 0.038 
## CI           : 0.136 0.285

Ejemplo de relación inversa

Gusto por partidos de izquierda (P13J) según posición izquierda - derecha del entrevistado (P17)

  • Gusto por partidos de izquierda (X): 1 = Nada - 10 = Mucho
  • Posicion izquierda - derecha (Y) : 0 = Extrema izquieda - 10 = Extrema Derecha

Se supone que cuanto mayor sea el valor de la variable X, menor será el valor de la variable Y.

Primero hay que transformar las variables

#Gusto por partidos de izquieda
library(car)
p13j <- as.numeric(conf$P13J)
p13j[p13j > 10] <- NA
p13j.r <- recode(p13j, "1:2=1; 3:4=2; 5:6=3; 7:8=4; 9:10=5")
p13j.r <- factor(p13j.r)
levels(p13j.r) <- c("1-2", "3-4", "5-6", "7-8","9-10")
conf$part.izq <- p13j.r

# Posicion izquierda - derecha del entrevistado
p17r <- as.numeric(conf$P17)
p17r[p17r > 11] <- NA
p17r <- p17r-1
p17r2 <- recode(p17r, "0:2 = 1; 3:4 = 2; 5 = 3; 6:7=4; 8:10=5")
p17r2 <- factor(p17r2)
levels(p17r2) <- c("IZQ", "C-IZQ", "CEN", "C-DER", "DER")
conf$izde <- p17r2

#Distribución de gusto por partidos de izquierda (recodificada)
prop.table(table(conf$part.izq))*100
## 
##       1-2       3-4       5-6       7-8      9-10 
## 54.076739 21.223022 17.146283  4.916067  2.637890
#Distribución de posición del entrevistado en la escala I-D (recodificada)
prop.table(table(conf$izde))*100
## 
##       IZQ     C-IZQ       CEN     C-DER       DER 
##  9.808343 13.641488 39.120631 22.435175 14.994363

Tabla de contingencia de gusto por partidos de izquierda según posición izquierda - derecha del entrevistado y coeficiente de asociación Gamma de Goodman y Kruskal:

tab <- table(conf$part.izq, conf$izde)
prop.table(tab,2)*100
##       
##              IZQ     C-IZQ       CEN     C-DER       DER
##   1-2  45.945946 27.884615 55.252918 54.000000 71.681416
##   3-4  16.216216 36.538462 22.178988 26.666667  9.734513
##   5-6  18.918919 26.923077 15.953307 18.000000 10.619469
##   7-8  10.810811  4.807692  5.058366  1.333333  5.309735
##   9-10  8.108108  3.846154  1.556420  0.000000  2.654867
GKgamma(tab)
## gamma        : -0.252 
## std. error   : 0.046 
## CI           : -0.341 -0.162

Ojo: El signo del coeficiente Gamma depende de la codificación de las categorías

Ejemplo: Interés en la política según nivel educativo del entrevistado. Primero preparamos la variable Nivel Educativo, para agrupar los casos

## 
##                           Ninguno     Inicial o primaria incompleta 
##                                22                                91 
##                 Primaria completa             Secundaria incompleta 
##                               106                               143 
##               Secundaria completa       Superior técnica incompleta 
##                               367                                87 
##         Superior técnica completa Superior universitaria incompleta 
##                               160                               108 
##   Superior universitaria completa                        Post grado 
##                               102                                17 
##                             NS/NR 
##                                 0

educ <- as.numeric(conf$DG4)
table(educ)
## educ
##   1   2   3   4   5   6   7   8   9  10 
##  22  91 106 143 367  87 160 108 102  17
educ2 <- recode(educ, "1:4=1; 5:6=2; 8=2; 7=3; 9:10=4")
table(educ2)
## educ2
##   1   2   3   4 
## 362 562 160 119
educ3 <- factor(educ2)
levels(educ3) <- c("Menos que Sec. Comp.", "Sec. Comp.", "Tec. Comp.", "Univ. Comp.")
conf$educ <- educ3

tabla4 <- table(conf$p2r, conf$educ)
prop.table(tabla4, 2)*100 
##                  
##                   Menos que Sec. Comp. Sec. Comp. Tec. Comp. Univ. Comp.
##   Muy interesado              3.418803   6.822262   7.547170   15.966387
##   Algo interesado            17.948718  22.082585  27.044025   32.773109
##   Poco interesado            45.868946  46.678636  45.283019   37.815126
##   Nada interesado            32.763533  24.416517  20.125786   13.445378
GKgamma(tabla4)
## gamma        : -0.236 
## std. error   : 0.036 
## CI           : -0.307 -0.165