Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

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

Select an option

Save robintux/c49760918c46631d9ab88a039961e343 to your computer and use it in GitHub Desktop.

Simulación de Distribución Muestral de un Dado

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import gradio as gr

def plot_distribution_muestral(simulaciones, n_lanzamientos):
    """
    Genera un histograma de la distribución muestral de medias de lanzamientos de un dado.

    Args:
        simulaciones: Número de simulaciones a realizar
        n_lanzamientos: Número de lanzamientos por simulación
    """
    # Generar las simulaciones
    medias = [np.mean(np.random.randint(1, 7, n_lanzamientos)) for _ in range(simulaciones)]

    # Crear la figura
    fig, ax = plt.subplots(figsize=(10, 6))

    # Crear el histograma
    sns.histplot(medias, kde=True, color='skyblue', ax=ax, bins=30)

    # Personalizar el gráfico
    ax.set_title(f'Distribución Muestral (n={n_lanzamientos}, simulaciones={simulaciones}) de un Dado', fontsize=14)
    ax.set_xlabel('Media muestral', fontsize=12)
    ax.set_ylabel('Frecuencia', fontsize=12)
    ax.grid(True, alpha=0.3)

    # Agregar línea vertical en la media teórica (3.5)
    ax.axvline(x=3.5, color='red', linestyle='--', linewidth=2, label='Media teórica (3.5)')

    # Agregar estadísticas en el gráfico
    ax.text(0.02, 0.98, f'Media: {np.mean(medias):.3f}\nDesv. estándar: {np.std(medias):.3f}',
            transform=ax.transAxes, verticalalignment='top',
            bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))

    ax.legend()

    return fig

# Crear la interfaz Gradio
with gr.Blocks(title="Simulación de Distribución Muestral") as demo:
    gr.Markdown("""
    # 📊 Simulación de Distribución Muestral de un Dado

    Esta aplicación simula la distribución muestral de las medias de lanzamientos de un dado.
    Ajusta los parámetros usando los sliders y observa cómo cambia la distribución.
    """)

    with gr.Row():
        with gr.Column(scale=1):
            simulaciones_slider = gr.Slider(
                minimum=100,
                maximum=5000,
                value=1000,
                step=100,
                label="Número de simulaciones",
                info="Cantidad de muestras a generar"
            )

            n_lanzamientos_slider = gr.Slider(
                minimum=10,
                maximum=200,
                value=30,
                step=10,
                label="Tamaño de muestra (n)",
                info="Número de lanzamientos por simulación"
            )

            generar_btn = gr.Button("Generar gráfico", variant="primary")

            gr.Markdown("""
            ### 📝 Notas:
            - Cada simulación genera `n` lanzamientos de un dado justo (valores 1-6)
            - Se calcula la media de cada muestra
            - La línea roja punteada muestra la media teórica (3.5)
            - El histograma muestra la distribución de todas las medias calculadas
            """)

        with gr.Column(scale=2):
            plot_output = gr.Plot(label="Distribución Muestral")

    # Conectar los componentes
    generar_btn.click(
        fn=plot_distribution_muestral,
        inputs=[simulaciones_slider, n_lanzamientos_slider],
        outputs=plot_output
    )

    # También actualizar automáticamente al cambiar los sliders
    simulaciones_slider.change(
        fn=plot_distribution_muestral,
        inputs=[simulaciones_slider, n_lanzamientos_slider],
        outputs=plot_output
    )

    n_lanzamientos_slider.change(
        fn=plot_distribution_muestral,
        inputs=[simulaciones_slider, n_lanzamientos_slider],
        outputs=plot_output
    )

# Para ejecutar la aplicación
if __name__ == "__main__":
    demo.launch()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment