Actividad Evaluativa — Semana 5

“Ingeniero Detective”: Probabilidad Condicional y Tablas de Contingencia en Ingeniería Agrícola

Asignatura: Estadística Aplicada con Python y R Programa: Ingeniería Agrícola — Universidad de Sucre Semana de referencia: Semana 5 — Probabilidad Aplicada, Incertidumbre y Simulación (Sesión 2: Probabilidad Condicional y Tablas de Contingencia) Modalidad: Individual, trabajo autónomo en Posit Cloud (RMarkdown) Entregable: URL del documento RMarkdown publicado en RPubs (más el archivo .Rmd como respaldo, si el profesor lo solicita)

Nota para el docente: el título de la nota (Nota 3, Nota 4, etc.) y su peso dentro del corte quedan a tu criterio, según el esquema de evaluación vigente del curso; este documento solo fija la actividad y la rúbrica.


1. Descripción de la actividad

En la Semana 5 aprendimos que muchas variables de un sistema agrícola no son independientes: el clima condiciona el estrés hídrico del cultivo, un sistema de riego ineficiente condiciona la probabilidad de pérdida de humedad, y la textura de un suelo condiciona su capacidad de retención de agua. La herramienta estadística para demostrar — no solo intuir — estas dependencias es la tabla de contingencia y la probabilidad condicional \(P(A\vert B)\), contrastada con una prueba formal de independencia (\(\chi^2\)).

En esta actividad cada estudiante debe elegir un conjunto de datos real de interés en ingeniería (ver sección 4), identificar dentro de él dos variables categóricas con una relación de interés ingenieril, y construir — con apoyo crítico y documentado de un agente de IA (Claude, ChatGPT o Gemini) — un notebook de RMarkdown en Posit Cloud que:

  1. Verifique a mano (lápiz y cuaderno) al menos una probabilidad condicional antes de calcularla en R, siguiendo la lógica trabajada en clase con el ejemplo de clima y estrés hídrico.
  2. Reproduzca ese resultado en R usando las funciones vistas en clase: table(), margin.table(), prop.table(), addmargins() y chisq.test().
  3. Concluya, con criterio de ingeniero agrícola, si existe o no dependencia estadística entre las dos variables elegidas y qué decisión técnica se derivaría de ese resultado.

Esta actividad extiende — no reemplaza — el ejercicio de clase (clima × estado del cultivo) y se enmarca en la pedagogía del “Lápiz y el Algoritmo”: el estudiante debe comprender la lógica matemática de la probabilidad condicional antes de delegarle la escritura del código a la IA, y debe poder explicar y defender cada decisión tomada por su función.


2. Objetivos

Objetivo general

Aplicar el marco de tablas de contingencia y probabilidad condicional para evaluar la dependencia estadística entre dos variables categóricas de un sistema agrícola o agroindustrial real, mediante un notebook de R desarrollado con apoyo crítico de un agente de IA.

Objetivos específicos

  • Traducir una pregunta de ingeniería en una pareja de variables categóricas analizable mediante tabla de contingencia (fila = condición, columna = resultado).
  • Calcular a mano al menos una probabilidad condicional antes de programarla, como verificación humana del resultado computacional.
  • Construir la tabla de contingencia y las probabilidades condicionales, marginales y conjuntas en R usando table(), margin.table(), prop.table() y addmargins().
  • Aplicar e interpretar correctamente chisq.test(), incluyendo la diferencia entre el \(\chi^2\) con y sin corrección de continuidad de Yates.
  • Documentar de forma crítica el proceso de interacción con el agente de IA (Bitácora de IA), incluyendo errores, ajustes y verificación humana del código.
  • Justificar, como futuro ingeniero agrícola, una decisión técnica a partir del resultado de la prueba de independencia.

3. Competencias, resultados de aprendizaje y estrategias

Competencia Resultado de aprendizaje Estrategia pedagógica
Razonamiento probabilístico aplicado Calcula correctamente probabilidades condicionales, marginales y conjuntas a partir de una tabla de contingencia Verificación manuscrita previa + réplica exacta en R
Pensamiento computacional y programación asistida por IA Traduce una pregunta de ingeniería en código R correcto (table, prop.table, chisq.test), verificándolo línea por línea Prompting guiado, verificación humana obligatoria, Bitácora de IA
Inferencia estadística básica Interpreta correctamente un valor \(p\) de chisq.test() y distingue significancia estadística de importancia práctica Prueba de hipótesis aplicada a un caso agrícola real, con y sin corrección de Yates
Juicio técnico e ingenieril Traduce un resultado de dependencia estadística en una recomendación técnica concreta (riego, manejo de suelo, mantenimiento) Pregunta de conclusión técnica individual
Reserva cognitiva y uso ético de la IA Documenta el prompt usado, si el código funcionó al primer intento y qué ajustes humanos fueron necesarios Bitácora de IA obligatoria (conforme a la Hoja de Ruta de IA ética 2024)

4. Elección del conjunto de datos

Cada estudiante debe elegir uno de los siguientes tres conjuntos de datos y justificar en una línea por qué le resulta de interés como futuro ingeniero agrícola. Para cada opción se sugieren parejas de variables categóricas de partida — el estudiante puede proponer otra pareja distinta, siempre que la justifique.

Opción A — acero.csv (proceso agroindustrial de manufactura)

Dataset compartido por el profesor con 118 registros de un proceso industrial por línea de producción (A, B, C) y turno. Aunque no es agrícola en sentido estricto, es representativo de un proceso agroindustrial de transformación (poscosecha, beneficio, empaque) donde también interesa saber si las averías dependen de condiciones operativas.

  • Variables categóricas disponibles: linea (A/B/C), hora (turno 1º–8º), temperatura (Alta/Media/Baja), averias (Si/No), sistema (ON/OFF).
  • Parejas sugeridas: sistema × averias; temperatura × averias; linea × averias.
  • Advertencia técnica de importación: el archivo separa columnas con coma (,) pero también usa la coma como separador decimal en varias columnas (por eso esos valores vienen entre comillas, p. ej. "135,31"). El separador de campo no cambia (sigue siendo coma), así que en R se importa indicando solo el separador decimal:
acero <- read.csv("acero.csv", dec = ",")
str(acero)  # revisa que columnas como 'consumo', 'NOx', 'CO', 'COV', 'SO2', 'CO2', 'N2O'
            # hayan quedado numéricas (num) y NO como texto (chr); si alguna queda
            # como chr, conviértela con as.numeric(gsub(",", ".", acero$columna))

Opción B — Soils (paquete carData de R)

Dataset clásico de ciencia del suelo: 48 muestras de un experimento en bloques completos al azar que cruza posición del terreno (Contour: Depression, Slope, Top) y profundidad de muestreo (Depth: 0-10, 10-30, 30-60, 60-90 cm), con 9 variables químicas de respuesta (pH, N, P, Ca, Mg, K, Na, Conduc, Dens).

install.packages("carData")   # una sola vez
library(carData)
data(Soils)
str(Soils)
  • Contour y Depth ya son categóricas, pero al cruzarse forman un diseño balanceado (4 réplicas por celda) que no sirve para una prueba de independencia interesante. Por eso, para esta opción es obligatorio crear una nueva variable categórica a partir de una variable química continua, por ejemplo:
# Ejemplo: clasificar el pH en categorías agronómicas
Soils$pH_categoria <- cut(Soils$pH,
                           breaks = c(-Inf, 5.5, 7.0, Inf),
                           labels = c("Ácido", "Neutro", "Alcalino"))

# Alternativa con el Nitrógeno, usando terciles de la muestra
Soils$N_categoria <- cut(Soils$N,
                          breaks = quantile(Soils$N, probs = c(0, 1/3, 2/3, 1)),
                          labels = c("Bajo", "Medio", "Alto"),
                          include.lowest = TRUE)
  • Pareja sugerida: Contour × pH_categoria (¿la posición del terreno condiciona la acidez del suelo?), o Depth × N_categoria.

Opción C — riego_estres_hidrico_agricola.csv (dataset propuesto para esta actividad)

Conjunto de datos simulado —pero estadísticamente realista— de 180 lotes agrícolas, construido específicamente para esta actividad, que extiende el ejercicio de clase (clima × estrés hídrico) incorporando el sistema de riego y la textura del suelo. Se entrega junto con esta guía.

Variable Tipo Descripción
id_lote entero Identificador del lote
sector categórica (3) Sector de la finca: Sector 1, 2, 3
sistema_riego categórica (3) Goteo, Aspersión, Gravedad
textura_suelo categórica (3) Arenoso, Franco, Arcilloso
horas_riego_semana numérica Horas de riego aplicadas en la semana
precipitacion_semana_mm numérica Precipitación acumulada de la semana (mm)
humedad_suelo_pct numérica Humedad volumétrica del suelo (%)
falla_bomba categórica (2) Si hubo falla de la motobomba esa semana (Si/No)
estado_cultivo categórica (2) Estado hídrico observado: Normal / Estrés
rendimiento_kg_ha numérica Rendimiento estimado (kg/ha)
  • Parejas sugeridas: sistema_riego × estado_cultivo; textura_suelo × estado_cultivo; falla_bomba × estado_cultivo.
  • Es el dataset más cercano al ejercicio de clase: se recomienda para quienes quieran concentrarse en la interpretación del resultado más que en la limpieza de datos.
riego <- read.csv("riego_estres_hidrico_agricola.csv")  # decimales con punto
str(riego)

5. Requisitos del notebook RMarkdown

  1. Nombre del archivo: ApellidoNombre_ProbabilidadCondicional.Rmd (ejemplo: FuentesJusto_ProbabilidadCondicional.Rmd).
  2. Encabezado YAML: debe incluir en author los nombres completos del estudiante y su código estudiantil, y en title el tema de la actividad.
  3. Sección manuscrita (fotografiada o descrita en el propio notebook): una celda de texto donde el estudiante transcriba el cálculo a mano de al menos una probabilidad condicional de su tabla elegida, tal como se hizo en clase con el ejemplo de clima y estrés hídrico. Se recomienda anexar una foto del cálculo manuscrito.
  4. Justificación del dataset y de la pareja de variables (2 a 4 líneas): por qué esa pareja de variables es relevante para un ingeniero agrícola.
  5. Código R obligatorio, usando explícitamente:
    • table() para construir la tabla de contingencia.
    • margin.table() para los totales marginales.
    • prop.table() con margin = 1 (condicionales por fila) y al menos una vez sin margin (probabilidades conjuntas).
    • addmargins() para la tabla resumen final.
    • chisq.test(), reportando el resultado con y sin correct = FALSE cuando la tabla sea 2×2, y explicando la diferencia.
  6. Bitácora de IA (obligatoria): herramienta usada, prompt exacto utilizado, si el código funcionó al primer intento, ajustes humanos realizados y errores o alucinaciones detectadas (por ejemplo, funciones inventadas o mal usadas por la IA).
  7. Conclusión técnica individual (3 a 5 líneas): ¿existe dependencia estadística entre las variables elegidas? ¿Qué decisión de ingeniería agrícola (cambio de sistema de riego, manejo del suelo, mantenimiento preventivo de bombas, programación de turnos, etc.) se derivaría de ese resultado?

Entrega: publicar el documento en RPubs desde Posit Cloud (botón KnitPublish) y compartir la URL en el grupo de WhatsApp de la asignatura o por el medio que el profesor indique.


6. Rúbrica de evaluación

Escala institucional 0.0 a 5.0. La nota de la actividad corresponde al promedio ponderado de los ocho criterios.

# Criterio Peso Excelente (4.6–5.0) Bueno (3.6–4.5) Aceptable (3.0–3.5) Insuficiente (0.0–2.9)
1 Identificación y encabezado del notebook 5% YAML completo: nombre, código, asignatura, tema Completo con formato menor incompleto Falta un dato (p. ej. el código) Falta el encabezado o varios datos
2 Elección y justificación del dataset y de la pareja de variables 10% Pareja de variables clara, pertinente y bien justificada en clave de ingeniería agrícola Pareja adecuada, justificación breve pero correcta Pareja poco pertinente o justificación genérica No justifica la elección o la pareja no permite un análisis 2×2 o r×s con sentido
3 Verificación manuscrita previa 15% Cálculo a mano correcto de al menos una probabilidad condicional, coherente con la salida de R Cálculo a mano presente con error menor no estructural Cálculo a mano incompleto o con error conceptual Ausente o incoherente con el resultado de R
4 Construcción de la tabla de contingencia (table()) 15% Tabla correcta, niveles bien ordenados/etiquetados, coincide con el conteo manuscrito Tabla correcta con orden o etiquetas menores por mejorar Tabla con error de conteo o de variables cruzadas table() ausente o tabla incorrecta
5 Probabilidades condicionales, marginales y conjuntas (prop.table, margin.table, addmargins) 20% Las tres funciones usadas correctamente; condicionales, marginales y conjuntas bien diferenciadas e interpretadas Uso correcto con alguna interpretación imprecisa Confunde condicional con conjunta o marginal en algún punto Funciones ausentes o mal aplicadas
6 Prueba de independencia (chisq.test) e interpretación 15% Aplica la prueba correctamente, compara con/sin corrección de Yates cuando aplica, e interpreta el p-valor de forma correcta Aplica la prueba correctamente, interpretación del p-valor adecuada pero sin comparar correcciones Aplica la prueba pero interpreta mal el p-valor o la hipótesis nula Prueba ausente o inexistente relación con la conclusión
7 Bitácora de IA 10% Prompt exacto documentado, honestidad sobre ajustes/errores, reflexión crítica genuina Documentada pero con detalle limitado Bitácora superficial o genérica Ausente o copiada sin evidencia real de uso
8 Conclusión técnica y juicio ingenieril 10% Conclusión sólida, específica y coherente con el resultado estadístico obtenido Conclusión adecuada pero general Conclusión superficial o parcialmente desconectada del resultado Ausente o no relacionada con los resultados

Nota de la actividad = Σ (nota del criterio × peso del criterio), redondeada a un decimal según la escala institucional (0.0–5.0).


7. Recomendaciones para el estudiante

  • Antes de pedirle el código al agente de IA, calcula a mano la probabilidad condicional para un subconjunto pequeño de tu tabla, tal como se hizo en clase. Esto te permitirá verificar si el código generado por la IA es correcto.
  • Revisa el código generado línea por línea: no lo aceptes sin entenderlo, especialmente el argumento margin de prop.table() — es la causa más común de errores conceptuales en esta actividad.
  • Si tu tabla de contingencia es mayor a 2×2 (por ejemplo, sistema_riego con 3 niveles), no existe corrección de continuidad de Yates aplicable de la misma forma que en 2×2; chisq.test() la ignora automáticamente en tablas r×s más grandes — no es necesario forzar correct = FALSE en ese caso.
  • Sé honesto en la Bitácora de IA: documentar un error o una alucinación de la IA y cómo la corregiste vale más que aparentar que todo funcionó a la primera.