Le développement des indices de capabilité suppose que les valeurs des données sont issues d’une distribution normale. Il est possible de calculer des indices avec des données provenant de distributions non normales mais leur interprétation sera différente (la correspondance entre un \(C_{pk}\) et la proportion d’éléments non conformes ne pourra plus se faire).

Pour illustrer notre propos, commençons par charger nos données :

donnees<-read.csv2("https://sjaubert.github.io/SPCR/device.csv",header = T)
donnees$x<-as.numeric(as.character(donnees$x))#pour corriger un petit problème de format...

Ces données nous renvoient le diamètre de 100 aiguilles pour des buses de pistolet de peinture, le diamètre a pour spécification \(2.0 ± 0.05\) mm. Ces relevés ont été effectués par des prélèvements à intervalles réguliers de 20 échantillons de taille 5.

Sans se préoccuper d’une quelconque normalité regardons nos cartes de controles :

library(qcc)
diameter<-qcc.groups(donnees$x,rep(1:20,5))
q1<-qcc(diameter,type = "xbar",center = 2)

Nous avons 3 points en dessous de la limite naturelle LCL signe d’une instabilité du processus et 9 analyses non conformes…

Toujours sans se préoccuper de la normalité calculons malgré tout les capabilités :

process.capability(q1,spec.limits = c(1.95,2.05),target = 2)

## 
## Process Capability Analysis
## 
## Call:
## process.capability(object = q1, spec.limits = c(1.95, 2.05),     target = 2)
## 
## Number of obs = 100          Target = 2
##        Center = 2               LSL = 1.95
##        StdDev = 0.01539         USL = 2.05
## 
## Capability indices:
## 
##       Value    2.5%  97.5%
## Cp    1.083  0.9322  1.233
## Cp_l  1.083  0.9449  1.221
## Cp_u  1.083  0.9449  1.221
## Cp_k  1.083  0.9185  1.247
## Cpm   1.083  0.9329  1.233
## 
## Exp<LSL 0.058%    Obs<LSL 0%
## Exp>USL 0.058%    Obs>USL 1%

Nous obtenons des indices tous supérieurs à 1, quelle décision prendre ?? et avons nous les moyens de prendre une décision ? c’est oublier que nous n’avons pas pris en compte l’hypothèse de normalité…

Intérrogeons nous maintenant sur la normalité de nos données.

Commençons par une appréciation visuelle :

MASS::truehist(donnees$x,nbins = 30)

L’asymétrie de cet histogramme doit nous interpeller…

Appuyons nous sur un graphe quantile-quantile :

qqnorm(donnees$x);qqline(donnees$x,col="red")

Nous constatons un écart qui s’amplifie sur la fin.

Une double évaluation, visuelle et par un test est toujours préférable.

Posons les hypothèses suivantes :

Bien entendu comme dans tous tests d’hypothèse, le bénéfice du doute est accordé à l’hypothèse nulle. Un tel test déterminera s’il existe suffisament de preuves pour rejeter \(H_{0}\). Passer le test, ne signifie pas que les données sont normales mais si le test échoue alors il faudra utiliser une autre approche.

