Apéndice D — Simulación del dataset de repetibilidad (Gerber)

Este documento genera el dataset utilizado en el capítulo de análisis del sistema de medición. El código está documentado para que el profesorado pueda ajustar los parámetros de simulación si lo considera necesario.

D.1 Diseño del estudio

El estudio simula un análisis de repetibilidad del método Gerber para la determinación de grasa en leche, con el siguiente diseño:

  • 5 analistas con perfiles de error distintos
  • 3 muestras que cubren el rango habitual de grasa en leche de vaca: baja, media y alta
  • 3 repeticiones por analista y muestra
  • Total: 45 análisis

Valores de referencia de las muestras

Muestra Valor de referencia (%) Contexto tecnológico
A (baja) 3,4 Leche de verano, alimentación en pasto
B (media) 3,8 Valor típico anual
C (alta) 4,5 Leche de invierno, estabulación

Perfiles de los analistas

Analista Sesgo Desv. típica Descripción
1 (referencia) 0,00% 0,04% Técnica depurada, lectura correcta del butirómetro, baño maría estable
2 (correcto) 0,00% 0,08% Buen nivel general, pequeña variación natural de técnica
3 (correcto, sesgo leve) +0,10% 0,12% Tiende a redondear ligeramente al alza en la lectura de la columna de grasa
4 (sesgo sistemático) −0,35% 0,06% Lee sistemáticamente bajo: error de posición del ojo al leer el menisco del butirómetro. Alta repetibilidad pero resultado alejado del valor de referencia
5 (alta variabilidad) 0,00% 0,25% Técnica irregular: temperatura del baño maría inestable, tiempo de centrifugación variable, dificultad para homogeneizar la muestra

D.2 Código de simulación

Mostrar código
import pandas as pd
import numpy as np

# =============================================================================
# SIMULADOR DE ESTUDIO DE REPETIBILIDAD - MÉTODO GERBER (GRASA EN LECHE)
# =============================================================================
# Diseño: 5 analistas x 3 muestras x 3 repeticiones = 45 análisis
#
# MUESTRAS:
#   - Muestra A (baja):  valor de referencia 3,4% — leche de verano, alimentación en pasto
#   - Muestra B (media): valor de referencia 3,8% — valor típico anual
#   - Muestra C (alta):  valor de referencia 4,5% — leche de invierno, estabulación
#
# PERFILES DE ANALISTAS:
#   - Analista 1 (referencia, el mejor): σ = 0,04%, sin sesgo.
#     Técnica depurada, lectura correcta del butirómetro, temperatura de baño estable.
#
#   - Analista 2 (correcto): σ = 0,08%, sin sesgo.
#     Buen nivel general, pequeña variación natural de técnica.
#
#   - Analista 3 (correcto con sesgo leve): σ = 0,12%, sesgo = +0,10%.
#     Técnica algo menos consistente; tiende a redondear ligeramente al alza
#     en la lectura de la columna de grasa.
#
#   - Analista 4 (sesgo sistemático): σ = 0,06%, sesgo = -0,35%.
#     Resultados consistentemente bajos. Error típico de lectura del menisco
#     del butirómetro: lee el borde superior en lugar del borde inferior,
#     o posición de ojos incorrecta. Alta repetibilidad pero resultado
#     sistemáticamente alejado del valor de referencia.
#
#   - Analista 5 (alta variabilidad): σ = 0,25%, sin sesgo.
#     Técnica irregular: temperatura del baño maría inestable, tiempo de
#     centrifugación variable, dificultad para homogeneizar bien la muestra.
#     Los resultados oscilan alrededor del valor de referencia pero con mucha dispersión.
# =============================================================================

np.random.seed(42)  # Para reproducibilidad del dataset generado

# --- Definición de muestras ---
muestras = {
    'A_baja':  3.4,   # leche de verano
    'B_media': 3.8,   # valor típico anual
    'C_alta':  4.5,   # leche de invierno
}

# --- Definición de analistas (sesgo, desviación típica) ---
analistas = {
    'Analista_1': {'sesgo':  0.00, 'sigma': 0.04},
    'Analista_2': {'sesgo':  0.00, 'sigma': 0.08},
    'Analista_3': {'sesgo': +0.10, 'sigma': 0.12},
    'Analista_4': {'sesgo': -0.35, 'sigma': 0.06},
    'Analista_5': {'sesgo':  0.00, 'sigma': 0.25},
}

repeticiones = 3

# --- Generación del dataset ---
filas = []
for analista, params in analistas.items():
    for muestra, valor_referencia in muestras.items():
        for rep in range(1, repeticiones + 1):
            resultado = (
                valor_referencia
                + params['sesgo']
                + np.random.normal(0, params['sigma'])
            )
            filas.append({
                'analista':    analista,
                'muestra':     muestra,
                'valor_referencia': valor_referencia,
                'repeticion':  rep,
                'resultado':   round(resultado, 2),
            })

df = pd.DataFrame(filas)

# --- Exportar ---
nombre_fichero = 'datos/grr_gerber.csv'
df.to_csv(nombre_fichero, index=False, sep=';', decimal=',', encoding='ISO-8859-1')

print(f"Dataset generado: {nombre_fichero}")
print(f"Dimensiones: {df.shape[0]} filas x {df.shape[1]} columnas")
NotaNota sobre la semilla aleatoria

El código usa np.random.seed(42) para que el dataset generado sea siempre idéntico. Si se desea generar un dataset diferente para una nueva edición o para otro grupo de alumnos, basta con cambiar el valor de la semilla por cualquier otro número entero.