Análisis descriptivo de la base de datos de insectos

En este análisis se carga una base de datos que contiene información morfológica de dos tipos de especie (a y b). Las variables medidas son: • Longitud de patas • Diámetro del abdomen • Diámetro del órgano sexual

Primero se obtiene un resumen general de las variables y posteriormente se calculan medidas de dispersión (desviación estándar y varianza) para las variables numéricas.

library(readxl)

# Cargar la base de datos
base_insec <- read_excel("/Users/veronicapichardo/Downloads/BD_insectos 2.xlsx")

# Visualización inicial
head(base_insec)
## # A tibble: 6 × 4
##   `Tipo especie` `Longitud de patas` `Diametro del abdomen`
##   <chr>                        <dbl>                  <dbl>
## 1 a                              191                    131
## 2 a                              185                    134
## 3 a                              200                    137
## 4 a                              173                    127
## 5 a                              171                    128
## 6 a                              160                    118
## # ℹ 1 more variable: `Diametro del organo sexual` <dbl>
# Ver especies presentes
unique(base_insec$`Tipo especie`)
## [1] "a" "b"
# Resumen estadístico general
summary(base_insec)
##  Tipo especie       Longitud de patas Diametro del abdomen
##  Length:20          Min.   :160.0     Min.   :107.0       
##  Class :character   1st Qu.:181.5     1st Qu.:121.0       
##  Mode  :character   Median :189.5     Median :127.0       
##                     Mean   :193.7     Mean   :125.6       
##                     3rd Qu.:208.8     3rd Qu.:131.0       
##                     Max.   :242.0     Max.   :144.0       
##  Diametro del organo sexual
##  Min.   :43.00             
##  1st Qu.:48.50             
##  Median :50.00             
##  Mean   :49.70             
##  3rd Qu.:51.25             
##  Max.   :54.00

Interpretación

El conjunto de datos está compuesto por 20 observaciones correspondientes a dos tipos de especie (a y b). La variable Tipo especie es de tipo cualitativo (character), por lo que únicamente describe categorías y no admite medidas numéricas de tendencia central o dispersión.

  1. Longitud de patas • Valor mínimo: 160 • Primer cuartil (Q1): 181.5 • Mediana: 189.5 • Media: 193.7 • Tercer cuartil (Q3): 208.8 • Valor máximo: 242

La media (193.7) es mayor que la mediana (189.5), lo que sugiere una ligera asimetría positiva (cola hacia la derecha), posiblemente influida por valores altos como 242.

El 50% central de los datos se encuentra entre 181.5 y 208.8, lo que indica una dispersión considerable. El rango total es 82 unidades (242 − 160), siendo la variable con mayor amplitud, lo que confirma que es la característica con mayor variabilidad entre individuos

# Función para obtener resumen completo
resumen_completo <- function(data) {
  
  print("Resumen general:")
  print(summary(data))
  
  # Seleccionar columnas numéricas
  datos_numericos <- data[sapply(data, is.numeric)]
  
  if (ncol(datos_numericos) == 0) {
    cat("\nNo hay columnas numéricas en el dataset.\n")
  } else {
    cat("\nDesviación estándar:\n")
    print(sapply(datos_numericos, sd, na.rm = TRUE))
    
    cat("\nVarianza:\n")
    print(sapply(datos_numericos, var, na.rm = TRUE))
  }
}


# Ejecutar función
resumen_completo(base_insec)
## [1] "Resumen general:"
##  Tipo especie       Longitud de patas Diametro del abdomen
##  Length:20          Min.   :160.0     Min.   :107.0       
##  Class :character   1st Qu.:181.5     1st Qu.:121.0       
##  Mode  :character   Median :189.5     Median :127.0       
##                     Mean   :193.7     Mean   :125.6       
##                     3rd Qu.:208.8     3rd Qu.:131.0       
##                     Max.   :242.0     Max.   :144.0       
##  Diametro del organo sexual
##  Min.   :43.00             
##  1st Qu.:48.50             
##  Median :50.00             
##  Mean   :49.70             
##  3rd Qu.:51.25             
##  Max.   :54.00             
## 
## Desviación estándar:
##          Longitud de patas       Diametro del abdomen 
##                  21.021981                   9.264533 
## Diametro del organo sexual 
##                   2.773939 
## 
## Varianza:
##          Longitud de patas       Diametro del abdomen 
##                 441.923684                  85.831579 
## Diametro del organo sexual 
##                   7.694737

