3.2 Estadística básica con R

En los siguientes apartados veremos cómo utilizar R para realizar tareas estadísticas básicas. En particular, trataremos aspectos como:

  1. Manejo de distribuciones estadísticas de uso frecuente (como la distribución normal).

  2. Caracterización estadística de datos (estadística descriptiva).

  3. Realización de contrastes de hipótesis mediante test básicos (estadística inferencial).

3.2.1 Distribuciones estadísticas

Las distribuciones más habitualmente utilizadas a la hora de modelar estadísticamente unos datos o para llevar a cabo tests están implementadas en R. Entre ellas se incluyen (con su nombre en R entre paréntesis) las distribuciones binomial (binom), Chi-cuadrado (chisq), exponencial (exp), normal (norm), log-normal (lnorm), poisson (pois), t de Student (t), uniforme (unif), etc.

Para cada una de estas distribuciones R ofrece funciones que nos permiten calcular cuatro tipos de valores vinculados a ellas:

  1. Valores de la función de densidad de probabilidad

  2. Valores de la función de distribución

  3. Cuantiles

  4. Muestras pseudoaleatorias de esas distribuciones

Además, estas funciones utilizan un esquema de nombramiento homogéneo, para facilitar su uso. Así, si el nombre de la distribución es xxx (por ejemplo, norm para la distribución normal), los valores de la función de densidad de probabilidad se obtendrán con dxxx (dnorm), los de la función de distribución con pxxx (pnorm), los cuantiles con qxxx (qnorm) y las muestras pseudoaleatorias con rxxx (rnorm). Por ejemplo, para una distribución normal de media 0 y desviación típica 1:

dnorm(0, mean=0, sd=1)     # Densidad de probabilidad en 0 
# [1] 0.3989423 

pnorm(0, mean=0, sd=1)     # Función de distribución en 0 
# [1] 0.5 

qnorm(0.25, mean=0, sd=1)  # Cuantil 0.25 (primer cuartil) 
# [1] -0.6744898 

rnorm(5, mean=0, sd=1)     # 5 muestras pseudoaleatorias  
# [1] -0.4711529 -0.9017104  0.3270642 -1.1161598 -0.7629164 

3.2.2 Estadística descriptiva

Además de trabajar con distribuciones estadísticas teóricas, R nos permite analizar unos datos para caracterizarlos estadísticamente. Entre las funciones más habitualmente empleadas a la hora de llevar a cabo este tipo de análisis se encuentran:

  • Función mean: Nos permite calcular la media.

  • Función sd: Sirve para obtener la desviación estándar.

  • Función var: Nos devuelve la varianza.

  • Función quantile: Para obtener los cuantiles (por defecto, cuartiles, pero se puede configurar con el parámetro probs).

  • Función median: Permite calcular la mediana de la muestra.

  • Función summary: Devuelve un resumen con los principales estadísticos de los datos que se pasan como argumento.

Podemos ver a continuación ejemplos de uso de estas funciones:

datos<-rnorm(100, mean=0, sd=1)
mean(datos)
# [1] -0.04541376
sd(datos)
# [1] 0.9461041
var(datos)
# [1] 0.895113
median(datos)
# [1] -0.1267531
quantile(datos)
#         0%        25%        50%        75%       100%
# -1.6806238 -0.7602521 -0.1267531  0.5466689  2.5583851
quantile(datos, probs=seq(0,1,0.2))
#         0%        20%        40%        60%        80%       100%
# -1.6806238 -0.9240561 -0.4597640  0.2103897  0.7079928  2.5583851
summary(datos)
#     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
# -1.68100 -0.76030 -0.12680 -0.04541  0.54670  2.55800

Además de obtener sus estadísticos básicos, se pueden caracterizar unos datos de manera gráfica. Tres de los procedimientos más utilizados para esto son la representación del histograma (que nos da una estimación de la función de densidad de probabilidad), la representación de la distribución acumulada empírica (que nos da una estimación de la función de distribución) y la representación del diagrama de caja (boxplot) de los datos. Para obtener estas representaciones gráficas en R, utilizaremos las siguientes funciones:

  • La función boxplot dibuja el diagrama de caja, recibiendo como parámetro los datos a representar:
datos<-rnorm(100, mean=0, sd=1)
boxplot(datos)
Ejemplo de diagrama de caja.

Figura 3.1: Ejemplo de diagrama de caja.

  • La función ecdf nos permite obtener la distribución acumulada empírica, que se puede dibujar a continuación mediante una llamada a la función plot (función genérica de representación gráfica en R, que veremos en temas posteriores):
datos<-rnorm(100, mean=0, sd=1)
plot(ecdf(datos)) 
Ejemplo de representación de distribución acumulada empírica.

Figura 3.2: Ejemplo de representación de distribución acumulada empírica.

  • La función hist representa el histograma. Los parámetros principales de esta función según la documentación de R son:

    • x: los datos a representar en el histograma.

    • breaks: sirve para especificar los límites de los intervalos en los que está dividido el eje-x del histograma. Suele tomar como valor un número (que indica cuántos intervalos del mismo tamaño se deben representar) o un vector (con los límites de los intervalos).

    • freq: un valor lógico que indica si se deben representar en el eje-y frecuencias (TRUE) o probabilidades (FALSE).

datos<-rnorm(100, mean=0, sd=1)
hist(datos, breaks=10, freq=F) 
Ejemplo de histograma.

Figura 3.3: Ejemplo de histograma.

3.2.3 Test estadísticos básicos

Otra actividad que se suele realizar como parte del proceso de análisis estadístico de unos datos es enunciar hipótesis sobre esos datos y tratar de contrastar esas hipótesis por medio de test estadísticos. Este proceso de inferencia estadística también se puede realizar en R, como veremos en esta sección.

