9  Cálculos en R

9.1 Base de datos

El conjunto de datos IRIS es uno de los conjuntos de datos más utilizados en la literatura de estadística y aprendizaje automático. Fue introducido por Ronald Fisher en 1936 y contiene mediciones de cuatro características morfológicas de flores de tres especies distintas de iris: Iris setosa, Iris versicolor e Iris virginica. Este dataset es ampliamente empleado para ilustrar técnicas de análisis estadístico y clasificación supervisada (Fisher, 1936).

Referencia del dataset: Fisher, R. (1936). Iris [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C56C76

Acceso a recursos: El script completo con el ejemplo desarrollado y la base de datos IRIS pueden descargarse en el siguiente repositorio: https://github.com/Ludwing-MJ/MTCDPR_sin_agrupar

9.2 Configuración del Entorno de Trabajo

Antes de comenzar cualquier análisis, es fundamental configurar adecuadamente el entorno de trabajo. Esto implica instalar y cargar los paquetes necesarios, así como explorar y comprender la estructura del conjunto de datos que se utilizará. En esta sección, se detallarán los pasos para configurar el entorno de trabajo y realizar una exploración inicial del conjunto de datos.

Se recomienda crear un proyecto nuevo en R para organizar adecuadamente el trabajo de estadística descriptiva. Se sugiere seguir los siguientes pasos para establecer un entorno de trabajo ordenado:

  1. Crear una nueva carpeta en el directorio de trabajo denominada “Estadistica_Descriptiva_Iris”

  2. Crear un nuevo proyecto de R dentro de esta carpeta utilizando RStudio

  3. Crear un script donde se realizará y documentará el análisis estadístico

9.2.1 Instalación y Carga de Paquetes

Se procede a instalar y cargar los paquetes necesarios para el análisis estadístico descriptivo. Se utiliza la función condicional if(!require()) para verificar si el paquete está instalado antes de proceder con la instalación:

# Instalación y carga de paquetes necesarios
## Para manipulación y visualización de datos
if (!require(tidyverse)) install.packages("tidyverse")
## Para estadísticas descriptivas
if (!require(psych)) install.packages("psych")

9.2.2 Carga y exploración de los Datos

El dataset iris es un conjunto de datos clásico en estadística que contiene mediciones de características morfológicas de flores de tres especies del género Iris. Este dataset está incluido por defecto en R, lo que facilita su acceso para fines didácticos y de análisis estadístico.

# Cargar el dataset iris
data(iris)

# Explorar la estructura del dataset
str(iris)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

La función str() proporciona información sobre la estructura del dataset:

  1. object: Nombre del objeto a examinar
# Visualizar las primeras observaciones
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

La función head() muestra las primeras filas del dataset:

  1. x: Objeto del cual mostrar las primeras filas

  2. n: Número de filas a mostrar (por defecto 6)

# Resumen básico del dataset
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  
                
                
                

La función summary() proporciona un resumen estadístico básico:

  1. object: Objeto del cual generar el resumen

  2. maxsum: Número máximo de elementos a mostrar para factores (por defecto 7)

  3. digits: Número de dígitos significativos para valores numéricos

9.3 Medidas de Tendencia Central

9.3.1 Media Aritmética

La función mean() calcula la media aritmética de un vector numérico.

  1. x: Vector numérico del cual se calculará la media.

  2. trim: Fracción de valores a recortar de cada extremo del vector (por defecto 0).

  3. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

# Calcular la media para la longitud del sépalo
mean(iris$Sepal.Length)
[1] 5.843333

9.3.2 Mediana

La función median() calcula la mediana de un vector numérico.

  1. x: Vector numérico del cual se calculará la mediana.

  2. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

  3. type: Tipo de algoritmo para calcular la mediana (entero entre 1 y 9).

# Calcular la mediana para la longitud del sépalo
median(iris$Sepal.Length)
[1] 5.8

9.3.3 Moda

No existe una función base en R para calcular la moda directamente. Se puede crear una función personalizada para calcular la moda que maneja valores faltantes y múltiples modas:

# Función para calcular la moda
moda <- function(x) {
  # Eliminar valores NA
  x <- na.omit(x)

  # Verificar si el vector está vacío
  if (length(x) == 0) return(NA_character_)

  # Calcular la frecuencia de cada valor
  tabla <- table(x)

  # Identificar el/los valores con mayor frecuencia
  max_frecuencia <- max(tabla)
  modas <- names(tabla[tabla == max_frecuencia])

  # Verificar si todos los valores son únicos (sin moda)
  if (max_frecuencia == 1) return(NA_character_)

  # Retornar la moda como un string separado por comas
  return(paste(modas, collapse = ", "))
}

Una vez ya definida la función para calcular la moda (tarea que se realiza la cada vez que se abre el software y se desea cargar la función en el entorno de trabajo). Se procede a calcular la moda para la longitud del sépalo:

# Calcular la moda para la longitud del sépalo
moda(iris$Sepal.Length)
[1] "5"

9.4 Medidas de Dispersión

9.4.1 Rango

La función range() devuelve los valores mínimo y máximo de un vector numérico. La función diff() calcula la diferencia entre los valores máximo y mínimo.

  1. x: Vector numérico del cual se calculará el rango.

  2. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

# Obtener el valor minimo y máximo de la logitud del sépalo
range(iris$Sepal.Length)
[1] 4.3 7.9
# Calcular el rango para la longitud del sépalo
diff(range(iris$Sepal.Length))
[1] 3.6

9.4.2 Varianza

La función var() calcula la varianza de un vector numérico.

  1. x: Vector numérico del cual se calculará la varianza.

  2. y: Vector numérico opcional para calcular la covarianza.

  3. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

  4. use: Método para manejar valores faltantes (por defecto “everything”).

# Calcular la varianza para la longitud del sépalo
var(iris$Sepal.Length)
[1] 0.6856935

9.4.3 Desviación Estándar

La función sd() calcula la desviación estándar de un vector numérico.

  1. x: Vector numérico del cual se calculará la desviación estándar.

  2. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

# Calcular la desviación estándar para la longitud del sépalo
sd(iris$Sepal.Length)
[1] 0.8280661

9.4.4 Coeficiente de Variación

No existe una función base en R para calcular el coeficiente de variación directamente. Se puede crear una función personalizada o calcularse mediante operaciones aritméticas:

# Función para calcular el coeficiente de variación
cv <- function(x) {
  (sd(x) / mean(x)) * 100
}
# Calcular el coeficiente de variación para la longitud del sépalo
cv(iris$Sepal.Length)
[1] 14.17113
# Calcular el coeficiente de variación para la longitud del sépalo
(sd(iris$Sepal.Length) / mean(iris$Sepal.Length)) * 100
[1] 14.17113

9.5 Medidas de Posición Relativa

9.5.1 Cuartiles

La función quantile() calcula los cuartiles y otros percentiles de un vector numérico.

  1. x: Vector numérico del cual se calcularán los cuantiles.

  2. probs: Vector de probabilidades (0.25 para Q₁, 0.75 para Q₃).

  3. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

  4. type: Método de cálculo (entero entre 1 y 9, por defecto 7).

# Calcular cuartiles para la longitud del sépalo
quantile(iris$Sepal.Length, probs = c(0.25, 0.5, 0.75))
25% 50% 75% 
5.1 5.8 6.4 
# Calcular Q1 y Q3 por separado
Q1 <- quantile(iris$Sepal.Length, 0.25); Q1
25% 
5.1 
Q3 <- quantile(iris$Sepal.Length, 0.75); Q3
75% 
6.4 

9.5.2 Rango intercuartílico

La función IQR() calcula en automático el rango intercuartílico (Q1-Q3) de un vector numérico.

  1. x: Vector numérico del cual se calcularán los cuantiles.

  2. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

  3. type: Método de cálculo (entero entre 1 y 9, por defecto 7).

# Rango intercuartílico
IQR(iris$Sepal.Length)
[1] 1.3

9.5.3 Percentiles

La función quantile() también se utiliza para calcular percentiles.

  1. x: Vector numérico del cual se calcularán los cuantiles.

  2. probs: Vector de probabilidades (ej. 0.10 para el percentil 10, 0.90 para el percentil 90).

  3. na.rm: Valor lógico que indica si se deben remover los valores NA (por defecto FALSE).

  4. type: Método de cálculo (entero entre 1 y 9, por defecto 7).

# Calcular percentiles específicos
quantile(iris$Sepal.Length, c(0.10, 0.90))
10% 90% 
4.8 6.9 
# Calcular el percentil 95
quantile(iris$Sepal.Length, 0.95)
  95% 
7.255 

9.6 Análisis Completo con el Paquete psych

La función describe() del paquete psych calcula múltiples estadísticas descriptivas en una sola línea de código.

  1. x: Data frame o vector numérico.

  2. na.rm: Remover valores faltantes (por defecto TRUE).

  3. trim: Fracción para la media recortada (por defecto 0.1).

  4. skew: Calcular asimetría (por defecto TRUE).

  5. kurtosis: Calcular curtosis (por defecto TRUE).

  6. ranges: Calcular rangos (por defecto TRUE).

# Análisis descriptivo completo del dataset iris
describe(iris[,1:4])
             vars   n mean   sd median trimmed  mad min max range  skew
Sepal.Length    1 150 5.84 0.83   5.80    5.81 1.04 4.3 7.9   3.6  0.31
Sepal.Width     2 150 3.06 0.44   3.00    3.04 0.44 2.0 4.4   2.4  0.31
Petal.Length    3 150 3.76 1.77   4.35    3.76 1.85 1.0 6.9   5.9 -0.27
Petal.Width     4 150 1.20 0.76   1.30    1.18 1.04 0.1 2.5   2.4 -0.10
             kurtosis   se
Sepal.Length    -0.61 0.07
Sepal.Width      0.14 0.04
Petal.Length    -1.42 0.14
Petal.Width     -1.36 0.06

Interpretación de los Estimadores de la Función describe()

La función describe() proporciona los siguientes estimadores estadísticos:

  1. n: Número de observaciones válidas (sin valores faltantes)

  2. mean: Media aritmética de los datos

  3. sd: Desviación estándar muestral

  4. median: Mediana o percentil 50

  5. trimmed: Media recortada al 10% (elimina el 10% de valores extremos de cada cola)

  6. mad: Desviación absoluta mediana, medida robusta de dispersión

  7. min: Valor mínimo observado

  8. max: Valor máximo observado

  9. range: Diferencia entre el valor máximo y mínimo

  10. skew: Coeficiente de asimetría. Valores cercanos a 0 indican distribución simétrica, valores positivos indican asimetría hacia la derecha, valores negativos hacia la izquierda

  11. kurtosis: Coeficiente de curtosis. Valores cercanos a 0 indican distribución normal, valores positivos indican distribución leptocúrtica (más puntiaguda), valores negativos indican distribución platicúrtica (más aplanada)

  12. se: Error estándar de la media, calculado como sd/√n

9.7 Visualización de Datos

La visualización de datos es una parte esencial del análisis estadístico descriptivo, ya que permite identificar patrones, tendencias y anomalías en los datos de manera gráfica. A continuación, se presentan ejemplos de diferentes tipos de gráficos que se pueden utilizar para visualizar el dataset iris.

9.7.1 Diagrama de Caja (Boxplot)

El diagrama de caja es una herramienta útil para visualizar la distribución de una variable numérica y comparar distribuciones entre diferentes grupos. Este gráfico muestra la mediana, los cuartiles (Q1 y Q3), los valores atípicos y los bigotes (valores mínimo y máximo dentro de un rango razonable).

# Diagrama de caja para visualizar la longitud del sépalo por especie
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Distribución de la Longitud del Sépalo por Especie",
       y = "Longitud del Sépalo (cm)")

Interpretación:

  1. La línea dentro de la caja representa la mediana.

  2. Los bordes de la caja representan los cuartiles Q1 (25%) y Q3 (75%).

  3. Los bigotes se extienden hasta los valores mínimo y máximo dentro de 1.5 veces el rango intercuartílico (IQR).

  4. Los puntos fuera de los bigotes son considerados valores atípicos.

9.7.2 Histograma

El histograma es un gráfico que muestra la distribución de frecuencia de una variable numérica. Divide los datos en intervalos (bins) y muestra la frecuencia de observaciones en cada intervalo.

# Histograma de la longitud del sépalo
ggplot(iris, aes(x = Sepal.Length)) +
  geom_histogram(binwidth = 0.1, fill = "steelblue", color = "black") +
  theme_minimal() +
  labs(title = "Distribución de la Longitud del Sépalo",
       x = "Longitud del Sépalo (cm)",
       y = "Frecuencia")

Interpretación:

  1. El eje x representa los valores de la variable.

  2. El eje y representa la frecuencia de observaciones en cada intervalo.

  3. La forma del histograma puede indicar la simetría, asimetría y curtosis de la distribución.

9.7.3 Gráfico de Dispersión (Scatter Plot)

El gráfico de dispersión se utiliza para visualizar la relación entre dos variables numéricas. Cada punto en el gráfico representa una observación, con la posición del punto determinada por los valores de las dos variables.

# Gráfico de dispersión entre la longitud y el ancho del sépalo
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point() +
  theme_minimal() +
  labs(title = "Relación entre Longitud y Ancho del Sépalo",
       x = "Longitud del Sépalo (cm)",
       y = "Ancho del Sépalo (cm)")

Interpretación:

  1. El gráfico muestra la relación entre dos variables.

  2. Los patrones en el gráfico pueden indicar correlación positiva, negativa o ninguna correlación.

  3. Se pueden utilizar diferentes colores o formas para representar diferentes grupos.