1 Estadística descriptiva con R

  • Instalar paquetes necesarios (ejecutar solo una vez)
install.packages(c("tidyverse", "psych", "summarytools", 
                "ggplot2", "plotly", "DT", "rmarkdown"))

1.1 ¿Por qué R para estadística descriptiva?

R ofrece:

  • Más de 15,000 paquetes estadísticos
  • Visualización avanzada
  • Reproducibilidad
  • Gratuito y de código abierto

1.2 Cargando datos de ejemplo mtcars

R cuenta con algunos datos integrados, por ejmeplo la base de datos mtcars.

Por ejemplo mtcarts cuenta con 32 observaciones Si dice factor es el nombre de las etiquetas

  • mpg = Millas por galón
  • cyl = Número de cilindros
  • disp = Desplazamiento (pulgadas cúbicas)
  • hp = Caballos de fuerza brutos
  • drat = Relación del eje trasero
  • wt = Peso (lb/1000)
  • qsec = 1/4 milla de tiempo (Tiempo que se demora el carro en recorrer 1/4 de milla)
  • vs = (0= , 1=)
  • am = Trasmisión (0=automático, 1=manual)
  • gear = Número de engranajes de la trasmisión
  • carb = Número de carburadores
data("mtcars") # Datos de automóviles
mtcars

Para imprimir las primeras filas usamos head()

# Primeras filas de mtcars
head(mtcars)
# Primeras filas de iris
head(iris)

1.3 Cargando datos de ejemplo iris

Conjunto de datos de la flor del iris

En 1936, Edgar Anderson recopiló datos para cuantificar las variaciones geográficas de las flores de iris . El conjunto de datos consta de 50 muestras de cada una de las tres subespecies ( iris setosa , iris virginica e iris versicolor ).

Se midieron cuatro características en centímetros (cm):

  • Sepal.Length: longitudes de los sépalos
  • Sepal.Width: anchos de los sépalos
  • Petal.Length: longitudes de los pétalo
  • Petal.Width: ancho de los pétalo
  • Species: especie (iris setosa , iris virginica e iris versicolor)
data("iris") # Datos de flores
iris

2 Resumen estadístico básico

Usando summary() para resumen rápido

summary(mtcars)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

3 Medidas de tendencia central

Cálculo de medidas para la variable mpg (millas por galón)

mpg <- mtcars$mpg
mpg
##  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
medidas <- data.frame(
  Media = mean(mpg),
  Mediana = median(mpg),
  Moda = as.numeric(names(sort(table(mpg), decreasing = TRUE)[1])),
  Mínimo = min(mpg),
  Máximo = max(mpg)
)

print(medidas)
##      Media Mediana Moda Mínimo Máximo
## 1 20.09062    19.2 10.4   10.4   33.9

4 Gráfica de barras

library(repmis)
source_data("https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false")
## Downloading data from: https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false
## SHA-1 hash of the downloaded data file is:
## 6bf9d5a19779293538bd61d55d0662bdaf8100a1
## [1] "Estudiantes"
datosCompleto <- Estudiantes; datosCompleto

4.1 Diagrama de barras simple

Ejemplo 1 Para crear un diagrama de barras, se necesita crear una tabla de frecuencias (con la función table) y luego aplicar la función barplot a esta tabla. El diagrama de barras es (observe que sale en escala de grises):

Sexo <- as.factor(datosCompleto$Sexo)
Fuma <- as.factor(datosCompleto$Fuma)

Cuentas1 <- table(Sexo)                 #A) Tabla de frecuencias no agrupadas para Sexo
barplot(Cuentas1,                       #B) Se aplica barplot a esa tabla
        main="TITULO GENERAL",          #C) Título principal     
        xlab="Eje X",                   #D) Tíulo del eje X
        ylab="Eje Y",                   #E) Título del eje Y
        legend = rownames(Cuentas1),    #F) Mostrar las leyendas
        ylim = c(0, 300)                #G) Ajustar límites en eje Y
        )                               #H) No olvidar cerrar el paréntesis

4.2 Colorear barras en diagrama para Sexo

Ejemplo 2, “jugar” con algunas opciones gráficas, obtenemos:

Cuentas1 <- table(Sexo)                 #A) Tabla de frecuencias no agrupadas para Sexo
barplot(Cuentas1,                       #B) Se aplica barplot a esa tabla
        main="TITULO GENERAL",          #C) Título principal     
        xlab="Eje X",                   #D) Tíulo del eje X
        ylab="Eje Y",                   #E) Título del eje Y
        legend = rownames(Cuentas1),    #F) Mostrar las leyendas
        ylim = c(0, 300),               #G) Ajustar límites en eje Y
        col=c("pink","blue")            #H) Colorear las barras
        )                               #I) No olvidar cerrar el paréntesis

4.3 Diagrama de barras apiladas

