Grafico de Control (Levey Jennings) con Python

 In Sin categoría

En esta guía revisaremos los pasos a seguir para la confección de un Gráfico de Control (Levey & Jennings) utilizando Python como lenguaje de Programación y Google Colaboratory como entorno de Interpretación de Python,

P1.- Paso Inicial, los datos…

Para comenzar debemos identificar los valores que corresponden a nuestro control y de estos tomar los primeros 20 valores como nuestro N20 para el gráfico correspondiente, los controles los colocamos en una hoja de Cálculo en la columna A y exportamos esta hoja con el formato Texto separado por Comas (*.CSV)

P2.- Google Colab

Ingresamos a Google Drive y creamos un archivo de Google Colaboratory, este tendrá una extensión ipynb y por lo tanto es un archivo Python Notebook

P3.- Carga de Librerías

Insertamos un segmento de Código en nuestro colab y copiamos el siguiente código

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import io
from google.colab import files
uploaded = files.upload()

P4.- Corremos el segmento de Código antes copiado y subimos nuestro archivo CSV, que contiene los datos del Control.

P5.- Convertimos el archivo CSV en un Dataframe almacenado en la variable df

NOTA: Muy importante reemplazar el nombre del archivo por el que corresponde a nuestro archivo antes enviado a nuestro entorno Colab
NOTA2: Importante es colocar como variable sep, el separador de listas que tiene nuestro CSV, recordemos que el formato USA de separador es la coma, pero en Latinoamérica se utiliza punto y coma ; esto puede afectar nuestra importación

df = pd.read_csv(io.BytesIO(uploaded[‘ControlGlucosa100.csv’]),sep=»;»)

df

P6.- Ahora convertimos los primeros 20 datos de la columna del Dataframe que contiene los controles en una lista con el nombre controlGlucosa, para esto utilizamos la función .tolist()

controlGlucosa = df.head(20)[‘Glucosa’].tolist()

controlGlucosa

El nombre de la columna que contiene los datos de control debe ser colocado entre comillas simples o en su defecto el indicede la misma, recordemos que en Python partimos desde el número 0

P7.- Test de Dixon

Para realizar el test de Dixon en primer lugar creamos un segmento de código para definir 3 variables que contendrán las listas de valores de tabla para el contraste del test de Dixon.

q90 = [0.941, 0.765, 0.642, 0.56, 0.507, 0.468, 0.437,

      0.412, 0.392, 0.376, 0.361, 0.349, 0.338, 0.329,

      0.32, 0.313, 0.306, 0.3, 0.295, 0.29, 0.285, 0.281,

      0.277, 0.273, 0.269, 0.266, 0.263, 0.26

     ]

q95 = [0.97, 0.829, 0.71, 0.625, 0.568, 0.526, 0.493, 0.466,

      0.444, 0.426, 0.41, 0.396, 0.384, 0.374, 0.365, 0.356,

      0.349, 0.342, 0.337, 0.331, 0.326, 0.321, 0.317, 0.312,

      0.308, 0.305, 0.301, 0.29

     ]

q99 = [0.994, 0.926, 0.821, 0.74, 0.68, 0.634, 0.598, 0.568,

      0.542, 0.522, 0.503, 0.488, 0.475, 0.463, 0.452, 0.442,

      0.433, 0.425, 0.418, 0.411, 0.404, 0.399, 0.393, 0.388,

      0.384, 0.38, 0.376, 0.372

      ]

Q90 = {n:q for n,q in zip(range(3,len(q90)+1), q90)}

Q95 = {n:q for n,q in zip(range(3,len(q95)+1), q95)}Q99 = {n:q for n,q in zip(range(3,len(q99)+1), q99)}

Luego colocamos otro segmento de código con la función de dixon_test

