O controle de qualidade é uma ferramenta essencial para garantia dos resultados e obrigatória para laboratórios certificados em normas nacionais e internacionais como a ISO 17025[1].
Os controles são soluções de padrões de origem (lote) diferente dos usados na calibração do equipamento, eles simulam uma amostra nas mesmas condições experimentais porém de teor conhecido.
Este trabalho busca avaliar a normalidade no histórico do uso destes padrões em um período de aproximadamente 4 anos.
As análises de Sódio foram efetuadas por espectrometria de emissão de plasma de argônio (ICP-OES) e Chumbo, Cádmio, Arsênio e Selênio, Níquel, Prata, Tálio e Berílio por espectrometria de absorção atômica por forno de grafite (GFAAS).
Foi calculado também a capacidade do processo, que é definida como a razão entre a dispersão dos dados experimentais (variação de concentração do controle) e um limite pré estabelecido no processo de medição.
Os dados foram retirados das planilhas Excel das estações de trabalho junto ao espectrômetros e compilados num mesmo arquivo que foi exportado como CSV, este então, foi usado no R[2,3] para cálculos e visualização dos dados[4].
library(qcc)
library(ggplot2)
library(stringi)
library(ggthemes)
cartas <- read.delim2("/mnt/DADOS/Data Science/Carta Controle/cartas.csv")
Pb <- as.numeric(stri_omit_empty_na(cartas$Pb))
Cd <- as.numeric(stri_omit_empty_na(cartas$Cd))
As <- as.numeric(stri_omit_empty_na(cartas$As))
Se <- as.numeric(stri_omit_empty_na(cartas$Se))
Na <- as.numeric(stri_omit_empty_na(cartas$Na))
Ni <- as.numeric(stri_omit_empty_na(cartas$Ni))
Ag <- as.numeric(stri_omit_empty_na(cartas$Ag))
Tl <- as.numeric(stri_omit_empty_na(cartas$Tl))
Be <- as.numeric(stri_omit_empty_na(cartas$Be))
data <- as.Date(cartas$Data, "%d/%m/%y")
Os controles de qualidade eram lidos junto a cada “batelada” de amostra, e plotados nas respectivas cartas de forma individual, sem subgrupos.
Os limites de 20% foram usados no cálculo de capacidade do processo. Em resumo: Os limites são comparados com a variação experimental do processo, se a analise estiver com sua média no centro e sua variação estiver menor que os valores de aceitação ele terá um índice de capacidade (CPK) maior que 1. Caso sua variação esteja exatamente nos limites será 1 e caso a variação esteja indo além da faixa permitida será menor que 1.
É interessante ressaltar que o limite de 20% foi baseado na equação de Horwitz para a Faixa de 0.005 mg/L. [5]
process.capability((qcc(Na,type = "xbar.one")),c(45,55),target = 50)
Figura 1. Gráfico de carta controle(esquerda) para o ensaio de Sódio por ICP-OES. No gráfico é possível ver diversas mudanças de médias ao longo do período estudado. As violações das regras sobre frequências na distribuição dos resultados foram a segunda maior no estudo. Boa parte desse comportamento pode ser explicado pelo preparo e utilização da solução usada no ensaio. A direita se pode observar o histograma descrevendo os limites do processo e a distribuição gaussiana teórica esperada. Os controles de qualidade do ensaio apresentam uma tendência de aproximadamente 3% (valor médio de 51.4 mg/L). O índice de capacidade do processo é de 0.93 indicando um pequeno deslocamento (1,6%) dos valores para fora do limite superior. Provavelmente devio ao deslocamento da média desde o valor teórico de 50 mg/L.
process.capability((qcc(Pb,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 2. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Chumbo por GFAAS. Com média experimentalmais próxima da teórica, o ensaio apresenta um CPK inferior a 0,46 e 14% dos controles fora do limite.
process.capability((qcc(Cd,type = "xbar.one")),c(0.0016,0.0024),target = 0.002)
Figura 3. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Cadmio por GFAAS. Com média experimental também próxima da teórica e com um CPK também inferior, com 0,48.
process.capability((qcc(As,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 4. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Arsênio por GFAAS.
process.capability((qcc(Se,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 5. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Selênio por GFAAS. Média dos controles compatível com o valor teórico
process.capability((qcc(Ni,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 6. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Níquel por GFAAS. Média dos controles compatível com o valor teórico.
process.capability((qcc(Ag,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 7. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Prata por GFAAS. Média dos controles compatível com o valor teórico.
process.capability((qcc(Tl,type = "xbar.one")),c(0.004,0.006),target = 0.005)
Figura 8. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Tálio por GFAAS. Média dos controles compatível com o valor teórico.
process.capability((qcc(Be,type = "xbar.one")),c(0.00035,0.00065),target = 0.0005)
Figura 9. Gráfico de carta controle(esquerda) e de capacidade do processo(direita) para o ensaio de Berílio por GFAAS. Média dos controles compatível com o valor teórico.
Como a inspeção visual pode gerar erros de interpretação, foram aplicados os testes de Kolmogorov-Smirnov e Anderson-Darling para avaliação da normalidade dos dados.
Tabela 1. valores de P de significância do teste para normalidade de Kolmogorov-Smirnov conforme o elemento
library(knitr)
k <- ks.test(Na,"pnorm",mean(Na),sd(Na))
k <- rbind(ks.test(Pb,"pnorm",mean(Pb),sd(Pb)),k)
k <- rbind(ks.test(Cd,"pnorm",mean(Cd),sd(Cd)),k)
k <- rbind(ks.test(Ni,"pnorm",mean(Ni),sd(Ni)),k)
k <- rbind(ks.test(As,"pnorm",mean(As),sd(As)),k)
k <- rbind(ks.test(Se,"pnorm",mean(Se),sd(Se)),k)
k <- rbind(ks.test(Ag,"pnorm",mean(Ag),sd(Ag)),k)
k <- rbind(ks.test(Tl,"pnorm",mean(Tl),sd(Tl)),k)
k <- rbind(ks.test(Be,"pnorm",mean(Be),sd(Be)),k)
kable(k)
| statistic | p.value | alternative | method | data.name | |
|---|---|---|---|---|---|
| c(D = 0.0651585449346498) | 0.688196679088224 | two-sided | One-sample Kolmogorov-Smirnov test | Be | |
| c(D = 0.0806404044286015) | 0.465928660175946 | two-sided | One-sample Kolmogorov-Smirnov test | Tl | |
| c(D = 0.0944625998549306) | 0.230431710522422 | two-sided | One-sample Kolmogorov-Smirnov test | Ag | |
| c(D = 0.0930723536285547) | 0.416682195300287 | two-sided | One-sample Kolmogorov-Smirnov test | Se | |
| c(D = 0.127379407996318) | 0.603194155195296 | two-sided | One-sample Kolmogorov-Smirnov test | As | |
| c(D = 0.0692338052859338) | 0.723949646397361 | two-sided | One-sample Kolmogorov-Smirnov test | Ni | |
| c(D = 0.120687431874253) | 0.0885713064170117 | two-sided | One-sample Kolmogorov-Smirnov test | Cd | |
| c(D = 0.0857154034101655) | 0.351243464185763 | two-sided | One-sample Kolmogorov-Smirnov test | Pb | |
| k | c(D = 0.0473620078134431) | 0.614065566682513 | two-sided | One-sample Kolmogorov-Smirnov test | Na |
p.values <- data.frame(cbind("p.value"= unlist(k[,2])))
elementos <-data.frame(cbind("Elemento" = unlist(k[,5])))
g <- cbind(p.values,elementos)
ggplot(data=as.data.frame(g), aes(x=Elemento, y=p.value)) +
geom_bar(stat="identity")+ geom_hline(yintercept=0.05, linetype="solid", color = "red")+ theme_economist()
A figura 10. mostra a distribuição dos valores p de significancia dos teste de normalidade usando Kolmogorov-Smirnov. A linha vermelha mostra o valor de p de significancia mínimo aceito (0.05)
Tabela 2. valores de P de significancia do teste para normalidade de Anderson-Darling conforme o elemento:
library(goftest)
library(knitr)
ad <- ad.test(Na,"pnorm",mean(Na),sd(Na))
ad <- rbind(ad.test(Pb,"pnorm",mean(Pb),sd(Pb)),ad)
ad <- rbind(ad.test(Cd,"pnorm",mean(Cd),sd(Cd)),ad)
ad <- rbind(ad.test(Ni,"pnorm",mean(Ni),sd(Ni)),ad)
ad <- rbind(ad.test(As,"pnorm",mean(As),sd(As)),ad)
ad <- rbind(ad.test(Se,"pnorm",mean(Se),sd(Se)),ad)
ad <- rbind(ad.test(Ag,"pnorm",mean(Ag),sd(Ag)),ad)
ad <- rbind(ad.test(Tl,"pnorm",mean(Tl),sd(Tl)),ad)
ad <- rbind(ad.test(Be,"pnorm",mean(Be),sd(Be)),ad)
kable(ad)
| statistic | p.value | method | data.name | |
|---|---|---|---|---|
| c(An = 0.433388811120111) | 0.814786883174361 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Be | |
| c(An = 0.915787217765754) | 0.404398213381611 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Tl | |
| c(An = 1.04289302803949) | 0.335378195720549 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Ag | |
| c(An = 0.787993368447104) | 0.48940490653152 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Se | |
| c(An = 0.414133860673488) | 0.833661009848596 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | As | |
| c(An = 0.556067329784767) | 0.690034443285084 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Ni | |
| c(An = 1.19481891105367) | 0.269430620472133 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Cd | |
| c(An = 0.512342445077948) | 0.733900890481073 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Pb | |
| ad | c(An = 0.529324574065868) | 0.716930541660092 | c(“Anderson-Darling test of goodness-of-fit”, “Null hypothesis: Normal distribution”, “Parameters assumed to be fixed”) | Na |
p.values <- data.frame(cbind("p.value"= unlist(ad[,2])))
elementos <-data.frame(cbind("Elemento" = unlist(ad[,4])))
g <- cbind(p.values,elementos)
ggplot(data=as.data.frame(g), aes(x=Elemento, y=p.value)) +
geom_bar(stat="identity")+ geom_hline(yintercept=0.05, linetype="solid", color = "red")+ theme_economist()
A figura 11. mostra a distribuição dos valores p dos teste de normalidade usando Anderson-Darling. A linha vermelha mostra o valor de p de significancia mínimo aceito (0.05)
Todos os elementos apresentam distribuição normal.
Uma segunda forma de visualizar os dados em busca de outliers é através de plotagens QQ ou dos quartis, onde se compara a distribuição dos valores com uma distribuição teórica de mesma média e desvio padrão.
Figura 12: Plotagens dos quartis dos 9 elementos estudados. Nota-se um que o elemento Cádmio apresenta agrupamentos mais nítidos, provavelmente devido a quantidade de algarismo usados, porém, em uma faixa mais baixa (média de 0.002 mg/L). Apenas os elementos Níquel, Prata e Tálio possuem pontos nitidamente fora do intervalo de confiança (em cinza)
O uso de controles de qualidade e parâmetros de capacidade de processo em analise instrumentais tem, em relação aos erros/desvios envolvidos, uma variação maior do que linhas de produção e manufatura.
Os controles apresentam normalidade porém uma dispersão maior que o esperado. Este fato pode ser justificado com fatores como vida útil de equipamento, flutuações nas diluições dos lotes de padrão e consumíveis em diferentes pontos da vida útil.
Os valores baixos de CPK podem ser explicados pela escolha de limites mais restritivos como limite de processo. Ainda existe grande discussão sobre a aplicabilidade da equação de Horwitz [6] em análise na faixa de traço e das faixas de erro aplicáveis.
[1] ISO/IEC 17025:2017, General requirements for the competence of testing and calibration laboratories.
[2]R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
[3]RStudio Team (2020). RStudio: Integrated Development for R. RStudio, PBC, Boston, MA URL http://www.rstudio.com/
[4]Scrucca, L. (2004). qcc: an R package for quality control charting and statistical process control. R News 4/1, 11-17.
[5]DOQ-CGCRE-008. Orientação sobre validação de Métodos analíticos. INMETRO, Revisão: 09,Jun.2020.
[6]Linsinger, Thomas & Josephs, Ralf. (2006). Limitations of the application of the Horwitz equation. TrAC Trends in Analytical Chemistry. 25. 1125-1130. 10.1016/j.trac.2006.11.002.