Escuela Nacional de Inteligencia

Curso de Estadística para el Análisis Social

Prof. José Manuel Magallanes, PhD


Análisis de Datos Categóricos


Carguemos la data:

folder='data'
fileName='idePeru2012.csv'
fileToRead=file.path(folder,fileName)
ide12=read.csv(fileToRead,strip.white = T,stringsAsFactors = F)

Veámos cuáles son las categóricas:

str(ide12)
## 'data.frame':    195 obs. of  14 variables:
##  $ ubiProv        : int  10100 10200 10300 10400 10500 10600 10700 20100 20200 20300 ...
##  $ ubiReg         : int  10000 10000 10000 10000 10000 10000 10000 20000 20000 20000 ...
##  $ DEPARTAMENTO   : chr  "AMAZONAS" "AMAZONAS" "AMAZONAS" "AMAZONAS" ...
##  $ PROVINCIA      : chr  "Chachapoyas" "Bagua" "Bongara" "Condorcanqui" ...
##  $ IDE            : num  0.774 0.662 0.632 0.46 0.605 ...
##  $ IDENTIDAD      : num  98.6 94.6 97.5 86.2 96.2 ...
##  $ SALUD          : num  25.45 14.61 9.01 8.56 12.42 ...
##  $ EDUCACION      : num  91.5 79.8 76.4 52.2 74.7 ...
##  $ SANEAMIENTO    : num  70.3 64.5 54.8 37.7 43.3 ...
##  $ ELECTRIFICACION: num  84 67.9 72.2 39.5 67.4 ...
##  $ POBLACION      : int  54783 77438 32317 51802 52185 30236 118747 161003 7974 16879 ...
##  $ COSTA          : chr  "NO" "NO" "NO" "NO" ...
##  $ CAPITAL        : chr  "SI" "NO" "NO" "NO" ...
##  $ TAMANO         : int  2 2 1 2 2 1 3 3 1 1 ...

La variable TAMANO debe ser ordinal:

ide12$TAMANO=as.ordered(ide12$TAMANO)

Cambiemos los compnentes del IDE a ordinal (5 niveles). Para ello, primero creemos cinco nuevas variables (estarán vacías):

ide12$elcOrd=ide12$sanOrd=ide12$eduOrd=ide12$salOrd=ide12$idOrd=NA

Ahora démosle valores a las variables recién creadas. Se crearán tres niveles en cada una, pero les daremos diferentes nombres para que se note el propósito de la técnica:

gruposCantidad=3
etiquetas1=c('bajo','medio','alto')
ide12[,c(15:17)]=lapply(ide12[,c(6:8)],cut,
       breaks = gruposCantidad,
       labels = etiquetas1,
       ordered_result = T)

###

etiquetas2=c('malo','regular','bueno') # usando otra etiqueta
ide12[,c(18:19)]=lapply(ide12[,c(9:10)],cut,
       breaks = gruposCantidad,
       labels = etiquetas2,
       ordered_result = T)

Una mirada:

summary(ide12[,c(15:19)])
##    idOrd       salOrd      eduOrd        sanOrd        elcOrd  
##  bajo :  3   bajo :156   bajo : 18   malo   : 25   malo   :32  
##  medio:  7   medio: 35   medio: 67   regular:108   regular:89  
##  alto :185   alto :  4   alto :110   bueno  : 62   bueno  :74

ANALIZANDO UNA VARIABLE

La tabla de frecuencias de una variable categórica es el punto de partida. Hallemos la tabla de frecuencias para la variable TAMANO, que asigna a la provincias a una categoria segun su población, siendo 1 el grupo de población menor, y el cinco el de mayor poblacion:

tablaT=table(ide12$TAMANO)
tablaT
## 
##  1  2  3  4  5 
## 69 64 46 15  1

Siendo los porcentajes:

prop.table(tablaT)
## 
##           1           2           3           4           5 
## 0.353846154 0.328205128 0.235897436 0.076923077 0.005128205

Lo interesante es cuando queremos hacer inferencias. En este caso puede resultar obvio, pero veamos como R responde: “¿Es probable que los grupos sean del mismo tamaño?”

chisq.test(tablaT)
## 
##  Chi-squared test for given probabilities
## 
## data:  tablaT
## X-squared = 92.154, df = 4, p-value < 2.2e-16

La prueba chi-cuadrado acaba de testear si esos valores de la tabla de frecuencias provienen de una distribución uniforme (todos iguales). El p-value sugiere el nivel de esa probabilidad. Como el valor es muy pequeño se concluye que los datos no se distribuyen por igual.

Pero podriamos tener una hipotesis más exigente:

chisq.test(tablaT, p=c(.35,.35,.21,.07,.02))
## Warning in chisq.test(tablaT, p = c(0.35, 0.35, 0.21, 0.07, 0.02)): Chi-
## squared approximation may be incorrect
## 
##  Chi-squared test for given probabilities
## 
## data:  tablaT
## X-squared = 3.1856, df = 4, p-value = 0.5273

