La pregunta es sobre el proceso, no sobre los números
Phitter exige elegir fit_type antes de ajustar nada, y la elección no se puede aplazar: las distribuciones continuas y las discretas se ajustan mediante procedimientos distintos y se contrastan con pruebas distintas.
La decisión no se toma observando cómo están almacenados los valores. Una columna de enteros puede describir una cantidad continua que simplemente fue redondeada. Una columna de decimales puede describir conteos que se promediaron aguas arriba. La pregunta que hay que responder es qué puede producir el proceso subyacente:
- Discreta si el resultado es contable: número de llegadas por hora, defectos por lote, artículos por pedido. Entre 3 y 4 no hay nada.
- Continua si el resultado es medible: duración, peso, distancia, temperatura. Entre 3 y 4 hay todo, y la precisión registrada es una propiedad del instrumento, no de la magnitud.
La prueba útil consiste en preguntar si «3.5» tiene sentido. Media hora de inactividad lo tiene. Medio cliente no.
Casos que parecen lo que no son
Datos continuos redondeados. Tiempos de reparación registrados en minutos enteros parecen conteos. Son mediciones continuas con resolución de un minuto. Deben ajustarse como continuas: el redondeo es un artefacto del registro y se manifestará como empates, no como discretitud.
Dinero. Los precios en céntimos son técnicamente discretos, pero la rejilla es tan fina respecto al rango que un modelo continuo resulta más simple y más preciso. La excepción es un conjunto reducido de precios permitidos — una tabla de tarifas, una carta — que sí es genuinamente discreto.
Escalas ordinales. Una escala de satisfacción de cinco puntos produce enteros, pero la distancia entre 2 y 3 no es la distancia entre 4 y 5. Ajustar una distribución discreta sobre ella trata los códigos como conteos, que no lo son. Esto suele requerir un modelo categórico u ordinal, y no ninguna de las dos opciones aquí.
Conteos almacenados como decimales. Una tubería de datos que escribe 4.0 no ha creado una magnitud continua. Conviene comprobar si la parte fraccionaria es siempre cero.
Conteos agregados. Un promedio de conteos es continuo aunque las entradas fueran discretas. Ajustar como discreto el promedio de llegadas diarias es un error de categoría.
Un diagnóstico de una línea
import numpy as np
distinct = len(np.unique(data))
print(distinct, len(data), distinct / len(data))
print(np.all(np.equal(np.mod(data, 1), 0))) # ¿son todos enteros?
Dos señales, leídas junto con lo que se sabe del proceso:
- Todos los valores enteros y pocos valores distintos respecto a n — digamos menos de 30 distintos en 500 observaciones — apunta a datos genuinamente discretos.
- Casi todos los valores distintos apunta a datos continuos, sea cual sea el tipo de almacenamiento.
- Valores enteros con muchos valores distintos es el caso ambiguo, y es donde conocer el proceso resulta decisivo. Miles de conteos enteros distintos se comportan lo bastante como un continuo para que un modelo continuo funcione bien; la decisión debe apoyarse en lo que se pretende calcular.
Qué se rompe cuando la elección es incorrecta
Modelo continuo sobre datos discretos. El modelo asigna probabilidad cero a cada valor individual, así que P(X = 3) queda indisponible — a menudo la cantidad exacta para la que existe un modelo de conteos. Los cuantiles salen fraccionarios: un modelo de inventario que recomienda mantener 4.7 unidades hay que redondearlo a mano, y redondear un cuantil no equivale a calcular el cuantil de la variable redondeada. La prueba chi-cuadrado sigue funcionando, pero Kolmogorov–Smirnov y Anderson–Darling se vuelven poco fiables, porque su teoría supone una distribución continua subyacente y los empates que generan los valores repetidos la violan.
Modelo discreto sobre datos continuos. Se pierde resolución justo donde suele importar. Un ajuste discreto sobre duraciones redondeadas al minuto no puede representar nada más fino, y la cola —donde la simulación pasa su tiempo— se convierte en una función escalonada cuyos escalones son un artefacto de la precisión del registro.
Cómo separa Phitter ambos casos
phi = phitter.Phitter(data=data, fit_type="continuous") # o "discrete"
phi.fit(n_workers=4)
Las dos rutas recurren a catálogos distintos. El lado continuo cubre las familias estándar junto con sus variantes desplazadas y de cuatro parámetros; el lado discreto cubre Bernoulli, binomial, geométrica, hipergeométrica, logarítmica, binomial negativa, Poisson, uniforme y otras. Los diagnósticos reportados difieren en consecuencia: chi-cuadrado es la prueba principal en los ajustes discretos, donde la partición en intervalos es natural en lugar de impuesta.
El soporte es la restricción que hay que revisar primero en cualquiera de los dos casos. Muchas distribuciones de conteo están acotadas inferiormente en cero y no tienen cota superior; algunas, como la binomial y la hipergeométrica, están acotadas por ambos extremos mediante parámetros que deben corresponder a algo real en el proceso. Un ajuste binomial cuyo n estimado sea menor que la observación máxima no es un resultado marginal: es un resultado imposible.
Lista de comprobación
- ¿Puede el proceso producir un valor entre dos observaciones contiguas? Si sí, continua.
- ¿Todos los valores son enteros y el número de valores distintos es pequeño respecto a n? Si sí, discreta.
- ¿Los enteros son códigos y no conteos — valoraciones, categorías, identificadores? Entonces ninguna de estas dos opciones es la correcta.
- ¿Hará falta
P(X = k)para un k concreto? Eso exige un modelo discreto. - ¿El proceso tiene una cota superior estricta, y el modelo ajustado la respeta?
Conviene responder a esto antes de ejecutar el ajuste. Sale más barato que descubrir el problema en los diagnósticos, y algunos desajustes producen un ajuste de apariencia razonable que responde en silencio a la pregunta equivocada.