1 de septiembre de 2014

Estadísticos de resumen

Los estadísticos descriptivos son un número o categoría que nos proporciona información acerca algunos atributos importantes de una variable. Podemos clasificarlos en tres grandes tipos:

  • Estadísticos de tendencia central: Moda, Mediana (Md), Media (\(\bar{x}\))
  • Estadísticos de dispersión: Mínimo, máximo, rango, varianza (\(\sigma^2\), \(S^2\)), desviación estándar (\(\sigma\), \(S\)), rango intercuartil.
  • Cuantiles o estadísticos de orden o posición: percentiles, deciles, cuartiles, quintiles, etc.

Cargamos los datos de trabajo

Base de datos para estos ejercicios: Familia y roles de género 2012, a descargar de:

http://iop-data.pucp.edu.pe/busqueda/encuesta/71?

Se sugiere descargar también el cuestionario para utilizarlo como referencia de libro de códigos. Descomprimir y grabar el archivo SPSS en el directorio de trabajo de R

# Importar la base de datos del SPSS a un data frame de R
library(foreign)
genero <- as.data.frame(read.spss("IOP_1212_01_B.sav"))
## re-encoding from UTF-8

Medidas de tendencia central

median(genero$EDAD) # Mediana
## [1] 36
mean(genero$EDAD) # Media
## [1] 38.98

Medidas de dispersión

range(genero$EDAD) # Rango
## [1] 18 92
var(genero$EDAD) # Varianza
## [1] 243.7
sd(genero$EDAD) # Desviación Estándar
## [1] 15.61

Cuantiles: Medidas de orden o posición

El comando "quantile" nos muestra los valores mínimo y máximo de la variable, así como los cuartiles

quantile(genero$EDAD) # Cuartiles
##   0%  25%  50%  75% 100% 
##   18   26   36   49   92

Con los cuartiles podemos calcular el rango intercuartil: la diferencia entre el tercer cuartil (percentil 75) y el primer cuartil (percentil 25)

IQR(genero$EDAD)
## [1] 23

Si queremos otros cuantiles podemos crear un vector que contenga los cuantiles específicos y aplicar el comando condicionado a ese vector:

decil <- seq(0, 1, 0.1)
decil
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
quantile(genero$EDAD, decil)
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##   18   20   24   28   32   36   42   46   52   62   92

Otros ejemplos de lo anterior:

Quintiles:

quintil <- seq(0,1, 0.2) 
quantile(genero$EDAD, quintil)
##   0%  20%  40%  60%  80% 100% 
##   18   24   32   42   52   92

Cuantiles específicos

quantile(genero$EDAD, probs=c(.33, .44, .66, .855))
##   33%   44%   66% 85.5% 
##    29    34    44    57

Distribución Empírica Acumulada

Otra forma de analizar una distribución es mediante la función de Distribución Empírica Acumulada (ecdf) que calcula el percentil correspondiente a cada valor de una distribución ordenada de una variable cuantitativa. Podemos observar el gráfico de una distribución empírica acumulada mediante el comando:

plot(ecdf(genero$EDAD))

Tambien podemos indagar acerca del percentil correspondiente a valores específicos de una variable. Por ejemplo:

Per <- ecdf(genero$EDAD)
Per(50) # Para la edad 50
## [1] 0.7764
x <- c(25, 40, 65) # Para las edades 25, 40 y 65
Per(x)
## [1] 0.2394 0.5827 0.9277

Manejo de valores perdidos

Observen qué pasa cuando se pide lo siguiente:

mean(genero$P19A)
## [1] NA

No se puede computar la media porque hay valores perdidos. Podemos comprobar cuántos hay de la siguientes maneras:

table(is.na(genero$P19A)) # tabla 
## 
## FALSE  TRUE 
##  1201     2

Otra forma de comprobar los casos perdidos y válidos:

sum(is.na(genero$P19A)) # conteo de valores perdidos
## [1] 2
sum(!is.na(genero$P19A)) # conteo de casos válidos
## [1] 1201

Para indicar que se excluyan los casos perdidos (NA) del cómputo de un estatístico se usa la opción "na.rm = TRUE":

mean(genero$P19A, na.rm = TRUE)
## [1] 23.19

Podemos usar el comando "summary" para producir algunos estadísticos descriptivos de una variable:

summary(genero$P19A)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     7.0    16.0    23.2    30.0   168.0       2

O de una lista de variables que ponemos en un data frame:

mis.vars <- data.frame(genero$EDAD, genero$P1, genero$P19A)
summary(mis.vars)
##   genero.EDAD   genero.P1     genero.P19A   
##  Min.   :18   Min.   :15.0   Min.   :  0.0  
##  1st Qu.:26   1st Qu.:25.0   1st Qu.:  7.0  
##  Median :36   Median :25.0   Median : 16.0  
##  Mean   :39   Mean   :28.8   Mean   : 23.2  
##  3rd Qu.:49   3rd Qu.:30.0   3rd Qu.: 30.0  
##  Max.   :92   Max.   :99.0   Max.   :168.0  
##                              NA's   :2

