Esta es la guía definitiva que puedes compartir con tus estudiantes. Incluye todas las lecciones aprendidas y el flujo de trabajo correcto.
1. Generar un Token de Acceso Personal (PAT) Seguro 🔑
Un PAT es tu contraseña para interactuar con GitHub desde aplicaciones externas.
Posit Cloud API
.repo
. Esto es suficiente para todo lo que
necesitamos.ghp_...
) inmediatamente. Guárdalo en un lugar seguro y
temporal. No volverás a verlo.2. Crear el Repositorio en GitHub
analisis-precipitacion-v2
.R
de la lista.1. Clonar el Repositorio
2. Configurar Git y Guardar el PAT
Ahora, le diremos a Posit Cloud quién eres y guardaremos el PAT de forma segura. Todo esto se hace en la Consola de R.
En la Consola de R (panel inferior izquierdo), instala los paquetes necesarios:
install.packages("usethis")
install.packages("usethis", dependencies = TRUE, repos = "https://cloud.r-project.org/")
install.packages("gitcreds")
install.packages("credentials", repos = "https://cloud.r-project.org/")
Configura tu identidad de Git. Usa el mismo usuario y email de tu cuenta de GitHub:
library(usethis)
use_git_config(
user.name = "TuNombreDeUsuarioGitHub",
user.email = "tu_email_asociado_a_github@example.com"
)
Guarda tu PAT de forma segura. Al ejecutar el siguiente comando, la consola te pedirá el token:
library(gitcreds)
gitcreds_set()
Cuando veas -> Enter password or token:
,
pega tu PAT y presiona Enter. No verás los caracteres,
es normal. Confirma si te lo pide.
¡Perfecto! Tu entorno está listo y seguro. Posit Cloud nunca más te pedirá credenciales.
Vamos a recrear los archivos que se borraron.
1. Crear Carpeta y Archivo de Datos
En el panel de archivos (abajo a la derecha), haz clic en
New Folder y llámala data
.
Entra en la carpeta data
.
Crea un nuevo archivo de texto (New File > Text
File), llámalo precipitacion_sucre.csv
y pega lo
siguiente:
Fecha,Precipitacion_mm,Estacion
2024-01-15,5,LaMojana
2024-02-20,2,LaMojana
2024-03-10,15,LaMojana
2024-04-18,80,LaMojana
2024-05-25,150,LaMojana
2024-06-30,220,LaMojana
2024-07-15,180,LaMojana
2024-08-22,160,LaMojana
Guarda el archivo.
2. Crear el Script de Análisis
Vuelve al directorio principal del proyecto (haciendo clic en el icono de la casita en el panel de archivos).
Crea un nuevo Script de R (New File > R
Script), llámalo analisis.R
y pega el siguiente
código:
# ANÁLISIS DE PRECIPITACIÓN - INGENIERÍA
# ------------------------------------
# 1. Cargar librerías
# Si no están instaladas, la primera vez debes correr: install.packages("tidyverse")
library(tidyverse)
library(lubridate)
# 2. Cargar los datos
datos_lluvia <- read_csv("data/precipitacion_sucre.csv")
# 3. Procesamiento y análisis
analisis_mensual <- datos_lluvia %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = FALSE)) %>%
group_by(Mes) %>%
summarise(PrecipitacionTotal_mm = sum(Precipitacion_mm))
print("Resumen de precipitación mensual:")
print(analisis_mensual)
# 4. Visualización
grafico_precipitacion <- ggplot(analisis_mensual, aes(x = Mes, y = PrecipitacionTotal_mm)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(
title = "Precipitación Mensual Total en la Estación 'La Mojana'",
subtitle = "Año 2024 (Datos parciales)",
x = "Mes",
y = "Precipitación Total (mm)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(grafico_precipitacion)
# 5. Guardar el gráfico
if (!dir.exists("output")) dir.create("output")
ggsave("output/grafico_precipitacion_mensual.png", plot = grafico_precipitacion, width = 8, height = 6)
print("¡Análisis completado! El gráfico se ha guardado en la carpeta 'output'.")
Guarda el script y ejecútalo haciendo clic en el botón
Source. Se creará la carpeta output
con el
gráfico dentro.
Este es el proceso para sincronizar tu trabajo con GitHub.
Ir a la Pestaña Git: En el panel superior derecho, haz clic en la pestaña Git.
Preparar Cambios (Stage): Verás una lista de
todos tus archivos y carpetas nuevos (analisis.R
,
data
, output
, etc.). Marca TODAS las
casillas para incluirlos.
Confirmar Cambios (Commit): Haz clic en el botón Commit.
Escribir Mensaje: En la nueva ventana, escribe
un mensaje descriptivo en “Commit message”. Por ejemplo:
Añade script inicial, datos y gráfico de precipitación
.
Haz clic en Commit. Has guardado una “fotografía” de tu trabajo localmente.
Empujar a GitHub (Push): Finalmente, haz clic en el botón Push (la flecha verde hacia arriba).
Verás un mensaje de que el proceso se completó con éxito. ¡Y listo! Si vas a tu repositorio en GitHub y refrescas la página, verás todos tus archivos y carpetas allí.
Aprovecha para explicar a tus estudiantes qué pasó:
push
para proteger tu cuenta. La solución es
eliminar el secreto del historial, no solo del
archivo.install.packages
,
library
, etc.). La Terminal ejecuta
comandos del sistema operativo y de Git (git reset
,
ls
, etc.). Son herramientas distintas para propósitos
distintos.git reset --soft
vs. git reset --hard
:
--soft
: Deshace el último commit pero conserva
tus cambios en los archivos. Es seguro.--hard
: Deshace el último commit y BORRA todos
los cambios no guardados en los archivos. Es potente pero
peligroso si no sabes lo que haces.Asignatura: Estadística Aplicada con Python y R
Tema: Predicción de la Resistencia del Concreto con Regresión Lineal Múltiple
Como ingenieros, constantemente buscamos optimizar mezclas y predecir el rendimiento de los materiales. En este ejercicio, actuarás como un ingeniero de control de calidad para una empresa constructora. Tu objetivo es construir un modelo de regresión lineal múltiple para predecir la resistencia a la compresión del concreto basándose en sus componentes y su tiempo de curado.
Este modelo permitirá a la empresa estimar la calidad del producto final antes de realizar costosas pruebas de laboratorio, optimizando recursos y tiempo.
Antes de empezar con el análisis, asegúrate de tener tu entorno de trabajo listo.
Crear Repositorio en GitHub:
proyecto-regresion-concreto
.README.md
y un
.gitignore
(selecciona la plantilla R
).Clonar en Posit Cloud:
Configurar Git (si es la primera vez en este proyecto):
gitcreds::gitcreds_set()
, tal como se describe en la
guía.install.packages("usethis")
install.packages("gitcreds")
library(usethis)
use_git_config(
user.name = "justorfc",
user.email = "justorfc@gmail.com"
)
library(gitcreds)
gitcreds_set()
# Te pedirá el usuario y la contraseña, cuando te pida la contraseña copia y pega el Token
1. Crear la Carpeta de Datos:
New Folder
) llamada
data
.2. Crear el Archivo de Datos:
data
.New File
>
Text File
) llamado datos_concreto.csv
.Cemento_kg,Agua_kg,Arena_kg,Edad_dias,Resistencia_MPa
250,150,900,7,22.5
250,165,850,28,35.1
300,160,880,7,28.9
300,175,820,28,40.2
350,170,850,7,33.4
350,185,800,28,45.8
400,180,820,7,39.1
400,195,780,28,52.3
450,190,790,7,44.6
450,205,750,28,58.0
280,155,890,14,33.7
320,165,860,14,38.5
380,175,830,14,44.9
420,185,800,14,50.1
3. Crear el Documento R Markdown:
New File
>
R Markdown...
).analisis_regresion.Rmd
. Borra
todo el contenido de ejemplo que aparece después de la cabecera (YAML
header).Ahora, dentro de tu archivo analisis_regresion.Rmd
,
empezarás a escribir el código y texto para el análisis.
Crea un chunk de código de R (atajo: Ctrl+Alt+I
) y carga
las librerías necesarias y los datos.
# Cargar las librerías para manipulación de datos y visualización
library(tidyverse)
library(GGally) # Para gráficos exploratorios avanzados
# Cargar el dataset desde la carpeta 'data'
datos <- read_csv("data/datos_concreto.csv")
## Rows: 14 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (5): Cemento_kg, Agua_kg, Arena_kg, Edad_dias, Resistencia_MPa
##
## ℹ 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 para asegurar que se cargó correctamente
head(datos)
Antes de modelar, debemos entender nuestros datos. ¿Cómo se relacionan las variables?
En esta sección, exploramos las relaciones entre los componentes del concreto y la resistencia final.
# Resumen estadístico de todas las variables
summary(datos)
## Cemento_kg Agua_kg Arena_kg Edad_dias Resistencia_MPa
## Min. :250 Min. :150.0 Min. :750.0 Min. : 7.0 Min. :22.50
## 1st Qu.:300 1st Qu.:165.0 1st Qu.:800.0 1st Qu.: 7.0 1st Qu.:34.05
## Median :350 Median :175.0 Median :825.0 Median :14.0 Median :39.65
## Mean :350 Mean :175.4 Mean :830.0 Mean :16.5 Mean :40.51
## 3rd Qu.:400 3rd Qu.:185.0 3rd Qu.:857.5 3rd Qu.:28.0 3rd Qu.:45.58
## Max. :450 Max. :205.0 Max. :900.0 Max. :28.0 Max. :58.00
# Matriz de correlación y gráficos de dispersión
# ggpairs nos da:
# - Histogramas en la diagonal para ver la distribución de cada variable.
# - Gráficos de dispersión en la parte inferior para ver la relación entre pares.
# - Coeficientes de correlación en la parte superior.
ggpairs(datos) +
labs(title = "Matriz de Correlación y Dispersión de Variables")
Interpretación Preliminar:
Observa la última fila de gráficos.
¿Qué variables parecen tener una relación lineal fuerte y positiva
con Resistencia_MPa
?
La correlación entre Cemento_kg
y
Resistencia_MPa
, y entre Edad_dias
y
Resistencia_MPa
parece ser alta.
La relación con Agua_kg
parece ser más débil o incluso
negativa.
Ahora, construiremos el modelo usando la función lm()
(linear model).
Vamos a crear un modelo donde la resistencia es la variable dependiente (Y) y los demás componentes son las variables independientes (X).
La fórmula es: \(Resistencia = \beta_0 + \beta_1 \cdot Cemento + \beta_2 \cdot Agua + \beta_3 \cdot Arena + \beta_4 \cdot Edad\)
# Construir el modelo de regresión lineal
modelo <- lm(Resistencia_MPa ~ Cemento_kg + Agua_kg + Arena_kg + Edad_dias, data = datos)
# Mostrar el resumen completo del modelo
summary(modelo)
##
## Call:
## lm(formula = Resistencia_MPa ~ Cemento_kg + Agua_kg + Arena_kg +
## Edad_dias, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.80793 -0.47950 -0.08593 0.22506 1.36346
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 29.18617 69.49910 0.420 0.68437
## Cemento_kg 0.25908 0.01888 13.724 2.44e-07 ***
## Agua_kg -0.66549 0.16948 -3.927 0.00348 **
## Arena_kg 0.02265 0.05276 0.429 0.67779
## Edad_dias 1.12367 0.07628 14.730 1.32e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7904 on 9 degrees of freedom
## Multiple R-squared: 0.9953, Adjusted R-squared: 0.9932
## F-statistic: 474.8 on 4 and 9 DF, p-value: 1.861e-10
````
Esta es la parte más importante. ¿Qué nos dicen todos esos números?
1. Coeficientes (Coefficients):
Intercept (\beta_0
): Es el valor
teórico de la resistencia si todos los predictores fueran cero. En este
contexto, no tiene una interpretación práctica.
Cemento_kg (\beta_1
): Por cada kg
adicional de cemento, manteniendo el resto constante, la resistencia
aumenta en [valor del coeficiente]
MPa. El p-valor
(Pr(>|t|)
) es muy bajo, lo que indica que esta variable
es muy significativa.
Agua_kg (\beta_2
): Por cada kg
adicional de agua, la resistencia cambia en
[valor del coeficiente]
. Observa si el efecto es positivo o
negativo. Evalúa su p-valor para ver si es significativo.
Arena_kg (\beta_3
): Analiza su
efecto y significancia de la misma manera.
Edad_dias (\beta_4
): Por cada día
adicional de curado, la resistencia aumenta significativamente. Es,
junto con el cemento, una de las variables más influyentes.
2. Medidas de Ajuste del Modelo:
Adjusted R-squared (R^2
ajustado):
Este valor es [valor de R^2 ajustado]
. Esto significa que
nuestro modelo explica aproximadamente el
[porcentaje]
% de la variabilidad en la
resistencia del concreto. Un valor por encima del 80-90% se considera
muy bueno.
F-statistic (Prueba F): El p-valor general del
modelo (p-value
de la última línea) es extremadamente
pequeño. Esto nos permite rechazar la hipótesis nula de que todos los
coeficientes son cero. En otras palabras, nuestro modelo es
estadísticamente significativo y útil para la
predicción.
Un buen análisis verifica si se cumplen los supuestos del modelo de regresión.
# Generar los gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(modelo)
par(mfrow = c(1, 1))
Qué buscar:
1. Generar el Reporte:
2. Sincronizar con GitHub ✅:
.Rmd
,
.html
, la carpeta data
, etc.).Finaliza análisis de regresión para resistencia del concreto
.¡Felicitaciones! Has completado un proyecto de análisis de datos de principio a fin, combinando buenas prácticas de estadística, programación en R y control de versiones con Git.
Asignatura: Estadística Aplicada con Python y R
Tema: Comparación del Efecto de Fertilizantes en el Crecimiento de Cultivos
Imagina que eres un ingeniero agrónomo encargado de un proyecto de agricultura sostenible. Una empresa ha desarrollado dos nuevos biofertilizantes y afirma que son tan buenos o mejores que el fertilizante químico tradicional, pero con un menor impacto ambiental.
Tu misión es diseñar y analizar un experimento para verificar estas afirmaciones. Utilizarás ANOVA para determinar si hay una diferencia significativa en el rendimiento del cultivo entre los fertilizantes. Luego, usarás MANOVA para evaluar el efecto simultáneo sobre el rendimiento y la altura de la planta, dos indicadores clave de la salud del cultivo.
Crear Repositorio en GitHub:
proyecto-anova-fertilizantes
.README.md
y un
.gitignore
para R
.Clonar en Posit Cloud:
Configurar Git:
use_git_config
) y guarda tu
PAT (gitcreds_set
).1. Crear la Carpeta y el Archivo de Datos:
data
.data
, crea un nuevo archivo de texto
(New File
> Text File
) llamado
datos_fertilizantes.csv
.Parcela,Fertilizante,Rendimiento_kg_ha,Altura_cm
1,Control,3200,85
2,Control,3350,88
3,Control,3280,86
4,Control,3100,83
5,Control,3320,89
6,Biofertilizante_A,3600,92
7,Biofertilizante_A,3750,95
8,Biofertilizante_A,3550,91
9,Biofertilizante_A,3680,94
10,Biofertilizante_A,3800,96
11,Biofertilizante_B,3500,94
12,Biofertilizante_B,3450,92
13,Biofertilizante_B,3650,96
14,Biofertilizante_B,3380,91
15,Biofertilizante_B,3550,95
16,Quimico,3700,90
17,Quimico,3820,93
18,Quimico,3900,94
19,Quimico,3650,89
20,Quimico,3880,92
2. Crear el Documento R Markdown:
Crea un nuevo archivo R Markdown (New File
>
R Markdown...
).
Titúlalo “Análisis de Fertilizantes con ANOVA y MANOVA”.
Guárdalo como analisis_anova.Rmd
y borra el
contenido de ejemplo.
Ahora, dentro de tu archivo analisis_anova.Rmd
,
desarrollarás el análisis.
Primero, cargamos las herramientas y visualizamos los datos para entenderlos.
# Cargar librerías para manipulación, visualización y análisis
library(tidyverse)
library(car) # Para la prueba de Levene
# Cargar el dataset
datos <- read_csv("data/datos_fertilizantes.csv")
## Rows: 20 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Fertilizante
## dbl (3): Parcela, Rendimiento_kg_ha, Altura_cm
##
## ℹ 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.
# Convertir la variable 'Fertilizante' a un factor (importante para ANOVA)
datos$Fertilizante <- factor(datos$Fertilizante,
levels = c("Control", "Biofertilizante_A", "Biofertilizante_B", "Quimico"))
# Ver la estructura
str(datos)
## spc_tbl_ [20 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Parcela : num [1:20] 1 2 3 4 5 6 7 8 9 10 ...
## $ Fertilizante : Factor w/ 4 levels "Control","Biofertilizante_A",..: 1 1 1 1 1 2 2 2 2 2 ...
## $ Rendimiento_kg_ha: num [1:20] 3200 3350 3280 3100 3320 3600 3750 3550 3680 3800 ...
## $ Altura_cm : num [1:20] 85 88 86 83 89 92 95 91 94 96 ...
## - attr(*, "spec")=
## .. cols(
## .. Parcela = col_double(),
## .. Fertilizante = col_character(),
## .. Rendimiento_kg_ha = col_double(),
## .. Altura_cm = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
# Visualización con Boxplots para comparar los grupos
# Gráfico para Rendimiento
ggplot(datos, aes(x = Fertilizante, y = Rendimiento_kg_ha, fill = Fertilizante)) +
geom_boxplot() +
geom_jitter(width = 0.1, alpha = 0.6) +
labs(title = "Comparación de Rendimiento por Tipo de Fertilizante",
x = "Tipo de Fertilizante",
y = "Rendimiento (kg/ha)") +
theme_minimal()
# Gráfico para Altura
ggplot(datos, aes(x = Fertilizante, y = Altura_cm, fill = Fertilizante)) +
geom_boxplot() +
geom_jitter(width = 0.1, alpha = 0.6) +
labs(title = "Comparación de Altura por Tipo de Fertilizante",
x = "Tipo de Fertilizante",
y = "Altura Promedio (cm)") +
theme_minimal()
Observación Preliminar: Los boxplots sugieren que el grupo “Control” tiene un rendimiento y altura menores que los grupos con fertilizantes. El “Biofertilizante A” y el “Químico” parecen ser los más efectivos.
Aquí respondemos la primera pregunta: ¿Afecta el tipo de fertilizante al rendimiento del cultivo?
Hipótesis del ANOVA:
\(H_0\) (Hipótesis Nula): No hay diferencia significativa entre los rendimientos promedio de los cuatro grupos. (\(\mu_{control} = \mu_{bioA} = \mu_{bioB} = \mu_{quimico}\))
\(H_a\) (Hipótesis Alternativa): Al menos un grupo tiene un rendimiento promedio significativamente diferente.
1. Verificación de Supuestos del ANOVA
Homogeneidad de Varianzas (Prueba de Levene):
leveneTest(Rendimiento_kg_ha ~ Fertilizante, data = datos)
<script data-pagedtable-source type="application/json">
{“columns”:[{“label”:[“”],“name”:[“rn”],“type”:[“”],“align”:[“left”]},{“label”:[“Df”],“name”:[1],“type”:[“int”],“align”:[“right”]},{“label”:[“F
value”],“name”:[2],“type”:[“dbl”],“align”:[“right”]},{“label”:[“Pr(>F)”],“name”:[3],“type”:[“dbl”],“align”:[“right”]}],“data”:[{“1”:“3”,“2”:“0.04447439”,“3”:“0.9870663”,“rn”:“group”},{“1”:“16”,“2”:“NA”,“3”:“NA”,“rn”:““}],“options”:{“columns”:{“min”:{},“max”:[10]},“rows”:{“min”:[10],“max”:[10]},“pages”:{}}}
Si el p-valor (Pr(>F)
) es mayor a 0.05, asumimos que
las varianzas son iguales.
2. Ejecución del Modelo ANOVA
modelo_anova <- aov(Rendimiento_kg_ha ~ Fertilizante, data = datos)
summary(modelo_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizante 3 826455 275485 25.36 2.55e-06 ***
## Residuals 16 173840 10865
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación del ANOVA:
Observamos el p-valor (Pr(>F)
) en la tabla de
resultados. Si es muy pequeño (típicamente < 0.05), rechazamos la
hipótesis nula.
Esto significa que hay evidencia estadística de que el tipo de fertilizante sí afecta el rendimiento.
3. Prueba Post-Hoc (Tukey HSD)
El ANOVA nos dice que hay diferencias, pero no entre qué pares. La prueba de Tukey nos lo dirá.
TukeyHSD(modelo_anova)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rendimiento_kg_ha ~ Fertilizante, data = datos)
##
## $Fertilizante
## diff lwr upr p adj
## Biofertilizante_A-Control 426 237.38956 614.61044 0.0000423
## Biofertilizante_B-Control 256 67.38956 444.61044 0.0064980
## Quimico-Control 540 351.38956 728.61044 0.0000022
## Biofertilizante_B-Biofertilizante_A -170 -358.61044 18.61044 0.0849586
## Quimico-Biofertilizante_A 114 -74.61044 302.61044 0.3416364
## Quimico-Biofertilizante_B 284 95.38956 472.61044 0.0027380
Interpretación de Tukey HSD:
La tabla muestra la comparación de todos los pares de grupos. Fíjate
en la columna p adj
.
Si el valor es < 0.05, la diferencia entre ese par es estadísticamente significativa.
Por ejemplo, podrás confirmar si “Biofertilizante_A” es significativamente mejor que “Control”, pero no necesariamente diferente del “Químico”.
Ahora respondemos la pregunta más compleja:
¿Afecta el tipo de fertilizante al conjunto de variables (rendimiento y altura) de forma simultánea?
Hipótesis del MANOVA:
\(H_0\) (Hipótesis Nula): Los vectores de medias de (Rendimiento, Altura) son iguales para todos los tipos de fertilizante.
\(H_a\) (Hipótesis Alternativa): Al menos un grupo tiene un vector de medias significativamente diferente.
# Creamos una matriz con las variables dependientes
variables_dependientes <- cbind(datos$Rendimiento_kg_ha, datos$Altura_cm)
# Ejecutamos el modelo MANOVA
modelo_manova <- manova(variables_dependientes ~ Fertilizante, data = datos)
# Usamos summary para obtener los resultados con la prueba de Pillai
summary(modelo_manova, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Fertilizante 3 1.6727 27.261 6 32 2.893e-11 ***
## Residuals 16
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación del MANOVA:
El resultado clave es el p-valor (Pr(>F)
) de la
prueba de Pillai.
Si es < 0.05, rechazamos la hipótesis nula.
Concluimos que el tipo de fertilizante tiene un efecto multivariado significativo sobre las características del cultivo.
Esto refuerza nuestros hallazgos, mostrando que el efecto no se limita a una sola variable, sino al perfil de crecimiento general de la planta.
1. Escribir las Conclusiones:
Basado en el ANOVA y la prueba de Tukey, ¿qué fertilizante recomendarías para maximizar el rendimiento?
¿Hay alguna diferencia significativa entre el mejor biofertilizante y el fertilizante químico?
¿Qué información adicional te aportó el MANOVA?
2. Generar el Reporte:
3. Sincronizar con GitHub ✅:
Ve a la pestaña Git.
Stage: Marca todos los archivos nuevos
(.Rmd
, .html
, etc.).
Commit: Escribe un mensaje claro, como
Análisis ANOVA y MANOVA de fertilizantes completado
.
Push: Envía tu trabajo finalizado a tu repositorio en GitHub.
¡Excelente trabajo! Has aplicado dos técnicas estadísticas muy potentes para resolver un problema de ingeniería real y documentado todo el proceso de forma reproducible.
Asignatura: Estadística Aplicada con Python y R Tema: Clasificación de la Calidad de Granos de Café
A continuación se detalla el siguiente ejercicio de la serie, enfocado en Análisis Multivariado (con Componentes Principales) y Análisis Discriminante.
Este tipo de análisis es extremadamente útil en ingeniería cuando se necesita clasificar objetos o situaciones basándose en múltiples mediciones simultáneamente, como en control de calidad, diagnóstico de fallas o caracterización de materiales.
Eres un ingeniero agroindustrial en una cooperativa cafetera. Para mejorar la eficiencia y objetividad del proceso de selección, la cooperativa ha instalado sensores que capturan cuatro características físicas de los granos de café. Tu tarea es desarrollar un modelo estadístico que pueda clasificar automáticamente cada grano en una de tres categorías de calidad (“Premium”, “Estándar”, “Defectuoso”) basándose en estas mediciones.
Primero, usarás Análisis de Componentes Principales (PCA) para visualizar si los grupos de calidad son naturalmente separables. Luego, construirás un modelo de Análisis Discriminante Lineal (LDA) para predecir la calidad de nuevos granos.
Crear Repositorio en GitHub:
proyecto-multivariado-cafe
.README.md
y un
.gitignore
para R
.Clonar en Posit Cloud:
Configurar Git:
1. Crear la Carpeta y el Archivo de Datos:
data
.data
, crea un nuevo archivo de texto
(New File
> Text File
) llamado
datos_cafe.csv
.Lote,Calidad,Intensidad_Color,Humedad_pct,Densidad_g_cm3,Tamano_mm
1,Premium,85,11.5,0.75,8.2
2,Premium,88,11.2,0.76,8.5
3,Premium,86,11.8,0.74,8.3
4,Premium,90,11.0,0.77,8.6
5,Premium,84,12.0,0.73,8.1
6,Estándar,75,12.5,0.68,7.5
7,Estándar,78,12.2,0.70,7.8
8,Estándar,76,12.8,0.67,7.6
9,Estándar,80,12.1,0.71,7.9
10,Estándar,77,12.6,0.69,7.7
11,Defectuoso,65,13.5,0.60,6.5
12,Defectuoso,68,13.2,0.62,6.8
13,Defectuoso,66,13.8,0.59,6.6
14,Defectuoso,70,13.0,0.63,7.0
15,Defectuoso,64,14.0,0.58,6.4
2. Crear el Documento R Markdown:
New File
>
R Markdown...
).analisis_multivariado.Rmd
y borra el
contenido de ejemplo.Ahora, dentro de tu archivo analisis_multivariado.Rmd
,
desarrollarás el análisis.
Cargamos las herramientas y damos un primer vistazo a los datos.
# Cargar librerías
library(tidyverse) # Para manipulación y gráficos
library(MASS) # Para el Análisis Discriminante Lineal (LDA)
library(caTools) # Para dividir datos en entrenamiento y prueba
library(GGally) # Para gráficos exploratorios
# Cargar el dataset
datos <- read_csv("data/datos_cafe.csv")
## Rows: 15 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Calidad
## dbl (5): Lote, Intensidad_Color, Humedad_pct, Densidad_g_cm3, Tamano_mm
##
## ℹ 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.
# Convertir la variable 'Calidad' a un factor
datos$Calidad <- factor(datos$Calidad,
levels = c("Defectuoso", "Estándar", "Premium"))
# Seleccionar solo las variables de interés
datos_analisis <- datos %>% dplyr::select(Calidad, Intensidad_Color, Humedad_pct, Densidad_g_cm3, Tamano_mm)
# Visualización exploratoria
ggpairs(datos_analisis, aes(color = Calidad, alpha = 0.7)) +
labs(title = "Relaciones entre Variables por Calidad de Café")
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
Observación Preliminar: El gráfico
ggpairs
nos muestra cómo se distribuyen las variables y sus
relaciones. Visualmente, parece que los grupos de calidad tienen
características diferentes, lo que sugiere que un modelo de
clasificación podría funcionar.
El PCA nos ayudará a reducir las 4 variables de medición a solo 2 “componentes principales”, permitiéndonos visualizar la separación de los grupos en un gráfico 2D.
El objetivo del PCA es visualizar la estructura de los datos. No es un modelo de clasificación, sino una técnica de reducción de dimensionalidad.
# Seleccionar solo las variables numéricas para el PCA
variables_numericas <- datos_analisis %>% dplyr::select(-Calidad)
# Ejecutar el PCA. Es crucial escalar las variables (scale = TRUE)
# porque están en diferentes unidades.
pca_resultado <- prcomp(variables_numericas, scale = TRUE)
# Convertir los resultados del PCA en un data frame para graficar
pca_scores <- as.data.frame(pca_resultado$x)
# Añadir la variable de Calidad para colorear los puntos
pca_scores$Calidad <- datos_analisis$Calidad
# Graficar los dos primeros componentes principales
ggplot(pca_scores, aes(x = PC1, y = PC2, color = Calidad)) +
geom_point(size = 4, alpha = 0.8) +
labs(title = "Visualización de Grupos de Café con PCA",
x = "Componente Principal 1",
y = "Componente Principal 2") +
theme_minimal() +
stat_ellipse() # Añade elipses para visualizar la concentración de cada grupo
Interpretación del PCA:
En el gráfico, cada punto es un grano de café. Si los colores (que representan la calidad) forman grupos separados, ¡es una excelente señal! Significa que las mediciones contienen información útil para distinguir entre granos “Premium”, “Estándar” y “Defectuosos”.
Ahora que sabemos que los grupos son separables, construiremos un modelo para predecir la calidad.
El objetivo del LDA es crear una regla de clasificación para asignar nuevos granos a una categoría de calidad.
1. Dividir los Datos: Entrenamiento y Prueba Para evaluar nuestro modelo de forma honesta, lo entrenaremos con una parte de los datos (70%) y probaremos su rendimiento con la parte restante (30%).
set.seed(123) # Para que la división sea reproducible
split <- sample.split(datos_analisis$Calidad, SplitRatio = 0.7)
datos_entrenamiento <- subset(datos_analisis, split == TRUE)
datos_prueba <- subset(datos_analisis, split == FALSE)
2. Construir el Modelo LDA
Entrenamos el modelo usando solo el conjunto de entrenamiento.
modelo_lda <- lda(Calidad ~ ., data = datos_entrenamiento)
print(modelo_lda)
## Call:
## lda(Calidad ~ ., data = datos_entrenamiento)
##
## Prior probabilities of groups:
## Defectuoso Estándar Premium
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Intensidad_Color Humedad_pct Densidad_g_cm3 Tamano_mm
## Defectuoso 67.00 13.500 0.605 6.700
## Estándar 77.50 12.350 0.695 7.725
## Premium 87.25 11.375 0.755 8.400
##
## Coefficients of linear discriminants:
## LD1 LD2
## Intensidad_Color -0.9152908 2.625394
## Humedad_pct -8.3778153 -3.320469
## Densidad_g_cm3 -230.3977354 -84.080382
## Tamano_mm 12.1654058 -27.761087
##
## Proportion of trace:
## LD1 LD2
## 0.8722 0.1278
3. Realizar Predicciones
Usamos el modelo entrenado para predecir la calidad de los granos en el conjunto de prueba.
predicciones <- predict(modelo_lda, newdata = datos_prueba)
nombres_clases_predichas <- predicciones$class
4. Evaluar el Modelo con una Matriz de Confusión
Comparamos las predicciones del modelo con la calidad real de los granos.
# Crear la tabla que cruza lo real vs. lo predicho
matriz_confusion <- table(Observado = datos_prueba$Calidad,
Predicho = nombres_clases_predichas)
print("Matriz de Confusión:")
## [1] "Matriz de Confusión:"
print(matriz_confusion)
## Predicho
## Observado Defectuoso Estándar Premium
## Defectuoso 1 0 0
## Estándar 0 1 0
## Premium 0 0 1
# Calcular la Precisión (Accuracy) del modelo
precision <- sum(diag(matriz_confusion)) / sum(matriz_confusion)
print(paste("Precisión del Modelo:", round(precision * 100, 2), "%"))
## [1] "Precisión del Modelo: 100 %"
Interpretación de la Matriz de Confusión: La diagonal principal muestra las predicciones correctas. Los números fuera de la diagonal son los errores. Una precisión alta (cercana al 100%) indica que el modelo es muy bueno para clasificar los granos de café.
1. Escribir las Conclusiones:
[valor]
% es suficientemente buena para ser implementada
por la cooperativa?print(modelo_lda)
)?2. Generar el Reporte y Sincronizar con GitHub ✅:
Análisis multivariado y LDA para calidad de café
), y
Push para subir tu proyecto final a GitHub.¡Felicidades! Has aplicado un flujo de trabajo completo de machine learning supervisado, desde la exploración y visualización hasta la construcción y evaluación de un modelo predictivo.