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.
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.
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.
¿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)
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
## '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
## [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
## La mediana es: 63
## 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
## 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 .
## La frecuencia del nivel: F de la variable: sex es: 112
## La frecuencia del nivel: M de la variable: sex es: 88
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
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:"
## 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")
}
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)