Hay más de 50% de probabilidad que la tabla de frecuencias se distribuya con esos procentajes, por lo que eso se aceptaría. Pero R informa que el Chi-cuadrado calculado de manera convencional puede presentar problemas.

Para verificar lo hayado, podemos calcularlo con apoyo computacional:

chisq.test(tablaT, p=c(.35,.35,.21,.07,.02),simulate.p.value = T)
## 
##  Chi-squared test for given probabilities with simulated p-value
##  (based on 2000 replicates)
## 
## data:  tablaT
## X-squared = 3.1856, df = NA, p-value = 0.5347

Podemos ver graficamente por que decidimos lo anterior.

par(mfrow=c(2,1))
barplot(c(.35,.35,.21,.07,.02), col="red", main='supuesto')
barplot(prop.table(tablaT),col="yellow", main='real')

ANALIZANDO DOS VARIABLE

Aqui necesitamos la tabla de contingencias:

tablaTE=table(ide12$TAMANO,ide12$eduOrd)
prop.table(tablaTE)
##    
##            bajo       medio        alto
##   1 0.020512821 0.138461538 0.194871795
##   2 0.056410256 0.128205128 0.143589744
##   3 0.015384615 0.071794872 0.148717949
##   4 0.000000000 0.005128205 0.071794872
##   5 0.000000000 0.000000000 0.005128205

Luego, con la prueba Chi-Cuadrado se pregunta si el comportamiento conjunto expresa asoción:

chisq.test(tablaTE)
## Warning in chisq.test(tablaTE): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tablaTE
## X-squared = 18.042, df = 8, p-value = 0.02092

Se ha obtenido un resultado no confiable, pues algun requisito de la prueba no se puede sostener (hay celdas menores que 5, y hasta un cero). Lo bueno es que R alerta que podria ser incorrecto, y nos da una salida no paramétrica:

chisq.test(tablaTE,simulate.p.value = T)
## 
##  Pearson's Chi-squared test with simulated p-value (based on 2000
##  replicates)
## 
## data:  tablaTE
## X-squared = 18.042, df = NA, p-value = 0.02649

Si el valor del p-value es menor a 0.05, se asume que hay asociación (formalmente estamos rechanzando la hipotesis nula: “la variables son independientes”).

Hasta aqui sabemos que las variables están relacionadas, pero no tenemos mayor detalle de cómo es esa relación. Es aquí donde aparece el análisis de correspondencias. Éste es un análisis gráfico que permite conocer como se están asociando las categorías.

Se comienza por calcular la tabla de correspondencias, a partir de la tabla de contingencia:

library(ca)
tablaCA_te=ca(tablaTE)

Este objeto tiene información interesante:

tablaCA_te
## 
##  Principal inertias (eigenvalues):
##            1        2       
## Value      0.078998 0.013523
## Percentage 85.38%   14.62%  
## 
## 
##  Rows:
##                 1         2         3         4         5
## Mass     0.353846  0.328205  0.235897  0.076923  0.005128
## ChiDist  0.140414  0.321618  0.142240  0.746443  0.879049
## Inertia  0.006976  0.033949  0.004773  0.042860  0.003963
## Dim. 1  -0.063547  1.081488 -0.505903 -2.572733 -2.967917
## Dim. 2   1.197668 -0.903582  0.031782 -1.592507 -2.384260
## 
## 
##  Columns:
##              bajo    medio      alto
## Mass     0.092308 0.343590  0.564103
## ChiDist  0.628641 0.266736  0.236666
## Inertia  0.036479 0.024446  0.031596
## Dim. 1   2.001206 0.831911 -0.834179
## Dim. 2  -2.414230 1.103799 -0.277258

Si revisamos los eigenvalues vemos que la tabla se ha descompuesto en dos dimensiones, y que la primera recoge la mayor información:

plot.ca(tablaCA_te, col=c("red","blue"))

Queremos entender la relación entre las categorias de ambas variables. Para ello: 1. Debemos descartar las categorias cercanas al origen:

  • “alto” y “3” están cerca al origen. Solo podemos concluir que no están asociadas.
  1. Miremos las categorias distanciadas del origen:
  • “medio” y “2” están relativamente más lejos, debe haber una ligera asociación. Como el ángulo entre ellas desde el origen es menor a 90, la asociación es positiva.
  • “bajo” y ‘4’ y ‘5’ están muy distanciadas del origen. El angulo entre ellas es mayor que 90, lo que sugiere una asociación negativa.
  • “bajo” está muy distanciada del origen, y ‘2’ no tanto. Si ‘2’ estuviese más cerca a ‘bajo’ sugeriría una asociación positiva fuerte.

Para ver los angulos podemos pedir:

plot.ca(tablaCA_te, col=c("red","blue"), arrows = c(T,T))

Inicio