Guía Inicial Completa y Corregida: De Cero a Héroe con Posit Cloud y GitHub 🚀

Esta es la guía definitiva que puedes compartir con tus estudiantes. Incluye todas las lecciones aprendidas y el flujo de trabajo correcto.

Parte 1: Preparación en GitHub

1. Generar un Token de Acceso Personal (PAT) Seguro 🔑

Un PAT es tu contraseña para interactuar con GitHub desde aplicaciones externas.

  1. Inicia sesión en GitHub.
  2. Ve a Settings (desde tu foto de perfil) > Developer settings (al final del menú izquierdo).
  3. Haz clic en Personal access tokens > Tokens (classic).
  4. Selecciona Generate new token (y elige la opción “classic”).
  5. Nota: Dale un nombre claro, como Posit Cloud API.
  6. Expiración: Elige 90 días. Recibirás un email antes de que caduque.
  7. Permisos (Scopes): Activa la casilla principal repo. Esto es suficiente para todo lo que necesitamos.
  8. Haz clic en Generate token.
  9. ¡ACCIÓN CRÍTICA! Copia el token (ej: ghp_...) inmediatamente. Guárdalo en un lugar seguro y temporal. No volverás a verlo.

2. Crear el Repositorio en GitHub

  1. En GitHub, crea un nuevo repositorio llamado analisis-precipitacion-v2.
  2. Hazlo Público.
  3. MUY IMPORTANTE: Marca las siguientes casillas:
    • Add a README file.
    • Add .gitignore y elige la plantilla R de la lista.
  4. Haz clic en Create repository.

Parte 2: Configuración del Proyecto en Posit Cloud

1. Clonar el Repositorio

  1. En tu nuevo repositorio de GitHub, haz clic en el botón verde <> Code y copia la URL HTTPS.
  2. En Posit Cloud, ve a New Project > New Project from Git Repository.
  3. Pega la URL de tu repositorio y haz clic en OK.

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.

  1. 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/")
  2. 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"
    )
  3. Guarda tu PAT de forma segura. Al ejecutar el siguiente comando, la consola te pedirá el token:

    library(gitcreds)
    gitcreds_set()
  4. 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.

Parte 3: El Trabajo de Análisis (Reconstrucción)

Vamos a recrear los archivos que se borraron.

1. Crear Carpeta y Archivo de Datos

  1. En el panel de archivos (abajo a la derecha), haz clic en New Folder y llámala data.

  2. Entra en la carpeta data.

  3. 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
  4. Guarda el archivo.

2. Crear el Script de Análisis

  1. Vuelve al directorio principal del proyecto (haciendo clic en el icono de la casita en el panel de archivos).

  2. 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'.")
  3. Guarda el script y ejecútalo haciendo clic en el botón Source. Se creará la carpeta output con el gráfico dentro.

Parte 4: El Flujo de Git Correcto y Final

Este es el proceso para sincronizar tu trabajo con GitHub.

  1. Ir a la Pestaña Git: En el panel superior derecho, haz clic en la pestaña Git.

  2. 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.

  3. Confirmar Cambios (Commit): Haz clic en el botón Commit.

  4. 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.

  5. Haz clic en Commit. Has guardado una “fotografía” de tu trabajo localmente.

  6. 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í.

Lecciones Aprendidas de los Errores

Aprovecha para explicar a tus estudiantes qué pasó:

  • GitHub Push Protection: Es un guardián automático. Si detecta un secreto (como un PAT) en los archivos que intentas subir, bloquea el push para proteger tu cuenta. La solución es eliminar el secreto del historial, no solo del archivo.
  • Consola vs. Terminal: La Consola ejecuta código de R (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.

🧪 Práctica Guiada 1: Modelos de Regresión

Asignatura: Estadística Aplicada con Python y R

Tema: Predicción de la Resistencia del Concreto con Regresión Lineal Múltiple

Objetivo del Ejercicio

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.

Paso 1: Configuración del Proyecto (El Flujo “De Cero a Héroe”)

Antes de empezar con el análisis, asegúrate de tener tu entorno de trabajo listo.

  1. Crear Repositorio en GitHub:

    • Ve a tu cuenta de GitHub.
    • Crea un nuevo repositorio público llamado proyecto-regresion-concreto.
    • Importante: Asegúrate de inicializarlo marcando las casillas para añadir un README.md y un .gitignore (selecciona la plantilla R).
  2. Clonar en Posit Cloud:

    • Copia la URL HTTPS de tu nuevo repositorio.
    • En Posit Cloud, crea un New Project from Git Repository y pega la URL.
  3. Configurar Git (si es la primera vez en este proyecto):

    • En la Consola de R, ejecuta los comandos para configurar tu nombre y email, y para guardar tu PAT con 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

Paso 2: Creación de los Datos y el Entorno de Trabajo

1. Crear la Carpeta de Datos:

  • En el panel de archivos de Posit Cloud (abajo a la derecha), crea una nueva carpeta (New Folder) llamada data.

2. Crear el Archivo de Datos:

  • Entra en la carpeta data.
  • Crea un nuevo archivo de texto (New File > Text File) llamado datos_concreto.csv.
  • Pega los siguientes datos, que simulan muestras de laboratorio, y guarda el archivo:
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:

  • Vuelve al directorio principal del proyecto.
  • Crea un nuevo archivo R Markdown (New File > R Markdown...).
  • Dale el título “Análisis de Regresión del Concreto” y como autor tu nombre. Deja el formato de salida por defecto (HTML).
  • Guarda el archivo como analisis_regresion.Rmd. Borra todo el contenido de ejemplo que aparece después de la cabecera (YAML header).

Paso 3: Análisis de Regresión en R Markdown

Ahora, dentro de tu archivo analisis_regresion.Rmd, empezarás a escribir el código y texto para el análisis.

3.1 Carga de Librerías y Datos

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)

