Italian Trulli
 

En primer lugar, leemos las bases de datos:

library(readxl)
library(qcc)
library(SixSigma)
library(ggplot2)
Capability_CD <- read_excel("Capability-CD.XLS")
View(Capability_CD)

Capability_RepairTimes<-read_excel("Capability-RepairTimes.XLS")
View(Capability_RepairTimes)
Capability_RepairTimes$`Sub Group No`<-as.factor(Capability_RepairTimes$`Sub Group No`)

1 Capability CD

1.1 Límites de especificación 1:

Vemos un resumen de la base de datos Capability_CD:

library(tidyverse)
library(pander)
resumen=Capability_CD %>%
  summarise( Media=mean(Capability_CD$`CD Thickness (mm)`), Mediana=median(Capability_CD$`CD Thickness (mm)`), Min=min(Capability_CD), Max=max(Capability_CD), Total=n())
pander(resumen)
Media Mediana Min Max Total
1.349 1.349 1.188 1.486 100

Para el primer análisis de capacidad de la base de datos Capability_CD, utilizaremos los límites de especificación 1.15 y 1.55, que hemos sacado mediante las siguientes formulas:

  • \(LSL = target - tolerancia\)
  • \(USL = target + tolerancia\)
datos1=Capability_CD
names(datos1)="variable_resp"

ggplot(datos1, aes(x=(1:length(variable_resp)), y=variable_resp)) + geom_point() + geom_line(color="blue") + labs(x="Run")
#Especificaciones de límites
target=1.35 
tol=0.2 #tolerancia
lsl=target-tol #límite inferior especificación
usl=target+tol #límite superior especificación

#Especificamos los datos para capacidad potencial y datos a largo plazo
ss.study.ca(xST=datos1$variable_resp[1:20], xLT=datos1$variable_resp,
            LSL=lsl, USL=usl, T=target, alpha=0.5,
            f.sub="Thickness")

Según los resultados, observamos que el índice de capacidad para el corto plazo es 1.28 (\(C_p\)), por lo tanto, el proceso sería adecuado (\(1<=C_p<=1.33\)). En cambio, el índice de capacidad a largo plazo, es aproximadamente 1. El proceso es técnicamente capaz pero no existe márgen de maniobra, ya que los límites de variación son muy próximos a la variación del proceso. Entre la capacidad del proceso a corto y a largo plazo no existe mucha diferencia entre sí, lo que indica que el proceso se ha ido controlando bien.

1.2 Límites de especificación 2:

Para el segundo análisis de capacidad de la base de datos Capability_CD, utilizaremos los límites de especificación 1.25 y 1.50 (en este caso los límites de especificación son más estrictos):

datos1=Capability_CD
names(datos1)="variable_resp"

ggplot(datos1, aes(x=(1:length(variable_resp)), y=variable_resp)) + geom_point() + geom_line(color="blue") + labs(x="Run")
#Especificaciones de límites
target=1.35 
tol=0.2 #tolerancia
lsl1=1.25 #límite inferior especificación
usl1=1.50 #límite superior especificación

#Especificamos los datos para capacidad potencial y datos a largo plazo
ss.study.ca(xST=datos1$variable_resp[1:20], xLT=datos1$variable_resp,
            LSL=lsl1, USL=usl1, T=target, alpha=0.5,
            f.sub="Thickness")

PPU=(1.5-1.35)/(3*0.0604)
PPL=(1.35-1.25)/(3*0.0604)
Ppk=min(PPU, PPL)
Ppk
## [1] 0.5518764

Para el segundo caso, al ajustar más los límites de especificación a los datos, vemos como el índice de capacidad (\(C_{pk}\)) disminuye a 0.6704 y la capacidad del proceso pasa a no ser adecuada. Sucede lo mismo para la capacidad del proceso a largo plazo, disminuye a un 0.552 y el proceso no es adecuado.

1.3 Límites de especificación 3:

Para el último análisis de capacidad de la base de datos Capability_CD, utilizaremos los límites de especificación 1 y 1.65 (ampliamos los límites de especificación):

datos1=Capability_CD
names(datos1)="variable_resp"

ggplot(datos1, aes(x=(1:length(variable_resp)), y=variable_resp)) + geom_point() + geom_line(color="blue") + labs(x="Run")
#Especificaciones de límites
target=1.35 
tol=0.2 #tolerancia
lsl2=1 #límite inferior especificación
usl2=1.65 #límite superior especificación

