Responde a las siguientes preguntas

Si la distribución de los datos es asimétrica, ¿qué estadístico(s) emplearías?

Emplearía la mediana (valor central del conjunto ordenado) y la moda (valor que más se repite), ya que son más robustas. Además, también el IQR (mide la dispersión del 50% central de los datos). Los tres tienen menor impacto en datos asimétricos.

Volver al inicio

Cuando los datos presentan potenciales “outliers”, ¿qué estadístico(s) emplearías?

Emplearía la mediana y el rango IQR, ya que estos dos estadísticos son menos sensibles a datos extremos. Adicionalmente, el IQR es más estable y robusto.

Volver al inicio

Un boxplot, ¿permite identificar rápidamente la desviación estándar? ¿Por qué?

No, un boxplot no permite identificar la desviación estándar. Muestra la mediana, los cuartiles y posibles valores atípicos, pero no proporciona información sobre la dispersión de los datos.

Volver al inicio

¿Con qué otros nombres podemos referirnos a las variables cualitativas?

Se puede utilizar:
Variables Categóricas, denotan categorías (Estado civil: Soltero, casado, divorciado, viudo, unión libre)
Variables Nominales, variables cualitativas que no tienen un orden natural (Color: Rojo, Amarillo, Verde)
Variables Ordinales, variables cualitativas que si tienen un orden natural (Tamaño: Pequeña, mediana, grande)
Variables Atributivas, describen atributos (Estado Solido, Liquido, Gaseoso)

Volver al inicio

Dataset “Davis”: Calcula los estadísticos de 1 de las variables numéricas y de 1 de las variables factor

Attach del dataset Davis

data(Davis) 

data = Davis

attach(data)

data %>%
  head(5) %>%
  kable() %>%
  kable_styling("striped", full_width = FALSE, position = "center", font_size = 16) %>%
  row_spec(0, monospace = TRUE, bold = TRUE, color = "navy", background = "grey") %>%
  row_spec(1:ncol(data), color = "black", background = "lightgrey")
sex weight height repwt repht
M 77 182 77 180
F 58 161 51 159
F 53 161 54 158
M 68 177 70 175
F 59 157 59 155

Revisión de los datos

str(data)
## 'data.frame':    200 obs. of  5 variables:
##  $ sex   : Factor w/ 2 levels "F","M": 2 1 1 2 1 2 2 2 2 2 ...
##  $ weight: int  77 58 53 68 59 76 76 69 71 65 ...
##  $ height: int  182 161 161 177 157 170 167 186 178 171 ...
##  $ repwt : int  77 51 54 70 59 76 77 73 71 64 ...
##  $ repht : int  180 159 158 175 155 165 165 180 175 170 ...

Conversión de los datos Int a numeric

data$weight = as.numeric(data$weight)
data$height = as.numeric(data$height)
data$repwt = as.numeric(data$repwt)
data$repht = as.numeric(data$repht)

str(data)
## 'data.frame':    200 obs. of  5 variables:
##  $ sex   : Factor w/ 2 levels "F","M": 2 1 1 2 1 2 2 2 2 2 ...
##  $ weight: num  77 58 53 68 59 76 76 69 71 65 ...
##  $ height: num  182 161 161 177 157 170 167 186 178 171 ...
##  $ repwt : num  77 51 54 70 59 76 77 73 71 64 ...
##  $ repht : num  180 159 158 175 155 165 165 180 175 170 ...

Solo variables Numéricas

variables_numericas_df = data %>%
  select(where(is.numeric)) %>%
  names()

variables_numericas_df
## [1] "weight" "height" "repwt"  "repht"

Estadísticos de Solo una variable numérica: weight

media = round(mean(data$weight, na.rm = TRUE),2)
mediana = round(median(data$weight, na.rm = TRUE),2)
IQR = round(IQR(data$weight, na.rm = TRUE),2)

