Licencia Creative Commons

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional


1 Introducción

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.

2 Situación

En un grupo de 15 estudiantes, se midieron tres variables categóricas:

  • asistió a clase (si,no)
  • aprobó la materia (si,no) y
  • sexo (M,F).

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)

3 Análisis

3.1 Tablas a una y dos vías.

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

3.2 Tablas a dos vías estratificadas.

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

3.3 Otra forma

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

4 Interpretación

  1. 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.

  2. De los que asistieron a clase el 90% aprobó la materia, mientras que de los que no asisten sólo el 40% aprobó.

  3. 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ó.

  4. En los hombres, de los que asistieron a clase el 100% aprobó el curso, mientras que de los que no asistieron el 50% aprobó.