#Especificamos los datos para capacidad potencial y datos a largo plazo
ss.study.ca(xST=datos1$variable_resp[1:20], xLT=datos1$variable_resp,
            LSL=lsl2, USL=usl2, T=target, alpha=0.5,
            f.sub="Thickness")

PPU=(1.5-1.35)/(3*0.0604)
PPL=(1.35-0.9)/(3*0.0604)
Ppk=min(PPU, PPL)
Ppk
## [1] 0.8278146

Observamos como la capacidad del proceso a corto plazo mejora bastante (2.0720), hasta el punto de pasar a ser satisfactorio para nuevos procesos con una variable crítica. Igual sucede para la capacidad de proceso a largo plazo (1.7925). Entre la capacidad del proceso a corto y a largo plazo no existe mucha diferencia entre sí, lo que indica que el proceso se ha ido controlando bien.

En conclusión, podemos comprobar que al aumentar el rango de los límites de especificación, mayor es la capacidad del proceso.

2 Capability_Repairtimes:

Hacemos una tabla descriptiva para ver algunas de las características de la base de datos agrupada por subgrupos:

library(dplyr)
library(pander)
names(Capability_RepairTimes)[1] = "Tiempos"
names(Capability_RepairTimes)[2] = "Subgrupos"



resumen.grupos=Capability_RepairTimes %>%
  group_by(Subgrupos)%>%
  summarise(Media=mean(Tiempos),Min=min(Tiempos),Max=max(Tiempos),"Rango Tiempo"=max(Tiempos)-min(Tiempos),Total=n())
pander(resumen.grupos)
Subgrupos Media Min Max Rango Tiempo Total
1 5.368 5.02 5.66 0.64 5
2 5.016 4.52 5.51 0.99 5
3 5.558 5.12 5.99 0.87 5
4 5.344 5.03 6.08 1.05 5
5 5.956 5.37 6.61 1.24 5
6 5.874 5.11 6.56 1.45 5
7 5.778 5.26 6.3 1.04 5
8 5.582 5.15 5.85 0.7 5
9 5.936 5.52 6.24 0.72 5
10 5.478 4.56 6.4 1.84 5
11 4.902 4.28 5.38 1.1 5
12 4.424 3.68 5.24 1.56 5
13 4.772 4.29 5.33 1.04 5
14 4.48 4.14 4.73 0.59 5
15 4.08 3.82 4.58 0.76 5
16 4.174 3.69 4.97 1.28 5
17 4.032 3.49 4.29 0.8 5
18 3.852 3.42 4.67 1.25 5
19 5.168 5.06 5.24 0.18 5
20 4.892 4.08 5.26 1.18 5

Hacemos una representación de los Tiempos de espera y los subgrupos existentes:

library(ggplot2)
ggplot(data=Capability_RepairTimes, aes(x=Subgrupos, y=Tiempos, color = Subgrupos)) + xlab("Subgrupos") + ylab("Tiempo que se tarda en reparar defectos") + geom_point()

A continuación, hacemos el mismo gráfico anterior, pero con un boxplot para visualizar la mediana de cada grupo:

ggplot(Capability_RepairTimes,aes(Subgrupos,Tiempos)) + geom_boxplot(aes(colour=Subgrupos)) + xlab("Subgrupos") + ylab("Tiempo que se tarda en reparar defectos")

En las anteriores gráficas podemos apreciar que se podría dividir la base de datos en 2 grupos. El primero estaría formado por los subgrupos del 1 al 9, y el segundo estaría formado por los subgrupos del 10 al 20. Se aprecia como tienen diferentes comportamientos, y una bajada a partir del subgrupo 9.

Seguidamente creamos una función que calcule los índices básicos para cada subgrupo:

cap.fun=function(Capability_RepairTimes,lsl,usl){
  xbar=mean(Capability_RepairTimes)
  s=sd(Capability_RepairTimes)
  zu=(usl-xbar)/s
  zl=(lsl-xbar)/s
  pdfe=pnorm(zl)+1-pnorm(zu)
zbench=qnorm(pdfe)
zscore=min(c(zu,-zl))
Cp=(usl-lsl)/(6*s)
Cpk=min(c(zu/3,-zl/3 ))
return(data.frame(zl=zl,zu=zu,pdfe=pdfe,zbench=zbench,zscore=zscore,Cp=Cp,Cpk=Cpk))}

Y los índices por subgrupos:

