Digamos que estás en un centro de atención al cliente y te gustaría saber la distribución de probabilidad del número de llamadas por minuto, o en otras palabras, quieres responder a la pregunta: ¿cuál es la probabilidad de recibir cero, uno, dos? , … etc., ¿llamadas por minuto? Necesita esta distribución para predecir la probabilidad de recibir un número diferente de llamadas en función de lo cual puede planificar cuántos empleados se necesitan, si se requiere o no una expansión, etc.
Para que nuestra decisión esté “informada por los datos”, comenzamos recopilando datos de los cuales intentamos inferir esta distribución o, en otras palabras, queremos generalizar desde los datos de la muestra a los datos no vistos, que también se conocen como población en estadística. términos. Ésta es la esencia de la inferencia estadística.
A partir de los datos recopilados podemos calcular la frecuencia relativa de cada valor de llamadas por minuto. Por ejemplo, si los datos recopilados a lo largo del tiempo se ven así: 2, 2, 3, 5, 4, 5, 5, 3, 6, 3, 4,… etc. Estos datos se obtienen contando el número de llamadas recibidas. cada minuto. Para calcular la frecuencia relativa de cada valor, puede contar el número de apariciones de cada valor dividido por el número total de apariciones. De esta manera, terminará con algo como la curva gris en la siguiente figura, que es equivalente al histograma de los datos en este ejemplo.
Otra opción es asumir que cada punto de datos de nuestros datos es una realización de una variable aleatoria (X) que sigue una determinada distribución de probabilidad. Esta distribución de probabilidad representa todos los valores posibles que se generarían si tuviéramos que recopilar estos datos en el futuro o, en otras palabras, podemos decir que representa la población de la que se recopilaron nuestros datos de muestra. Además, podemos suponer que todos los puntos de datos provienen de la misma distribución de probabilidad, es decir, los puntos de datos están distribuidos de manera idéntica. Además, suponemos que los puntos de datos son independientes, es decir, el valor de un punto de datos en la muestra no se ve afectado por los valores de los otros puntos de datos. El supuesto de independencia y distribución idéntica (iid) de los puntos de datos muestrales nos permite proceder matemáticamente con nuestro problema de inferencia estadística de una manera sistemática y sencilla. En términos más formales, asumimos que un modelo probabilístico generativo es responsable de generar los datos iid como se muestra a continuación.
En este ejemplo particular, se supone que una distribución de Poisson con valor medio λ = 5 generó los datos como se muestra en la curva azul en la siguiente figura. En otras palabras, asumimos aquí que conocemos el valor verdadero de λ, que generalmente no se conoce y debe estimarse a partir de los datos.
A diferencia del método anterior en el que teníamos que calcular la frecuencia relativa de cada valor de llamadas por minuto (por ejemplo, en este ejemplo se estimarían 12 valores como se muestra en la figura gris de arriba), ahora solo tenemos un parámetro que objetivo encontrar cuál es λ. Otra ventaja de este enfoque de modelo generativo es que es mejor en términos de generalización de la muestra a la población. Se puede decir que la distribución de probabilidad supuesta ha resumido los datos de una manera elegante que sigue el principio de la navaja de Occam.
Antes de continuar con cómo pretendemos encontrar este parámetro λ, mostremos primero algo de código Python que se usó para generar la figura anterior.
# Import the Python libraries that we will need in this article
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import math
from scipy import stats# Poisson distribution example
lambda_ = 5
sample_size = 1000
data_poisson = stats.poisson.rvs(lambda_,size= sample_size) # generate data
# Plot the data histogram vs the PMF
x1 = np.arange(data_poisson.min(), data_poisson.max(), 1)
fig1, ax = plt.subplots()
plt.bar(x1, stats.poisson.pmf(x1,lambda_),
label="Possion distribution (PMF)",color = BLUE2,linewidth=3.0,width=0.3,zorder=2)
ax.hist(data_poisson, bins=x1.size, density=True, label="Data histogram",color = GRAY9, width=1,zorder=1,align='left')
ax.set_title("Data histogram vs. Poisson true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
plt.savefig("Possion_hist_PMF.png", format="png", dpi=800)
Nuestro problema ahora es estimar el valor del parámetro desconocido λ utilizando los datos que recopilamos. Aquí es donde usaremos el método de momentos (MoM) enfoque que aparece en el título de este artículo.
Primero, necesitamos definir qué se entiende por momento de una variable aleatoria. Matemáticamente, el k-ésimo momento de una variable aleatoria discreta (X) se define de la siguiente manera
Tome el primer momento E(X) como ejemplo, que también es la media μ de la variable aleatoria, y suponiendo que recopilamos nuestros datos que se modelan como N realizaciones iid de la variable aleatoria X. Una estimación razonable de μ es la media muestral que se define de la siguiente manera
Por lo tanto, para obtener una estimación MoM de un parámetro del modelo que parametriza la distribución de probabilidad de la variable aleatoria X, primero escribimos el parámetro desconocido como una función de uno o más de los k-ésimos momentos de la variable aleatoria, luego reemplazamos el k-ésimo momento con su estimación muestral. Cuantos más parámetros desconocidos tengamos en nuestros modelos, más momentos necesitaremos.
En nuestro ejemplo del modelo de Poisson, esto es muy simple como se muestra a continuación.
En la siguiente parte, probamos nuestro estimador MoM con los datos simulados que teníamos anteriormente. A continuación se muestra el código Python para obtener el estimador y trazar la distribución de probabilidad correspondiente utilizando el parámetro estimado.
# Method of moments estimator using the data (Poisson Dist)
lambda_hat = sum(data_poisson) / len(data_poisson)# Plot the MoM estimated PMF vs the true PMF
x1 = np.arange(data_poisson.min(), data_poisson.max(), 1)
fig2, ax = plt.subplots()
plt.bar(x1, stats.poisson.pmf(x1,lambda_hat),
label="Estimated PMF",color = ORANGE1,linewidth=3.0,width=0.3)
plt.bar(x1+0.3, stats.poisson.pmf(x1,lambda_),
label="True PMF",color = BLUE2,linewidth=3.0,width=0.3)
ax.set_title("Estimated Poisson distribution vs. true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
#ax.grid()
plt.savefig("Possion_true_vs_est.png", format="png", dpi=800)
La siguiente figura muestra la distribución estimada versus la distribución real. Las distribuciones son bastante cercanas, lo que indica que el estimador MoM es un estimador razonable para nuestro problema. De hecho, reemplazar expectativas con promedios en el estimador MoM implica que el estimador es consistente por la ley de los grandes números, lo cual es una buena justificación para usar dicho estimador.
A continuación se muestra otro ejemplo de estimación MoM, suponiendo que los datos iid se generan mediante una distribución normal con media μ y varianza σ² como se muestra a continuación.
En este ejemplo particular, se supone que una distribución gaussiana (normal) con valor medio μ = 10 y σ = 2 ha generado los datos. El histograma de la muestra de datos generada (tamaño de muestra = 1000) se muestra en gris en la siguiente figura, mientras que la distribución real se muestra en la curva azul.
El código Python que se utilizó para generar la figura anterior se muestra a continuación.
# Normal distribution example
mu = 10
sigma = 2
sample_size = 1000
data_normal = stats.norm.rvs(loc=mu, scale=sigma ,size= sample_size) # generate data# Plot the data histogram vs the PDF
x2 = np.linspace(data_normal.min(), data_normal.max(), sample_size)
fig3, ax = plt.subplots()
ax.hist(data_normal, bins=50, density=True, label="Data histogram",color = GRAY9)
ax.plot(x2, stats.norm(loc=mu, scale=sigma).pdf(x2),
label="Normal distribution (PDF)",color = BLUE2,linewidth=3.0)
ax.set_title("Data histogram vs. true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
ax.grid()
plt.savefig("Normal_hist_PMF.png", format="png", dpi=800)
Ahora, nos gustaría utilizar el estimador MoM para encontrar una estimación de los parámetros del modelo, es decir, μ y σ² como se muestra a continuación.
Para probar este estimador utilizando nuestros datos de muestra, trazamos la distribución con los parámetros estimados (naranja) en la siguiente figura, versus la distribución real (azul). Nuevamente se puede demostrar que las distribuciones son bastante cercanas. Por supuesto, para cuantificar este estimador, debemos probarlo en múltiples realizaciones de los datos y observar propiedades como el sesgo, la varianza, etc. Estos aspectos importantes se discutieron en un artículo anterior. Compensación de varianza de sesgo en la estimación de parámetros con código Python | por Mahmoud Abdelaziz, PhD | Medio
A continuación se muestra el código Python que se utilizó para estimar los parámetros del modelo usando MoM y para trazar la figura anterior.
# Method of moments estimator using the data (Normal Dist)
mu_hat = sum(data_normal) / len(data_normal) # MoM mean estimator
var_hat = sum(pow(x-mu_hat,2) for x in data_normal) / len(data_normal) # variance
sigma_hat = math.sqrt(var_hat) # MoM standard deviation estimator# Plot the MoM estimated PDF vs the true PDF
x2 = np.linspace(data_normal.min(), data_normal.max(), sample_size)
fig4, ax = plt.subplots()
ax.plot(x2, stats.norm(loc=mu_hat, scale=sigma_hat).pdf(x2),
label="Estimated PDF",color = ORANGE1,linewidth=3.0)
ax.plot(x2, stats.norm(loc=mu, scale=sigma).pdf(x2),
label="True PDF",color = BLUE2,linewidth=3.0)
ax.set_title("Estimated Normal distribution vs. true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
ax.grid()
plt.savefig("Normal_true_vs_est.png", format="png", dpi=800)
Otra distribución de probabilidad útil es la distribución Gamma. En un artículo anterior se analizó un ejemplo de la aplicación de esta distribución en la vida real. artículo. Sin embargo, en este artículo, derivamos el estimador MoM de los parámetros de distribución gamma α y β como se muestra a continuación, asumiendo que los datos son iid.
En este ejemplo particular, se supone que una distribución Gamma con α = 6 y β = 0,5 ha generado los datos. El histograma de la muestra de datos generada (tamaño de muestra = 1000) se muestra en gris en la siguiente figura, mientras que la distribución real se muestra en la curva azul.
El código Python que se utilizó para generar la figura anterior se muestra a continuación.
# Gamma distribution example
alpha_ = 6 # shape parameter
scale_ = 2 # scale paramter (lamda) = 1/beta in gamma dist.
sample_size = 1000
data_gamma = stats.gamma.rvs(alpha_,loc=0, scale=scale_ ,size= sample_size) # generate data# Plot the data histogram vs the PDF
x3 = np.linspace(data_gamma.min(), data_gamma.max(), sample_size)
fig5, ax = plt.subplots()
ax.hist(data_gamma, bins=50, density=True, label="Data histogram",color = GRAY9)
ax.plot(x3, stats.gamma(alpha_,loc=0, scale=scale_).pdf(x3),
label="Gamma distribution (PDF)",color = BLUE2,linewidth=3.0)
ax.set_title("Data histogram vs. true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
ax.grid()
plt.savefig("Gamma_hist_PMF.png", format="png", dpi=800)
Ahora, nos gustaría utilizar el estimador MoM para encontrar una estimación de los parámetros del modelo, es decir, α y β, como se muestra a continuación.
Para probar este estimador utilizando nuestros datos de muestra, trazamos la distribución con los parámetros estimados (naranja) en la siguiente figura, versus la distribución real (azul). Nuevamente se puede demostrar que las distribuciones son bastante cercanas.
A continuación se muestra el código Python que se utilizó para estimar los parámetros del modelo usando MoM y para trazar la figura anterior.
# Method of moments estimator using the data (Gamma Dist)
sample_mean = data_gamma.mean()
sample_var = data_gamma.var()
scale_hat = sample_var/sample_mean #scale is equal to 1/beta in gamma dist.
alpha_hat = sample_mean**2/sample_var# Plot the MoM estimated PDF vs the true PDF
x4 = np.linspace(data_gamma.min(), data_gamma.max(), sample_size)
fig6, ax = plt.subplots()
ax.plot(x4, stats.gamma(alpha_hat,loc=0, scale=scale_hat).pdf(x4),
label="Estimated PDF",color = ORANGE1,linewidth=3.0)
ax.plot(x4, stats.gamma(alpha_,loc=0, scale=scale_).pdf(x4),
label="True PDF",color = BLUE2,linewidth=3.0)
ax.set_title("Estimated Gamma distribution vs. true distribution", fontsize=14, loc='left')
ax.set_xlabel('Data value')
ax.set_ylabel('Probability')
ax.legend()
ax.grid()
plt.savefig("Gamma_true_vs_est.png", format="png", dpi=800)
Tenga en cuenta que utilizamos las siguientes formas equivalentes de escribir la varianza al derivar los estimadores en los casos de distribuciones Gaussiana y Gamma.
En este artículo, exploramos varios ejemplos del método del estimador de momentos y sus aplicaciones en diferentes problemas de ciencia de datos. Además, también se muestra el código Python detallado que se utilizó para implementar los estimadores desde cero, así como para trazar las diferentes cifras. Espero que este artículo te resulte útil.