Created
December 14, 2025 21:52
-
-
Save robintux/860eb97d9f3b3554cbe438f948016cd7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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