#Especificaciones de límites
target4=mean(Capability_RepairTimes$Tiempos) 
tol4=0.2 #tolerancia
lsl4=target4-tol4 #límite inferior especificación
usl4=target4+tol4 #límite superior especificación
pormes=tapply(Capability_RepairTimes$Tiempos,as.factor(Capability_RepairTimes$Subgrupos),FUN=cap.fun,lsl=lsl4,usl=usl4)
pander(pormes)

Para todos los subgrupos aparecen unos índices de capacidad bastante bajos. El único subgrupo que tiene un índice de capacidad que se aproxima al baremo establecido como adecuado (\(1<=C_p<=1.33\)) es el subgrupo 19, y parece ser que es el que menos variabilidad presenta. Además, en la primera tabla realizada, en la columna Rango de tiempo, se contempla como el subgrupo 19 es el que menos diferencia tiene entre el máximo y mínimo tiempo de espera, por lo que tiene menos variabilidad que los demás. Por eso es el que mejor índice de capacidad posee. Dicho esto, el proceso no es adecuado, pues todas las \(C_p\) son menores que 1.

Calculamos el rendimiento (YIELD) y todos los demás índices de capacidad para obtener información sobre el número de defectos:

defectos=sum(Capability_RepairTimes$Tiempos>usl4)+sum(Capability_RepairTimes$Tiempos<lsl4)
opp=length(Capability_RepairTimes$Tiempos)
pander(ss.ca.yield(defects = defectos, rework = 0, opportunities = opp))
Yield FTY RTY DPU DPMO
0.23 0.23 0.23 77 770000

Tenemos un rendimiento YIELD de 0.23, que es el volumen de buenos resultados sobre el total de resultados. El Rendimiento de primera mano es de 0.23, que es el volumen de buenos resultados obtenidos sin necesidad de retrabajo. Destaca el número de defectos entre el número total de unidades inspeccionadas (DPU), que es 77, y tenemos un total de 100 elementos. Existen bastantes unidades con defectos.

Podemos afirmar que tenemos un proceso no adecuado, ya que el volumen de buenos resultados sobre el total es de un 23%, y tenemos 77 unidades defectuosas respecto a un total de 100 elementos.

#Especificaciones de límites
target4=mean(Capability_RepairTimes$Tiempos) 
tol4=0.2 #tolerancia
lsl10=4.40 #límite inferior especificación
usl10=6.65 #límite superior especificación
pormes=tapply(Capability_RepairTimes$Tiempos,as.factor(Capability_RepairTimes$Subgrupos),FUN=cap.fun,lsl=lsl10,usl=usl10)
pander(pormes)

Hemos aumentado los límites de especificación. Ahora, los subgrupos 2,3,8,15,17 pasan a ser un proceso adecuado. Los subgrupos 1 y 9 serán adecuados para procesos existentes. El subgrupo 14 será satisfactorio para variables críticas. El subgrupo 19 será satisfactorio para nuevos procesos con una variable crítica y, los subgrupos 4,5,6,7,10,11,12,13,16,18,20 serán procesos no adecuados.

2.1 División base de datos en 2 subgrupos

Dividimos la base de datos en 2 subgrupos, como hemos comentado anteriormente en los gráficos realizados:

Subgrupos_2<-rep(1:2,c(45,55))
Tiempos2<-Capability_RepairTimes$Tiempos
datos4<-data.frame(Tiempos2, Subgrupos_2)
datos4$Subgrupos_2<-as.factor(datos4$Subgrupos_2)

Una vez que hemos dividido la base de datos en 2 subgrupos, la representamos en un gráfico de puntos:

library(ggplot2)
ggplot(data=datos4, aes(x=Subgrupos_2, y=Tiempos2, color = Subgrupos_2)) + xlab("Subgrupos") + ylab("Tiempo que se tarda en reparar defectos") + geom_point()

Y en un gráfico boxplot:

ggplot(datos4,aes(Subgrupos_2,Tiempos2))+geom_boxplot(aes(colour=Subgrupos_2))

2.1.1 Límites de especificación 1:

Calculamos los índices de capacidad por subgrupos (2 grupos):

#Especificaciones de límites
target5=mean(datos4$Tiempos2) 
tol5=0.2 #tolerancia
lsl5=target5-tol5 #límite inferior especificación
usl5=target5+tol5 #límite superior especificación
pormes=tapply(datos4$Tiempos2,as.factor(datos4$Subgrupos_2),FUN=cap.fun,lsl=lsl5,usl=usl5)
pander(pormes)
  • 1:

    zl zu pdfe zbench zscore Cp Cpk
    -1.615 -0.7741 0.8337 0.9688 -0.7741 0.1402 -0.258
  • 2:

    zl zu pdfe zbench zscore Cp Cpk
    0.4111 1.032 0.8105 0.8797 -0.4111 0.1035 -0.137

El grupo 1 tiene un mejor índice de capacidad que el grupo 2, pero ninguno de los dos llegan a ser adecuados. No son capaces.

Vemos el rendimiento (YIELD) y todos los demás índices de capacidad para obtener información sobre el número de defectos del grupo 1 y 2:

grupo1<-datos4[c(1:45),]
grupo2<-datos4[c(46:100),]
#Grupo 1
defectos=sum(grupo1$Tiempos2>usl5)+sum(grupo1$Tiempos2<lsl5)
opp=length(grupo1$Tiempos2)
pander(ss.ca.yield(defects = defectos, rework = 0, opportunities = opp))
Yield FTY RTY DPU DPMO
0.2444 0.2444 0.2444 34 755556
#Grupo 2
defectos1=sum(grupo2$Tiempos2>usl5)+sum(grupo2$Tiempos2<lsl5)
opp1=length(grupo2$Tiempos2)
pander(ss.ca.yield(defects = defectos1, rework = 0, opportunities = opp1))
Yield FTY RTY DPU DPMO
0.2182 0.2182 0.2182 43 781818

El grupo 2 contiene más defectos entre el número total de unidades inspeccionadas, aparte de que su volumen de buenos resultados sobre el total de resultados es algo menor. Lo mismo pasa con FTY y RTY.

2.1.2 Límites de especificación 2:

Al ver que para ninguno de los casos anteriores son capaces, probamos a aumentar los límites de especificación:

#Especificaciones de límites
target5=mean(datos4$Tiempos2) 
tol5=0.2 #tolerancia
lsl7=3.83 #límite inferior especificación
usl7=6.23 #límite superior especificación
pormes=tapply(datos4$Tiempos2,as.factor(datos4$Subgrupos_2),FUN=cap.fun,lsl=lsl7,usl=usl7)
pander(pormes)
  • 1:

    zl zu pdfe zbench zscore Cp Cpk
    -3.726 1.322 0.09313 -1.322 1.322 0.8413 0.4408
  • 2:

    zl zu pdfe zbench zscore Cp Cpk
    -1.147 2.58 0.1307 -1.123 1.147 0.6211 0.3822

También realizamos el análisis de índices de capacidad con SixSigma, para poderlo ver gráficamente:

datos5=datos4
names(datos5)="variable_resp"

ggplot(datos5, aes(x=(1:length(variable_resp)), y=variable_resp)) + geom_point() + geom_line(color="blue") + labs(x="Run")
#Especificaciones de límites
target6=mean(datos4$Tiempos2) 
tol=0.2 #tolerancia

#Especificamos los datos para capacidad potencial y datos a largo plazo
ss.study.ca(xST=datos5$variable_resp[1:45], xLT=datos5$variable_resp,
            LSL=lsl7, USL=usl7, T=target6, alpha=0.5,
            f.sub="Thickness")

Si aumentamos los límites de especificación, el índice de capacidad aumenta tanto a corto como a largo plazo, pero los índices de capacidad siguen siendo inaceptables ya que tienen valores menores a 1.

Para el grupo 2 tendremos los siguientes índices de capacidad:

ss.study.ca(xST=datos5$variable_resp[46:100], xLT=datos5$variable_resp,
            LSL=lsl7, USL=usl7, T=target6, alpha=0.5,
            f.sub="Thickness")

Pasa lo mismo que para el grupo 1. El grupo 2 tiene índices de capacidad mayores, pero siguen siendo procesos inaceptables.

2.2 Límites de especificación 3:

Por último, utilizaremos los siguientes límites de especificación para poder comprobar que al menos son aceptables:

#Especificaciones de límites
target5=mean(datos4$Tiempos2) 
tol5=0.2 #tolerancia
lsl8=3.23 #límite inferior especificación
usl8=6.83
#límite superior especificación
pormes=tapply(datos4$Tiempos2,as.factor(datos4$Subgrupos_2),FUN=cap.fun,lsl=lsl8,usl=usl8)
pander(pormes)
  • 1:

    zl zu pdfe zbench zscore Cp Cpk
    -4.988 2.584 0.004879 -2.584 2.584 1.262 0.8614
  • 2:

    zl zu pdfe zbench zscore Cp Cpk
    -2.078 3.511 0.01906 -2.073 2.078 0.9316 0.6928