En los datos anteriores notamos que hay algunos problemas con las variables P1 y P19A: En P1, se considera como valor máximo 99 años (que es el código NS/NR). En P19A el valor máximo corresponde a una persona que dedica 24 horas diarias todos los días a las tareas domésticas (168/7). Si exploramos con más detalle ese dato (y en de la variable P19B), por ejemplo con el comando "table", notaremos que algunas personas dicen dedicarse a las tareas domésticas y de cuidado más de 20 horas al día todos los días, lo que es extraño. Podemos optar por excluir esos casos y marcarlos como valores perdidos usando el siguiente código:

genero$P1r <- genero$P1
genero$P1r[genero$P1==99] <- NA
genero$P2r <- genero$P2
genero$P2r[genero$P2==99] <- NA
genero$P19Ar <- genero$P19A
genero$P19Ar[genero$P19A >= 140] <- NA
genero$P19Br <- genero$P19B
genero$P19Br[genero$P19B >= 140] <- NA

Veamos algunos estadísticos de resumen de las variables modificadas

mis.var2 <- data.frame(genero$P1r, genero$P2r, genero$P19Ar, genero$P19Br)
summary(mis.var2)
##    genero.P1r     genero.P2r    genero.P19Ar    genero.P19Br  
##  Min.   :15.0   Min.   :18.0   Min.   :  0.0   Min.   :  0.0  
##  1st Qu.:25.0   1st Qu.:25.0   1st Qu.:  7.0   1st Qu.:  1.0  
##  Median :25.0   Median :29.0   Median : 16.0   Median : 14.0  
##  Mean   :26.2   Mean   :28.6   Mean   : 22.6   Mean   : 19.2  
##  3rd Qu.:29.0   3rd Qu.:30.0   3rd Qu.: 30.0   3rd Qu.: 28.0  
##  Max.   :60.0   Max.   :42.0   Max.   :112.0   Max.   :120.0  
##  NA's   :42     NA's   :41     NA's   :7       NA's   :11

Resúmenes para grupos de casos

Con el comando "tapply" podemos solicitar estadísticos según los niveles de un factor. Por ejemplo, el tiempo dedicado a labores domésticas, según sexo:

tapply(genero$P19Ar, genero$SEXO, mean, na.rm=TRUE) # Media
## Masculino  Femenino 
##      13.7      31.2
tapply(genero$P19Ar, genero$SEXO, median, na.rm=TRUE) # Mediana
## Masculino  Femenino 
##        10        28

tapply(genero$P19Ar, genero$SEXO, sd, na.rm=TRUE) # Desviación estándar
## Masculino  Femenino 
##     13.50     21.35
tapply(genero$P19Ar, genero$SEXO, length) # Número de casos
## Masculino  Femenino 
##       589       614

Podemos juntar los estadísticos en un mismo objeto:

Media <- tapply(genero$P19Ar, genero$SEXO, mean, na.rm=TRUE) 
Mediana <- tapply(genero$P19Ar, genero$SEXO, median, na.rm=TRUE)
Desv <- tapply(genero$P19Ar, genero$SEXO, sd, na.rm=TRUE) 
Ncasos <- tapply(genero$P19Ar, genero$SEXO, length)
cbind(Media, Mediana, Desv, Ncasos)
##           Media Mediana  Desv Ncasos
## Masculino  13.7      10 13.50    589
## Femenino   31.2      28 21.35    614

El problema es que no se consigna el número de casos válidos. Para ello una solución es:

df.val <- genero[is.na(genero$P19Ar)==FALSE, ]
Nvalid <- tapply(df.val$P19Ar, df.val$SEXO, length)
cbind(Media, Mediana, Desv, Ncasos, Nvalid)
##           Media Mediana  Desv Ncasos Nvalid
## Masculino  13.7      10 13.50    589    587
## Femenino   31.2      28 21.35    614    609

Luego podemos

tab1 <- cbind(Media, Mediana, Desv, Ncasos, Nvalid)
library(xtable)
print(xtable(tab1), type="html", file="resumen.html")

El comando "tapply" también se puede aplicar a "summary". Por ejemplo:

mujeres <- subset(genero, SEXO=="Femenino")
tapply(mujeres$P19Ar, mujeres$NSEGrup, summary)
## $`A/B`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0    14.0    23.5    28.2    36.0    84.0       1 
## 
## $C
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    14.0    25.0    28.5    42.0    84.0 
## 
## $`D/E`
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0    18.0    28.0    34.2    49.0   112.0       4

Boxplots

Boxplots o gráficos de cajas

El boxplot o gráfico de cajas es una de las herramientas más útiles para el análisis descriptivo de la distribución de una variable, ya que nos presenta de manera suscinta:

  • Una medida de tendencia central: La mediana
  • Una medida de dispersión: El rango intercuartil
  • Estadísticos de orden: Los cuartiles
  • Identifica los casos atípicos o "outliers"

Boxplot con ggplot

Un gráfico de cajas simple de una variable para un grupo único puede pedirse en ggplot con el siguiente comando:

# Para las horas dedicadas a labores domésticas:
library(ggplot2)
boxp1 <- ggplot(genero, aes(x=1, y=P19Ar)) + geom_boxplot()

boxp1

Podemos solicitar un boxplot según grupos, en este caso sexo:

ggplot(genero, aes(x=SEXO, y=P19Ar)) + geom_boxplot() 

Se pueden añadir facetas:

ggplot(genero, aes(x=SEXO, y=P19Ar)) + geom_boxplot() + facet_grid(.~ NSEGrup)