Introducción

Las tablas de contingencia permiten analizar la relación entre dos variables categóricas. En este trabajo se utiliza un conjunto de datos relacionado con un proceso de producción para estudiar la relación entre la línea de producción y la categoría de temperatura registrada. Primero se realiza un cálculo manual de probabilidad condicional y posteriormente se comprueba mediante R.

Descripción del conjunto de datos

Base de datos utilizada

Se utiliza el archivo acero (1).csv, que contiene información relacionada con diferentes variables del proceso de producción. La base contiene 117 observaciones y 20 variables.

Variables seleccionadas

Para este análisis se seleccionaron las variables:

  • Línea: identifica la línea de producción A, B o C.
  • Temperatura: clasifica el registro como Alta, Baja o Media.

Justificación de las variables

La relación entre la línea de producción y la temperatura es relevante porque permite identificar si la distribución de las categorías de temperatura es similar entre las diferentes líneas. En un proceso industrial, esta información puede servir como apoyo para revisar las condiciones de operación de cada línea.

Carga de los datos

Preparación

El archivo acero (1).csv debe encontrarse en la misma carpeta que este documento RMarkdown.

# Verificar los archivos disponibles
list.files()
## [1] "acero (1).csv"            "Actividad_Final_50%.html"
## [3] "Actividad_Final_50%.Rmd"  "calculo_manual.png"      
## [5] "project.Rproj"
# Cargar la base de datos
acero <- read.csv(
  "acero (1).csv",
  stringsAsFactors = FALSE,
  check.names = FALSE
)

# Información general
cat("Número de observaciones:", nrow(acero), "\n")
## Número de observaciones: 117
cat("Número de variables:", ncol(acero), "\n")
## Número de variables: 20

Verificación de las variables

names(acero)
##  [1] "consumo"     "pr.tbc"      "pr.cc"       "pr.ca"       "pr.galv1"   
##  [6] "pr.galv2"    "pr.pint"     "linea"       "hora"        "temperatura"
## [11] "averias"     "naverias"    "sistema"     "ProdTotal"   "NOx"        
## [16] "CO"          "COV"         "SO2"         "CO2"         "N2O"

Categorías de línea

unique(acero$linea)
## [1] "A" "B" "C"

Categorías de temperatura

unique(acero$temperatura)
## [1] "Alta"  "Baja"  "Media"

Tabla de contingencia

Construcción de la tabla

tabla <- table(
  acero$linea,
  acero$temperatura
)

tabla
##    
##     Alta Baja Media
##   A   24   15     0
##   B   13   13    13
##   C    9   10    20

Presentación de la tabla

knitr::kable(
  tabla,
  caption = "Tabla 1. Frecuencias observadas de línea y temperatura"
)
Tabla 1. Frecuencias observadas de línea y temperatura
Alta Baja Media
A 24 15 0
B 13 13 13
C 9 10 20

La tabla obtenida es:

Línea Alta Baja Media Total
A 24 15 0 39
B 13 13 13 39
C 9 10 20 39
Total 46 38 33 117

Totales marginales

Total por línea

Se utiliza margin.table() para obtener los totales de cada línea.

totales_linea <- margin.table(
  tabla,
  1
)

knitr::kable(
  data.frame(
    Linea = names(totales_linea),
    Total = as.numeric(totales_linea)
  ),
  caption = "Tabla 2. Totales marginales por línea"
)
Tabla 2. Totales marginales por línea
Linea Total
A 39
B 39
C 39

Total por temperatura

totales_temperatura <- margin.table(
  tabla,
  2
)

knitr::kable(
  data.frame(
    Temperatura = names(totales_temperatura),
    Total = as.numeric(totales_temperatura)
  ),
  caption = "Tabla 3. Totales marginales por temperatura"
)
Tabla 3. Totales marginales por temperatura
Temperatura Total
Alta 46
Baja 38
Media 33

Tabla con totales generales

La función addmargins() permite agregar los totales por filas y columnas.

tabla_totales <- addmargins(tabla)

knitr::kable(
  tabla_totales,
  caption = "Tabla 4. Tabla de contingencia con totales marginales"
)
Tabla 4. Tabla de contingencia con totales marginales
Alta Baja Media Sum
A 24 15 0 39
B 13 13 13 39
C 9 10 20 39
Sum 46 38 33 117

Cálculo manual de probabilidad condicional

Fórmula

La probabilidad condicional se calcula mediante:

\[ P(A|B)=\frac{P(A\cap B)}{P(B)} \]

En este trabajo se calculará:

\[ P(\text{Temperatura Alta}|\text{Línea A}) \]

Datos de la tabla

De la tabla de contingencia se obtiene:

  • Línea A y Temperatura Alta = 24 casos.
  • Total de casos de Línea A = 39 casos.

Por lo tanto:

\[ P(\text{Alta}|\text{Línea A}) = \frac{24}{39} \]

Realizando la división:

\[ P(\text{Alta}|\text{Línea A}) = 0.6154 \]

Convertido a porcentaje:

\[ 0.6154\times100=61.54\% \]

Por lo tanto:

\[ \boxed{P(\text{Alta}|\text{Línea A})=61.54\%} \]

Evidencia del cálculo manual

El estudiante debe tomar una fotografía del procedimiento realizado a mano en el cuaderno y subirla a Posit Cloud.

La imagen debe mostrar:

\[ P(\text{Alta}|\text{Línea A}) = \frac{24}{39} = 0.6154 = 61.54\% \]

calculos a mano
calculos a mano

Probabilidad condicional mediante R

Uso de prop.table()

La función prop.table() permite convertir las frecuencias de la tabla en proporciones.

probabilidades <- prop.table(
  tabla,
  margin = 1
)

knitr::kable(
  probabilidades,
  digits = 4,
  caption = "Tabla 5. Probabilidades condicionales de temperatura según la línea"
)
Tabla 5. Probabilidades condicionales de temperatura según la línea
Alta Baja Media
A 0.6154 0.3846 0.0000
B 0.3333 0.3333 0.3333
C 0.2308 0.2564 0.5128

Comprobación del cálculo manual

P(Alta | Línea A)

p_alta_A <- prop.table(
  tabla,
  margin = 1
)["A", "Alta"]

p_alta_A
## [1] 0.6153846

El resultado obtenido debe ser:

\[ 0.6154 \]

Para expresarlo como porcentaje:

p_alta_A * 100
## [1] 61.53846

El resultado es:

\[ 61.54\% \]

Comparación entre cálculo manual y R

comparacion <- data.frame(
  Metodo = c(
    "Cálculo manual",
    "R"
  ),
  
  Probabilidad = c(
    24/39,
    p_alta_A
  ),
  
  Porcentaje = c(
    (24/39)*100,
    p_alta_A*100
  )
)

knitr::kable(
  comparacion,
  digits = 4,
  caption = "Tabla 6. Comparación del cálculo manual con el cálculo en R"
)
Tabla 6. Comparación del cálculo manual con el cálculo en R
Metodo Probabilidad Porcentaje
Cálculo manual 0.6154 61.5385
R 0.6154 61.5385

Probabilidades conjuntas

Las probabilidades conjuntas se calculan dividiendo cada frecuencia entre el número total de observaciones.

prob_conjuntas <- prop.table(tabla)

knitr::kable(
  prob_conjuntas,
  digits = 4,
  caption = "Tabla 7. Probabilidades conjuntas"
)
Tabla 7. Probabilidades conjuntas
Alta Baja Media
A 0.2051 0.1282 0.0000
B 0.1111 0.1111 0.1111
C 0.0769 0.0855 0.1709

Probabilidad conjunta de Línea A y Temperatura Alta

p_A_alta <- prop.table(tabla)["A", "Alta"]

p_A_alta
## [1] 0.2051282

El cálculo manual es:

\[ P(\text{A y Alta}) = \frac{24}{117} \]

\[ P(\text{A y Alta}) = 0.2051 \]

Porcentaje:

\[ 20.51\% \]

Prueba de independencia Chi-cuadrado

Hipótesis

H₀: La línea de producción y la temperatura son independientes.

H₁: La línea de producción y la temperatura no son independientes.

Se establece:

\[ \alpha=0.05 \]

Aplicación de la prueba

Como la tabla tiene dimensiones 3 × 3, se utiliza chisq.test() sin corrección de continuidad.

prueba_chi <- chisq.test(
  tabla,
  correct = FALSE
)

prueba_chi
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 27.597, df = 4, p-value = 1.505e-05

Resultados de Chi-cuadrado

resultado_chi <- data.frame(
  Chi_cuadrado = as.numeric(
    prueba_chi$statistic
  ),
  
  Grados_libertad = as.numeric(
    prueba_chi$parameter
  ),
  
  Valor_p = as.numeric(
    prueba_chi$p.value
  )
)

knitr::kable(
  resultado_chi,
  digits = 6,
  caption = "Tabla 8. Resultado de la prueba de chi-cuadrado"
)
Tabla 8. Resultado de la prueba de chi-cuadrado
Chi_cuadrado Grados_libertad Valor_p
27.59684 4 1.5e-05

Frecuencias esperadas

frecuencias_esperadas <- prueba_chi$expected