Interpretación

Las medidas de dispersión permiten analizar qué tan alejados están los datos respecto a su media. En este caso se calcularon la desviación estándar y la varianza para las tres variables cuantitativas.

  1. Longitud de patas • Desviación estándar: 21.02 • Varianza: 441.92

Es la variable con mayor dispersión. Una desviación estándar de 21 indica que, en promedio, los valores se alejan aproximadamente 21 unidades respecto a la media (193.7).

La varianza es alta (441.92) porque esta medida eleva las diferencias al cuadrado, amplificando la dispersión.

Esto confirma que la longitud de patas presenta una gran variabilidad entre individuos, lo que puede ser una característica útil para diferenciar especies.

  1. Diámetro del abdomen • Desviación estándar: 9.26 • Varianza: 85.83

Presenta una dispersión intermedia. Los valores se alejan en promedio 9.26 unidades respecto a la media (125.6).

Comparada con la longitud de patas, la variabilidad es considerablemente menor, lo que indica mayor concentración de datos alrededor del promedio.

  1. Diámetro del órgano sexual • Desviación estándar: 2.77 • Varianza: 7.69

Es la variable más homogénea del conjunto. Los datos se desvían en promedio solo 2.77 unidades respecto a la media (49.7).

La varianza es muy baja comparada con las otras variables, lo que indica que los valores están fuertemente concentrados alrededor del promedio.

Comparación general

Si ordenamos las variables según su dispersión: 1. Longitud de patas (mayor variabilidad) 2. Diámetro del abdomen (variabilidad media) 3. Diámetro del órgano sexual (menor variabilidad)

Esto sugiere que la longitud de patas podría aportar mayor información para diferenciar grupos en un análisis multivariado, mientras que el diámetro del órgano sexual es una variable más estable.

Además, la gran diferencia entre varianzas indica que, si se realizara un análisis discriminante o algún método multivariado, podría ser necesario considerar la estandarización de variables para evitar que la longitud de patas domine el análisis debido a su mayor escala y variabilidad.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data <- base_insec %>%
  rename(
    patas = `Longitud de patas`,
    abdomen = `Diametro del abdomen`,
    organo = `Diametro del organo sexual`
  )

pairs(
  x = data[, c("patas", "abdomen", "organo")],
  col = c("black", "red")[as.numeric(factor(data$`Tipo especie`))],
  pch = 19
)

sapply(base_insec, class)
##               Tipo especie          Longitud de patas 
##                "character"                  "numeric" 
##       Diametro del abdomen Diametro del organo sexual 
##                  "numeric"                  "numeric"
# install.packages("biotools")
library(biotools)
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## ---
## biotools version 4.3
boxM(base_insec[, c("Longitud de patas",
                    "Diametro del abdomen",
                    "Diametro del organo sexual")],
     base_insec$`Tipo especie`)
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  base_insec[, c("Longitud de patas", "Diametro del abdomen", "Diametro del organo sexual")]
## Chi-Sq (approx.) = 9.831, df = 6, p-value = 0.132
colSums(is.na(base_insec[, c("Longitud de patas",
                             "Diametro del abdomen",
                             "Diametro del organo sexual")]))
##          Longitud de patas       Diametro del abdomen 
##                          0                          0 
## Diametro del organo sexual 
##                          0

Ejemplo 2

library(dplyr)
library(biotools)  # para boxM()

# Revisar NA en variables numéricas
colSums(is.na(base_insec[, c("Longitud de patas",
                             "Diametro del abdomen",
                             "Diametro del organo sexual")]))