cat("La media es:", media, "\n")
## La media es: 65.8
cat("La mediana es:", mediana, "\n")
## La mediana es: 63
cat("El IQR es:", IQR, "\n")
## El IQR es: 19

Estadísticos de todas las variables numéricas

variables_numericas_df = data %>%
  select(where(is.numeric))


estadisticos_numericos_df = data.frame(Variable = character(), 
                                       Media = numeric(), 
                                       Mediana = numeric(), 
                                       IQR = numeric())

for (i in names(variables_numericas_df)) {
  
  media = round(mean(variables_numericas_df[[i]], na.rm = TRUE),2)
  mediana = round(median(variables_numericas_df[[i]], na.rm = TRUE),2)
  IQR = round(IQR(variables_numericas_df[[i]], na.rm = TRUE),2)
  
  temp_df <- data.frame(Variable = i,
                        Media = media, 
                        Mediana = mediana,
                        IQR = IQR)
  estadisticos_numericos_df <- rbind(estadisticos_numericos_df, temp_df)
}

# print(estadisticos_numericos_df)

estadisticos_numericos_df %>%
  head(5) %>%
  kable() %>%
  kable_styling("striped", full_width = FALSE, position = "center", font_size = 16) %>%
  row_spec(0, monospace = TRUE, bold = TRUE, color = "navy", background = "grey") %>%
  row_spec(1:ncol(estadisticos_numericos_df), color = "black", background = "lightgrey")
Variable Media Mediana IQR
weight 65.80 63.0 19.00
height 170.02 169.5 13.25
repwt 65.62 63.0 18.50
repht 168.50 168.0 14.50

Otra forma de impresión

for (i in 1:nrow(estadisticos_numericos_df)) {
  cat(paste("\n -------------------------\n",
            "Variable: ", estadisticos_numericos_df$Variable[i], "\n",
            "Media: ", round(estadisticos_numericos_df$Media[i], 2), "\n",
            "Mediana: ", round(estadisticos_numericos_df$Mediana[i], 2), "\n",
            "IQR: ", round(estadisticos_numericos_df$IQR[i], 2), "\n",
            "-------------------------\n"))
}
## 
##  -------------------------
##  Variable:  weight 
##  Media:  65.8 
##  Mediana:  63 
##  IQR:  19 
##  -------------------------
## 
##  -------------------------
##  Variable:  height 
##  Media:  170.02 
##  Mediana:  169.5 
##  IQR:  13.25 
##  -------------------------
## 
##  -------------------------
##  Variable:  repwt 
##  Media:  65.62 
##  Mediana:  63 
##  IQR:  18.5 
##  -------------------------
## 
##  -------------------------
##  Variable:  repht 
##  Media:  168.5 
##  Mediana:  168 
##  IQR:  14.5 
##  -------------------------

Otra forma de impresión

resultados_list <- list()

for (i in 1:nrow(estadisticos_numericos_df)) {
 variable <- estadisticos_numericos_df$Variable[i]
 Media <- estadisticos_numericos_df$Media[i]
 Mediana <- estadisticos_numericos_df$Mediana[i]
 IQR <- estadisticos_numericos_df$IQR[i]
 
 resultados_num <- paste("Para la Variable: ", variable, " la media es: ", Media, ", la Mediana es: ", Mediana, ", y el IQR es: ", IQR, ".")
 
 resultados_list[[i]] <- resultados_num
}

for(resultados_num in resultados_list){
  cat(resultados_num, "\n")
}
## Para la Variable:  weight  la media es:  65.8 , la Mediana es:  63 , y el IQR es:  19 . 
## Para la Variable:  height  la media es:  170.02 , la Mediana es:  169.5 , y el IQR es:  13.25 . 
## Para la Variable:  repwt  la media es:  65.62 , la Mediana es:  63 , y el IQR es:  18.5 . 
## Para la Variable:  repht  la media es:  168.5 , la Mediana es:  168 , y el IQR es:  14.5 .