knitr::kable(
  round(frecuencias_esperadas, 4),
  caption = "Tabla 9. Frecuencias esperadas"
)
Tabla 9. Frecuencias esperadas
Alta Baja Media
A 15.3333 12.6667 11
B 15.3333 12.6667 11
C 15.3333 12.6667 11

Decisión estadística

El nivel de significancia establecido es:

\[ \alpha=0.05 \]

La regla de decisión es:

  • Si \(p < 0.05\), se rechaza H₀.
  • Si \(p \geq 0.05\), no se rechaza H₀.
alpha <- 0.05

if (prueba_chi$p.value < alpha) {
  decision <- "Se rechaza H0"
} else {
  decision <- "No se rechaza H0"
}

resultado_decision <- data.frame(
  Alfa = alpha,
  Valor_p = prueba_chi$p.value,
  Decision = decision
)

knitr::kable(
  resultado_decision,
  digits = 6,
  caption = "Tabla 10. Decisión estadística"
)
Tabla 10. Decisión estadística
Alfa Valor_p Decision
0.05 1.5e-05 Se rechaza H0

Interpretación

La prueba de chi-cuadrado produce un valor p aproximadamente igual a:

\[ p=0.000015 \]

Este valor es menor que el nivel de significancia:

\[ 0.000015 < 0.05 \]

Por lo tanto, se rechaza la hipótesis nula de independencia.

Existe evidencia estadística de asociación entre la línea de producción y la categoría de temperatura en los datos analizados.

Comparación de las probabilidades entre líneas

comparacion_lineas <- data.frame(
  Linea = rownames(probabilidades),
  
  Alta = probabilidades[, "Alta"],
  
  Baja = probabilidades[, "Baja"],
  
  Media = probabilidades[, "Media"]
)

knitr::kable(
  comparacion_lineas,
  digits = 4,
  caption = "Tabla 11. Probabilidades de temperatura dentro de cada línea"
)
Tabla 11. Probabilidades de temperatura dentro de cada línea
Linea Alta Baja Media
A A 0.6154 0.3846 0.0000
B B 0.3333 0.3333 0.3333
C C 0.2308 0.2564 0.5128

La Línea A presenta una probabilidad de 61.54 % para la categoría Alta y 38.46 % para Baja.

La Línea B presenta una distribución de 33.33 % para cada una de las tres categorías.

La Línea C presenta 23.08 % para Alta, 25.64 % para Baja y 51.28 % para Media.

Estas diferencias en las distribuciones ayudan a explicar el resultado obtenido mediante la prueba de chi-cuadrado.

Aplicación en Ingeniería

Desde la perspectiva de la ingeniería, las tablas de contingencia pueden utilizarse para comparar condiciones de operación entre diferentes grupos o líneas de producción.

En este caso, la asociación encontrada entre línea y temperatura indica que las categorías de temperatura no presentan la misma distribución en las tres líneas. Este resultado puede utilizarse como punto de partida para revisar las condiciones de operación y realizar análisis adicionales que permitan identificar las causas de las diferencias observadas.

Conclusiones

  1. La tabla de contingencia permitió analizar conjuntamente la línea de producción y la categoría de temperatura utilizando 117 observaciones.

  2. La probabilidad de registrar una temperatura Alta cuando la observación corresponde a la Línea A fue de 61.54 %, resultado obtenido manualmente y comprobado mediante R.

  3. La probabilidad conjunta de pertenecer a la Línea A y presentar una temperatura Alta fue de 20.51 %.

  4. La prueba de chi-cuadrado obtuvo un valor p aproximado de 0.000015, menor que 0.05.

  5. Por lo tanto, se rechaza la hipótesis de independencia y existe evidencia estadística de asociación entre la línea de producción y la categoría de temperatura.

Uso de inteligencia artificial

Herramienta utilizada

Se utilizó ChatGPT como herramienta de apoyo para organizar el código RMarkdown, revisar la estructura de las tablas y orientar la aplicación de las funciones estadísticas.

Prompt utilizado

“Ayúdame a realizar una actividad en RMarkdown con una base de datos de acero. Necesito seleccionar dos variables categóricas, construir una tabla de contingencia, calcular una probabilidad condicional manualmente y comprobarla en R usando table(), margin.table(), prop.table(), addmargins() y chisq.test(). También necesito interpretación, conclusión y referencias.”

Verificación humana

Los resultados obtenidos mediante R fueron comparados con el cálculo manual de la probabilidad condicional para comprobar que ambos procedimientos produjeran el mismo resultado.

Referencias

Illowsky, B., & Dean, S. (2023). Introductory statistics 2e. OpenStax.

National Institute of Standards and Technology. (2012). Engineering statistics handbook: Product and process comparisons. U.S. Department of Commerce.

OpenStax. (2022). Introducción a la estadística. OpenStax.