1 1. Planteamiento del problema

En esta evaluación se desarrolla un ejercicio de Analítica de Datos Industriales usando R y RStudio.

La data utilizada en este análisis corresponde a una línea de producción automatizada de manufactura ligera, específicamente a una Línea de Ensamblaje y Control de Calidad de Componentes Plásticos Inyectados. Para cada orden de producción se registran:

  • La línea de producción (L1, L2, L3).
  • El turno de operación (Mañana, Tarde, Noche).
  • La velocidad de producción (unidades/minuto).
  • La temperatura de operación (°C).
  • La cantidad de defectos detectados.
  • El número de paradas no programadas.
  • Un indicador categórico de calidad del lote: Baja, Media, Alta.

El objetivo es aplicar el proceso de analítica de datos:

  1. Comprender el problema.
  2. Preparar y explorar los datos.
  3. Analizar relaciones entre variables.
  4. Construir un modelo simple (árbol de decisión).
  5. Interpretar resultados y proponer conclusiones operativas.

2 2. Carga de librerías

library(dplyr)
library(ggplot2)
library(psych)
library(party)

3 3. Carga y descripción del dataset

En el proyecto existe un archivo data/datos_industriales.csv con información de producción, donde se registran variables críticas del proceso y de calidad por lote.

datos <- read.csv("data/datos_industriales.csv",
                  stringsAsFactors = TRUE)

str(datos)
## 'data.frame':    180 obs. of  8 variables:
##  $ id         : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ linea      : Factor w/ 3 levels "L1","L2","L3": 3 3 3 3 1 1 1 1 3 1 ...
##  $ turno      : Factor w/ 3 levels "Mañana","Noche",..: 1 2 1 2 1 1 3 3 2 1 ...
##  $ velocidad  : num  118 123 124 133 124 ...
##  $ temperatura: num  67 82 75.6 75.5 70.7 72.3 69.4 70.3 75.9 77.7 ...
##  $ defectos   : int  5 9 6 4 13 8 8 10 4 11 ...
##  $ paradas    : int  1 8 6 2 3 4 7 0 2 4 ...
##  $ calidad    : Factor w/ 3 levels "Alta","Baja",..: 1 2 2 1 2 3 2 2 1 2 ...
head(datos)
##   id linea  turno velocidad temperatura defectos paradas calidad
## 1  1    L3 Mañana     117.9        67.0        5       1    Alta
## 2  2    L3  Noche     122.9        82.0        9       8    Baja
## 3  3    L3 Mañana     124.5        75.6        6       6    Baja
## 4  4    L3  Noche     132.8        75.5        4       2    Alta
## 5  5    L1 Mañana     123.7        70.7       13       3    Baja
## 6  6    L1 Mañana     129.0        72.3        8       4   Media

Dimensiones del conjunto de datos:

dim(datos)
## [1] 180   8
names(datos)
## [1] "id"          "linea"       "turno"       "velocidad"   "temperatura"
## [6] "defectos"    "paradas"     "calidad"

Resumen general de las variables:

summary(datos)
##        id         linea      turno      velocidad      temperatura   
##  Min.   :  1.00   L1:67   Mañana:62   Min.   : 99.0   Min.   :64.10  
##  1st Qu.: 45.75   L2:64   Noche :50   1st Qu.:114.7   1st Qu.:71.47  
##  Median : 90.50   L3:49   Tarde :68   Median :119.7   Median :74.70  
##  Mean   : 90.50                       Mean   :119.3   Mean   :74.54  
##  3rd Qu.:135.25                       3rd Qu.:123.6   3rd Qu.:77.33  
##  Max.   :180.00                       Max.   :137.2   Max.   :85.10  
##     defectos         paradas        calidad  
##  Min.   : 2.000   Min.   : 0.000   Alta :30  
##  1st Qu.: 5.000   1st Qu.: 2.000   Baja :57  
##  Median : 7.000   Median : 3.000   Media:93  
##  Mean   : 7.033   Mean   : 2.956             
##  3rd Qu.: 9.000   3rd Qu.: 4.000             
##  Max.   :13.000   Max.   :10.000

4 4. Análisis exploratorio de datos

4.1 4.1. Estadísticos descriptivos univariados

vars_numericas <- datos %>%
  dplyr::select(velocidad, temperatura, defectos, paradas)

psych::describe(vars_numericas)
##             vars   n   mean   sd median trimmed  mad  min   max range  skew
## velocidad      1 180 119.35 6.77 119.65  119.37 6.67 99.0 137.2  38.2 -0.09
## temperatura    2 180  74.54 4.13  74.70   74.57 4.45 64.1  85.1  21.0 -0.03
## defectos       3 180   7.03 2.49   7.00    6.90 2.97  2.0  13.0  11.0  0.41
## paradas        4 180   2.96 1.72   3.00    2.83 1.48  0.0  10.0  10.0  0.78
##             kurtosis   se
## velocidad       0.11 0.50
## temperatura    -0.33 0.31
## defectos       -0.59 0.19
## paradas         1.08 0.13

4.1.1 Distribución del nivel de calidad

table(datos$calidad)
## 
##  Alta  Baja Media 
##    30    57    93
prop.table(table(datos$calidad))
## 
##      Alta      Baja     Media 
## 0.1666667 0.3166667 0.5166667

4.2 4.2. Histogramas

par(mfrow = c(2, 2))

hist(datos$velocidad,
     main = "Histograma de velocidad",
     xlab = "Unidades/minuto")

hist(datos$temperatura,
     main = "Histograma de temperatura",
     xlab = "°C")

hist(datos$defectos,
     main = "Histograma de defectos",
     xlab = "Número de defectos")

hist(datos$paradas,
     main = "Histograma de paradas",
     xlab = "Número de paradas")

4.3 4.3. Boxplots por línea de producción

boxplot(defectos ~ linea, data = datos,
        main = "Defectos por línea de producción",
        xlab = "Línea",
        ylab = "Número de defectos")

4.4 4.4. Calidad por turno

tabla_cal_turno <- table(datos$turno, datos$calidad)
tabla_cal_turno
##         
##          Alta Baja Media
##   Mañana    7   24    31
##   Noche    12   20    18
##   Tarde    11   13    44
barplot(t(tabla_cal_turno),
        beside = TRUE,
        legend = TRUE,
        main   = "Distribución de calidad por turno",
        xlab   = "Turno",
        ylab   = "Frecuencia")

5 5. Análisis multivariado

5.1 5.1. Matriz de correlación

cor(vars_numericas)
##                velocidad  temperatura    defectos     paradas
## velocidad    1.000000000  0.006000351  0.01507527 -0.02958364
## temperatura  0.006000351  1.000000000 -0.04785002  0.09683975
## defectos     0.015075271 -0.047850020  1.00000000  0.12662837
## paradas     -0.029583639  0.096839749  0.12662837  1.00000000

5.2 5.2. Gráficos de dispersión

plot(datos$velocidad, datos$defectos,
     xlab = "Velocidad (unidades/min)",
     ylab = "Número de defectos",
     main = "Velocidad vs Defectos")

plot(datos$temperatura, datos$defectos,
     xlab = "Temperatura (°C)",
     ylab = "Número de defectos",
     main = "Temperatura vs Defectos")

6 6. Modelo de analítica de datos: Árbol de decisión

El objetivo es predecir el nivel de calidad (calidad) a partir de las variables de proceso.

6.1 6.1. Separación en conjunto de entrenamiento y prueba

set.seed(2025)

ind <- sample(2,
              size    = nrow(datos),
              replace = TRUE,
              prob    = c(0.7, 0.3))

trainData <- datos[ind == 1, ]
testData  <- datos[ind == 2, ]

nrow(trainData); nrow(testData)
## [1] 115
## [1] 65

6.2 6.2. Entrenamiento del árbol de decisión

formula_arbol <- calidad ~ velocidad + temperatura +
                            defectos + paradas +
                            linea + turno

arbol_calidad <- ctree(formula_arbol, data = trainData)

