Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional
En esta “pildora” encontrará como calcular frecuencias y porcentajes para variables categóricas, obteniendo tablas a una y dos vías y tablas a dos vías estratificando por una tercera variable.
En un grupo de 15 estudiantes, se midieron tres variables categóricas:
Se tiene como objetivo describir a los 15 estudiantes con base en estas tres variables. Los valores observados fueron los siguientes:
#Se crean tres vectores con los valores observados en las tres variables.
asiste<-c("si","no","si","si","si","no","si","no","no","si","si","si","si","si","no")
aprobar<-c("si","si","si","si","no","no","si","no","si","si","si","si","si","si","no")
sexo<-c("M","F","M","F","F","M","M","F","M","F","M","F","M","F","F")
#Se crea un data.frame con el nombre BD a partir de los tres vectores.
BD<-data.frame(asiste,aprobar,sexo)
La descripción de variables categóricas se realiza calculado frecuencias absolutas (conteo) y frecuencias relativas (proporciones o porcentajes). Las frecuencias absolutas se pueden obtener, por ejemplo para la variable asistió a clase, así:
table(asiste)
## asiste
## no si
## 5 10
las frecuencias relativas, basado en la tabla anterior, se pueden obtener así:
round(prop.table(table(asiste))*100,1)
## asiste
## no si
## 33.3 66.7
donde la función prop.table
calcula proporciones con base en una tabla de frecuencias y la función round
aproxima a un número de decimales. Si nos interesa obtener frecuencias absolutas y relativas cruzando dos variables, por ejemplo cruzando la variable asiste a clase y aprobó la materia, se puede obtener así:
table(asiste,aprobar)
## aprobar
## asiste no si
## no 3 2
## si 1 9
round(prop.table(table(asiste,aprobar))*100,1)
## aprobar
## asiste no si
## no 20.0 13.3
## si 6.7 60.0
Los porcentajes anteriores se obtuvieron con base al total de estudiantes; si nos interesa obtener porcentajes por filas o por columnas se puede realizar lo siguiente:
round(prop.table(table(asiste,aprobar),1)*100,1)# % por fila
## aprobar
## asiste no si
## no 60 40
## si 10 90
round(prop.table(table(asiste,aprobar),2)*100,1)# % por columna
## aprobar
## asiste no si
## no 75.0 18.2
## si 25.0 81.8
También se pueden obtener frecuencias absolutas y relativas cruzando dos variables y estratificando por una tercera variable, utilizando la función by
y tomando la información del data.frame BD creado al comienzo de este documento.
Por ejemplo, cruzar las variables asistió a clase y aprobó la materia estratificando por la variable sexo, se puede obtener así:
by(BD,BD$sexo, function(BD) round(prop.table(table(BD$asiste,BD$aprobar))*100,1))
## BD$sexo: F
##
## no si
## no 25.0 12.5
## si 12.5 50.0
## --------------------------------------------------------
## BD$sexo: M
##
## no si
## no 14.3 14.3
## si 0.0 71.4
Si queremos obtener porcentajes por fila, utilizando las opciones de la función prop.table
, se pueden obtener así:
by(BD,BD$sexo, function(BD) round(prop.table(table(BD$asiste,BD$aprobar),1)*100,1))
## BD$sexo: F
##
## no si
## no 66.7 33.3
## si 20.0 80.0
## --------------------------------------------------------
## BD$sexo: M
##
## no si
## no 50 50
## si 0 100
La función CrossTable
del paquete gmodels
brinda otra forma para construir tablas. Una tabla para la variable asistió a clase se puede obtener así:
library(gmodels)
CrossTable(asiste,digits = 3)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 15
##
##
## | no | si |
## |-----------|-----------|
## | 5 | 10 |
## | 0.333 | 0.667 |
## |-----------|-----------|
##
##
##
##
una tabla cruzando las variables asistió a clase y aprobó la materia, se puede obtener así:
CrossTable(asiste,aprobar,digits = 3,expected = FALSE,prop.r = TRUE,prop.c = TRUE,prop.t = TRUE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 15
##
##
## | aprobar
## asiste | no | si | Row Total |
## -------------|-----------|-----------|-----------|
## no | 3 | 2 | 5 |
## | 2.083 | 0.758 | |
## | 0.600 | 0.400 | 0.333 |
## | 0.750 | 0.182 | |
## | 0.200 | 0.133 | |
## -------------|-----------|-----------|-----------|
## si | 1 | 9 | 10 |
## | 1.042 | 0.379 | |
## | 0.100 | 0.900 | 0.667 |
## | 0.250 | 0.818 | |
## | 0.067 | 0.600 | |
## -------------|-----------|-----------|-----------|
## Column Total | 4 | 11 | 15 |
## | 0.267 | 0.733 | |
## -------------|-----------|-----------|-----------|
##
##
Finalmente, utilizando nuevamente las función by
, se pueden obtener tablas a dos vías estratificando por una tercera variable de la siguiente forma:
by(BD,BD$sexo,function(BD) CrossTable(BD$asiste,BD$aprobar,digits = 3,expected = FALSE))
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 8
##
##
## | BD$aprobar
## BD$asiste | no | si | Row Total |
## -------------|-----------|-----------|-----------|
## no | 2 | 1 | 3 |
## | 0.681 | 0.408 | |
## | 0.667 | 0.333 | 0.375 |
## | 0.667 | 0.200 | |
## | 0.250 | 0.125 | |
## -------------|-----------|-----------|-----------|
## si | 1 | 4 | 5 |
## | 0.408 | 0.245 | |
## | 0.200 | 0.800 | 0.625 |
## | 0.333 | 0.800 | |
## | 0.125 | 0.500 | |
## -------------|-----------|-----------|-----------|
## Column Total | 3 | 5 | 8 |
## | 0.375 | 0.625 | |
## -------------|-----------|-----------|-----------|
##
##
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 7
##
##
## | BD$aprobar
## BD$asiste | no | si | Row Total |
## -------------|-----------|-----------|-----------|
## no | 1 | 1 | 2 |
## | 1.786 | 0.298 | |
## | 0.500 | 0.500 | 0.286 |
## | 1.000 | 0.167 | |
## | 0.143 | 0.143 | |
## -------------|-----------|-----------|-----------|
## si | 0 | 5 | 5 |
## | 0.714 | 0.119 | |
## | 0.000 | 1.000 | 0.714 |
## | 0.000 | 0.833 | |
## | 0.000 | 0.714 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1 | 6 | 7 |
## | 0.143 | 0.857 | |
## -------------|-----------|-----------|-----------|
##
##
## BD$sexo: F
## $t
## y
## x no si
## no 2 1
## si 1 4
##
## $prop.row
## y
## x no si
## no 0.6666667 0.3333333
## si 0.2000000 0.8000000
##
## $prop.col
## y
## x no si
## no 0.6666667 0.2000000
## si 0.3333333 0.8000000
##
## $prop.tbl
## y
## x no si
## no 0.250 0.125
## si 0.125 0.500
##
## --------------------------------------------------------
## BD$sexo: M
## $t
## y
## x no si
## no 1 1
## si 0 5
##
## $prop.row
## y
## x no si
## no 0.5 0.5
## si 0.0 1.0
##
## $prop.col
## y
## x no si
## no 1.0000000 0.1666667
## si 0.0000000 0.8333333
##
## $prop.tbl
## y
## x no si
## no 0.1428571 0.1428571
## si 0.0000000 0.7142857
De los 15 estudiantes, 8 mujeres (53.3%) y 7 hombres (46.7%), el 66.7% (10) asisten a clase y el 73.3% aprobó el curso.
De los que asistieron a clase el 90% aprobó la materia, mientras que de los que no asisten sólo el 40% aprobó.
En las mujeres, de las que asistieron a clase el 80% aprobó el curso, mientras que de las que no asistieron el 33.3% aprobó.
En los hombres, de los que asistieron a clase el 100% aprobó el curso, mientras que de los que no asistieron el 50% aprobó.