Skip to content

Instantly share code, notes, and snippets.

@robintux
Created December 14, 2025 21:52
Show Gist options
  • Select an option

  • Save robintux/860eb97d9f3b3554cbe438f948016cd7 to your computer and use it in GitHub Desktop.

Select an option

Save robintux/860eb97d9f3b3554cbe438f948016cd7 to your computer and use it in GitHub Desktop.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
def verificar_tlc(distribucion, params, tamano_muestra=10000, n_simulaciones=10000):
"""
Verificación empírica del Teorema del Límite Central
Parámetros:
-----------
distribucion : función que genera muestras
params : parámetros de la distribución
tamano_muestra : tamaño de cada muestra
n_simulaciones : número de muestras a generar
"""
# Configuración
np.random.seed(42)
# Generar muestras de la distribución original
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
# 1. Distribución original
muestra_original = distribucion(*params, size=10000)
axes[0, 0].hist(muestra_original, bins=50, density=True, alpha=0.6, color='blue')
axes[0, 0].set_title('Distribución Original')
axes[0, 0].set_xlabel('Valor')
axes[0, 0].set_ylabel('Densidad')
# Estadísticas de la distribución original
media_original = np.mean(muestra_original)
varianza_original = np.var(muestra_original, ddof=1)
axes[0, 0].axvline(media_original, color='red', linestyle='--',
label=f'Media: {media_original:.3f}')
axes[0, 0].legend()
# 2. Evolución de la distribución de medias para diferentes n
tamanos_n = [1, 5, 10, 30, 50, 100]
medias_muestrales = []
for i, n in enumerate(tamanos_n):
# Calcular medias muestrales
medias = np.array([
np.mean(distribucion(*params, size=n))
for _ in range(n_simulaciones)
])
medias_muestrales.append(medias)
# Normalizar
media_teorica = np.mean(muestra_original)
desvio_teorico = np.std(muestra_original) / np.sqrt(n)
medias_normalizadas = (medias - media_teorica) / desvio_teorico
# Graficar
row = (i + 1) // 3
col = (i + 1) % 3
if row < 2 and col < 3:
axes[row, col].hist(medias_normalizadas, bins=50, density=True,
alpha=0.6, color='green')
# Sobreponer distribución normal estándar
x = np.linspace(-4, 4, 1000)
axes[row, col].plot(x, stats.norm.pdf(x), 'r-', linewidth=2)
# Estadísticas de bondad de ajuste
ks_stat, ks_pvalue = stats.kstest(medias_normalizadas, 'norm')
axes[row, col].set_title(f'n = {n}\nKS p-value: {ks_pvalue:.4f}')
axes[row, col].set_xlim(-4, 4)
plt.suptitle('Verificación del Teorema del Límite Central', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
# 3. Análisis cuantitativo de convergencia
print("="*70)
print("ANÁLISIS DE CONVERGENCIA AL TLC")
print("="*70)
for n, medias in zip(tamanos_n, medias_muestrales):
if n > 1:
medias_norm = (medias - media_original) / (np.std(muestra_original)/np.sqrt(n))
ks_stat, ks_pvalue = stats.kstest(medias_norm, 'norm')
print(f"n = {n:3d} | KS p-value: {ks_pvalue:.6f} | "
f"Sesgo: {stats.skew(medias_norm):.4f} | "
f"Curtosis: {stats.kurtosis(medias_norm):.4f}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment