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.
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:
table(), margin.table(),
prop.table(), addmargins() y
chisq.test().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.
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
table(),
margin.table(), prop.table() y
addmargins().chisq.test(),
incluyendo la diferencia entre el \(\chi^2\) con y sin corrección de
continuidad de Yates.| 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) |
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.
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.
linea (A/B/C),
hora (turno 1º–8º), temperatura
(Alta/Media/Baja), averias (Si/No), sistema
(ON/OFF).sistema × averias;
temperatura × averias; linea ×
averias.,) 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))
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)
Contour × pH_categoria
(¿la posición del terreno condiciona la acidez del suelo?), o
Depth × N_categoria.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) |
sistema_riego ×
estado_cultivo; textura_suelo ×
estado_cultivo; falla_bomba ×
estado_cultivo.riego <- read.csv("riego_estres_hidrico_agricola.csv") # decimales con punto
str(riego)
ApellidoNombre_ProbabilidadCondicional.Rmd (ejemplo:
FuentesJusto_ProbabilidadCondicional.Rmd).author los nombres completos del estudiante y su código
estudiantil, y en title el tema de la actividad.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.Entrega: publicar el documento en RPubs desde Posit Cloud (botón Knit → Publish) y compartir la URL en el grupo de WhatsApp de la asignatura o por el medio que el profesor indique.
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).
margin de
prop.table() — es la causa más común de errores
conceptuales en esta actividad.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.