Ejemplo 3 (Distribución de Sexo dentro de cada nivel de Fuma)

La distribución de las personas según el género (variable 1=SEXO), dentro de cada grupo de los fumadores (Variable 2=FUMA), se puede visualizar en la tabla siguiente:

Cuentas2 <- table(Sexo, Fuma); Cuentas2  #A) Tabla de frecuencias no agrupadas para Sexo y Fuma
##            Fuma
## Sexo         No  Si
##   Femenino  116  95
##   Masculino 109  80

El diagrama de barras apilado correspondiente es:

barplot(Cuentas2,                       #B) Se aplica barplot a esa tabla
        main="Diagrama de barras",      #C) Título principal     
        xlab="Fuma",                    #D) Tíulo del eje X
        ylab="Frecuencias",             #E) Título del eje Y
        legend = rownames(Cuentas2),    #F) Mostrar las leyendas
        ylim = c(0, 300),               #G) Ajustar límites en eje Y
        col=c("pink","blue")            #H) Colorear las barras
        )                               #I) No olvidar cerrar el paréntesis

4.4 Distribución de Fuma dentro de cada nivel de Sexo

Ejemplo 4 la distribución de las personas fumadoras (variable 1=FUMA), dentro de cada grupo de género (Variable 2=SEXO), se puede visualizar en la tabla siguiente:

Cuentas3 <- table(Fuma, Sexo); Cuentas3    #A) Tabla de frecuencias no agrupadas para Sexo y Fuma
##     Sexo
## Fuma Femenino Masculino
##   No      116       109
##   Si       95        80

El diagrama de barras apilado correspondiente es:

barplot(Cuentas3,                       #B) Se aplica barplot a esa tabla
        main="Diagrama de barras",      #C) Título principal     
        xlab="Sexo",                    #D) Tíulo del eje X
        ylab="Frecuencias",             #E) Título del eje Y
        legend = rownames(Cuentas3),    #F) Mostrar las leyendas
        ylim = c(0, 300),               #G) Ajustar límites en eje Y
        col=c("yellow","brown")         #H) Colorear las barras
        )                               #I) No olvidar cerrar el paréntesis

4.5 Diagrama de barras agrupadas

Ejemplo 5, distribución de Sexo dentro de cada nivel de Fuma.

La distribución de las personas según el género (variable 1=SEXO), dentro de cada grupo de los fumadores (Variable 2=FUMA), se puede visualizar en la tabla siguiente:

Cuentas4 <- table(Sexo, Fuma); Cuentas2  #A) Tabla de frecuencias no agrupadas para Sexo y Fuma
##            Fuma
## Sexo         No  Si
##   Femenino  116  95
##   Masculino 109  80

El diagrama de barras apilado correspondiente es:

barplot(Cuentas2,                            #B) Se aplica barplot a esa tabla
        main="Diagrama de barras",           #C) Título principal     
        xlab="Fuma",                         #D) Tíulo del eje X
        ylab="Frecuencias",                  #E) Título del eje Y
        legend = rownames(Cuentas2),         #F) Mostrar las leyendas
        ylim = c(0, 200),                    #G) Ajustar límites en eje Y
        col=c("moccasin","mediumseagreen"),  #H) Colorear las barras
        beside=TRUE                          #I) Para agrupar las barras
        )                                    #J) No olvidar cerrar el paréntesis

4.6 Distribución de Fuma dentro de cada nivel de Sexo

Ejemplo 6, la distribución de las personas fumadoras (variable 1=FUMA), dentro de cada grupo de género (Variable 2=SEXO), se puede visualizar en la tabla siguiente:

Cuentas5 <- table(Fuma, Sexo); Cuentas5   #A) Tabla de frecuencias no agrupadas para Sexo y Fuma
##     Sexo
## Fuma Femenino Masculino
##   No      116       109
##   Si       95        80

El diagrama de barras apilado correspondiente es:

barplot(Cuentas3,                              #B) Se aplica barplot a esa tabla
        main="Diagrama de barras",             #C) Título principal     
        xlab="Sexo",                           #D) Tíulo del eje X
        ylab="Frecuencias",                    #E) Título del eje Y
        legend = rownames(Cuentas3),           #F) Mostrar las leyendas
        ylim = c(0, 200),                      #G) Ajustar límites en eje Y
        col=c("Indianred1","lightslateblue"),  #H) Colorear las barras
        beside=TRUE                            #I) Para agrupar las barras
        )                                      #J) No olvidar cerrar el paréntesis

5 Visualización: Histograma y densidad

hist(mpg)

hist(mpg, xlab = "Millas por galón",ylab="Frecuencia", main ="Histograma de mpg", col = "purple")

5.1 rug()

Ahora añadimos los valores individuales en el eje x por medio de rug(mpg)

hist(mpg, col = "darkgreen", xlab = "Millas por galón",ylab="Frecuencia", main ="Histograma de mpg")
rug(mpg)