3.2.3.1 Test t

Es uno de los más básicos y también de los más comúnmente utilizados. En R este test se implementa mediante la función t.test.

A través de un test t podemos por ejemplo determinar si la media de una muestra empírica coincide o no con un valor indicado. Veamos un ejemplo:

datos<-rnorm(100, mean=1, sd=1) 
t.test(datos, mu=1) 
# One Sample t-test 
#  
# data:  datos 
# t = 0.0613, df = 99, p-value = 0.9513 
# alternative hypothesis: true mean is not equal to 1 
# 95 percent confidence interval: 
#  0.7931953 1.2199846 
# sample estimates: 
# mean of x  
#   1.00659 

Como se puede ver, hemos generado un vector de datos aleatorios (100 muestras) siguiendo una distribución normal N(1,1) y hemos aplicado el test t para determinar si la media (parámetro mu) es igual a 1. Obtenemos los siguientes resultados:

  • La línea t = 0.0613, df = 99, p-value = 0.9513 nos indica el valor del estadístico t, los grados de libertad del test (df) y el p-valor obtenido.

  • El intervalo de confianza del 95 % es 0.7931953, 1.2199846.

  • La media estimada en la muestra es 1.00659.

Por defecto el test se lleva a cabo con un nivel de confianza del 95 % (se puede cambiar con el parámetro conf.level de la función t.test). Así pues, a tenor de los resultados obtenidos (p>0.05, el intervalo de confianza estimado para la media contiene el valor 1), no podemos rechazar la hipótesis de que la media es 1.

También podemos utilizar un test t para comprobar si las medias de dos muestras independientes del mismo tamaño son iguales:

datos1<-rnorm(100, mean=0, sd=1) 
datos2<-rnorm(100, mean=1, sd=1) 
t.test(datos1, datos2, conf.level=0.99) 
 
#   Welch Two Sample t-test 
#  
# data:  datos1 and datos2 
# t = -7.4744, df = 197.978, p-value = 2.446e-12 
# alternative hypothesis: true difference in means is not equal to 0 
# 99 percent confidence interval: 
#  -1.5054492 -0.7281998 
# sample estimates: 
#   mean of x   mean of y  
# -0.05670122  1.06012327 

Se puede ver que, en este caso, el p-valor obtenido es muy pequeño y el valor 0 queda fuera del intervalo de confianza estimado para la diferencia de medias, con lo que se rechazaría la hipótesis de que las medias son iguales.

3.2.3.2 Test Chi-cuadrado

Este test se suele utilizar cuando queremos saber si dos variables son o no independientes. La hipótesis nula (las variables son independientes) se rechazaría si el p-valor obtenido para el test es menor que un valor alfa que depende del nivel de confianza que nosotros queramos (en particular, alfa = 1 – nivel de confianza).

Por ejemplo, supongamos que tenemos el siguiente data frame que relaciona dos variables: las filas representan al tipo de fumador (M, muy frecuente; F, frecuente; O, ocasional; N, no fuma), las columnas al tipo de deportista (Frec, frecuente; Esp, esporádico) y los valores al número de personas de cada tipo:

depFrec<-c(7,87,12,9) 
depEsp<-c(4, 102, 7, 8) 
tabla<-data.frame(Frec=depFrec, Esp=depEsp) 
rownames(tabla)<-c("M","N","O","F") 
tabla 
#   Frec Esp 
# M    7   4 
# N   87 102 
# O   12   7 
# F    9   8 

Queremos saber si las variables «ser fumador» y «ser deportista» son o no independientes, para lo que llevaremos a cabo un test de Chi-cuadrado, que en R se implementa por medio de la función chisq.test:

chisq.test(tabla) 
#   Pearson's Chi-squared test 
#  
# data:  tabla 
# X-squared = 3.2328, df = 3, p-value = 0.3571 

Como se puede ver, el p-valor es 0.3571 por lo que si nuestro nivel de confianza es del 95 % (y por tanto alfa = 1-0.95 = 0.05) no se cumple que el p-valor sea menor que alfa y, por tanto, no podemos rechazar la hipótesis nula de que las variables son independientes.

Otro uso habitual del test de Chi-cuadrado es realizar contrastes de bondad de ajuste, en los que la hipótesis a contrastar es que los datos de una muestra se ajustan a un modelo estadístico dado.

Por ejemplo, supongamos que tenemos un dado, y queremos saber si el dado ha sido manipulado o no. Podemos tirar un determinado número de veces el dado y obtener la frecuencia con la que se obtiene cada uno de los seis resultados, construyendo por ejemplo el siguiente data frame:

dado 
#   Freq 
# 1   20 
# 2   19 
# 3   20 
# 4   25 
# 5   20 
# 6   46 

A continuación comprobaríamos si esa muestra se ajusta a un modelo en el que cada una de las seis alternativas es igualmente probable (como cabría esperar en un dado no manipulado) utilizando un test de Chi-cuadrado:

probs<-rep(1, 6)/6 
chisq.test(dado$Freq, p=probs) 
 
#   Chi-squared test for given probabilities 
#  
# data:  dado$Freq 
# X-squared = 22.08, df = 5, p-value = 0.0005056 

Como se puede ver, en este caso el p-valor es muy pequeño con lo que rechazamos la hipótesis de que los datos se ajustan al modelo considerado (y podríamos sospechar que el dado ha sido efectivamente manipulado).

Nótese que la función chisq.test lleva a cabo una u otra tarea dependiendo de los parámetros que recibe como entrada (en función de si los datos representan una tabla bidimensional -test de independencia- o un vector unidimensional -bondad de ajuste-).