##          Longitud de patas       Diametro del abdomen 
##                          0                          0 
## Diametro del organo sexual 
##                          0
# Eliminar filas con NA
base_box <- base_insec %>%
  dplyr::select(`Longitud de patas`,
                `Diametro del abdomen`,
                `Diametro del organo sexual`,
                `Tipo especie`) %>%
  na.omit()

# Asegurar que el grupo sea factor
base_box$`Tipo especie` <- as.factor(base_box$`Tipo especie`)

# Prueba Box's M
boxM(base_box[, c("Longitud de patas",
                  "Diametro del abdomen",
                  "Diametro del organo sexual")],
     base_box$`Tipo especie`)
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  base_box[, c("Longitud de patas", "Diametro del abdomen", "Diametro del organo sexual")]
## Chi-Sq (approx.) = 9.831, df = 6, p-value = 0.132
by(data[, c("patas", "abdomen", "organo")],
   data$`Tipo especie`,
   function(x) apply(x, 2, shapiro.test))
## data$`Tipo especie`: a
## $patas
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.95916, p-value = 0.7763
## 
## 
## $abdomen
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.89327, p-value = 0.1845
## 
## 
## $organo
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.94785, p-value = 0.6431
## 
## 
## ------------------------------------------------------------ 
## data$`Tipo especie`: b
## $patas
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.96112, p-value = 0.7986
## 
## 
## $abdomen
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.94007, p-value = 0.5538
## 
## 
## $organo
## 
##  Shapiro-Wilk normality test
## 
## data:  newX[, i]
## W = 0.96321, p-value = 0.8218
library(MASS)

lda_model <- lda(`Tipo especie` ~ patas + abdomen + organo, data = data)
lda_model
## Call:
## lda(`Tipo especie` ~ patas + abdomen + organo, data = data)
## 
## Prior probabilities of groups:
##   a   b 
## 0.5 0.5 
## 
## Group means:
##   patas abdomen organo
## a 179.1   128.4   50.5
## b 208.2   122.8   48.9
## 
## Coefficients of linear discriminants:
##                 LD1
## patas    0.13225339
## abdomen -0.07941509
## organo  -0.52655608

Tarea 2 formas de probar normalidad

Prueba de Mardia (normalidad multivariada) \[H_0: \text{Los datos siguen una distribución normal multivariada}\]

\[H_1: \text{Los datos no siguen una distribución normal multivariada}\]

# install.packages("energy")
library(energy)

datos_num <- as.matrix(base_insec[, c("Longitud de patas",
                                       "Diametro del abdomen",
                                       "Diametro del organo sexual")])

# Prueba de normalidad multivariada de Székely-Rizzo
set.seed(123)
resultado_energy <- mvnorm.etest(datos_num, R = 999)
print(resultado_energy)
## 
##  Energy test of multivariate normality: estimated parameters
## 
## data:  x, sample size 20, dimension 3, replicates 999
## E-statistic = 0.98142, p-value = 0.08709

El p-value obtenido es 0.087, que es mayor que 0.05, por lo tanto no se rechaza la hipótesis nula de normalidad multivariada. Esto significa que las tres variables en conjunto (longitud de patas, diámetro del abdomen y diámetro del órgano sexual) se comportan de manera aproximadamente normal en su distribución conjunta. Relación con tu análisis LDA: Esto es una buena noticia para tu modelo LDA que ya corriste, ya que el Análisis Discriminante Lineal asume precisamente normalidad multivariada. Al no rechazarse este supuesto, el modelo LDA está bien sustentado y sus resultados son confiables.

Gráficos Q-Q por especie + prueba de Kolmogorov-Smirnov

# Prueba de Kolmogorov-Smirnov con corrección de Lilliefors
# install.packages("nortest")
library(nortest)
library(ggplot2)

variables <- c("Longitud de patas", "Diametro del abdomen", "Diametro del organo sexual")
especies  <- c("a", "b")