3.2 Análisis Exploratorio de Datos (EDA) 📊

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.

3.3 Construcción del Modelo de Regresión Lineal Múltiple 🏗️

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

````

3.4 Interpretación de los Resultados del Modelo

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.

3.5 Diagnóstico del Modelo (Opcional, pero recomendado)

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. Residuals vs. Fitted: Los puntos deben dispersarse aleatoriamente alrededor de la línea horizontal en 0, sin patrones evidentes (como una curva o un embudo). Esto verifica la linealidad.
  2. Normal Q-Q: Los puntos deben seguir de cerca la línea diagonal. Esto verifica que los residuos siguen una distribución normal.

Paso 4: Comunicación y Sincronización

1. Generar el Reporte:

  • Haz clic en el botón Knit en la parte superior de tu script R Markdown.
  • Esto generará un archivo HTML con todo tu código, texto y gráficos, ¡un reporte profesional listo para compartir!

2. Sincronizar con GitHub ✅:

  • ¡Es hora de guardar tu trabajo en la nube!
  • Ve a la pestaña Git en Posit Cloud.
  • Verás todos tus archivos nuevos y modificados (.Rmd, .html, la carpeta data, etc.).
  • Stage: Marca todas las casillas.
  • Commit: Escribe un mensaje descriptivo, como Finaliza análisis de regresión para resistencia del concreto.
  • Push: Haz clic en el botón Push para enviar todo a tu repositorio de GitHub.

¡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.

🌱 Práctica Guiada 2: ANOVA y MANOVA

Asignatura: Estadística Aplicada con Python y R

Tema: Comparación del Efecto de Fertilizantes en el Crecimiento de Cultivos

Objetivo del Ejercicio

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.

Paso 1: Configuración del Proyecto (El Flujo “De Cero a Héroe”)

  1. Crear Repositorio en GitHub:

    • Crea un nuevo repositorio público llamado proyecto-anova-fertilizantes.
    • Inicialízalo con un README.md y un .gitignore para R.
  2. Clonar en Posit Cloud:

    • Copia la URL HTTPS del repositorio.
    • En Posit Cloud, crea un New Project from Git Repository usando esa URL.
  3. Configurar Git:

    • Si es necesario, configura tu identidad en la Consola de R (use_git_config) y guarda tu PAT (gitcreds_set).

Paso 2: Creación de los Datos y el Entorno de Trabajo

1. Crear la Carpeta y el Archivo de Datos:

  • En Posit Cloud, crea una carpeta llamada data.
  • Dentro de data, crea un nuevo archivo de texto (New File > Text File) llamado datos_fertilizantes.csv.
  • Pega los siguientes datos de un experimento de campo simulado y guarda el archivo:
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.

Paso 3: Análisis en R Markdown

Ahora, dentro de tu archivo analisis_anova.Rmd, desarrollarás el análisis.

3.1 Carga de Librerías y Exploración de Datos 🔬

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.

3.2 Análisis de Varianza (ANOVA)

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”.

3.3 Análisis de Varianza Multivariado (MANOVA)

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.

Paso 4: Conclusiones y Sincronización

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:

  • Haz clic en Knit para generar tu reporte en HTML.

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.

☕ Práctica Guiada 3: Análisis Multivariado y Discriminante

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.

Objetivo del Ejercicio

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.

Paso 1: Configuración del Proyecto (El Flujo “De Cero a Héroe”)

  1. Crear Repositorio en GitHub:

    • Crea un nuevo repositorio público llamado proyecto-multivariado-cafe.
    • Inicialízalo con un README.md y un .gitignore para R.
  2. Clonar en Posit Cloud:

    • Copia la URL HTTPS del repositorio.
    • En Posit Cloud, crea un New Project from Git Repository usando esa URL.
  3. Configurar Git:

    • Asegúrate de que tu identidad y tu PAT estén configurados en la Consola de R.

Paso 2: Creación de los Datos y el Entorno de Trabajo

1. Crear la Carpeta y el Archivo de Datos:

  • Crea una carpeta llamada data.
  • Dentro de data, crea un nuevo archivo de texto (New File > Text File) llamado datos_cafe.csv.
  • Pega los siguientes datos de las mediciones de los sensores y guarda el archivo:
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:

  • Crea un nuevo archivo R Markdown (New File > R Markdown...).
  • Titúlalo “Clasificación de Calidad del Café”.
  • Guárdalo como analisis_multivariado.Rmd y borra el contenido de ejemplo.

Paso 3: Análisis en R Markdown

Ahora, dentro de tu archivo analisis_multivariado.Rmd, desarrollarás el análisis.

3.1 Carga de Librerías y Exploración Inicial

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.

3.2 Análisis de Componentes Principales (PCA) para Visualización 📈

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”.

3.3 Análisis Discriminante Lineal (LDA) para Clasificación

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é.

Paso 4: Conclusiones y Sincronización

1. Escribir las Conclusiones:

  • ¿Qué te mostró el gráfico de PCA sobre la separabilidad de las calidades de café?
  • ¿Qué tan preciso fue tu modelo de LDA? ¿Consideras que una precisión del [valor]% es suficientemente buena para ser implementada por la cooperativa?
  • ¿Qué variables parecen ser más importantes para discriminar entre grupos (observa los “Coefficients of linear discriminants” en el resultado de print(modelo_lda))?

2. Generar el Reporte y Sincronizar con GitHub ✅:

  • Knit tu documento a HTML.
  • Ve a la pestaña Git, y haz Stage, Commit (con un mensaje como 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.