Con estos nuevos intervalos de especificación, el índice de capacidad del grupo 1 pasa a ser aceptable, pero el grupo 2 sigue sin serlo.

Si vemos el análisis según seis sigma:

#Especificamos los datos para capacidad potencial y datos a largo plazo
ss.study.ca(xST=datos5$variable_resp[1:45], xLT=datos5$variable_resp,
            LSL=lsl8, USL=usl8, T=target6, alpha=0.5,
            f.sub="Thickness")

Para el grupo 1 el índice de capacidad ha aumentado (1.2620) y ahora el proceso es adecuado a corto plazo, pero a largo no. Existe una diferencia considerable entre el corto y el largo plazo que resulta un problema. Se debería de corregir el proceso para homogeneizar su funcionamiento a la larga. Lo que indica que se debería de mejorar también el control del proceso.

Para el grupo 2 tendríamos los siguientes índices de capacidad:

ss.study.ca(xST=datos5$variable_resp[46:100], xLT=datos5$variable_resp,
            LSL=lsl8, USL=usl8, T=target6, alpha=0.5,
            f.sub="Thickness")

Para el grupo 2, el índice de capacidad para corto y largo plazo sigue sin ser aceptable.

Por tanto, existirá un problema en el grupo 2, ya que en el 1, aumentando los rangos de especificación, logramos conseguir que el proceso sea adecuado. Para conseguir que el grupo 2 lo sea, habría que aumentar considerablemente estos rangos.

2.3 Análisis de capacidad con qcc

cap <- qcc.groups(Capability_RepairTimes$Tiempos, Capability_RepairTimes$Subgrupos)
q <- qcc(cap, type="xbar", nsigmas=3, plot=TRUE)

Utilizando nsigmas=3, tenemos como límite superior de especificación 5.618177, y como inferior 4.448423.

lsl=4.448423;usl=5.618177
target=mean(Capability_RepairTimes$Tiempos)
process.capability(q, spec.limits=c(lsl,usl),target=target)

## 
## Process Capability Analysis
## 
## Call:
## process.capability(object = q, spec.limits = c(lsl, usl), target = target)
## 
## Number of obs = 100          Target = 5.033
##        Center = 5.033           LSL = 4.448
##        StdDev = 0.4359          USL = 5.618
## 
## Capability indices:
## 
##        Value    2.5%   97.5%
## Cp    0.4472  0.3850  0.5094
## Cp_l  0.4472  0.3715  0.5230
## Cp_u  0.4472  0.3715  0.5230
## Cp_k  0.4472  0.3569  0.5375
## Cpm   0.4472  0.3853  0.5090
## 
## Exp<LSL 9%    Obs<LSL 24%
## Exp>USL 9%    Obs>USL 22%

Con estos límites de especificación, tenemos un índice de capacidad del proceso a corto plazo de 0.447. Lo que nos indica que el proceso no es adecuado.

2.4 CONCLUSIONES

En la base de datos Capability_CD, ¿qué podemos hacer para que el proceso sea capaz?

Para que el proceso sea capaz se tiene que reducir el número de defectos. Después de haber estudiado la base de datos, nos hemos dado cuenta de que para que esto sea posible debemos ampliar el rango de aceptación de la dureza del material. En este caso, hemos aumentado el rango (Límite Inferior=1, Límite Superior=1.65) y el proceso es satisfactorio para nuevos procesos con una variable crítica.

¿Cuántas unidades defectuosas respecto al total tendremos en Capabiliity_RepairTimes si se ha asignado unos límites de especificación de LSL= 4.83, USL=5.23?

Obtendremos 77 unidades defectuosas.

¿Para Capability_RepairTimes el proceso es adecuado?

Para estudiar la capacidad del proceso hemos dividido la base de datos en dos grupos basándonos en las diferencias entre los tiempos de reparación. Utilizando un rango de aceptación de LSL= 3.23 y USL= 6.83, vemos que los primeros nueve subgrupos producirán un proceso adecuado, mientras que los once últimos no. Esto se debe a la gran variabilidad que presentan los subgrupos del grupo 2. La empresa debería estudiar qué sucede, pues a pesar de no tener defectos, el proceso no es adecuado.

 
Italian Trulli