En estudios de inferencia estadística se utiliza mucho la distribución normal estándar, ya sea en los intervalos de confianza o en las pruebas de hipótesis. Los parámetros con los que se trabajan son los valores \(z_\alpha\) y \(\alpha\). Vease la siguiente figura.

z y alfa en la gráfica

Python tiene el módulo scipy.stats.norm que contiene las funciones para determinar estos 2 parámetros: las funciones ppf y cdf. La función cdf se denomina cumulative distribution function, en español, función de distribución acumulada. Mientras la función ppf se denomina percent point function o inverse cumulative distribution function, en español, función de distribución acumulada inversa. Es decir una función es la inversa de la otra, y son conceptos que aparecen cuando estudiamos variables aleatorias y distribuciones de probabilidad.

En su forma matemática cdf, con Z como variable aleatoria, se expresa:

$$\alpha = F_Z(z_\alpha) = P(Z \leq z_\alpha) = \int_{-\infty}^{z_\alpha} f(x) \cdot dx$$

\(f(x)\) es la función de densidad de probabilidad, que en este caso es la normal estándar, y es la que define la forma de campana de la distribución: $$f(x) = \frac{1}{\sqrt{2\pi}} \cdot e ^{-\frac{x^2}{2}}$$

Mientras que ppf sería la inversa:

$$z_\alpha = F_Z^{-1}(\alpha)$$

En definitiva, con la función ppf podemos determinar el valor de \(z_\alpha\) conocido \(\alpha\), y con la función cdf podemos determinar el valor de \(\alpha\) conocido \(z_\alpha\).

Veamos ahora como utilizarlas con el siguiente ejemplo. Supongamos que queremos determinar el valor de z para un \(\alpha\) de 0,025 (\(z_{0,025}\)). El código en Python es:

In:

from scipy import stats

alfa= 0.025
z_alfa = stats.norm.ppf(alfa)
z_alfa

Out:

-1.9599639845400545

Ahora a la inversa, determinar \(\alpha\) para un z de -1.96. Debe dar 0,025 aproximadamente, por lo que decíamos antes, que una es la función inversa de la otra.

In:

from scipy import stats

z_alfa= -1.96
alfa = stats.norm.cdf(z_alfa)
alfa

Out:

0.024997895148220435

Para terminar voy dejar el código para crear el gráfico de la figura anterior. Antes, eso sí, hay que mencionar otra función de este módulo: la función pdf. Esta función permite obtener los valores de la función de densidad dado un valor z. De este modo obtendríamos una tabla de datos para poder graficar. En el código siguiente fijarse en la definición de f_x = lambda x: stats.norm.pdf(x) que es la función de densidad para la normal estándar. Luego esta misma función f_x se usa para crear la gráfica en ax.plot(x, f_x(x)).

In:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="ticks")

#Distribución normal estándar: dominio x y función de densidad de probabilidad f(x)
x_inf = stats.norm.ppf(0.001)
x_sup = stats.norm.ppf(0.999)
x = np.linspace(x_inf, x_sup, 10000)
f_x = lambda x: stats.norm.pdf(x)

#Alfa y z
z_alfa = -1.96
x_z = np.linspace(x_inf, z_alfa,10000)

#Creación de gráfico
fig, ax = plt.subplots(figsize=(8,4))
ax.plot(x, f_x(x))
ax.fill_between(x_z, y1=f_x(x_z), y2=0, color="r", alpha=0.5)

#--Anotación en gráfico
ax.annotate(r"$\alpha$",
            xy=(-2.2,0.02),
            xytext=(-3,0.1),
            arrowprops=dict(facecolor='black', width=2),
            fontsize=14)

#--Personalizando gráfico
ax.spines[['left', 'top','right']].set_visible(False)

plt.ylim(bottom=0)
plt.yticks([])
plt.xticks(ticks= [z_alfa], labels=[r"$z_\alpha$"], fontsize=14)

plt.show()

Out:


Versiones usadas:
  • Python: 3.9.7,
  • Jupyter Notebook: 6.4.5,
  • Numpy: 1.20.3,
  • Scipy: 1.7.1,
  • Matplotlib: 3.4.3,
  • Seaborn: 0.11.2
Tags:

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *