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:
El objetivo es aplicar el proceso de analítica de datos:
library(dplyr)
library(ggplot2)
library(psych)
library(party)
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
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
table(datos$calidad)
##
## Alta Baja Media
## 30 57 93
prop.table(table(datos$calidad))
##
## Alta Baja Media
## 0.1666667 0.3166667 0.5166667
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")
boxplot(defectos ~ linea, data = datos,
main = "Defectos por línea de producción",
xlab = "Línea",
ylab = "Número de defectos")
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")
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
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")
El objetivo es predecir el nivel de calidad
(calidad) a partir de las variables de proceso.
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
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
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
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
plot(arbol_calidad)
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.
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.
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.
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.
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.