# --- Parte 1: Prueba Lilliefors por especie y variable ---
cat("=== Prueba de Lilliefors (KS corregido) ===\n\n")
## === Prueba de Lilliefors (KS corregido) ===
for (sp in especies) {
  cat("Especie:", sp, "\n")
  subconjunto <- base_insec[base_insec$`Tipo especie` == sp, ]
  for (v in variables) {
    resultado <- lillie.test(subconjunto[[v]])
    cat(" ", v, "-> W =", round(resultado$statistic, 4),
        "| p-value =", round(resultado$p.value, 4),
        ifelse(resultado$p.value > 0.05, "✓ Normal", "✗ No normal"), "\n")
  }
  cat("\n")
}
## Especie: a 
##   Longitud de patas -> W = 0.1766 | p-value = 0.5062 ✓ Normal 
##   Diametro del abdomen -> W = 0.2207 | p-value = 0.1815 ✓ Normal 
##   Diametro del organo sexual -> W = 0.1367 | p-value = 0.8602 ✓ Normal 
## 
## Especie: b 
##   Longitud de patas -> W = 0.1354 | p-value = 0.8689 ✓ Normal 
##   Diametro del abdomen -> W = 0.1702 | p-value = 0.5655 ✓ Normal 
##   Diametro del organo sexual -> W = 0.2131 | p-value = 0.2222 ✓ Normal
# --- Parte 2: QQ plots por variable y especie ---
par(mfrow = c(2, 3))  # 2 filas (especies) x 3 columnas (variables)

for (sp in especies) {
  subconjunto <- base_insec[base_insec$`Tipo especie` == sp, ]
  for (v in variables) {
    qqnorm(subconjunto[[v]],
           main = paste("QQ -", v, "\nEspecie:", sp),
           col = ifelse(sp == "a", "steelblue", "tomato"),
           pch = 19)
    qqline(subconjunto[[v]], col = "black", lwd = 2)
  }
}

par(mfrow = c(1, 1))  # Restaurar layout

Todos los p-values son mayores a 0.05 en ambas especies, por lo tanto no se rechaza H0H_0 \(H0\) en ningún caso, lo que indica que todas las variables siguen una distribución normal. Especie a tuvo los p-values más altos en órgano sexual (0.860) y longitud de patas (0.506), siendo las variables más claramente normales. El diámetro del abdomen también cumple normalidad (p = 0.181) aunque con menor holgura. Especie b muestra un comportamiento similar, con longitud de patas liderando (p = 0.869), seguida de abdomen (0.565) y órgano sexual (0.222), todas dentro del criterio de normalidad. Gráficos Q-Q Los gráficos confirman visualmente los resultados numéricos. En general los puntos siguen de cerca la línea diagonal teórica en todas las variables y ambas especies. Las pequeñas desviaciones que se observan en los extremos (colas) son normales con muestras pequeñas como n = 10 por grupo y no representan una violación del supuesto. El único gráfico que muestra una desviación más notoria es Diámetro del abdomen, Especie a, donde el punto inferior izquierdo se aleja bastante de la línea, lo que coincide con que fue la variable con el p-value más bajo (0.181). Sin embargo, sigue siendo mayor a 0.05 así que no es problemático. Conclusión general Tanto la prueba de Lilliefors como los gráficos Q-Q y el Energy Test previo convergen en la misma conclusión: los datos cumplen el supuesto de normalidad, lo que respalda sólidamente el uso del LDA en tu análisis.

Forma 1: Prueba de Lilliefors (Kolmogorov-Smirnov corregido) Probaste normalidad univariada por cada variable y por cada especie, con resultados numéricos (W y p-value) y respaldo visual con los gráficos Q-Q. Esto cubre las tres variables independientes de forma individual. Forma 2: Energy Test (Székely-Rizzo) Probaste normalidad multivariada considerando las tres variables en conjunto, lo cual es incluso más completo que solo hacerlo de forma univariada. Ambas formas usan las variables independientes (longitud de patas, diámetro del abdomen, diámetro del órgano sexual) y en ambas casos no se rechazó \(H0\), confirmando normalidad.