def dixon_test(data, left=True, right=True, q_dict=Q95):

   «»»

   Keyword arguments:

       data = A ordered or unordered list of data points (int or float).

       left = Q-test of minimum value in the ordered list if True.

       right = Q-test of maximum value in the ordered list if True.

       q_dict = A dictionary of Q-values for a given confidence level,

           where the dict. keys are sample sizes N, and the associated values

           are the corresponding critical Q values. E.g.,

           {3: 0.97, 4: 0.829, 5: 0.71, 6: 0.625, …}

   Returns a list of 2 values for the outliers, or None.

   E.g.,

      for [1,1,1] -> [None, None]

      for [5,1,1] -> [None, 5]

      for [5,1,5] -> [1, None]

   «»»

   assert(left or right), ‘At least one of the variables, `left` or `right`, must be True.’

   assert(len(data) >= 3), ‘At least 3 data points are required’

   assert(len(data) <= max(q_dict.keys())), ‘Sample size too large’

   sdata = sorted(data)

   Q_mindiff, Q_maxdiff = (0,0), (0,0)

   if left:

       Q_min = (sdata[1] – sdata[0])

       try:

           Q_min /= (sdata[-1] – sdata[0])

       except ZeroDivisionError:

           pass

       Q_mindiff = (Q_min – q_dict[len(data)], sdata[0])

   if right:

       Q_max = abs((sdata[-2] – sdata[-1]))

       try:

           Q_max /= abs((sdata[0] – sdata[-1]))

       except ZeroDivisionError:

           pass

       Q_maxdiff = (Q_max – q_dict[len(data)], sdata[-1])

   if not Q_mindiff[0] > 0 and not Q_maxdiff[0] > 0:

       outliers = [None, None]

   elif Q_mindiff[0] == Q_maxdiff[0]:

       outliers = [Q_mindiff[1], Q_maxdiff[1]]

   elif Q_mindiff[0] > Q_maxdiff[0]:

       outliers = [Q_mindiff[1], None]

   else:

       outliers = [None, Q_maxdiff[1]]   return outliers

P8 Ahora evaluamos el valor Menor y Mayor por medio de la función dixon_test

dixon_test(controlglucosa)

El resultado lo observamos como una lista con el resultado de la evaluación, en primer lugar la evaluación del menor menor y luego el Mayor

[None, None]

P9 Quitamos los outliers si es que el test de dixon nos indica su presencia

P10 Es tiempo de identificar algunos estadigrafos propios de nuestro control, como El valor Menor, Mayor, la Media, la Desviación estándar y el Coeficiente de Variación

El siguiente código nos ofrece todos los estadigrafos de controlList

def mayor(lista):

max = lista[0];

for x in lista:

if x > max:

max = x

return max

def menor(lista):

min = lista[0];

for x in lista:

if x < min:

min = x

return min

# Identificamos el Valor Menor

vmenor=menor(controlGlucosa)

vm = f’Valor Menor {vmenor}’

print(vm)

# Identificamos el Valor Mayor

vmayor=mayor(controlGlucosa)

vm = f’Valor Mayor {vmayor}’

print(vm)

# Calculamos la Media de controlList

media = float(np.mean(controlGlucosa))

MED = f’Media: {media}’

print(MED)

# Calculamos la SD de controlList

sd = float(np.std(controlGlucosa))

SD = f’SD: {sd}’

print(SD)

# Calculamos el CV de controlList

cv = (sd / media)*100

CV = f’CV: {cv}’

print(CV)

P11 Para la construcción del gráfico de control ahora calculemos los límites de la media +/- 1, 2 y 3 DS

este código nos permite identificarlos como P1, P2, P3, P4,P5 y P6

P1 = media + sd

P2 = media + (sd*2)

P3 = media + (sd*3)

P4 = media – sd

P5 = media – (sd*2)

P6 = media – (sd*3)

print(f’P1: {P1}’)

print(f’P2: {P2}’)

print(f’P3: {P3}’)

print(f’P4: {P4}’)

print(f’P5: {P5}’)

P12 y ahora el paso final…. Graficamos !!!

from pylab import *

import matplotlib.pyplot as plt

plt.title(«CCI Colesterol», loc = ‘left’)

plt.xlabel(«Control»)

plt.ylabel(«»)

plt.plot(df[‘ Control ‘], «mo-«,label=»Control»)

plt.plot(df[‘ Media ‘],»m–«, label=»Media»)

plt.plot(df[‘ sd ‘],»g–«,label=»1SD»)

plt.plot(df[‘ menossd ‘],»g–«,label=»-1SD»)

plt.plot(df[‘ dossd ‘],»y–«,label=»2SD»)

plt.plot(df[‘ menosdossd ‘],»y–«,label=»-2SD»)

plt.plot(df[‘ tressd ‘],»r–«,label=»3SD»)

plt.plot(df[‘ menostressd ‘],»r–«,label=»-3SD»)

plt.axhspan(P3, P6, facecolor=’#E74C3C’, alpha=0.5)

plt.axhspan(P2, P5, facecolor=’#F2FE05′, alpha=0.5)

plt.axhspan(P1, P4, facecolor=’#58D68D’, alpha=0.5)

plt.show()

Recent Posts

Dejar un comentario

Start typing and press Enter to search