# Cargar libreria
library(qcc)
library(AcceptanceSampling)
library(SixSigma)
library(DiagrammeR)
library(ggplot2)
library(reshape2)
El control estadistico de calidad (por sus siglas en ingles QCC) es una tecnica usada para verificar la calidad de productos, procesos o servicios. Consiste en un marco de analisis estadisticos que son usados para la toma de decisiones, mantener la calidad y resolver no conformidades. Esta idea nace a partir de 1943 por parte del Dr. Kaoru Ishikawa. Destacan porque cada analisis permite observar diferentes angulos de calidad. Los analisis incluye:
Los procesos funcionan por la constitucion de diferentes elementos importantes para lograr cierto objetivo (ej. medicamentos de calidad), siendo agrupados por las “Six M’s”. No obstante, cuando ocurre una variacion es excesiva de algunos de los elementos, podrian generar perturbaciones que conlleve a defectos y problemas que afectan la calidad. Por ello, un analisis sistematico exhaustivo de las “Six M’s” permite encontrar la causa de un efecto/evento de interés.
Sanlou S.A. de C.V. es empresa dedicada a la generacion de medicamentos de calidad ISO 9001. En el transcurso de la semana le llegaron informes de seguridad de casos individuales (ICSR) por parte de autoridades sanitarias (HA) sobre reacciones adversas en los medicamentos. Para encontrar la causa posible de los medicamentos anormales, la organizacion reviso los elementos importantes del proceso usando el diagrama de Ishikawa y las Six M’s.
par(cex = 0.6)
causeEffectDiagram(
cause = list(
Manpower = c(
"Medical Reviewer Competency",
"Training of Global Process Owner",
"Training of Local Process Owner",
"IT Developer Expertise",
"Database Management Efficiency",
"Audit Process Rigor"
),
Materials = c(
"ICSR Data Quality",
"ICSR Detectability Issues",
"ICSR Volume and Completeness",
"ICSR Case Complexity"
),
`Machines` = c(
"System Availability",
"Technological Complexity",
"System Performance",
"Data Processing Quality"
),
Methods = c(
"Effectiveness of Data Reports",
"Compliance with Submission Rules",
"Risk Management Practices",
"Quality Management System Adherence",
"Change Management Effectiveness"
),
Measurements = c(
"Accuracy in Data Entry",
"Consistency in Medical Coding"
),
Environment = c(
"Regulatory Requirements",
"Influence of Local Cultures",
"Company Culture Alignment",
"Epidemiological Factors",
"Impact of Local Health Systems"
)
),
effect = "ICSR Not\nReported\nto HA"
)
par(cex = 1)
Figura 1.Diagrama de Ishikawa
Sirve para registrar, analizar y evaluar datos relacionados con los procesos y debe pertenecer al plan de la organizacion, como los registros de auditoria y/o evidencia de reportes.
Los graficos de monitoreo de procesos se pueden utilizar para rastrear si los indicadores claves de desempeño (por sus siglas en ingles KPIs) estan dentro o fuera de control.
Un registro de valores de diametros (mm) de unos anillos (sellado) para piston de motor automotriz que son producidos en un proceso de forjado de la empresa Canva S. de R.L. de C.V fue evaluado para detectar anormalidades causados por un ajuste de proceso. Las caracteristicas de los datos son diametros internos de los anillos fabricados en 25 muestras con un tamaño de 5 recolectados durante el control de calidad.
# Datos en dataframe
data("pistonrings")
# Convertir los datos a objeto tibble
df <- as_tibble(pistonrings)
# Cambiar el formato de trials
df <- df %>%
mutate(trial = ifelse(trial, "True", "False"))
head(df) # En el dataframe vemos el diameter= son los cm de diametro de los anillos; sample = es la muestra recopilada; trial = es el ensayo para un ajuste de maniobra (True o False).
## # A tibble: 6 × 3
## diameter sample trial
## <dbl> <int> <chr>
## 1 74.0 1 True
## 2 74.0 1 True
## 3 74.0 1 True
## 4 74.0 1 True
## 5 74.0 1 True
## 6 74.0 2 True
# Crear objeto qcc para realizar el control estadístico de calidad (qcc)
qcc_shew <- qcc(
df$diameter, # Variable a evaluar
type = "xbar.one", # Se puede cambiar el grupo estadistico, en este caso se uso xbar.one que es el promedio de datos de un proceso en continuo (una maquina operando).
rules = c(1, 2, 3, 4) # Un conjunto de reglas relacionados con el valor de sigma
)
# Converitr el objeto qcc a formato lista
str(qcc_shew)
## List of 12
## $ call : language qcc(data = df$diameter, type = "xbar.one", rules = c(1, 2, 3, 4))
## $ type : chr "xbar.one"
## $ data.name : chr "df$diameter"
## $ data : num [1:200, 1] 74 74 74 74 74 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ Group : chr [1:200] "1" "2" "3" "4" ...
## .. ..$ Samples: NULL
## $ statistics: Named num [1:200] 74 74 74 74 74 ...
## ..- attr(*, "names")= chr [1:200] "1" "2" "3" "4" ...
## $ sizes : int [1:200] 1 1 1 1 1 1 1 1 1 1 ...
## $ center : num 74
## $ std.dev : num 0.01
## $ rules : num [1:4] 1 2 3 4
## $ nsigmas : num 3
## $ limits : num [1, 1:2] 74 74
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr ""
## .. ..$ : chr [1:2] "LCL" "UCL"
## $ violations: num [1:200] NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, "WesternElectricRules")= num [1:4] 1 2 3 4
## - attr(*, "class")= chr "qcc"
En la Figura 2 podemos observar que 3 muestras (puntos en rojo) quedaron fuera del limite de control, presentando las anormalidades. Mientras 17 muestras (puntos en naranja y amarillo) presentaron una cercania con anomalias.
# Crear grafico de control de metricas del diametro de los anillos para piston
plot(qcc_shew)
Figura 2. Diagrama de dispersion considerando todas las observaciones. En donde: - UCL: Limite de control superior, que son tres desviaciones estandar por encima de la media - CL: Limite de control - LCL:Limite de control inferior, que son tres desviaciones estandar por encima de la media
Ahora, la empresa necesita comparar la dispersion cuando fue aplicado una calibracion de la maquina y despues de hacerlo.
# Considerando los datos del ejemplo 2
head(df)
## # A tibble: 6 × 3
## diameter sample trial
## <dbl> <int> <chr>
## 1 74.0 1 True
## 2 74.0 1 True
## 3 74.0 1 True
## 4 74.0 1 True
## 5 74.0 1 True
## 6 74.0 2 True
# Agrupar datos por muestras para realizar el grafico de control de calidad (qcc)
qcc_gr <- qccGroups(df, diameter, trial)
qcc_gr <- t(qcc_gr) %>%
as.data.frame()
# Realizar qcc
qcc_trial <- qcc(qcc_gr$False[1:75],
type = "xbar.one",
newdata = qcc_gr$True[1:125],
rules = c(1, 2, 3, 4))
# Graficar
plot(qcc_trial)
Figura 3. Comparando los dos grupos entre el ensayo de calibracion y los nuevos datos recolectados
Muestra la distribucion de las variables y muestra variaciones de acuerdo con el comportamiento de los datos. Conmunmente un comportamiento entorno a la posicion central (media) significaria que hay poca dispersion.
Antes de realizar el histograma, se puede realizar la Prueba Shapiro para conocer si los datos pertenecen a una distribucion normal, unicamente calculando el valor de p.
# Prueba Shapiro
shapiro.test(df$diameter)
##
## Shapiro-Wilk normality test
##
## data: df$diameter
## W = 0.98968, p-value = 0.1607
El resultado indica un p > 0.05 por lo que pertenecen a una distribucion normal.
# Ahora la grafica
hist(df$diameter, probability = FALSE, xlab = "Diametro de los anillos de piston", main = "Distribucion de datos")
Figura 4. Histograma que muestra la dispersion de los valores del diametro de los anillos, observando una distribucion normal, corroborado por la prueba Shapiro (p > 0.05).
Muestra un grafico de barras ordenadas de mayor a menor de acuerdo con el numero de frecuencias.
En el siguiente dataframe, se muestra el numero total de no conformidades en cada informe ICSR que miden aspectos importantes de los medicamentos (informacion del Ejemplo 1).
# Data frame con el conteo de no conformidades
no_conform_freq <- data.frame(
ICSR = c("ICSR Quality", "ICSR Detectability", "ICSR Quantity", "ICSR Complexity"),
freq = c(10, 5, 2, 7))
# Seleccionar conteo y nombrar los valores acorde al df anterior
pareto <- no_conform_freq$freq
names(pareto) <- no_conform_freq$ICSR
# Crear objeto pareto
qcc_pareto <- paretoChart(pareto)
# Graficar
plot(qcc_pareto) +
theme(axis.text.x = element_text(angle = 90))
Figura 5. Diagrama de Pareto muestra los procesos prioritarios a resolver de acuerdo con el mayor numero de no conformidades.
Identificar subgrupos de procesos relevantes mediante diagramas de flujo de un proceso en especifico o el sistema de la organizacion.
mermaid("graph TB
A[Pedido] --> B[Orden recibida]
B --> C[Chequeo de stock]
C --> D{¿Está en el almacen?}
D --> |Fuera del stock| E[Cancela orden]
D --> |Dentro del stock| F[Checa tarjeta de credito]
F --> G{¿Tarjeta validada?}
E --> G
G --> |Validada| H[Credito en proceso]
H --> I[Envio]
I --> J[Recibido]")
Figura 6. Diagrama de flujo de un proceso convencional para la venta de un producto.
Algunas variables categoricas podrian resaltar la calidad en diferentes grupos. Como parte del ejercicio 2, el objeto qcc tambien contiene los resultados de la aplicacion de las reglas de decision Western Electric, cuyo tratamiento de datos condujo a conocer el porcentaje de anillos que tuvieron un patron natural (normales) y los anillos que provinieron de un patron no natural (anormales).
# Dataframe que contiene la relacion entre las muestras que violaron las reglas y las que no
qcc_shew$violations
## [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [26] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 1 NA NA NA NA NA NA NA NA
## [76] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [101] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [126] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [151] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 NA NA NA NA
## [176] NA NA NA NA NA NA NA 3 NA 3 1 4 4 4 4 4 4 1 2 2 4 4 4 NA NA
## attr(,"WesternElectricRules")
## [1] 1 2 3 4
# Patron Natural - Numero de elementos que no violaron las reglas
A <- sum(is.na(qcc_shew[["violations"]]))
# Patron Non_Natural - Numero de elementos que violaron al menos una regla
table(qcc_shew[["violations"]], useNA = "ifany")
##
## 1 2 3 4 <NA>
## 3 3 2 9 183
# Crear la tabla de frecuencias
freq_table <- table(qcc_shew[["violations"]], useNA = "ifany")
# Sumar todas las frecuencias excepto las correspondientes a NA
B <- sum(freq_table[!is.na(names(freq_table))])
# Crear un data frame con los valores
QC_df <- data.frame(A,B)
# Calcular el promedio de A y B
QC_df$Promedio <- rowMeans(QC_df[, c("A", "B")])
# Calcular el porcentaje relativo de A y B con respecto a la suma de A + B
QC_df$P_Natural <- (QC_df$A / (QC_df$A + QC_df$B)) * 100
QC_df$P_No_Natural <- (QC_df$B / (QC_df$A + QC_df$B)) * 100
# Seleccionar solo porcentajes
QC_df <- QC_df %>%
select("P_Natural", "P_No_Natural")
# Cambiar de formato long a wide
QC_df_m <- melt(QC_df)
Ahora se crea el grafico para comparar entre el porcentaje entre los productos derivados de un proceso natural y no natural.
# Para guardar grafico
# Grafico
ggplot(QC_df_m, aes(x = variable, y = value, fill = variable)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = value), vjust = -0.5, color = "black", size = 4) +
scale_fill_manual(values = c("P_Natural" = "blue", "P_No_Natural" = "#189929ff"),
breaks = c("P_Natural", "P_No_Natural"),
labels = c("P_Natural" = "Anillos normales",
"P_No_Natural" = "Anillos defectuosos")) +
labs(x = "Clasificación de la calidad de anillos",
y = "Porcentaje de muestras observadas (%)",
fill = "Clasificacion") +
ylim(0,100)+
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.title.x = element_text(color = "black", size = 10),
axis.title.y = element_text(color = "black",size = 10),
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 10),
legend.background = element_rect(color = "black", fill = "white", size = 0.5),
legend.box.background = element_rect(color = "black", size = 0.5),
legend.position = c(0.85,0.8),
panel.border = element_rect(color = "black", fill = NA, size = 0.5),
panel.background = element_rect(color = "black", fill = "white"))
Figura 7. Porcentaje de anillos normales y defectuosos considerando las reglas de decision Western Electric
Cano, E., Moguerza, J., & Prieto Corcoba, M. (2015). Quality Control With R. An ISO Standards Approach. Springer Cham. https://doi.org/https://doi.org/10.1007/978-3-319-24046-6 https://www.datisticsblog.com/2021/08/qcwithr/#iso-standard-qc-approach https://www.investopedia.com/terms/i/ishikawa-diagram.asp https://www.electronicsandyou.com/blog/semiconductor-manufacturing-process-steps-and-technology-used.html https://bookdown.org/lawson/an_introduction_to_acceptance_sampling_and_spc_with_r26/shewhart-control-charts-in-phase-i.html https://www.jmp.com/es/statistics-knowledge-portal/exploratory-data-analysis/pareto-chart https://www.colima.tecnm.mx/posgrado/vfji/materialdescarga/Las%207%20herramientas.pdf