Solo variables Factor

variables_factor_df = data %>%
  select(where(is.factor))

estadisticos_factor_df = data.frame()

for(i in names(variables_factor_df)){
  niveles <- levels(variables_factor_df[[i]])
  frecuencias <- table(variables_factor_df[[i]])
  
  df_temp <- data.frame(Variable = i,
                        Nivel = niveles,
                        Frecuencia = as.numeric(frecuencias))
  
  estadisticos_factor_df <- rbind(estadisticos_factor_df, df_temp)
}
    
print(estadisticos_factor_df)
##   Variable Nivel Frecuencia
## 1      sex     F        112
## 2      sex     M         88

Almacenar en Lista y mostrarlo

resultados_Factor_list <-list()

for(i in 1:nrow(estadisticos_factor_df)){
  variable <- estadisticos_factor_df$Variable[i]
  nivel <- estadisticos_factor_df$Nivel[i]
  frecuencia <- estadisticos_factor_df$Frecuencia[i]
  
  resultados_Factor <- paste("La frecuencia del nivel: ", nivel, " de la variable: ", variable, " es: ", frecuencia)
  
  resultados_Factor_list[[i]] <- resultados_Factor
}



for(resultado_factor in resultados_Factor_list){
  cat(resultado_factor, "\n")
}
## La frecuencia del nivel:  F  de la variable:  sex  es:  112 
## La frecuencia del nivel:  M  de la variable:  sex  es:  88
for(resultados_num in resultados_list){
  cat(resultados_num, "\n")
}
## Para la Variable:  weight  la media es:  65.8 , la Mediana es:  63 , y el IQR es:  19 . 
## Para la Variable:  height  la media es:  170.02 , la Mediana es:  169.5 , y el IQR es:  13.25 . 
## Para la Variable:  repwt  la media es:  65.62 , la Mediana es:  63 , y el IQR es:  18.5 . 
## Para la Variable:  repht  la media es:  168.5 , la Mediana es:  168 , y el IQR es:  14.5 .
for(resultado_factor in resultados_Factor_list){
  cat(resultado_factor, "\n")
}
## La frecuencia del nivel:  F  de la variable:  sex  es:  112 
## La frecuencia del nivel:  M  de la variable:  sex  es:  88

Volver al inicio

Dataset “Davis”: Comprueba gráficamente, para las variables numéricas, si existen potenciales outliers

data_long <- gather(variables_numericas_df, key = "variable", value = "value")

