Supongamos que está en un centro de atención al cliente, y le gustaría saber la distribución de probabilidad de la cantidad de llamadas por minuto, o en otras palabras, desea responder a la pregunta: ¿Cuál es la probabilidad de recibir cero, uno, dos, dos? , … etc., llamadas por minuto? Necesita esta distribución para predecir la probabilidad de recibir una cantidad diferente de llamadas en función de las cuales puede planificar cuántos empleados se necesitan, si se requiere o no una expansión, etc.

Para dejar que nuestra decisión ‘Datos informados’ comiencemos por recopilar datos de los cuales intentamos inferir esta distribución, o en otras palabras, queremos generalizar de los datos de muestra a los datos invisibles que también se conoce como población en estadística estadística términos. Esta es la esencia de la inferencia estadística.

A partir de los datos recopilados, podemos calcular la frecuencia relativa de cada valor de las llamadas por minuto. Por ejemplo, si los datos recopilados a lo largo del tiempo se parecen a esto: 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 ocurrencias de cada valor dividido por el número total de ocurrencias. De esta manera, terminará con algo como la curva gris en la figura a continuación, que es equivalente al histograma de los datos en este ejemplo.

Imagen generada por el autor

Otra opción es suponer que cada punto de datos de nuestros datos es una realización de una variable aleatoria (x) que sigue una cierta distribución de probabilidad. Esta distribución de probabilidad representa todos los valores posibles que se generan si tuviéramos que recopilar estos datos en el futuro, o en otras palabras, podemos decir que representa a la población de la cual 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 se distribuyen 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. La suposición de independencia y distribución idéntica (IID) de los puntos de datos de la muestra nos permite proceder matemáticamente con nuestro problema de inferencia estadística de una manera sistemática y directa. En términos más formales, suponemos que un modelo probabilístico generativo es responsable de generar los datos IID como se muestra a continuación.

Imagen generada por el autor

En este ejemplo particular, se supone que una distribución de Poisson con el valor medio λ = 5 ha generado los datos como se muestra en la curva azul en la figura a continuación. En otras palabras, suponemos aquí que conocemos el verdadero valor de λ que generalmente no se conoce y debe estimarse a partir de los datos.

Imagen generada por el autor

A diferencia del método anterior en el que tuvimos que calcular la frecuencia relativa de cada valor de las llamadas por minuto (por ejemplo, 12 valores que se estimarán en este ejemplo como se muestra en la figura gris anterior), ahora solo tenemos un parámetro que nosotros Apunte a encontrar cuál es λ. Otra ventaja de este enfoque de modelo generativo es que es mejor en términos de generalización de muestra a población. Se puede decir que la distribución de probabilidad supuesta ha resumido los datos de una manera elegante que sigue al principio de afeitar del Occam.

Antes de continuar con el objetivo de encontrar este parámetro λ, mostremos algunos Pitón Código primero 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 se trata de estimar el valor del parámetro desconocido λ usando los datos que recopilamos. Aquí es donde usaremos el Método de momentos (mamá) enfoque que aparece en el título de este artículo.

Primero, necesitamos definir qué se entiende por el momento de una variable aleatoria. Matemáticamente, el momento kth de una variable aleatoria discreta (x) se define de la siguiente manera:

Tome el primer momento E (x) como un ejemplo, que también es la media μ de la variable aleatoria, y suponiendo que recopilemos nuestros datos que se modelan como realizaciones de la variable aleatoria X. Una estimación razonable de μ es la Media de muestra que se define de la siguiente manera:

Por lo tanto, para obtener una estimación de MOM de un parámetro de modelo que parametriza la distribución de probabilidad de la variable aleatoria x, primero escribimos el parámetro desconocido en función de uno o más de los momentos de la variable aleatoria, luego reemplazamos el Kth Moment con su estimación de muestra. Cuantos parámetros más desconocidos tengamos en nuestros modelos, más momentos necesitaremos.

En nuestro ejemplo de modelo Poisson, esto es muy simple como se muestra a continuación.

En la siguiente parte, probamos a nuestro estimador de MOM en los datos simulados que teníamos anteriormente. El código de Python para obtener el estimador y trazar la distribución de probabilidad correspondiente utilizando el parámetro estimado se muestra a continuación.

# 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 verdadera. Las distribuciones son bastante cercanas, lo que indica que el estimador de MOM es un estimador razonable para nuestro problema. De hecho, reemplazar las expectativas con promedios en el estimador de MOM implica que el estimador es un estimador consistente por la ley de grandes números, lo cual es una buena justificación para usar dicho estimador.

Imagen generada por el autor

A continuación se muestra otro ejemplo de estimación de MOM, suponiendo que los datos del IID se generen mediante una distribución normal con μ y varianza σ² como se muestra a continuación.

Imagen generada por el autor

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 figura siguiente, mientras que la distribución verdadera se muestra en la curva azul.

Imagen generada por el autor

El código de Python que se usó 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 usar 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 figura a continuación, versus la distribución verdadera (azul). Nuevamente, se puede demostrar que las distribuciones son bastante cercanas. Por supuesto, para cuantificar este estimador, necesitamos probarlo en múltiples realizaciones de los datos y observar propiedades como sesgo, varianza, etc. Aspectos tan importantes han sido discutidos en un artículo anterior.

Imagen generada por el autor

El código Python que se usó para estimar los parámetros del modelo usando MOM, y para trazar la figura anterior se muestra a continuación.

# 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. Un ejemplo para la aplicación de esta distribución en la vida real se discutió en un anterior artículo. Sin embargo, en este artículo, derivamos el estimador MOM de los parámetros de distribución de gamma α y β como se muestra a continuación, suponiendo que los datos son IID.

Imagen generada por el autor

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 figura siguiente, mientras que la distribución verdadera se muestra en la curva azul.

Imagen generada por el autor

El código de Python que se usó 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 usar 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 figura a continuación, versus la distribución verdadera (azul). Nuevamente, se puede demostrar que las distribuciones son bastante cercanas.

Imagen generada por el autor

El código Python que se usó para estimar los parámetros del modelo usando MOM, y para trazar la figura anterior se muestra a continuación.

# 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 gaussianas y gamma.

Conclusión

En este artículo, exploramos varios ejemplos del método de estimador de momentos y sus aplicaciones en diferentes problemas en la ciencia de datos. Además, también se muestra el código detallado de Python que se utilizó para implementar los estimadores desde cero, así como para trazar las diferentes figuras. Espero que encuentres útil este artículo.

Por automata