Le test le plus couramment utilisé est le test de Shapiro et Wilk. Ce test développé en 1965 construit une statistique \(W\) basée approximativement sur la distance entre les points et la droite du tracé quantile-quantile. (http://www.numdam.org/article/RSA_1972__20_2_5_0.pdf)

shapiro.test(donnees$x)
## 
##  Shapiro-Wilk normality test
## 
## data:  donnees$x
## W = 0.92058, p-value = 1.511e-05

Nous obtenons une p-value très faible, il est donc très improbable que cette série suive une loi normale, nous rejetterons l’hypothèse de normalité.

Pour des données non conformes à une loi normale, plusieurs pistes pour “normaliser” ces données sont possibles : (ici “normaliser” signifie transformer un vecteur de données de telle sorte que les valeurs transformées suivent une distribution gaussienne).

On pourra :

  1. Rechercher une transformation de nos données initiales afin que celles ci puissent se conformer à une distribution normale. du type :

\(X \mapsto \left (X+\Delta \right )^{p}=X'\) pour \(p\neq 0\)

Pour que cette transformation soit une fonction continue de \(p\), on utilisera le logarithme naturel quand \(p=0\) :

\(X \mapsto ln\left (X+\Delta \right )=X'\) (bien entendu il faut que \(\Delta\) soit tel que toutes les valeurs \(X+\Delta\) soient positives)

  1. Trouver une distribution alternative qui corresponde à nos données, ceci nous demandera d’ajuster nos indices de capabilité

  2. Approcher la distribution de nos données à une courbe de Jonhson https://en.wikipedia.org/wiki/Johnson%27s_SU-distribution

  3. Appliquer la transformation de Box et Cox qui en 1964 ont suggéré une modification qui préserve la magnitude des données en ne changeant que la forme.

Ils ont proposé cette transformation :

\(X'=\frac{X^{\lambda}-1}{\lambda}\) Si \(\lambda\neq0\)

\(X'=ln(X)\) Si \(\lambda=0\)

L’idée est de trouver le lambda qui maximise le coefficient de corrélation (entre les quantiles théoriques et les quantiles empiriques) de la droite de Henry. D’autres méthodes numériques peuvent être employées comme celle du Maximum de vraisemblance de la fonction Boxcox() de R du paquet MASS.

Toutes ces techniques ont leurs propres forces et faiblesses.Il sera souvent nécessaire de faire plusieurs essais…

Voyons ce que ça donne avec la fonction boxcox() de R du paquet MASS

library(MASS) 
 result<-boxcox(donnees$x~1,plotit = T,lambda = seq(-4,4,0.01))

Rien de concluant… Translatons nos données et recommençons :

xprime<-donnees$x-1.8 ## attention à prendre garde à rester positif...
result<-boxcox(xprime~1,plotit = T,lambda = seq(-4, 4,0.01))

Après cette transformation l’algorithme obtient un \(\lambda\) de -2.88 qui maximise le log de la fonction de vraisemblance

(lambda<- result$x[which.max(result$y)])
## [1] -2.88

Testons l’hypothèse de normalité de ces données transformées :

new_donnees<-(xprime^lambda-1)/lambda
shapiro.test(new_donnees)
## 
##  Shapiro-Wilk normality test
## 
## data:  new_donnees
## W = 0.99263, p-value = 0.8651

Nous passons d’une p-value de \(1,5.10^{-5}\) avant transformation à une p-value de \(0,865\) !!

qqnorm(new_donnees);qqline(new_donnees,col="red")

Après cette transformation, nous calculons les indices de capabilité sans oublier de transformer également les spécificités :

New_spec<-((c(1.95,2.05)-1.8)^lambda-1)/lambda
New_center<-((2-1.8)^lambda-1)/lambda
new_diameter<-qcc.groups(new_donnees,rep(1:20,5))
new_q<-qcc(new_diameter,type = "xbar",center = New_center)

Bien sûr cette transformation aboutit à la même conclusion pour la carte de contrôle \(Xbar\) car l’hypothèse de normalité n’est pas indispensable (à part pour une carte à valeurs individuelles et pour les étendues mobiles XmR.)

process.capability(new_q,spec.limits = New_spec,target =New_center)

## 
## Process Capability Analysis
## 
## Call:
## process.capability(object = new_q, spec.limits = New_spec, target = New_center)
## 
## Number of obs = 100          Target = -35.43
##        Center = -35.43          LSL = -81.59
##        StdDev = 9.854           USL = -18.47
## 
## Capability indices:
## 
##        Value    2.5%   97.5%
## Cp    1.0675  0.9189  1.2158
## Cp_l  1.5612  1.3706  1.7517
## Cp_u  0.5738  0.4872  0.6604
## Cp_k  0.5738  0.4706  0.6770
## Cpm   1.0675  0.9197  1.2151
## 
## Exp<LSL 0%    Obs<LSL 0%
## Exp>USL 4.3%  Obs>USL 1%

Par rapport aux résultats précédents qui supposaient que les données d’origines provenaient d’une distribution normale il ne fait aucun doute après normalisation que le processus est mal centré avec \(C_{pk}=0.57\) et un \(C_{p}\simeq 1\) montre que le processus est à peine capable.

\(\\\)

Références :