El código completo de esta retroalimentación fue generado con el siguiente prompt (pueden probar con este prompt para ver los resultados):

“Proporcione un código en R para analizar el MPG Dataset, donde se verifica la normalidad y homogeneidad de las varianzas, se imputan valores faltantes y se aplican pruebas paramétricas (regresion MCO) o no paramétricas (Kruskal-Wallis) según corresponda. Además, realice una prueba de Dunn, cree un dataframe que describa el tipo de variable para cada columna del conjunto de datos de esta manera: Nombre_variable Tipo_variable

mpg Numérica continua

cylinders Categórica nominal

displacement Numérica continua

horsepower Numérica continua

weight Numérica continua

acceleration Numérica continua

model_year Categórica ordinal

origin Categórica nominal

name Categórica nominal

y, finalmente, grafique las asociaciones o correlaciones entre las variables.”

# Cargar librerias necesarias
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
library(car)
## Loading required package: carData
library(stats)

#cargar los datos
  
# Instalar el paquete 'readr' si no está instalado
if (!requireNamespace("readr", quietly = TRUE)) {
    install.packages("readr")
}

# Cargar el paquete 'readr'
library(readr)

# URL del conjunto de datos
url_dataset <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/mpg.csv"

# Importar el conjunto de datos desde internet
mpg_data <- read_csv(url_dataset)
## Rows: 398 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): origin, name
## dbl (7): mpg, cylinders, displacement, horsepower, weight, acceleration, mod...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Ver las primeras filas del conjunto de datos
head(mpg_data)
## # A tibble: 6 × 9
##     mpg cylinders displacement horsepower weight accelera…¹ model…² origin name 
##   <dbl>     <dbl>        <dbl>      <dbl>  <dbl>      <dbl>   <dbl> <chr>  <chr>
## 1    18         8          307        130   3504       12        70 usa    chev…
## 2    15         8          350        165   3693       11.5      70 usa    buic…
## 3    18         8          318        150   3436       11        70 usa    plym…
## 4    16         8          304        150   3433       12        70 usa    amc …
## 5    17         8          302        140   3449       10.5      70 usa    ford…
## 6    15         8          429        198   4341       10        70 usa    ford…
## # … with abbreviated variable names ¹​acceleration, ²​model_year
# Paso 1: Comprobar supuestos de normalidad y homogeneidad de varianza
# Prueba de Shapiro-Wilk para normalidad
shapiro_test <- shapiro.test(mpg_data$mpg)
print(shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  mpg_data$mpg
## W = 0.96797, p-value = 1.183e-07
# Prueba de Levene para homogeneidad de varianzas
levene_test <- car::leveneTest(mpg_data$mpg, mpg_data$cylinders)
## Warning in leveneTest.default(mpg_data$mpg, mpg_data$cylinders):
## mpg_data$cylinders coerced to factor.
print(levene_test)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   4  14.586 4.067e-11 ***
##       393                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Shapiro Wilks:

Asumiendo un 5% de significancia, hay evidencia estadística para rechazar la hipótesis nula. Es decir, no se cumple el supuesto de normalidad.

Levene:

Asumiendo un 5% de significancia, hay evidencia estadística para rechazar la hipótesis nula. Es decir, no se cumple el supuesto de homogeneidad de varianzas.

# Paso 2: Aplicar método paramétrico o no paramétrico según corresponda

# Imputar valores faltantes con la media
mpg_data_imputed <- data.frame(lapply(mpg_data, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))

if (shapiro_test$p.value > 0.05 && levene_test$p.value > 0.05) {
  # Método paramétrico
  model <- lm(mpg ~ ., data = mpg_data_imputed)
  summary(model)
  cat("R^2:", summary(model)$r.squared)
} else {
  # Método no paramétrico
  # Seleccionar solo columnas numéricas
  mpg_data_numeric <- mpg_data_imputed[sapply(mpg_data_imputed, is.numeric)]
  
  # Aplicar Kruskal-Wallis 
  kruskal_wallis_results <- lapply(mpg_data_numeric, function(x) kruskal.test(x ~ mpg_data_imputed$mpg))
  print(kruskal_wallis_results)
}
## $mpg
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 397, df = 128, p-value < 2.2e-16
## 
## 
## $cylinders
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 336.07, df = 128, p-value < 2.2e-16
## 
## 
## $displacement
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 333.59, df = 128, p-value < 2.2e-16
## 
## 
## $horsepower
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 328.03, df = 128, p-value < 2.2e-16
## 
## 
## $weight
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 344.25, df = 128, p-value < 2.2e-16
## 
## 
## $acceleration
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 192.87, df = 128, p-value = 0.0001853
## 
## 
## $model_year
## 
##  Kruskal-Wallis rank sum test
## 
## data:  x by mpg_data_imputed$mpg
## Kruskal-Wallis chi-squared = 254.35, df = 128, p-value = 2.188e-10

Asumiendo un 5 % de significancia (\(\alpha\) = 0.05), existe evidencia estadística para rechazar la hipótesis nula de Kruskall-Wallis. Es decir, hay diferencias significativas en las medianas de rangos de al menos un par de grupos. Esto sugiere que la variable independiente tiene un efecto en la variable dependiente, y que la relación entre estas variables no es puramente aleatoria. Para entender mejor qué grupos presentan diferencias significativas, se pueden realizar pruebas de comparaciones múltiples post-hoc, como la prueba de Dunn o la de Conover. Estas pruebas ayudarán a identificar qué pares de grupos tienen diferencias significativas en sus medias de rangos, y así será posible obtener una visión más detallada de cómo la variable independiente afecta la variable dependiente.

# Instalar y cargar el paquete FSA si aún no lo has hecho
if (!requireNamespace("FSA", quietly = TRUE)) {
  install.packages("FSA")
}
## Registered S3 methods overwritten by 'FSA':
##   method       from
##   confint.boot car 
##   hist.boot    car
library(FSA)
## Warning: package 'FSA' was built under R version 4.2.3
## ## FSA v0.9.4. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
## 
## Attaching package: 'FSA'
## The following object is masked from 'package:car':
## 
##     bootCase
# Asumiendo que 'cylinders' es el nombre de la columna que define los grupos en el conjunto de datos 'mpg_data_imputed'

# Convertir la columna en un factor
mpg_data_imputed$cylinders <- as.factor(mpg_data_imputed$cylinders)

# Realizar la prueba de Dunn
dunn_test_result <- dunnTest(mpg_data_imputed$mpg, g = mpg_data_imputed$cylinders, method = "bonferroni")

# Mostrar los resultados de la prueba de Dunn
print(dunn_test_result)
## Dunn (1964) Kruskal-Wallis multiple comparison
##   p-values adjusted with the Bonferroni method.
##    Comparison          Z      P.unadj        P.adj
## 1       3 - 4 -2.1825916 2.906590e-02 2.906590e-01
## 2       3 - 5 -1.1295182 2.586793e-01 1.000000e+00
## 3       4 - 5  0.4113949 6.807830e-01 1.000000e+00
## 4       3 - 6  0.1769948 8.595125e-01 1.000000e+00
## 5       4 - 6  9.1986730 3.623974e-20 3.623974e-19
## 6       5 - 6  1.6223843 1.047211e-01 1.000000e+00
## 7       3 - 8  1.6897320 9.107924e-02 9.107924e-01
## 8       4 - 8 16.2404322 2.610784e-59 2.610784e-58
## 9       5 - 8  2.9431531 3.248877e-03 3.248877e-02
## 10      6 - 8  5.2411885 1.595456e-07 1.595456e-06

En el caso de la prueba de Dunn si p-value < \(\alpha\) = 0.05 quiere decir que en ese par de comparación hay diferencias significativas en las medianas de rangos.

# Paso 3

# Crear un dataframe con la información dada
variables_df <- data.frame(
  Nombre_variable = c("mpg", "cylinders", "displacement", "horsepower", "weight", "acceleration", "model_year", "origin", "name"),
  Tipo_variable = c("Numérica continua", "Categórica nominal", "Numérica continua", "Numérica continua", "Numérica continua", "Numérica continua", "Categórica ordinal", "Categórica nominal", "Categórica nominal")
)

# Mostrar el dataframe
print(variables_df)
##   Nombre_variable      Tipo_variable
## 1             mpg  Numérica continua
## 2       cylinders Categórica nominal
## 3    displacement  Numérica continua
## 4      horsepower  Numérica continua
## 5          weight  Numérica continua
## 6    acceleration  Numérica continua
## 7      model_year Categórica ordinal
## 8          origin Categórica nominal
## 9            name Categórica nominal
# Paso 4: Aplicar análisis de correlación o asociación
if (shapiro_test$p.value > 0.05) {
  # Correlación de Pearson
  cor_matrix <- cor(mpg_data_numeric)
  print(cor_matrix)
} else {
  # Asociaciones no paramétricas
  # Rho de Spearman
  rho_spearman <- cor(mpg_data_numeric, method = "spearman")
  print(rho_spearman)
}
##                     mpg  cylinders displacement horsepower     weight
## mpg           1.0000000 -0.8218645   -0.8556920 -0.8431804 -0.8749474
## cylinders    -0.8218645  1.0000000    0.9118759  0.8086202  0.8733136
## displacement -0.8556920  0.9118759    1.0000000  0.8666701  0.9459856
## horsepower   -0.8431804  0.8086202    0.8666701  1.0000000  0.8686589
## weight       -0.8749474  0.8733136    0.9459856  0.8686589  1.0000000
## acceleration  0.4386775 -0.4741891   -0.4965119 -0.6475569 -0.4045504
## model_year    0.5734687 -0.3350124   -0.3052573 -0.3800855 -0.2770146
##              acceleration model_year
## mpg             0.4386775  0.5734687
## cylinders      -0.4741891 -0.3350124
## displacement   -0.4965119 -0.3052573
## horsepower     -0.6475569 -0.3800855
## weight         -0.4045504 -0.2770146
## acceleration    1.0000000  0.2746321
## model_year      0.2746321  1.0000000

Estas asociaciones no paramétricas de Spearman muestran las correlaciones de Spearman entre las variables del dataframe. La correlación de Spearman es una medida de la relación monótona entre dos variables, que varía entre -1 y 1. Un valor cercano a 1 indica una relación monótona positiva fuerte, mientras que un valor cercano a -1 indica una relación monótona negativa fuerte. Un valor cercano a 0 indica que no hay una relación monótona entre las variables. Acá hay algunos ejemplos:

1 mpg y cylinders:

Asociación negativa fuerte (-0.822). A medida que aumenta el número de cilindros, el consumo de combustible (mpg) tiende a disminuir.

2 mpg y displacement:

Asociación negativa fuerte (-0.856). A medida que aumenta el desplazamiento, el consumo de combustible (mpg) tiende a disminuir.

3 mpg y horsepower:

Asociación negativa fuerte (-0.843). A medida que aumenta la potencia, el consumo de combustible (mpg) tiende a disminuir.

4 mpg y weight:

Asociación negativa fuerte (-0.875). A medida que aumenta el peso, el consumo de combustible (mpg) tiende a disminuir.

5 mpg y acceleration:

Asociación positiva moderada (0.439). A medida que aumenta la aceleración, el consumo de combustible (mpg) tiende a aumentar ligeramente.

6 mpg y model_year:

Asociación positiva moderada (0.573). Los vehículos más nuevos tienden a tener un mayor consumo de combustible (mpg).

7 cylinders y displacement:

Asociación positiva fuerte (0.912). A medida que aumenta el número de cilindros, el desplazamiento también tiende a aumentar.

8 cylinders y horsepower:

Asociación positiva fuerte (0.809). A medida que aumenta el número de cilindros, la potencia también tiende a aumentar.

9 cylinders y weight:

Asociación positiva fuerte (0.873). A medida que aumenta el número de cilindros, el peso también tiende a aumentar.

# Paso 5: Graficar asociaciones o correlaciones

# Cargar la librería 'psych'
library(psych)
## 
## Attaching package: 'psych'
## The following object is masked from 'package:FSA':
## 
##     headtail
## The following object is masked from 'package:car':
## 
##     logit
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
if (shapiro_test$p.value > 0.05) {
  # Gráfico de dispersión para correlación de Pearson
  pairs.panels(mpg_data_numeric, 
               method = "pearson",
               hist.col = "#00AFBB",
               density = TRUE,
               ellipses = TRUE)
} else {
  # Gráfico de dispersión para Rho de Spearman
  pairs.panels(mpg_data_numeric, 
               method = "spearman",
               hist.col = "#00AFBB",
               density = TRUE,
               ellipses = TRUE)
}

Para cada par de variables, se muestra un gráfico de dispersión en la parte inferior de la diagonal y la correlación de Spearman en la parte superior. Las correlaciones de Spearman ya las hemos interpretado en una respuesta anterior.

Además, en la diagonal principal del gráfico, se mostrarán histogramas y curvas de densidad de cada variable. Los histogramas permiten visualizar la distribución de los datos para cada variable, mientras que las curvas de densidad proporcionan una estimación suavizada de la distribución.

El gráfico también incluye elipses en cada diagrama de dispersión. Las elipses representan la concentración de los datos en el espacio bidimensional. Si la elipse está inclinada hacia arriba (hacia la derecha), indica una correlación positiva entre las variables, mientras que si está inclinada hacia abajo (hacia la derecha), indica una correlación negativa. La estrechez de la elipse sugiere la fuerza de la correlación: una elipse más estrecha indica una correlación más fuerte entre las variables.