{ "cells": [ { "cell_type": "markdown", "id": "2e3d2be7-3c64-480b-85c3-41b6504ea874", "metadata": { "id": "2e3d2be7-3c64-480b-85c3-41b6504ea874" }, "source": [ "# Práctico 1 - Introducción" ] }, { "cell_type": "markdown", "id": "960c5b25-e7ba-4263-af75-2d289e42d89e", "metadata": { "id": "960c5b25-e7ba-4263-af75-2d289e42d89e" }, "source": [ "## Ejercicio 1\n", "\n", "Considere los siguientes tres indicadores (Promedio, Mediana y Desvío estándar) de la distribución de notas de dos clases paralelas de un curso de Inglés, donde el puntaje máximo es 100.\n", "\n", "- **Clase 1:**\n", " - Promedio: 72\n", " - Mediana: 73\n", " - Desvío estándar: 6\n", "\n", "- **Clase 2:**\n", " - Promedio: 78\n", " - Mediana: 65\n", " - Desvío estándar: 16\n", " \n", "Se pide:\n", "\n", "1. Bosquejar el histograma (o la densidad) de la distribución de notas de cada clase.\n", "2. ¿En cuál de las dos clases es más probable encontrar un estudiante con nota alta?\n", "\n", "Lo haremos paso a paso en las siguientes partes." ] }, { "cell_type": "markdown", "id": "cb2ee1fd-2ff7-4891-8a02-c274c02471fb", "metadata": { "id": "cb2ee1fd-2ff7-4891-8a02-c274c02471fb" }, "source": [ "### 1. Generar una muestra para la Clase 1" ] }, { "cell_type": "code", "execution_count": null, "id": "861a339c-a882-4101-a5f6-4467ae60ca1a", "metadata": { "id": "861a339c-a882-4101-a5f6-4467ae60ca1a" }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "3a80a18c-c6f8-448d-8719-a93d4763f39c", "metadata": { "id": "3a80a18c-c6f8-448d-8719-a93d4763f39c" }, "source": [ "**Parte 1**\n", "\n", "Hacer una función `generate_sample(mean, std_dev, n)` que genere una muestra de `n` elementos simulando una distribución gaussiana con media `mean` y desvío estándar `std_dev`." ] }, { "cell_type": "code", "execution_count": 1, "id": "ae205ae0-6915-429f-a891-fd3ec8975250", "metadata": { "id": "ae205ae0-6915-429f-a891-fd3ec8975250" }, "outputs": [], "source": [ "def generate_sample(mean, std_dev, n)\n", " ###### COMPLETAR FUNCIÓN ######\n", " return sample" ] }, { "cell_type": "markdown", "id": "b6e53b45-36d0-4084-9577-5eaf6d026d2a", "metadata": { "id": "b6e53b45-36d0-4084-9577-5eaf6d026d2a" }, "source": [ "**Parte 2**\n", "\n", "Realizar una muestra con `n=100` y verificar que los indicadores sean cercanos a los dados en el enunciado." ] }, { "cell_type": "code", "execution_count": null, "id": "cfdcfd37-bcd8-43b6-b232-a19cb96c6e7e", "metadata": { "id": "cfdcfd37-bcd8-43b6-b232-a19cb96c6e7e" }, "outputs": [], "source": [ "# Datos para la Clase 1\n", "mean_clase1 = 72\n", "median_clase1 = 73 # Nota: En una distribución normal, la media y la mediana son iguales.\n", "std_dev_clase1 = 6\n", "n = 100\n", "\n", "# Generar la muestra\n", "sample_clase1 = generate_sample(mean_clase1, std_dev_clase1, n)" ] }, { "cell_type": "code", "execution_count": null, "id": "fe41183c-2e06-4681-b566-0715b786c069", "metadata": { "id": "fe41183c-2e06-4681-b566-0715b786c069" }, "outputs": [], "source": [ "# Verificar las estadísticas\n", "print(f\"Media de la muestra: {np.mean(sample_clase1):.2f}\")\n", "print(f\"Mediana de la muestra: {np.median(sample_clase1):.2f}\")\n", "print(f\"Desvío estándar de la muestra: {np.std(sample_clase1):.2f}\")" ] }, { "cell_type": "markdown", "id": "0e55a425-3577-4dc8-a2ed-268f34df05bd", "metadata": { "id": "0e55a425-3577-4dc8-a2ed-268f34df05bd" }, "source": [ "**Parte 3**\n", "\n", "Calcular la proporción de estudiantes con nota mayor o igual a 90." ] }, { "cell_type": "code", "execution_count": null, "id": "6c5a97da-2836-4b3d-a01d-50af1d786e52", "metadata": { "id": "6c5a97da-2836-4b3d-a01d-50af1d786e52" }, "outputs": [], "source": [ "# Calcular la proporción de elementos mayores o iguales a 90\n", "#above_90_clase1 = COMPLETAR!\n", "\n", "print(f\"Proporción de estudiantes con notas >= 90: {above_90_clase1:.2%}\")" ] }, { "cell_type": "markdown", "id": "c7eb31bc-5ae3-4a6d-9a1a-0b5926c2ddf8", "metadata": { "id": "c7eb31bc-5ae3-4a6d-9a1a-0b5926c2ddf8" }, "source": [ "**Parte 4**\n", "\n", "Hacer un histograma para la muestra obtenida en la parte 2." ] }, { "cell_type": "code", "execution_count": null, "id": "09a7f29e-e019-4c36-a9ae-4412351011fd", "metadata": { "id": "09a7f29e-e019-4c36-a9ae-4412351011fd" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "71d26bc2-bd7a-4064-9f51-a5567d6eb517", "metadata": { "id": "71d26bc2-bd7a-4064-9f51-a5567d6eb517" }, "source": [ "**Parte 5**\n", "\n", "Normalizar el histograma para que tenga área 1 y agregarle el gráfico de la densidad normal con los parámetros indicados en el enunciado." ] }, { "cell_type": "code", "execution_count": null, "id": "8d903567-eac9-4548-b467-327e415fd916", "metadata": { "id": "8d903567-eac9-4548-b467-327e415fd916" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "f9ead8fe-a3ab-459a-940a-40058a941838", "metadata": { "id": "f9ead8fe-a3ab-459a-940a-40058a941838" }, "source": [ "### 2. Generar una muestra para la Clase 2" ] }, { "cell_type": "markdown", "id": "791483fa-1e1f-4617-b341-b07d6d127db2", "metadata": { "id": "791483fa-1e1f-4617-b341-b07d6d127db2" }, "source": [ "**Parte 1**\n", "\n", "Hacer una función `generate_mixture(n, mean1, std_dev1, mean2, std_dev2, p)` que genere una muestra de `n` elementos simulando una mezcla de Gaussianas con medias `mean1` y `mean2`, desvíos `std_dev1` y `std_dev2`, y que la probabilidad de escoger la primera Gaussiana sea `p`." ] }, { "cell_type": "code", "execution_count": null, "id": "31ac4fca-8208-4c10-99bf-6ea4be1ed88c", "metadata": { "id": "31ac4fca-8208-4c10-99bf-6ea4be1ed88c" }, "outputs": [], "source": [ "import numpy as np\n", "\n", "def generate_mixture(n, mean1, std_dev1, mean2, std_dev2, p):\n", " \"\"\"\n", " Genera una muestra de tamaño n a partir de una mezcla de dos Gaussianas.\n", "\n", " Parámetros:\n", " - n: Tamaño de la muestra\n", " - mean1, std_dev1: Media y desvío estándar de la primera Gaussiana\n", " - mean2, std_dev2: Media y desvío estándar de la segunda Gaussiana\n", " - p: Probabilidad de escoger la primera Gaussiana\n", "\n", " Devuelve:\n", " - samples: Muestra generada\n", " \"\"\"\n", "\n", " ###### COMPLETAR FUNCIÓN ######\n", "\n", " return samples" ] }, { "cell_type": "markdown", "id": "aca006b8-1451-47ef-a8e7-c6c0ab030889", "metadata": { "id": "aca006b8-1451-47ef-a8e7-c6c0ab030889" }, "source": [ "**Parte 2**\n", "\n", "Realizar una muestra con `n=100` y cuyos indicadores sean cercanos a los dados en el enunciado." ] }, { "cell_type": "code", "source": [ "#sample_clase2=COMPLETAR!" ], "metadata": { "id": "IkKU6uOlLksF" }, "id": "IkKU6uOlLksF", "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "id": "a4574d45-c977-4616-a714-15e18ff4c46c", "metadata": { "id": "a4574d45-c977-4616-a714-15e18ff4c46c" }, "outputs": [], "source": [ "# Verificar las estadísticas\n", "print(f\"Media de la muestra: {np.mean(sample_clase2):.2f}\")\n", "print(f\"Mediana de la muestra: {np.median(sample_clase2):.2f}\")\n", "print(f\"Desvío estándar de la muestra: {np.std(sample_clase2):.2f}\")" ] }, { "cell_type": "markdown", "id": "e9934567-2caf-44ee-aeef-03d3fe4cd4c5", "metadata": { "id": "e9934567-2caf-44ee-aeef-03d3fe4cd4c5" }, "source": [ "**Parte 3**\n", "\n", "Calcular la proporción de estudiantes con nota mayor o igual a 90." ] }, { "cell_type": "code", "execution_count": null, "id": "6e2b5832-b9fe-4a8e-bd9c-4be746f0daa3", "metadata": { "id": "6e2b5832-b9fe-4a8e-bd9c-4be746f0daa3" }, "outputs": [], "source": [ "# Calcular la proporción de elementos mayores o iguales a 90\n", "#above_90_clase2 = COMPLETAR!\n", "\n", "print(f\"Proporción de estudiantes con notas >= 90: {above_90_clase2:.2%}\")" ] }, { "cell_type": "markdown", "id": "2bb9281a-c8b4-4d85-bb06-e999ea9055a8", "metadata": { "id": "2bb9281a-c8b4-4d85-bb06-e999ea9055a8" }, "source": [ "**Parte 4**\n", "\n", "Hacer un histograma para la muestra obtenida en la parte 2." ] }, { "cell_type": "code", "execution_count": null, "id": "9d2ed0f7-4b6b-4459-bd4d-0836ea919280", "metadata": { "id": "9d2ed0f7-4b6b-4459-bd4d-0836ea919280" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "29623fcc-1021-47de-9c14-a0ee044d54bc", "metadata": { "id": "29623fcc-1021-47de-9c14-a0ee044d54bc" }, "source": [ "**Parte 5**\n", "\n", "Hacer una función `density_mixture(x, mean1, std_dev1, mean2, std_dev2, p)` que calcule en `x` la densidad una mezcla de Gaussianas con medias `mean1` y `mean2`, desvíos `std_dev1` y `std_dev2`, y que la probabilidad de escoger la primera Gaussiana sea `p`." ] }, { "cell_type": "code", "execution_count": null, "id": "4efa3a45-b4a0-4322-a1dc-7d14bb094229", "metadata": { "id": "4efa3a45-b4a0-4322-a1dc-7d14bb094229" }, "outputs": [], "source": [ "def density_mixture(x, mean1, std_dev1, mean2, std_dev2, p):\n", " \"\"\"Calcula la densidad de probabilidad de la mezcla en los puntos x\"\"\"\n", " ###### COMPLETAR FUNCIÓN ######\n", " return densidad" ] }, { "cell_type": "markdown", "id": "0db1d381-2c5e-4b68-a9ff-94747575910c", "metadata": { "id": "0db1d381-2c5e-4b68-a9ff-94747575910c" }, "source": [ "**Parte 6**\n", "\n", "Normalizar el histograma para que tenga área 1 y agregarle el gráfico de la densidad definida en la parte 5 con los mismos parámetros elegidos en la parte 2." ] }, { "cell_type": "code", "execution_count": null, "id": "ef5b9fae-3cdc-4600-af7e-c8938b327b0f", "metadata": { "id": "ef5b9fae-3cdc-4600-af7e-c8938b327b0f" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5afde25b-f483-46ac-bc80-b2fbf55488d2", "metadata": { "id": "5afde25b-f483-46ac-bc80-b2fbf55488d2" }, "source": [ "## Ejercicio 2" ] }, { "cell_type": "markdown", "id": "058a7053-c680-49bd-8ce7-07143fe76925", "metadata": { "id": "058a7053-c680-49bd-8ce7-07143fe76925" }, "source": [ "El objetivo de este ejercicio es calcular los estimadores de máxima verosimilitud para las densidades definidas en las partes anteriores a partir de las muestras generadas." ] }, { "cell_type": "markdown", "id": "359fda9c-4202-4ac3-a4ce-9fbd644d5ced", "metadata": { "id": "359fda9c-4202-4ac3-a4ce-9fbd644d5ced" }, "source": [ "### 1. Máxima verosimilitud para una Gaussiana" ] }, { "cell_type": "markdown", "id": "e4b4442f-6315-49b5-87b4-613052761d78", "metadata": { "id": "e4b4442f-6315-49b5-87b4-613052761d78" }, "source": [ "**Parte 1**\n", "\n", "Definir una función `neg_log_likelihood(params, samples)` que calcule el negativo del logaritmo de la función de verosimilitud para una Gaussiana.\n", "\n", "Recordar que la función de verosimilitud $L$ para una Gaussiana:\n", "$$\n", "L(\\mu, \\sigma^2 | X) = \\prod_{i=1}^n \\frac{1}{\\sqrt{2\\pi\\sigma^2}} e^{-\\frac{(x_i-\\mu)^2}{2\\sigma^2}}\n", "$$\n", "\n", "Tomar el logaritmo nos da:\n", "$$\n", "\\ln(L) = -\\frac{n}{2} \\ln(2\\pi\\sigma^2) - \\frac{1}{2\\sigma^2} \\sum_{i=1}^n (x_i-\\mu)^2\n", "$$" ] }, { "cell_type": "code", "execution_count": null, "id": "ab92b38c-5f95-42ee-991e-5fa1f45c651f", "metadata": { "id": "ab92b38c-5f95-42ee-991e-5fa1f45c651f" }, "outputs": [], "source": [ "def neg_log_likelihood(params, samples):\n", " \"\"\"\n", " Calcula el negativo del logaritmo de la función de verosimilitud para una Gaussiana.\n", "\n", " Parámetros:\n", " - params: Una lista o arreglo con los parámetros [mu, sigma]\n", " - samples: Una lista o arreglo con la muestra\n", "\n", " Devuelve:\n", " - Negativo del logaritmo de la función de verosimilitud\n", " \"\"\"\n", " ###### COMPLETAR FUNCIÓN ######\n", "\n", " return -log_likelihood # Regresamos el negativo" ] }, { "cell_type": "markdown", "id": "79c8c8cd-c0e9-4d84-9701-05fd49dc4263", "metadata": { "id": "79c8c8cd-c0e9-4d84-9701-05fd49dc4263" }, "source": [ "**Parte 2**\n", "\n", "Usar un optimizador para encontrar los parámetros que minimizan esta función para la muestra de la Clase 1.\n", "\n", "Para este propósito, podemos utilizar la biblioteca `scipy` y su módulo `optimize`." ] }, { "cell_type": "code", "execution_count": null, "id": "e016bba4-eb29-4127-ba3f-8bbf6993d256", "metadata": { "id": "e016bba4-eb29-4127-ba3f-8bbf6993d256" }, "outputs": [], "source": [ "from scipy.optimize import minimize" ] }, { "cell_type": "code", "execution_count": null, "id": "c753a285-5c03-4524-8df4-56b71dd6a810", "metadata": { "id": "c753a285-5c03-4524-8df4-56b71dd6a810" }, "outputs": [], "source": [ "# Valores iniciales para la optimización\n", "initial_guess = [10, 1]\n", "\n", "# Optimización. Sugerencia: utilizar method='Nelder-Mead'\n", "#result = COMPLETAR!\n", "\n", "mu_mle, sigma_mle = result.x\n", "print(f\"Estimador MLE para la media: {mu_mle}\")\n", "print(f\"Estimador MLE para sigma: {sigma_mle}\")" ] }, { "cell_type": "markdown", "id": "25fa14a9-26e6-4e6b-8953-11969ec3d103", "metadata": { "id": "25fa14a9-26e6-4e6b-8953-11969ec3d103" }, "source": [ "### 2. Máxima verosimilitud para una mezcla de Gaussianas" ] }, { "cell_type": "markdown", "id": "4507ff3f-62c2-4ea7-8396-58d15c1af9c0", "metadata": { "id": "4507ff3f-62c2-4ea7-8396-58d15c1af9c0" }, "source": [ "Para una mezcla de dos gaussianas, la densidad es:\n", "\n", "$$\n", "p(x | \\mu_1, \\mu_2, \\sigma_1^2, \\sigma_2^2, \\pi) = \\pi \\cdot f_1(x) + (1 - \\pi) \\cdot f_2(x)\n", "$$\n", "\n", "donde $f_i$ es la densidad de una gaussiana con media $\\mu_i$ y varianza $\\sigma_i^2$, y $\\pi$ es la proporción de la primera gaussiana en la mezcla.\n", "\n", "El logaritmo de la función de verosimilitud es entonces:\n", "\n", "$$\n", "\\ln(L) = \\sum_{i=1}^n \\ln(\\pi \\cdot f_1(x_i) + (1 - \\pi) \\cdot f_2(x_i))\n", "$$" ] }, { "cell_type": "markdown", "id": "59aa09f6-84b4-46bc-bed0-a5b9bb60919c", "metadata": { "id": "59aa09f6-84b4-46bc-bed0-a5b9bb60919c" }, "source": [ "**Parte 1**\n", "\n", "Definir una función `neg_log_likelihood_mix(params, samples)` que calcule el negativo del logaritmo de la función de verosimilitud para una mezcla de Gaussianas." ] }, { "cell_type": "code", "execution_count": null, "id": "d775e6f9-a038-4daf-915a-344904acb0d3", "metadata": { "id": "d775e6f9-a038-4daf-915a-344904acb0d3" }, "outputs": [], "source": [ "def neg_log_likelihood_mix(params, samples):\n", " \"\"\"\n", " Calcula el negativo del logaritmo de la función de verosimilitud para una mezcla de dos gaussianas.\n", "\n", " Parámetros:\n", " - params: Una lista o arreglo con los parámetros [mu1, mu2, sigma1, sigma2, pi]\n", " - samples: Una lista o arreglo con la muestra\n", "\n", " Devuelve:\n", " - -log_likelihood: Negativo del logaritmo de la función de verosimilitud\n", " \"\"\"\n", " ##### COMPLETAR FUNCIÓN #####\n", "\n", " return -log_likelihood # Regresamos el negativo" ] }, { "cell_type": "markdown", "id": "1bc6283a-a7be-44af-98b0-861d6bdd5562", "metadata": { "id": "1bc6283a-a7be-44af-98b0-861d6bdd5562" }, "source": [ "**Parte 2**\n", "\n", "Usar un optimizador para encontrar los parámetros que minimizan esta función para la muestra de la Clase 2.\n", "\n", "*Nota: es probable que encuentre cierta sensibilidad a la elección de initial_guess*" ] }, { "cell_type": "code", "execution_count": null, "id": "bb5c82c6-7cb0-476f-b683-07732c2472b2", "metadata": { "id": "bb5c82c6-7cb0-476f-b683-07732c2472b2" }, "outputs": [], "source": [ "# Valores iniciales para la optimización\n", "initial_guess = [60, 80, 2, 2, 0.4]\n", "\n", "# Bordes para asegurarnos de que los parámetros permanezcan en rangos razonables\n", "bounds = [(None, None), (None, None), (1e-2, None), (1e-2, None), (0, 1)]\n", "\n", "# Optimización. Sugerencia: utilizar method='Nelder-Mead'\n", "#result = COMPLETAR!" ] }, { "cell_type": "code", "execution_count": null, "id": "22be1caa-c59c-43ec-9bd4-ddea87d30cdf", "metadata": { "id": "22be1caa-c59c-43ec-9bd4-ddea87d30cdf" }, "outputs": [], "source": [ "mu1_mle, mu2_mle, sigma1_mle, sigma2_mle, pi_mle = result.x\n", "print(f\"Estimador MLE para mu1: {mu1_mle}\")\n", "print(f\"Estimador MLE para mu2: {mu2_mle}\")\n", "print(f\"Estimador MLE para sigma1: {sigma1_mle}\")\n", "print(f\"Estimador MLE para sigma2: {sigma2_mle}\")\n", "print(f\"Estimador MLE para pi: {pi_mle}\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.15" }, "colab": { "provenance": [] } }, "nbformat": 4, "nbformat_minor": 5 }