5.2 varias gráficas

par(mfrow=c(1,2))

hist(mpg, col = "darkgreen", xlab = "Millas por galón",ylab="Frecuencia", main ="Histograma de mpg")
hist(mtcars$disp, col = "purple", xlab = "Pulgadas cúbicas",ylab="Frecuencia", main ="  Desplazamiento")

5.3 Histograma y curvas de densidad

Se puede optar por una figura con una curva de densidad de Kernel Density. Para ello:

density1 <- density(mtcars$disp)
density1
## 
## Call:
##  density.default(x = mtcars$disp)
## 
## Data: mtcars$disp (32 obs.); Bandwidth 'bw' = 55.77
## 
##        x                y            
##  Min.   :-96.22   Min.   :4.168e-06  
##  1st Qu.: 87.67   1st Qu.:2.925e-04  
##  Median :271.55   Median :1.415e-03  
##  Mean   :271.55   Mean   :1.357e-03  
##  3rd Qu.:455.43   3rd Qu.:2.158e-03  
##  Max.   :639.32   Max.   :3.099e-03
plot(density1)
polygon(density1, col="darkgreen", border="black")

Esto sería algo parecido a una curva de probabilidad en función de una distribución de datos. No es un histograma de los datos brutos que hemos hecho antes.

5.4 Histograma y curva normalidad

Podemos añadir lo anterior a nuestro histograma. En este caso optaremos por una curva de distribución normal de la siguiente manera:

hist(mtcars$disp, prob = TRUE, main = "Histograma y curva normalidad", ylab = "Densidad",col="cyan2")
primera <- seq(min(mtcars$disp), max(mtcars$disp), length = 40)
segunda <- dnorm(primera, mean = mean(mtcars$disp), sd = sd(mtcars$disp))
lines(primera, segunda, col = "blue", lwd = 2)

5.5 Curva de densidad

Y ahora añadimos una curva de densidad (parecido a lo que se ha hecho antes en una figura aislada). Para ello utilizamos lines:

hist(mtcars$disp, freq = FALSE, main = "Densidad", ylab = "Densidad",col="seagreen2")
lines(density(mtcars$disp), lwd = 2, col = 'purple4')

5.6 Histograma y boxplot

Se puede combinar en el histograma un boxplot con los valores de nuestra variable. Para ello hacemos lo siguiente:

hist(mtcars$disp, probability = TRUE, ylab = "", xlab="Valores de la variable", main = "",
     col = rgb(.4, .2, .1, alpha = 0.5), axes = FALSE)
axis(1) # Con esto añadimo sel eje horizontal
par(new = TRUE)
boxplot(mtcars$disp, horizontal = TRUE, axes = FALSE,
        lwd = 2.5, col = rgb(0, 0, 0, alpha = 0.3))

6 Medidas de dispersión

# Cálculo de medidas de dispersión
dispersion <- data.frame(
  Varianza = var(mpg),
  Desviación_Estándar = sd(mpg),
  Rango = diff(range(mpg)),
  IQR = IQR(mpg),
  Coef_Variación = sd(mpg)/mean(mpg)*100
)

print(round(dispersion, 2))
##   Varianza Desviación_Estándar Rango  IQR Coef_Variación
## 1    36.32                6.03  23.5 7.38             30

7 Análisis descriptivo avanzado

library(psych) 

# Descripción estadística detallada
descripcion <- describe(mtcars[, c("mpg", "hp", "wt", "qsec")])
descripcion
# Seleccionar columnas relevantes

descripcion_reducida <- data.frame(descripcion$n,descripcion$mean,descripcion$sd)

descripcion_reducida

8 Gráfico de dispersión

plot(mtcars$mpg,mtcars$disp, 
     xlab = "Millas por galón", 
     ylab = "Desplazamiento (pulgadas cúbicas)", 
     main = "Dispersión" )

plot(mpg ~ disp,data=mtcars,pch=16,
     xlab = "Millas por galón", 
     ylab = "Desplazamiento (pulgadas cúbicas)", 
     main = "Dispersión")
abline(lm(mpg ~ disp,data=mtcars),col="red")

9 gráfica de caja y bigotes

mtcars
boxplot(mtcars$mpg, main="Gráfica de caja y bigotes", ylab="mpg")

boxplot(mtcars$mpg, horizontal = T, col = "steelblue",main="Gráfica de caja y bigotes", xlab="mpg")

par(mfrow=c(2,1))
boxplot(mtcars$mpg, horizontal = TRUE, col = "steelblue", main = "Boxplot e Histograma")
hist(mtcars$mpg, col = "steelblue", border = "white", main = "", ylab = "Frecuencia")

boxplot(iris$Sepal.Length ~ iris$Species, col=c("red","blue","purple"),xlab = "Especies", ylab = "Longitudes de los sépalos (cm)",main="Boxplot")