p <- ggplot(data_long, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot() + 
  theme_minimal() + 
  theme(axis.text.x = element_text(angle = 90, hjust =1),
        axis.text.y = element_blank(),  
        axis.ticks.y = element_blank()) +
  labs(title = "Boxplot para cada variable númerica",
       x = "Variable",
       y = "Valor")
p_interactive <- ggplotly(p) 

p_interactive

Identificacion de Outliers

outliers_df <- data.frame()

for (variable in colnames(variables_numericas_df)) {
  data <-variables_numericas_df[[variable]]
  data <- data[!is.na(data)]
  IQR <- IQR(data, na.rm = TRUE)
  
  Q1 <-quantile(data,.25, na.rm = TRUE)
  Q3 <-quantile(data,.75, na.rm = TRUE)
  
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR

  outliers <- data[data < lower_bound | data > upper_bound]
  
  if(length(outliers)>0){
    temp_df <- data.frame(variable = variable, outlier = outliers)
    outliers_df <- rbind(outliers_df, temp_df)
  }
  
}

outliers_df
##   variable outlier
## 1   weight     166
## 2   weight     119
## 3   weight     103
## 4   height      57
## 5    repwt     124
## 6    repwt     107
## 7    repht     200
resultados_out <- list()

for(i in 1:length(colnames(variables_numericas_df))){
  variable <- colnames(variables_numericas_df)[i]
  data <- variables_numericas_df[[variable]]
  data <- data[!is.na(data)]
  IQR <- IQR(data, na.rm = TRUE)
  
  Q1 <-quantile(data,.25, na.rm = TRUE)
  Q3 <-quantile(data,.75, na.rm = TRUE)
  
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR

  outliers <- data[data < lower_bound | data > upper_bound]
  
  if(length(outliers)>0){
    resultados_outliers <- paste("Los outliers de la variable:",sprintf("%6s", variable) , "\tson los valores: ", toString(outliers), "")
    resultados_out[[i]] <- resultados_outliers
  }
}

for(resultados_outliers in resultados_out){
  cat(resultados_outliers, "\n")
}
## Los outliers de la variable: weight  son los valores:  166, 119, 103  
## Los outliers de la variable: height  son los valores:  57  
## Los outliers de la variable:  repwt  son los valores:  124, 107  
## Los outliers de la variable:  repht  son los valores:  200

Volver al inicio

Dataset “Davis”: Comprueba si las variables numéricas siguen una distribución normal

comprobar_normalidad <-function(data){
  resultado <- data.frame()
  
  for (nombre_variable in names(data)) {
    if(is.numeric(data[[nombre_variable]])){
      test <-   shapiro.test(data[[nombre_variable]])
      es_normal <- ifelse(test$p.value > 0.05, "Si", "No")
      temp_df <- data.frame(variable = nombre_variable, p.value = test$p.value, Distribucion_normal = es_normal)
      resultado <- rbind(resultado, temp_df)
    }
  }
  
  return(resultado)
}

resultado <- comprobar_normalidad(variables_numericas_df)
print(resultado)
##   variable      p.value Distribucion_normal
## 1   weight 4.918615e-12                  No
## 2   height 3.310134e-17                  No
## 3    repwt 4.163644e-07                  No
## 4    repht 6.382651e-03                  No

Otra opcion Obtenido con ayuda de ChatGPT

# Calcular normalidad para todas las variables numéricas
test_normalidad <- lapply(variables_numericas_df, shapiro.test)

# Crear una tabla resumen con los resultados
resultados_normalidad <- data.frame(
  Variable = names(test_normalidad),
  W = sapply(test_normalidad, function(x) round(x$statistic, 5)),
  p_value = sapply(test_normalidad, function(x) round(x$p.value, 5)),
  Normalidad = sapply(test_normalidad, function(x) ifelse(x$p.value > 0.05, "Sí", "No"))
)

# Imprimir la tabla resumen
print("Resultados del test de Shapiro-Wilk para normalidad:")
## [1] "Resultados del test de Shapiro-Wilk para normalidad:"
print(resultados_normalidad)
##          Variable       W p_value Normalidad
## weight.W   weight 0.87074 0.00000         No
## height.W   height 0.74704 0.00000         No
## repwt.W     repwt 0.93776 0.00000         No
## repht.W     repht 0.97852 0.00638         No
# Generar gráficos Q-Q para cada variable numérica
par(mfrow = c(1, length(variables_numericas_df)), mar = c(4, 4, 2, 1)) # Configurar layout para múltiples gráficos
for (variable in names(variables_numericas_df)) {
  qqnorm(variables_numericas_df[[variable]], main = paste("Q-Q Plot de", variable))
  qqline(variables_numericas_df[[variable]], col = "red")
}

Volver al inicio

Dataset “Davis”: Dibuja un histograma para las variables numéricas

histograma <- function(df){
  columnas_numericas <- sapply(df, is.numeric)
  for(nombre_columna in names(df) [columnas_numericas]){
    p <- ggplot(df, aes_string(nombre_columna)) +
      geom_histogram(binwidth = 10, fill= "darkmagenta", color ="black") +
      labs(title  = paste("Histograma de", nombre_columna),
           x = nombre_columna,
           y = "Recurrencia")
    print(p)
  }
}

data = Davis
histograma(data)

Volver al inicio