arbol_calidad
## 
##   Conditional inference tree with 6 terminal nodes
## 
## Response:  calidad 
## Inputs:  velocidad, temperatura, defectos, paradas, linea, turno 
## Number of observations:  115 
## 
## 1) defectos <= 9; criterion = 1, statistic = 42.705
##   2) paradas <= 4; criterion = 1, statistic = 60.64
##     3) paradas <= 2; criterion = 1, statistic = 19.028
##       4) defectos <= 6; criterion = 1, statistic = 16.075
##         5) temperatura <= 77.9; criterion = 0.999, statistic = 14.508
##           6)*  weights = 20 
##         5) temperatura > 77.9
##           7)*  weights = 9 
##       4) defectos > 6
##         8)*  weights = 14 
##     3) paradas > 2
##       9)*  weights = 42 
##   2) paradas > 4
##     10)*  weights = 12 
## 1) defectos > 9
##   11)*  weights = 18

6.3 6.3. Evaluación en datos de entrenamiento

pred_train <- predict(arbol_calidad)
tabla_train <- table(Predicho = pred_train,
                     Real     = trainData$calidad)
tabla_train
##         Real
## Predicho Alta Baja Media
##    Alta    20    0     0
##    Baja     0   30     0
##    Media    0    0    65
acc_train <- sum(diag(tabla_train)) / sum(tabla_train)
acc_train
## [1] 1

6.4 6.4. Evaluación en datos de prueba

pred_test <- predict(arbol_calidad, newdata = testData)
tabla_test <- table(Predicho = pred_test,
                    Real     = testData$calidad)
tabla_test
##         Real
## Predicho Alta Baja Media
##    Alta    10    0     0
##    Baja     0   27     0
##    Media    0    0    28
acc_test <- sum(diag(tabla_test)) / sum(tabla_test)
acc_test
## [1] 1

6.5 6.5. Gráfico del árbol de decisión

plot(arbol_calidad)

7 7. Discusión de resultados

El análisis exploratorio permitió observar comportamientos típicos de una línea de inyección de plásticos:

Las distribuciones de velocidad y temperatura mostraron variabilidad normal dentro de los rangos operativos, pero con casos donde valores extremos se asociaron con mayores defectos.

La relación entre paradas no programadas y defectos fue evidente: lotes con elevada frecuencia de paros presentaron significativamente más rechazo, lo cual es lógico considerando que las interrupciones del ciclo pueden alterar el llenado, la presión y la estabilidad térmica del molde.

Se apreciaron diferencias entre turnos, especialmente en el turno nocturno, lo cual es coherente con mayor probabilidad de variación en supervisión, mantenimiento o experiencia operativa.

El árbol de decisión construido identificó de manera clara los umbrales críticos del proceso. Se observaron reglas como:

  • Lotes con defectos bajos y pocas paradas clasifican consistentemente como “Alta” calidad.

  • Temperaturas elevadas y velocidades cercanas al límite superior incrementan la probabilidad de obtener calidades “Media” o “Baja”.

  • El número de paradas actúa como nodo decisivo en varios niveles del árbol, confirmando su papel central en la estabilidad del proceso.

Estas reglas no solo son coherentes con la física del proceso, sino que resultan directamente aplicables en un entorno industrial real. El modelo proporciona información para:

  • Ajustar límites de operación (control térmico y de ciclo).

  • Priorizar causas raíz de defectos.

  • Definir intervenciones de mantenimiento preventivo.

  • Identificar comportamientos de riesgo antes de que el lote sea rechazado.

El comportamiento del modelo reafirma que la calidad en procesos de inyección depende de un balance adecuado entre control térmico, estabilidad del ciclo y continuidad operativa.

8 8. Conclusiones

  1. La temperatura del proceso y la velocidad de ciclo influyen directamente en los defectos, lo cual es consistente con la operación de moldeo por inyección, donde desviaciones térmicas o ciclos demasiado rápidos afectan el llenado y la estabilidad de la pieza.

  2. Las paradas no programadas se identificaron como el factor más determinante para la calidad final, confirmando que las interrupciones del ciclo generan variaciones de presión, temperatura y tiempos que incrementan el rechazo.

  3. El árbol de decisión permitió extraer reglas operativas claras, mostrando que la combinación de pocos defectos y baja frecuencia de paradas es clave para obtener lotes de “Alta” calidad.

  4. Los resultados sugieren oportunidades de mejora centradas en estabilizar el ciclo, reforzar el control térmico y optimizar el mantenimiento preventivo, acciones directamente aplicables en líneas reales de inyección de plásticos.