<- matrix(c(23, 4, 10,
tabla 10, 14, 35), byrow=T, ncol=3)
chisq.test(tabla)
Pearson's Chi-squared test
data: tabla
X-squared = 20.606, df = 2, p-value = 3.353e-05
Es común en los estudios tener variables cualitativas y una forma de relacionar esas variables cualitativas es por medio de las tablas de contingencia.
Ejemplos:
El análisis de correspondencias es una técnica descriptiva para representar tablas de contingencia. Los datos de partida para el análisis de correspondencias es una matriz \(X\) de dimensiones \(n \times p\) que representa las frecuencias absolutas observadas en una tabla de contingencia de dos variables.
El análisis de correspondencias busca obtener un número de dimensiones (factores), de tal forma que la primera dimensión explique la mayor parte de la asociación total entre filas y columnas, la segunda dimensión explique la mayor parte del residuo de la asociación no explicada por la primera componente y así sucesivamente con el resto de las dimensiones.
Jean-Paul Benzecri es un estadístico francés. Estudió en la Ecole Normale Supérieure y ha sido profesor en la Universidad Pierre-et-Marie-Curie de París. Es más famoso por el desarrollo del análisis de correspondencia, una técnica estadística para analizar tablas de contingencia. Es ampliamente utilizado en estudios sociológicos de datos categóricos.
Para hacer análisis de correspondencias se puede usar la función ca
del paquete ca. Las funciones de factoextra para ayudar en la interpretación y visualización del análisis de correspondencia son:
get_eigenvalue
: extrae los valores propios/varianzas retenidas por cada dimensión (eje)fviz_eig
: Visualiza los valores propiosget_ca_row
y get_ca_col
: extrae los resultados para filas y columnas, respectivamente.fviz_ca_row
y fviz_ca_col
: muestra los resultados para filas y columnas, respectivamente.fviz_ca_biplot
: hace un biplot de filas y columnas.Se usa cuando se tienen 2 variables cualitativas.
\[\begin{equation} X=\begin{bmatrix} n_{11} & n_{12} & \cdots & n_{1p}\\ n_{21} & n_{22} & \cdots & n_{2p}\\ \vdots & \vdots & \ddots & \vdots \\ n_{n1} & n_{n2} & \cdots & n_{np} \end{bmatrix} \end{equation}\]
El subíndice \(n\) representa el número de niveles fila y el subíndice \(p\) representa el número de niveles columna. La letra grande \(n\) es la frecuencia absoluta de cada casilla.
Esta prueba de hipótesis se puede utilizar para saber si dos variables cualitativas son independientes o no.
Las hipotesis en esta prueba son:
Consultar el video en este enlace.
A continuación se muestra la forma de replicar el ejemplo del video anterior en R. En este caso tenemos que
<- matrix(c(23, 4, 10,
tabla 10, 14, 35), byrow=T, ncol=3)
chisq.test(tabla)
Pearson's Chi-squared test
data: tabla
X-squared = 20.606, df = 2, p-value = 3.353e-05
De la salida anterior se tiene que el valor-p = 3.353e-05, por lo tanto hay evidencias para rechazar \(H_0\).
En este ejemplo se muestra como usar CA para un estudio de relación entre color de ojos y color de cabello.
A continuación se muestra la tabla de frecuencias para el estudio de color de ojos y color de cabello.
Para una tabla o matriz \(X\) se pueden definir totales asociados de la siguiente manera:
Tabla de frecuencias con totales para el estudio de color del cabello y color de ojos.
Las expresiones para obtener las frecuencias son:
\[\begin{equation} \begin{array}{ll} f_{ij} &= \frac{n_{ij}}{N} \\ f_{j|i} &= \frac{n_{ij}}{n_{i.}} \\ f_{.j} &= \sum_{i=1}^{n}f_{ij}=\frac{n_{.j}}{N} \end{array} \end{equation}\]
Ejemplo:
A partir de la tabla perfil fila se puede construir el Gráfico de perfiles. Para el ejemplo tenemos:
<- matrix(c(688,116,584,188, 4,
X 326, 38,241,110, 3,
343, 84,909,412,26,
98, 48,403,681,85), nrow=4, byrow=T)
#Nombres de las filas y las columnas de la tabla.
dimnames(X) <- list(col.ojos=c("Claros","Azules",
"Medios","Oscuros"),
col.cabello=c("Rubio","Rojo",
"Medio","Oscuro",
"Negro"))
<- prop.table(X, 1)
f.fila par(oma=c(0, 0, 0, 5))
barplot(t(f.fila), beside=T, las=1,
ylab='Frecuencia', xlab='Color de ojos',
col=hcl(h=c(30, 70, 120, 240, 300)))
legend(par('usr')[2], par('usr')[4], xpd=NA,
legend=colnames(X), bty='n',
fill=hcl(h=c(30, 70, 120, 240, 300)))
En esta figura se puede ver como se comporta el color del cabello para cada uno de los colores de ojos.
Las expresiones para obtener las frecuencias relativas son:
\[\begin{equation} \begin{array}{ll} f_{ij} &= \frac{n_{ij}}{N} \\ f_{i|j} &= \frac{n_{ij}}{n_{.j}} \\ f_{i.} &= \sum_{j=1}^{p}f_{ij}=\frac{n_{i.}}{N} \end{array} \end{equation}\]
Ejemplo:
A partir de la tabla perfil columna se puede construir el Gráfico de perfiles. Para el ejemplo tenemos:
<- prop.table(X, 2)
f.colum par(oma=c(0, 0, 0, 5))
barplot(f.colum, beside=T, las=1,
ylab='Frecuencia', xlab='Color del pelo',
col=hcl(h=c(30, 70, 120, 240)))
legend(par('usr')[2], par('usr')[4], xpd=NA,
legend=rownames(X), bty='n',
fill=hcl(h=c(30, 70, 120, 240)))
En esta figura se puede ver como se comporta el color de ojos para cada uno de los colores de cabello.
A continuación se muestra la forma de realizar la prueba \(\chi^2\) para independencia sobre cabellos y ojos en R. En este caso tenemos que
<- matrix(c(688, 116, 584, 188, 4,
X 326, 38, 241, 110, 3,
343, 84, 909, 412, 26,
98, 48, 403, 681, 85), nrow=4, byrow=T)
dimnames(X) <- list(col_ojos=c("Claros","Azules", "Medios","Oscuros"),
col_cabello=c("Rubio","Rojo", "Medio","Oscuro", "Negro"))
chisq.test(X)
Pearson's Chi-squared test
data: X
X-squared = 1240, df = 12, p-value < 2.2e-16
De la salida anterior se tiene que el valor-p < 2.2e-16, por lo tanto hay evidencias para rechazar \(H_0\).
<- sum(X)
n <- X / n
P <- colSums(P)
column.masses <- rowSums(P)
row.masses <- row.masses %o% column.masses
E <- P - E
R <- R / E
I <- I * sqrt(E)
Z <- svd(Z)
SVD rownames(SVD$u) <- rownames(P)
rownames(SVD$v) <- colnames(P)
<- SVD$d^2
eigenvalues round(eigenvalues, digits=4)
[1] 0.1992 0.0301 0.0009 0.0000
Para hacer análisis de correspondencias se puede usar la función ca
del paquete ca.
require(ca)
<- ca(X) res_ca
Para ver la contribución de cada dimensión en la explicación de la varianza total hacemos lo siguiente:
library(factoextra)
Loading required package: ggplot2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
get_eigenvalue(res_ca)
eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.1992447520 86.5562709 86.55627
Dim.2 0.0300867741 13.0703516 99.62662
Dim.3 0.0008594814 0.3733775 100.00000
La tabla anterior nos indica que la primera dimensión explica el 86.6% de la varianza y que la segunda dimensión explica el 13.1% de la varianza, entre ambas, explican el 99.6% de la varianza, es decir, las dos primeras dimensiones explican la totalidad de la varianza observada.
Es posible mostrar estos resultados de forma gráfica así:
library(factoextra)
fviz_screeplot(res_ca)
La representación de los diferentes niveles de ambas variables en el plano bidimensional se obtiene así:
fviz_ca_biplot(res_ca, repel = TRUE)
De la figura anterior podemos ver lo siguiente:
Para ver el aporte que tiene cada nivel de la variable FILA en las dimensiones hacemos lo siguiente:
<- get_ca_row(res_ca)
row row
Correspondence Analysis - Results for rows
===================================================
Name Description
1 "$coord" "Coordinates for the rows"
2 "$cos2" "Cos2 for the rows"
3 "$contrib" "contributions of the rows"
4 "$inertia" "Inertia of the rows"
head(row$coord)
Dim.1 Dim.2 Dim.3
Claros -0.44070764 -0.08846303 -0.031773257
Azules -0.40029985 -0.16541100 0.064157519
Medios 0.03361434 0.24500190 0.005552885
Oscuros 0.70273880 -0.13391383 -0.004345377
De la tabla anterior se puede concluir que:
Para ver como aportan los niveles de la variable FILA en las dos primeras dimensiones hacemos lo siguiente:
fviz_ca_row(res_ca, repel = TRUE)
El gráfico anterior muestra las relaciones entre los puntos de fila:
Para ver el aporte que tiene cada nivel de la variable COLUMNA en las dimensiones hacemos lo siguiente:
<- get_ca_col(res_ca)
col col
Correspondence Analysis - Results for columns
===================================================
Name Description
1 "$coord" "Coordinates for the columns"
2 "$cos2" "Cos2 for the columns"
3 "$contrib" "contributions of the columns"
4 "$inertia" "Inertia of the columns"
head(col$coord)
Dim.1 Dim.2 Dim.3
Rubio -0.54399533 -0.17384449 0.012522082
Rojo -0.23326097 -0.04827895 -0.118054940
Medio -0.04202412 0.20830421 0.003236468
Oscuro 0.58870853 -0.10395044 0.010116315
Negro 1.09438828 -0.28643670 -0.046135954
De la tabla anterior se puede concluir que:
Para ver como aportan los niveles de la variable COLUMNA en las dos primeras dimensiones hacemos lo siguiente:
fviz_ca_col(res_ca, repel = TRUE)
En este ejemplo vamos a utilizar los datos de una tabla de frecuencias de tareas del hogar y quién las realiza.
Abajo la matriz a utilizar.
<- structure(c(156L, 124L, 77L, 82L, 53L, 32L, 33L, 12L, 10L, 13L,
X
8L, 0L, 0L, 14L, 20L, 11L, 36L, 11L, 24L, 23L, 46L, 51L, 13L,
1L, 3L, 1L, 2L, 5L, 7L, 15L, 1L, 4L, 9L, 23L, 75L, 21L, 53L,
160L, 6L, 4L, 4L, 13L, 7L, 57L, 53L, 55L, 15L, 3L, 66L, 77L, dim = c(13L, 4L), dimnames = list(c("Lavandería", "Almuerzo",
2L, 153L), "Comida", "Desayuno", "Ordenar", "Platos", "Compras", "Oficial",
"Conducción", "Finanzas", "Seguros", "Reparaciones", "Vacaciones"), c("Esposa",
"Alternado", "Esposo", "Juntos")), class = "table")
Para ver los datos.
X
Esposa Alternado Esposo Juntos
Lavandería 156 14 2 4
Almuerzo 124 20 5 4
Comida 77 11 7 13
Desayuno 82 36 15 7
Ordenar 53 11 1 57
Platos 32 24 4 53
Compras 33 23 9 55
Oficial 12 46 23 15
Conducción 10 51 75 3
Finanzas 13 13 21 66
Seguros 8 1 53 77
Reparaciones 0 3 160 2
Vacaciones 0 1 6 153
Para hacer el CA usamos el siguiente código:
require(ca)
<- ca(X) res_ca
Para ver la contribución de cada dimensión en la explicación de la varianza total hacemos lo siguiente:
library(factoextra)
get_eigenvalue(res_ca)
eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.5428893 48.69222 48.69222
Dim.2 0.4450028 39.91269 88.60491
Dim.3 0.1270484 11.39509 100.00000
La tabla anterior nos indica que la primera dimensión explica el 48.69% de la varianza y que la segunda dimensión explica el 39.91% de la varianza, entre ambas, explican el 88.60% de la varianza, es decir, las dos primeras dimensiones explican gran parte de la varianza observada.
Es posible mostrar estos resultados de forma gráfica así:
library(factoextra)
fviz_screeplot(res_ca)
La representación de los diferentes niveles de ambas variables en el plano bidimensional se obtiene así:
fviz_ca_biplot(res_ca, repel = TRUE)
De la figura anterior podemos ver lo siguiente:
Para ver el aporte que tiene cada nivel de la variable FILA en las dimensiones hacemos lo siguiente:
<- get_ca_row(res_ca)
row $coord row
Dim.1 Dim.2 Dim.3
Lavandería -0.9918368 -0.4953220 -0.31672897
Almuerzo -0.8755855 -0.4901092 -0.16406487
Comida -0.6925740 -0.3081043 -0.20741377
Desayuno -0.5086002 -0.4528038 0.22040453
Ordenar -0.3938084 0.4343444 -0.09421375
Platos -0.1889641 0.4419662 0.26694926
Compras -0.1176813 0.4033171 0.20261512
Oficial 0.2266324 -0.2536132 0.92336416
Conducción 0.7417696 -0.6534143 0.54445849
Finanzas 0.2707669 0.6178684 0.03479681
Seguros 0.6470759 0.4737832 -0.28936051
Reparaciones 1.5287787 -0.8642647 -0.47208778
Vacaciones 0.2524863 1.4350066 -0.12958665
De la tabla anterior se puede concluir que:
Para ver como aportan los niveles de la variable FILA en las dos primeras dimensiones hacemos lo siguiente:
fviz_ca_row(res_ca, repel = TRUE)
El gráfico anterior muestra las relaciones entre los puntos de fila:
Para ver el aporte que tiene cada nivel de la variable COLUMNA en las dimensiones hacemos lo siguiente:
<- get_ca_col(res_ca)
col $coord col
Dim.1 Dim.2 Dim.3
Esposa -0.83762154 -0.3652207 -0.19991139
Alternado -0.06218462 -0.2915938 0.84858939
Esposo 1.16091847 -0.6019199 -0.18885924
Juntos 0.14942609 1.0265791 -0.04644302
De la tabla anterior se puede concluir que:
Para ver como aportan los niveles de la variable COLUMNA en las dos primeras dimensiones hacemos lo siguiente:
fviz_ca_col(res_ca, repel = TRUE)
Se recomienda leer esta publicación para profundizar más en CA.