Este documento es una versión complementaria en RMarkdown del notebook maestro desarrollado para las semanas 1, 2, 3 y 4 de la asignatura Estadística Aplicada con Python y R. Está pensado para que usted lo copie, lo adapte en Posit Cloud, lo renderice a HTML, PDF y Word, y posteriormente lo publique en RPubs.
La secuencia conserva el mismo hilo pedagógico del notebook:
Se trabaja con dos conjuntos de datos:
Soils del paquete
carData, útil para mostrar acceso a datasets de R y
análisis exploratorio de variables físicas y químicas del suelo.acero.csv, útil para trabajar tipos de
datos, variables productivas, consumo energético y relaciones entre
variables en un contexto aplicado..Rmd.acero.csv.paquetes <- c(
"tidyverse",
"carData",
"PerformanceAnalytics",
"moments",
"ggplot2"
)
instalados <- rownames(installed.packages())
faltantes <- setdiff(paquetes, instalados)
if (length(faltantes) > 0) {
install.packages(faltantes, dependencies = TRUE)
}
invisible(lapply(paquetes, library, character.only = TRUE))
Se recomienda que el estudiante no espere al final del trabajo. Después de completar cada gran sección, debe guardar una nueva versión del archivo en su repositorio. Una sugerencia de nombres es:
01_semana1_fundamentos.Rmd02_semana2_visualizacion.Rmd03_semana3_eda_univariado.Rmd04_semana4_eda_bivariado.RmdCada vez que el estudiante termine un chunk relevante, puede usar este prompt:
Actúa como tutor experto en R y estadística aplicada.
Explícame línea por línea el siguiente código en R.
Indica: 1. qué hace cada línea,
2. por qué se usa,
3. qué entrada recibe,
4. qué salida produce,
5. cómo interpretar el resultado en contexto de ingeniería.
Además, si encuentras una mejora de estilo o claridad, sugiérela sin cambiar el propósito del código.
El flujo sugerido es:
.Rmd.data("Soils", package = "carData")
soils <- Soils
glimpse(soils)
#> Rows: 48
#> Columns: 14
#> $ Group <fct> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6,…
#> $ Contour <fct> Top, Top, Top, Top, Top, Top, Top, Top, Top, Top, Top, Top, To…
#> $ Depth <fct> 0-10, 0-10, 0-10, 0-10, 10-30, 10-30, 10-30, 10-30, 30-60, 30-…
#> $ Gp <fct> T0, T0, T0, T0, T1, T1, T1, T1, T3, T3, T3, T3, T6, T6, T6, T6…
#> $ Block <fct> 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1,…
#> $ pH <dbl> 5.40, 5.65, 5.14, 5.14, 5.14, 5.10, 4.70, 4.46, 4.37, 4.39, 4.…
#> $ N <dbl> 0.188, 0.165, 0.260, 0.169, 0.164, 0.094, 0.100, 0.112, 0.112,…
#> $ Dens <dbl> 0.92, 1.04, 0.95, 1.10, 1.12, 1.22, 1.52, 1.47, 1.07, 1.54, 1.…
#> $ P <int> 215, 208, 300, 248, 174, 129, 117, 170, 121, 115, 112, 117, 12…
#> $ Ca <dbl> 16.35, 12.25, 13.02, 11.92, 14.17, 8.55, 8.74, 9.49, 8.85, 4.7…
#> $ Mg <dbl> 7.65, 5.15, 5.68, 7.88, 8.12, 6.92, 8.16, 9.16, 10.35, 6.91, 7…
#> $ K <dbl> 0.72, 0.71, 0.68, 1.09, 0.70, 0.81, 0.39, 0.70, 0.74, 0.77, 0.…
#> $ Na <dbl> 1.14, 0.94, 0.60, 1.01, 2.17, 2.67, 3.32, 3.76, 5.74, 5.85, 5.…
#> $ Conduc <dbl> 1.09, 1.35, 1.41, 1.64, 1.85, 3.18, 4.16, 5.14, 5.73, 6.45, 8.…
El dataset Soils contiene observaciones de
características físicas y químicas del suelo en un diseño en bloques al
azar con factores como Contour, Depth
y Block. Resulta apropiado para enseñar identificación
de tipos de variables, descripción inicial, visualización y relaciones
entre variables.
Importante: ubique
acero.csven el mismo directorio del proyecto de Posit Cloud o ajuste la ruta en el chunk.
acero_raw <- read.csv("acero.csv", stringsAsFactors = FALSE)
glimpse(acero_raw)
#> Rows: 117
#> Columns: 20
#> $ consumo <chr> "135,31", "84,08", "131,62", "90,46", "120,04", "153,68", …
#> $ pr.tbc <int> 6840, 443, 7270, 5031, 9365, 9281, 3223, 10490, 7394, 8654…
#> $ pr.cc <int> 830, 903, 572, 694, 1054, 1003, 1118, 1077, 1204, 851, 369…
#> $ pr.ca <int> 0, 58, 36, 122, 157, 172, 0, 179, 167, 0, 32, 0, 0, 0, 0, …
#> $ pr.galv1 <int> 579, 611, 982, 896, 403, 605, 643, 737, 580, 828, 777, 626…
#> $ pr.galv2 <int> 1401, 1636, 1963, 1568, 1480, 1525, 1424, 1333, 934, 1326,…
#> $ pr.pint <int> 0, 717, 243, 0, 0, 473, 732, 93, 247, 607, 0, 0, 0, 561, 6…
#> $ linea <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"…
#> $ hora <chr> "1º", "2º", "3º", "4º", "5º", "6º", "7º", "8º", "1º", "2º"…
#> $ temperatura <chr> "Alta", "Alta", "Baja", "Baja", "Baja", "Baja", "Alta", "A…
#> $ averias <chr> "Si", "No", "No", "No", "No", "Si", "No", "No", "No", "Si"…
#> $ naverias <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ sistema <chr> "OFF", "OFF", "OFF", "ON", "OFF", "OFF", "OFF", "ON", "ON"…
#> $ ProdTotal <int> 11266, 7251, 11066, 8311, 12459, 13059, 8555, 18253, 11697…
#> $ NOx <chr> "0,49", "0,0725", "1,49", "1,715", "0,465", "2,4175", "1,0…
#> $ CO <chr> "3,545", "2,895", "5,0075", "2,16", "4,845", "3,6725", "2,…
#> $ COV <chr> "0,545", "0,425", "0,69", "0,36", "0,6625", "0,575", "0,44…
#> $ SO2 <chr> "0,038", "0,047", "0,062", "0,066", "0,086", "0,056", "0,0…
#> $ CO2 <chr> "101,5", "63,565", "98,8175", "70,1825", "88,53", "116,537…
#> $ N2O <chr> "6,35", "2,23", "5,99", "3,66", "6,06", "6,15", "7,75", "9…
acero.csvEn este archivo aparecen columnas numéricas con coma decimal. Por ello se realiza una transformación controlada para convertirlas correctamente a formato numérico.
acero <- acero_raw
columnas_decimal_coma <- c("consumo", "NOx", "CO", "COV", "SO2", "CO2", "N2O")
acero[columnas_decimal_coma] <- lapply(
acero[columnas_decimal_coma],
function(x) as.numeric(gsub(",", ".", x, fixed = TRUE))
)
acero <- acero %>%
mutate(
linea = as.factor(linea),
hora = as.factor(hora),
temperatura = as.factor(temperatura),
averias = as.factor(averias),
sistema = as.factor(sistema)
)
glimpse(acero)
#> Rows: 117
#> Columns: 20
#> $ consumo <dbl> 135.31, 84.08, 131.62, 90.46, 120.04, 153.68, 99.09, 226.3…
#> $ pr.tbc <int> 6840, 443, 7270, 5031, 9365, 9281, 3223, 10490, 7394, 8654…
#> $ pr.cc <int> 830, 903, 572, 694, 1054, 1003, 1118, 1077, 1204, 851, 369…
#> $ pr.ca <int> 0, 58, 36, 122, 157, 172, 0, 179, 167, 0, 32, 0, 0, 0, 0, …
#> $ pr.galv1 <int> 579, 611, 982, 896, 403, 605, 643, 737, 580, 828, 777, 626…
#> $ pr.galv2 <int> 1401, 1636, 1963, 1568, 1480, 1525, 1424, 1333, 934, 1326,…
#> $ pr.pint <int> 0, 717, 243, 0, 0, 473, 732, 93, 247, 607, 0, 0, 0, 561, 6…
#> $ linea <fct> A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A…
#> $ hora <fct> 1º, 2º, 3º, 4º, 5º, 6º, 7º, 8º, 1º, 2º, 3º, 4º, 5º, 6º, 7º…
#> $ temperatura <fct> Alta, Alta, Baja, Baja, Baja, Baja, Alta, Alta, Alta, Alta…
#> $ averias <fct> Si, No, No, No, No, Si, No, No, No, Si, Si, No, No, No, No…
#> $ naverias <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ sistema <fct> OFF, OFF, OFF, ON, OFF, OFF, OFF, ON, ON, OFF, ON, ON, ON,…
#> $ ProdTotal <int> 11266, 7251, 11066, 8311, 12459, 13059, 8555, 18253, 11697…
#> $ NOx <dbl> 0.4900, 0.0725, 1.4900, 1.7150, 0.4650, 2.4175, 1.0250, 1.…
#> $ CO <dbl> 3.5450, 2.8950, 5.0075, 2.1600, 4.8450, 3.6725, 2.8450, 9.…
#> $ COV <dbl> 0.5450, 0.4250, 0.6900, 0.3600, 0.6625, 0.5750, 0.4400, 1.…
#> $ SO2 <dbl> 0.038, 0.047, 0.062, 0.066, 0.086, 0.056, 0.070, 0.103, 0.…
#> $ CO2 <dbl> 101.5000, 63.5650, 98.8175, 70.1825, 88.5300, 116.5375, 74…
#> $ N2O <dbl> 6.35, 2.23, 5.99, 3.66, 6.06, 6.15, 7.75, 9.09, 8.69, 5.00…
summary(acero)
#> consumo pr.tbc pr.cc pr.ca
#> Min. : 17.50 Min. : 0 Min. : 0.0 Min. : 0.0
#> 1st Qu.: 99.09 1st Qu.: 5950 1st Qu.: 0.0 1st Qu.: 0.0
#> Median :140.07 Median : 8808 Median : 80.0 Median : 0.0
#> Mean :139.46 Mean : 7568 Mean : 295.5 Mean :124.5
#> 3rd Qu.:182.48 3rd Qu.: 9734 3rd Qu.: 582.0 3rd Qu.:248.0
#> Max. :290.72 Max. :10979 Max. :1204.0 Max. :677.0
#>
#> pr.galv1 pr.galv2 pr.pint linea hora temperatura
#> Min. : 0.0 Min. : 0 Min. : 0.0 A:39 1º :15 Alta :46
#> 1st Qu.: 0.0 1st Qu.: 933 1st Qu.: 0.0 B:39 2º :15 Baja :38
#> Median :432.0 Median :1360 Median : 0.0 C:39 3º :15 Media:33
#> Mean :402.8 Mean :1160 Mean :188.6 4º :15
#> 3rd Qu.:698.0 3rd Qu.:1567 3rd Qu.:394.0 5º :15
#> Max. :982.0 Max. :1963 Max. :898.0 6º :15
#> (Other):27
#> averias naverias sistema ProdTotal NOx
#> No:89 Min. :0.0000 OFF:59 Min. : 2187 Min. :0.0125
#> Si:28 1st Qu.:0.0000 ON :58 1st Qu.: 9023 1st Qu.:0.7750
#> Median :0.0000 Median :11860 Median :1.1200
#> Mean :0.6752 Mean :11842 Mean :1.1961
#> 3rd Qu.:0.0000 3rd Qu.:14908 3rd Qu.:1.6550
#> Max. :4.0000 Max. :23202 Max. :2.7750
#>
#> CO COV SO2 CO2
#> Min. : 0.250 Min. :0.0250 Min. :0.0010 Min. : 14.29
#> 1st Qu.: 2.928 1st Qu.:0.4525 1st Qu.:0.0540 1st Qu.: 73.72
#> Median : 4.107 Median :0.6250 Median :0.0660 Median :105.31
#> Mean : 4.377 Mean :0.6210 Mean :0.0665 Mean :104.63
#> 3rd Qu.: 5.585 3rd Qu.:0.7850 3rd Qu.:0.0800 3rd Qu.:134.88
#> Max. :10.170 Max. :1.2550 Max. :0.1270 Max. :218.31
#>
#> N2O
#> Min. : 0.870
#> 1st Qu.: 4.710
#> Median : 6.170
#> Mean : 6.115
#> 3rd Qu.: 7.580
#> Max. :11.140
#>
Este paso permite enseñar una idea fundamental: antes de analizar, hay que asegurar que los tipos de datos sean correctos. Si una variable numérica entra como texto, los resultados estadísticos y gráficos serán erróneos o imposibles de calcular.
En esta parte se trabaja la base conceptual del curso: tipos de datos, escalas de medición, población, muestra, variables y estadísticos descriptivos básicos. La guía de la semana 1 enfatiza que el software calcula, pero el ingeniero interpreta.
class(soils)
#> [1] "data.frame"
dim(soils)
#> [1] 48 14
names(soils)
#> [1] "Group" "Contour" "Depth" "Gp" "Block" "pH" "N"
#> [8] "Dens" "P" "Ca" "Mg" "K" "Na" "Conduc"
sapply(soils, class)
#> Group Contour Depth Gp Block pH N Dens
#> "factor" "factor" "factor" "factor" "factor" "numeric" "numeric" "numeric"
#> P Ca Mg K Na Conduc
#> "integer" "numeric" "numeric" "numeric" "numeric" "numeric"
sapply(acero, class)
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2
#> "numeric" "integer" "integer" "integer" "integer" "integer"
#> pr.pint linea hora temperatura averias naverias
#> "integer" "factor" "factor" "factor" "factor" "integer"
#> sistema ProdTotal NOx CO COV SO2
#> "factor" "integer" "numeric" "numeric" "numeric" "numeric"
#> CO2 N2O
#> "numeric" "numeric"
Soils aparecen variables categóricas y
numéricas.acero también se distinguen variables de producción,
consumo, emisiones y factores categóricos del proceso.summary(soils)
#> Group Contour Depth Gp Block pH
#> 1 : 4 Depression:16 0-10 :12 D0 : 4 1:12 Min. :3.740
#> 2 : 4 Slope :16 10-30:12 D1 : 4 2:12 1st Qu.:4.058
#> 3 : 4 Top :16 30-60:12 D3 : 4 3:12 Median :4.545
#> 4 : 4 60-90:12 D6 : 4 4:12 Mean :4.669
#> 5 : 4 S0 : 4 3rd Qu.:5.140
#> 6 : 4 S1 : 4 Max. :6.670
#> (Other):24 (Other):24
#> N Dens P Ca
#> Min. :0.03000 Min. :0.780 Min. : 79.0 Min. : 3.820
#> 1st Qu.:0.05075 1st Qu.:1.127 1st Qu.:108.8 1st Qu.: 5.040
#> Median :0.08450 Median :1.400 Median :131.0 Median : 7.305
#> Mean :0.10194 Mean :1.316 Mean :166.2 Mean : 8.029
#> 3rd Qu.:0.12925 3rd Qu.:1.502 3rd Qu.:214.2 3rd Qu.: 9.735
#> Max. :0.29800 Max. :1.600 Max. :445.0 Max. :16.350
#>
#> Mg K Na Conduc
#> Min. : 5.150 Min. :0.1400 Min. : 0.600 Min. : 0.670
#> 1st Qu.: 7.537 1st Qu.:0.2750 1st Qu.: 2.545 1st Qu.: 2.790
#> Median : 8.515 Median :0.4250 Median : 5.520 Median : 6.635
#> Mean : 8.465 Mean :0.4662 Mean : 5.600 Mean : 6.589
#> 3rd Qu.: 9.648 3rd Qu.:0.6425 3rd Qu.: 8.355 3rd Qu.: 9.852
#> Max. :10.960 Max. :1.0900 Max. :11.040 Max. :13.320
#>
summary(acero)
#> consumo pr.tbc pr.cc pr.ca
#> Min. : 17.50 Min. : 0 Min. : 0.0 Min. : 0.0
#> 1st Qu.: 99.09 1st Qu.: 5950 1st Qu.: 0.0 1st Qu.: 0.0
#> Median :140.07 Median : 8808 Median : 80.0 Median : 0.0
#> Mean :139.46 Mean : 7568 Mean : 295.5 Mean :124.5
#> 3rd Qu.:182.48 3rd Qu.: 9734 3rd Qu.: 582.0 3rd Qu.:248.0
#> Max. :290.72 Max. :10979 Max. :1204.0 Max. :677.0
#>
#> pr.galv1 pr.galv2 pr.pint linea hora temperatura
#> Min. : 0.0 Min. : 0 Min. : 0.0 A:39 1º :15 Alta :46
#> 1st Qu.: 0.0 1st Qu.: 933 1st Qu.: 0.0 B:39 2º :15 Baja :38
#> Median :432.0 Median :1360 Median : 0.0 C:39 3º :15 Media:33
#> Mean :402.8 Mean :1160 Mean :188.6 4º :15
#> 3rd Qu.:698.0 3rd Qu.:1567 3rd Qu.:394.0 5º :15
#> Max. :982.0 Max. :1963 Max. :898.0 6º :15
#> (Other):27
#> averias naverias sistema ProdTotal NOx
#> No:89 Min. :0.0000 OFF:59 Min. : 2187 Min. :0.0125
#> Si:28 1st Qu.:0.0000 ON :58 1st Qu.: 9023 1st Qu.:0.7750
#> Median :0.0000 Median :11860 Median :1.1200
#> Mean :0.6752 Mean :11842 Mean :1.1961
#> 3rd Qu.:0.0000 3rd Qu.:14908 3rd Qu.:1.6550
#> Max. :4.0000 Max. :23202 Max. :2.7750
#>
#> CO COV SO2 CO2
#> Min. : 0.250 Min. :0.0250 Min. :0.0010 Min. : 14.29
#> 1st Qu.: 2.928 1st Qu.:0.4525 1st Qu.:0.0540 1st Qu.: 73.72
#> Median : 4.107 Median :0.6250 Median :0.0660 Median :105.31
#> Mean : 4.377 Mean :0.6210 Mean :0.0665 Mean :104.63
#> 3rd Qu.: 5.585 3rd Qu.:0.7850 3rd Qu.:0.0800 3rd Qu.:134.88
#> Max. :10.170 Max. :1.2550 Max. :0.1270 Max. :218.31
#>
#> N2O
#> Min. : 0.870
#> 1st Qu.: 4.710
#> Median : 6.170
#> Mean : 6.115
#> 3rd Qu.: 7.580
#> Max. :11.140
#>
Aquí el estudiante debe observar:
soils_num <- soils %>% select(where(is.numeric))
acero_num <- acero %>% select(where(is.numeric))
names(soils_num)
#> [1] "pH" "N" "Dens" "P" "Ca" "Mg" "K" "Na"
#> [9] "Conduc"
names(acero_num)
#> [1] "consumo" "pr.tbc" "pr.cc" "pr.ca" "pr.galv1" "pr.galv2"
#> [7] "pr.pint" "naverias" "ProdTotal" "NOx" "CO" "COV"
#> [13] "SO2" "CO2" "N2O"
Pídale al chatbot que clasifique cada variable como:
y que la relacione con una decisión de ingeniería.
estadisticos_soils <- soils_num %>%
summarise(across(
everything(),
list(
media = mean,
mediana = median,
sd = sd,
varianza = var,
minimo = min,
maximo = max
),
na.rm = TRUE
))
estadisticos_acero <- acero_num %>%
summarise(across(
everything(),
list(
media = mean,
mediana = median,
sd = sd,
varianza = var,
minimo = min,
maximo = max
),
na.rm = TRUE
))
estadisticos_soils
estadisticos_acero
Al terminar esta sección, guarde una copia del trabajo como:
01_semana1_fundamentos.Rmd
La guía de la semana 2 plantea que la visualización no es adorno, sino herramienta de análisis. Aquí se ilustran histogramas, boxplots y scatterplots, y se insiste en la interpretación de forma, centro, dispersión y posibles anomalías.
ggplot(soils, aes(x = pH)) +
geom_histogram(bins = 10, fill = "steelblue", color = "black") +
labs(
title = "Histograma de pH en Soils",
x = "pH",
y = "Frecuencia"
) +
theme_minimal()
Analizar:
ggplot(acero, aes(x = consumo)) +
geom_histogram(bins = 12, fill = "darkorange", color = "black") +
labs(
title = "Histograma del consumo energético",
x = "Consumo (MWh)",
y = "Frecuencia"
) +
theme_minimal()
Este gráfico permite discutir si el consumo energético se concentra en ciertos rangos operativos y si existen valores inusualmente bajos o altos que ameriten revisión.
ggplot(soils, aes(x = Contour, y = pH, fill = Contour)) +
geom_boxplot() +
labs(
title = "Boxplot de pH según contorno",
x = "Contorno",
y = "pH"
) +
theme_minimal()
Se puede discutir:
ggplot(acero, aes(x = linea, y = consumo, fill = linea)) +
geom_boxplot() +
labs(
title = "Consumo energético según línea de producción",
x = "Línea",
y = "Consumo (MWh)"
) +
theme_minimal()
El estudiante puede relacionar este gráfico con eficiencia operativa y variabilidad del proceso entre líneas.
ggplot(soils, aes(x = Ca, y = Mg, color = Contour)) +
geom_point(size = 2) +
labs(
title = "Relación entre Ca y Mg",
x = "Calcio",
y = "Magnesio"
) +
theme_minimal()
ggplot(acero, aes(x = ProdTotal, y = consumo, color = linea)) +
geom_point(size = 2) +
labs(
title = "Producción total vs consumo energético",
x = "Producción total",
y = "Consumo"
) +
theme_minimal()
Al terminar esta sección, guarde una nueva versión como:
02_semana2_visualizacion.Rmd
La guía de la semana 3 introduce el EDA como proceso estructurado. Ya no se trata solo de “mirar datos”, sino de seguir una secuencia: estructura, faltantes, análisis univariado, forma de distribución y detección de atípicos.
dim(soils)
#> [1] 48 14
str(soils)
#> 'data.frame': 48 obs. of 14 variables:
#> $ Group : Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 2 2 2 2 3 3 ...
#> $ Contour: Factor w/ 3 levels "Depression","Slope",..: 3 3 3 3 3 3 3 3 3 3 ...
#> $ Depth : Factor w/ 4 levels "0-10","10-30",..: 1 1 1 1 2 2 2 2 3 3 ...
#> $ Gp : Factor w/ 12 levels "D0","D1","D3",..: 9 9 9 9 10 10 10 10 11 11 ...
#> $ Block : Factor w/ 4 levels "1","2","3","4": 1 2 3 4 1 2 3 4 1 2 ...
#> $ pH : num 5.4 5.65 5.14 5.14 5.14 5.1 4.7 4.46 4.37 4.39 ...
#> $ N : num 0.188 0.165 0.26 0.169 0.164 0.094 0.1 0.112 0.112 0.058 ...
#> $ Dens : num 0.92 1.04 0.95 1.1 1.12 1.22 1.52 1.47 1.07 1.54 ...
#> $ P : int 215 208 300 248 174 129 117 170 121 115 ...
#> $ Ca : num 16.4 12.2 13 11.9 14.2 ...
#> $ Mg : num 7.65 5.15 5.68 7.88 8.12 ...
#> $ K : num 0.72 0.71 0.68 1.09 0.7 0.81 0.39 0.7 0.74 0.77 ...
#> $ Na : num 1.14 0.94 0.6 1.01 2.17 2.67 3.32 3.76 5.74 5.85 ...
#> $ Conduc : num 1.09 1.35 1.41 1.64 1.85 3.18 4.16 5.14 5.73 6.45 ...
dim(acero)
#> [1] 117 20
str(acero)
#> 'data.frame': 117 obs. of 20 variables:
#> $ consumo : num 135.3 84.1 131.6 90.5 120 ...
#> $ pr.tbc : int 6840 443 7270 5031 9365 9281 3223 10490 7394 8654 ...
#> $ pr.cc : int 830 903 572 694 1054 1003 1118 1077 1204 851 ...
#> $ pr.ca : int 0 58 36 122 157 172 0 179 167 0 ...
#> $ pr.galv1 : int 579 611 982 896 403 605 643 737 580 828 ...
#> $ pr.galv2 : int 1401 1636 1963 1568 1480 1525 1424 1333 934 1326 ...
#> $ pr.pint : int 0 717 243 0 0 473 732 93 247 607 ...
#> $ linea : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
#> $ hora : Factor w/ 8 levels "1º","2º","3º",..: 1 2 3 4 5 6 7 8 1 2 ...
#> $ temperatura: Factor w/ 3 levels "Alta","Baja",..: 1 1 2 2 2 2 1 1 1 1 ...
#> $ averias : Factor w/ 2 levels "No","Si": 2 1 1 1 1 2 1 1 1 2 ...
#> $ naverias : int 1 0 0 0 0 1 0 0 0 3 ...
#> $ sistema : Factor w/ 2 levels "OFF","ON": 1 1 1 2 1 1 1 2 2 1 ...
#> $ ProdTotal : int 11266 7251 11066 8311 12459 13059 8555 18253 11697 13194 ...
#> $ NOx : num 0.49 0.0725 1.49 1.715 0.465 ...
#> $ CO : num 3.54 2.9 5.01 2.16 4.84 ...
#> $ COV : num 0.545 0.425 0.69 0.36 0.662 ...
#> $ SO2 : num 0.038 0.047 0.062 0.066 0.086 0.056 0.07 0.103 0.058 0.066 ...
#> $ CO2 : num 101.5 63.6 98.8 70.2 88.5 ...
#> $ N2O : num 6.35 2.23 5.99 3.66 6.06 6.15 7.75 9.09 8.69 5 ...
colSums(is.na(soils))
#> Group Contour Depth Gp Block pH N Dens P Ca
#> 0 0 0 0 0 0 0 0 0 0
#> Mg K Na Conduc
#> 0 0 0 0
colSums(is.na(acero))
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2
#> 0 0 0 0 0 0
#> pr.pint linea hora temperatura averias naverias
#> 0 0 0 0 0 0
#> sistema ProdTotal NOx CO COV SO2
#> 0 0 0 0 0 0
#> CO2 N2O
#> 0 0
Aunque un dataset no tenga faltantes, el paso debe hacerse siempre. La ausencia de valores faltantes también es un hallazgo importante.
medidas_soils <- soils_num %>%
summarise(across(
everything(),
list(
media = ~ mean(.x, na.rm = TRUE),
mediana = ~ median(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE),
rango = ~ max(.x, na.rm = TRUE) - min(.x, na.rm = TRUE)
)
))
medidas_acero <- acero_num %>%
summarise(across(
everything(),
list(
media = ~ mean(.x, na.rm = TRUE),
mediana = ~ median(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE),
rango = ~ max(.x, na.rm = TRUE) - min(.x, na.rm = TRUE)
)
))
medidas_soils
medidas_acero
medidas_soils <- soils_num %>%
summarise(across(
everything(),
list(
media = ~ mean(.x, na.rm = TRUE),
mediana = ~ median(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE),
rango = ~ max(.x, na.rm = TRUE) - min(.x, na.rm = TRUE)
)
))
medidas_acero <- acero_num %>%
summarise(across(
everything(),
list(
media = ~ mean(.x, na.rm = TRUE),
mediana = ~ median(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE),
rango = ~ max(.x, na.rm = TRUE) - min(.x, na.rm = TRUE)
)
))
medidas_soils
medidas_acero
skew_soils <- sapply(soils_num, moments::skewness, na.rm = TRUE)
kurt_soils <- sapply(soils_num, moments::kurtosis, na.rm = TRUE)
skew_acero <- sapply(acero_num, moments::skewness, na.rm = TRUE)
kurt_acero <- sapply(acero_num, moments::kurtosis, na.rm = TRUE)
skew_soils
#> pH N Dens P Ca Mg
#> 0.598184778 1.245697971 -0.637341556 1.431175740 0.680720289 -0.249438519
#> K Na Conduc
#> 0.377961059 0.008738835 -0.012390673
kurt_soils
#> pH N Dens P Ca Mg K Na
#> 2.882805 3.793367 2.220929 4.816547 2.431754 2.355985 2.514051 1.612310
#> Conduc
#> 1.576215
skew_acero
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2
#> 0.003201892 -1.243764926 0.816123166 1.179388549 -0.005802244 -0.937249395
#> pr.pint naverias ProdTotal NOx CO COV
#> 1.129745663 1.608273078 -0.082773410 0.081687346 0.388874084 0.087019000
#> SO2 CO2 N2O
#> -0.138286706 0.006413696 -0.142690117
kurt_acero
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2 pr.pint naverias
#> 2.618134 3.579382 2.307391 3.655330 1.484137 2.647911 2.648712 4.014125
#> ProdTotal NOx CO COV SO2 CO2 N2O
#> 2.911264 2.403473 2.933368 2.771855 3.536115 2.606436 2.603108
ggplot(acero, aes(x = "", y = consumo)) +
geom_boxplot(fill = "tomato") +
labs(
title = "Detección visual de outliers en consumo",
x = "",
y = "Consumo"
) +
theme_minimal()
ggplot(acero, aes(x = consumo)) +
geom_density(fill = "skyblue", alpha = 0.5) +
labs(
title = "Densidad del consumo energético",
x = "Consumo",
y = "Densidad"
) +
theme_minimal()
Al terminar esta sección, guarde una nueva versión como:
03_semana3_eda_univariado.Rmd
La guía de la semana 4 lleva el EDA al estudio de relaciones entre variables. Se enfatiza la interpretación de correlación, diferencia entre Pearson y Spearman, lectura de matrices y advertencia de que correlación no implica causalidad.
cor_soils_pearson <- cor(soils_num, use = "pairwise.complete.obs", method = "pearson")
round(cor_soils_pearson, 3)
#> pH N Dens P Ca Mg K Na Conduc
#> pH 1.000 0.637 -0.589 0.591 0.809 -0.396 0.580 -0.693 -0.765
#> N 0.637 1.000 -0.864 0.842 0.850 -0.522 0.676 -0.812 -0.804
#> Dens -0.589 -0.864 1.000 -0.794 -0.791 0.490 -0.667 0.742 0.763
#> P 0.591 0.842 -0.794 1.000 0.688 -0.489 0.556 -0.773 -0.762
#> Ca 0.809 0.850 -0.791 0.688 1.000 -0.427 0.721 -0.789 -0.832
#> Mg -0.396 -0.522 0.490 -0.489 -0.427 1.000 -0.357 0.565 0.508
#> K 0.580 0.676 -0.667 0.556 0.721 -0.357 1.000 -0.693 -0.753
#> Na -0.693 -0.812 0.742 -0.773 -0.789 0.565 -0.693 1.000 0.972
#> Conduc -0.765 -0.804 0.763 -0.762 -0.832 0.508 -0.753 0.972 1.000
cor_acero_pearson <- cor(acero_num, use = "pairwise.complete.obs", method = "pearson")
round(cor_acero_pearson, 3)
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2 pr.pint naverias
#> consumo 1.000 0.743 0.385 -0.045 0.401 0.241 0.194 0.082
#> pr.tbc 0.743 1.000 0.154 -0.040 0.066 0.102 0.003 0.044
#> pr.cc 0.385 0.154 1.000 -0.191 0.300 0.071 0.268 -0.006
#> pr.ca -0.045 -0.040 -0.191 1.000 0.083 -0.085 -0.027 0.034
#> pr.galv1 0.401 0.066 0.300 0.083 1.000 0.050 0.301 0.192
#> pr.galv2 0.241 0.102 0.071 -0.085 0.050 1.000 0.073 -0.111
#> pr.pint 0.194 0.003 0.268 -0.027 0.301 0.073 1.000 0.025
#> naverias 0.082 0.044 -0.006 0.034 0.192 -0.111 0.025 1.000
#> ProdTotal 0.984 0.797 0.379 -0.069 0.368 0.251 0.196 0.061
#> NOx 0.558 0.422 0.227 0.034 0.280 0.050 0.228 0.007
#> CO 0.945 0.655 0.364 -0.044 0.403 0.240 0.208 0.017
#> COV 0.966 0.697 0.372 -0.044 0.401 0.254 0.210 0.030
#> SO2 -0.029 -0.019 0.024 0.137 -0.032 -0.022 0.022 -0.108
#> CO2 1.000 0.742 0.385 -0.045 0.402 0.239 0.196 0.079
#> N2O 0.853 0.656 0.337 -0.055 0.290 0.182 0.188 0.033
#> ProdTotal NOx CO COV SO2 CO2 N2O
#> consumo 0.984 0.558 0.945 0.966 -0.029 1.000 0.853
#> pr.tbc 0.797 0.422 0.655 0.697 -0.019 0.742 0.656
#> pr.cc 0.379 0.227 0.364 0.372 0.024 0.385 0.337
#> pr.ca -0.069 0.034 -0.044 -0.044 0.137 -0.045 -0.055
#> pr.galv1 0.368 0.280 0.403 0.401 -0.032 0.402 0.290
#> pr.galv2 0.251 0.050 0.240 0.254 -0.022 0.239 0.182
#> pr.pint 0.196 0.228 0.208 0.210 0.022 0.196 0.188
#> naverias 0.061 0.007 0.017 0.030 -0.108 0.079 0.033
#> ProdTotal 1.000 0.553 0.933 0.953 -0.006 0.984 0.854
#> NOx 0.553 1.000 0.519 0.534 -0.126 0.568 0.532
#> CO 0.933 0.519 1.000 0.995 0.044 0.944 0.820
#> COV 0.953 0.534 0.995 1.000 0.031 0.965 0.836
#> SO2 -0.006 -0.126 0.044 0.031 1.000 -0.029 0.007
#> CO2 0.984 0.568 0.944 0.965 -0.029 1.000 0.854
#> N2O 0.854 0.532 0.820 0.836 0.007 0.854 1.000
cor_acero_spearman <- cor(acero_num, use = "pairwise.complete.obs", method = "spearman")
round(cor_acero_spearman, 3)
#> consumo pr.tbc pr.cc pr.ca pr.galv1 pr.galv2 pr.pint naverias
#> consumo 1.000 0.751 0.421 -0.049 0.421 0.155 0.214 0.096
#> pr.tbc 0.751 1.000 0.210 -0.048 0.126 -0.017 0.073 0.065
#> pr.cc 0.421 0.210 1.000 -0.175 0.375 0.050 0.336 0.030
#> pr.ca -0.049 -0.048 -0.175 1.000 0.051 -0.090 -0.040 0.052
#> pr.galv1 0.421 0.126 0.375 0.051 1.000 0.041 0.347 0.186
#> pr.galv2 0.155 -0.017 0.050 -0.090 0.041 1.000 -0.010 -0.108
#> pr.pint 0.214 0.073 0.336 -0.040 0.347 -0.010 1.000 0.019
#> naverias 0.096 0.065 0.030 0.052 0.186 -0.108 0.019 1.000
#> ProdTotal 0.980 0.813 0.407 -0.074 0.395 0.144 0.217 0.076
#> NOx 0.607 0.497 0.249 0.007 0.267 0.001 0.262 0.031
#> CO 0.947 0.724 0.397 -0.049 0.403 0.166 0.231 0.036
#> COV 0.963 0.734 0.405 -0.054 0.413 0.164 0.230 0.047
#> SO2 -0.038 -0.024 0.072 0.079 -0.018 -0.056 0.110 -0.119
#> CO2 0.999 0.752 0.422 -0.052 0.419 0.149 0.218 0.096
#> N2O 0.837 0.639 0.355 -0.058 0.295 0.098 0.202 0.053
#> ProdTotal NOx CO COV SO2 CO2 N2O
#> consumo 0.980 0.607 0.947 0.963 -0.038 0.999 0.837
#> pr.tbc 0.813 0.497 0.724 0.734 -0.024 0.752 0.639
#> pr.cc 0.407 0.249 0.397 0.405 0.072 0.422 0.355
#> pr.ca -0.074 0.007 -0.049 -0.054 0.079 -0.052 -0.058
#> pr.galv1 0.395 0.267 0.403 0.413 -0.018 0.419 0.295
#> pr.galv2 0.144 0.001 0.166 0.164 -0.056 0.149 0.098
#> pr.pint 0.217 0.262 0.231 0.230 0.110 0.218 0.202
#> naverias 0.076 0.031 0.036 0.047 -0.119 0.096 0.053
#> ProdTotal 1.000 0.608 0.941 0.954 -0.013 0.980 0.837
#> NOx 0.608 1.000 0.565 0.574 -0.132 0.612 0.571
#> CO 0.941 0.565 1.000 0.997 0.018 0.946 0.811
#> COV 0.954 0.574 0.997 1.000 0.011 0.962 0.822
#> SO2 -0.013 -0.132 0.018 0.011 1.000 -0.039 -0.001
#> CO2 0.980 0.612 0.946 0.962 -0.039 1.000 0.840
#> N2O 0.837 0.571 0.811 0.822 -0.001 0.840 1.000
Aquí conviene discutir:
PerformanceAnalytics::chart.Correlation(
acero_num,
histogram = TRUE,
pch = 19
)
ggplot(acero, aes(x = ProdTotal, y = consumo)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(
title = "Producción total y consumo energético",
x = "Producción total",
y = "Consumo"
) +
theme_minimal()
ggplot(soils, aes(x = Ca, y = Mg)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(
title = "Relación entre Ca y Mg en Soils",
x = "Ca",
y = "Mg"
) +
theme_minimal()
Este bloque prepara el terreno para regresión, pero todavía no pretende construir modelos formales. El foco es explorar relaciones y detectar posibles redundancias o multicolinealidad.
Al terminar esta sección, guarde una nueva versión como:
04_semana4_eda_bivariado.Rmd
En el editor de Posit Cloud:
.Rmd.rmarkdown::render("guia_semanas_1_4.Rmd", output_format = "html_document")
rmarkdown::render("guia_semanas_1_4.Rmd", output_format = "pdf_document")
rmarkdown::render("guia_semanas_1_4.Rmd", output_format = "word_document")
Para pdf_document, R Markdown requiere un motor LaTeX.
La documentación de R Markdown indica que el formato PDF se declara con
pdf_document, y la generación de Word se hace con
word_document; además, el IDE puede publicar documentos R
Markdown en RPubs. En Posit/RStudio, la publicación puede dirigirse a
RPubs desde el cuadro de publicación.
Este documento conserva la secuencia conceptual de las cuatro semanas:
La intención no es solo mostrar código en R, sino mantener una lógica de formación donde:
summary(soils)
#> Group Contour Depth Gp Block pH
#> 1 : 4 Depression:16 0-10 :12 D0 : 4 1:12 Min. :3.740
#> 2 : 4 Slope :16 10-30:12 D1 : 4 2:12 1st Qu.:4.058
#> 3 : 4 Top :16 30-60:12 D3 : 4 3:12 Median :4.545
#> 4 : 4 60-90:12 D6 : 4 4:12 Mean :4.669
#> 5 : 4 S0 : 4 3rd Qu.:5.140
#> 6 : 4 S1 : 4 Max. :6.670
#> (Other):24 (Other):24
#> N Dens P Ca
#> Min. :0.03000 Min. :0.780 Min. : 79.0 Min. : 3.820
#> 1st Qu.:0.05075 1st Qu.:1.127 1st Qu.:108.8 1st Qu.: 5.040
#> Median :0.08450 Median :1.400 Median :131.0 Median : 7.305
#> Mean :0.10194 Mean :1.316 Mean :166.2 Mean : 8.029
#> 3rd Qu.:0.12925 3rd Qu.:1.502 3rd Qu.:214.2 3rd Qu.: 9.735
#> Max. :0.29800 Max. :1.600 Max. :445.0 Max. :16.350
#>
#> Mg K Na Conduc
#> Min. : 5.150 Min. :0.1400 Min. : 0.600 Min. : 0.670
#> 1st Qu.: 7.537 1st Qu.:0.2750 1st Qu.: 2.545 1st Qu.: 2.790
#> Median : 8.515 Median :0.4250 Median : 5.520 Median : 6.635
#> Mean : 8.465 Mean :0.4662 Mean : 5.600 Mean : 6.589
#> 3rd Qu.: 9.648 3rd Qu.:0.6425 3rd Qu.: 8.355 3rd Qu.: 9.852
#> Max. :10.960 Max. :1.0900 Max. :11.040 Max. :13.320
#>
summary(acero)
#> consumo pr.tbc pr.cc pr.ca
#> Min. : 17.50 Min. : 0 Min. : 0.0 Min. : 0.0
#> 1st Qu.: 99.09 1st Qu.: 5950 1st Qu.: 0.0 1st Qu.: 0.0
#> Median :140.07 Median : 8808 Median : 80.0 Median : 0.0
#> Mean :139.46 Mean : 7568 Mean : 295.5 Mean :124.5
#> 3rd Qu.:182.48 3rd Qu.: 9734 3rd Qu.: 582.0 3rd Qu.:248.0
#> Max. :290.72 Max. :10979 Max. :1204.0 Max. :677.0
#>
#> pr.galv1 pr.galv2 pr.pint linea hora temperatura
#> Min. : 0.0 Min. : 0 Min. : 0.0 A:39 1º :15 Alta :46
#> 1st Qu.: 0.0 1st Qu.: 933 1st Qu.: 0.0 B:39 2º :15 Baja :38
#> Median :432.0 Median :1360 Median : 0.0 C:39 3º :15 Media:33
#> Mean :402.8 Mean :1160 Mean :188.6 4º :15
#> 3rd Qu.:698.0 3rd Qu.:1567 3rd Qu.:394.0 5º :15
#> Max. :982.0 Max. :1963 Max. :898.0 6º :15
#> (Other):27
#> averias naverias sistema ProdTotal NOx
#> No:89 Min. :0.0000 OFF:59 Min. : 2187 Min. :0.0125
#> Si:28 1st Qu.:0.0000 ON :58 1st Qu.: 9023 1st Qu.:0.7750
#> Median :0.0000 Median :11860 Median :1.1200
#> Mean :0.6752 Mean :11842 Mean :1.1961
#> 3rd Qu.:0.0000 3rd Qu.:14908 3rd Qu.:1.6550
#> Max. :4.0000 Max. :23202 Max. :2.7750
#>
#> CO COV SO2 CO2
#> Min. : 0.250 Min. :0.0250 Min. :0.0010 Min. : 14.29
#> 1st Qu.: 2.928 1st Qu.:0.4525 1st Qu.:0.0540 1st Qu.: 73.72
#> Median : 4.107 Median :0.6250 Median :0.0660 Median :105.31
#> Mean : 4.377 Mean :0.6210 Mean :0.0665 Mean :104.63
#> 3rd Qu.: 5.585 3rd Qu.:0.7850 3rd Qu.:0.0800 3rd Qu.:134.88
#> Max. :10.170 Max. :1.2550 Max. :0.1270 Max. :218.31
#>
#> N2O
#> Min. : 0.870
#> 1st Qu.: 4.710
#> Median : 6.170
#> Mean : 6.115
#> 3rd Qu.: 7.580
#> Max. :11.140
#>
ggplot(acero, aes(x = consumo)) +
geom_histogram(bins = 10)
cor(acero_num, method = "pearson")
#> consumo pr.tbc pr.cc pr.ca pr.galv1
#> consumo 1.00000000 0.743294582 0.385335203 -0.04462924 0.40126392
#> pr.tbc 0.74329458 1.000000000 0.153963066 -0.03999992 0.06614846
#> pr.cc 0.38533520 0.153963066 1.000000000 -0.19078475 0.30011090
#> pr.ca -0.04462924 -0.039999921 -0.190784746 1.00000000 0.08285971
#> pr.galv1 0.40126392 0.066148462 0.300110895 0.08285971 1.00000000
#> pr.galv2 0.24073916 0.102247494 0.071083806 -0.08530484 0.04964655
#> pr.pint 0.19358492 0.003463181 0.268146068 -0.02709511 0.30078858
#> naverias 0.08159454 0.043766798 -0.006062556 0.03419317 0.19234310
#> ProdTotal 0.98411477 0.796884106 0.378792207 -0.06944511 0.36801534
#> NOx 0.55823709 0.421965121 0.226522618 0.03419399 0.27964572
#> CO 0.94517247 0.654857129 0.363734814 -0.04387984 0.40278763
#> COV 0.96592575 0.697052420 0.371621928 -0.04427419 0.40106530
#> SO2 -0.02855792 -0.019458190 0.023663924 0.13729688 -0.03168346
#> CO2 0.99974286 0.741999831 0.384874382 -0.04478564 0.40226240
#> N2O 0.85256929 0.655629358 0.336932276 -0.05524991 0.28963394
#> pr.galv2 pr.pint naverias ProdTotal NOx
#> consumo 0.24073916 0.193584920 0.081594535 0.984114769 0.558237089
#> pr.tbc 0.10224749 0.003463181 0.043766798 0.796884106 0.421965121
#> pr.cc 0.07108381 0.268146068 -0.006062556 0.378792207 0.226522618
#> pr.ca -0.08530484 -0.027095106 0.034193168 -0.069445113 0.034193994
#> pr.galv1 0.04964655 0.300788576 0.192343100 0.368015341 0.279645716
#> pr.galv2 1.00000000 0.072855628 -0.110816558 0.251297646 0.049692805
#> pr.pint 0.07285563 1.000000000 0.024874363 0.195591110 0.227947791
#> naverias -0.11081656 0.024874363 1.000000000 0.061010424 0.007078148
#> ProdTotal 0.25129765 0.195591110 0.061010424 1.000000000 0.553461773
#> NOx 0.04969281 0.227947791 0.007078148 0.553461773 1.000000000
#> CO 0.23960105 0.208304556 0.017011796 0.933465635 0.519471754
#> COV 0.25428635 0.209777456 0.029575561 0.953059807 0.534443884
#> SO2 -0.02235232 0.021772640 -0.107906290 -0.005547291 -0.126162900
#> CO2 0.23888384 0.196377049 0.079158396 0.983920527 0.568486815
#> N2O 0.18241273 0.188485503 0.033063524 0.854197218 0.531728148
#> CO COV SO2 CO2 N2O
#> consumo 0.94517247 0.96592575 -0.028557917 0.99974286 0.852569287
#> pr.tbc 0.65485713 0.69705242 -0.019458190 0.74199983 0.655629358
#> pr.cc 0.36373481 0.37162193 0.023663924 0.38487438 0.336932276
#> pr.ca -0.04387984 -0.04427419 0.137296884 -0.04478564 -0.055249910
#> pr.galv1 0.40278763 0.40106530 -0.031683456 0.40226240 0.289633942
#> pr.galv2 0.23960105 0.25428635 -0.022352315 0.23888384 0.182412726
#> pr.pint 0.20830456 0.20977746 0.021772640 0.19637705 0.188485503
#> naverias 0.01701180 0.02957556 -0.107906290 0.07915840 0.033063524
#> ProdTotal 0.93346563 0.95305981 -0.005547291 0.98392053 0.854197218
#> NOx 0.51947175 0.53444388 -0.126162900 0.56848681 0.531728148
#> CO 1.00000000 0.99504982 0.044382463 0.94420266 0.819564142
#> COV 0.99504982 1.00000000 0.030834999 0.96500809 0.835862403
#> SO2 0.04438246 0.03083500 1.000000000 -0.02855760 0.007062938
#> CO2 0.94420266 0.96500809 -0.028557603 1.00000000 0.853984322
#> N2O 0.81956414 0.83586240 0.007062938 0.85398432 1.000000000
Este bloque mínimo puede servir para una primera demostración corta antes de recorrer todo el documento.