diff --git a/lab-intro-probability.ipynb b/lab-intro-probability.ipynb index 5893fc1..8071b2a 100644 --- a/lab-intro-probability.ipynb +++ b/lab-intro-probability.ipynb @@ -36,13 +36,66 @@ "If the Ironhack Airlines routinely sells 460 tickets, what is the chance that they have a seats for all passenger?" ] }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "#code here\n", + "\n", + "from scipy.stats import binom\n", + "from scipy.stats import poisson\n", + "from scipy.stats import expon\n", + "from scipy.stats import norm" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "#code here" + "### Ensayos Independientes: En el modelo, cada pasajero representa un ensayo independiente. \n", + "# La decisión de un pasajero de presentarse al vuelo no afecta la decisión de otro.\n", + "\n", + "### Dos Resultados Posibles: Cada pasajero tiene dos posibles resultados: presentarse o no \n", + "# presentarse al vuelo. Esto se alinea perfectamente con los ensayos Bernoulli, que son la \n", + "# base de las distribuciones binomiales.\n", + "\n", + "### Probabilidad Constante: En la situación dada, la probabilidad de un pasajero específico \n", + "# de presentarse al vuelo es constante al 97% (0.97) para todos los pasajeros. \n", + "# Esto es crucial para usar la distribución binomial, que requiere que cada ensayo tenga la \n", + "# misma probabilidad de éxito.\n", + "\n", + "### Número Fijo de Ensayos: El número total de pasajeros (ensayos) es conocido y fijo, en \n", + "# este caso, 460 tickets vendidos.\n", + "\n", + "# Por ello, la mejor distribución a usar es la binomial de Bernoulli." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Probability of having a seat for all passengers: 0.8845\n" + ] + } + ], + "source": [ + "# Parámetros para la distribución binomial\n", + "n = 460 # Número de muestras (tickets vendidos)\n", + "p = 0.97 # Probabilidad de que cada pasajero se presente\n", + "\n", + "# Probabilidad de que se presenten 450 pasajeros.\n", + "probability = binom.cdf(450, n, p)\n", + "\n", + "print(f\"Probability of having a seat for all passengers: {probability:.4f}\")" ] }, { @@ -72,11 +125,57 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "#code here" + "#code here\n", + "\n", + "### Éxito/Fracaso en Ensayos: En este escenario, cada intento de resolver la queja del cliente\n", + "# es un ensayo independiente con dos posibles resultados: éxito (resolución de la queja) o fracaso\n", + "# (la queja no se resuelve en ese intento).\n", + "\n", + "### Independencia de Ensayos: Cada intento de resolver la queja no depende del resultado de los \n", + "# intentos previos. Esto es esencial para aplicar la distribución geométrica, que asume que los \n", + "# ensayos son independientes entre sí.\n", + "\n", + "### Probabilidad Constante de Éxito: La probabilidad de resolver una queja en cualquier intento \n", + "# individual es constante en 0.3. Las distribuciones geométricas requieren que esta probabilidad \n", + "# de éxito ( p ) sea la misma en cada ensayo.\n", + "\n", + "### Contar Ensayos hasta el Primer Éxito: La pregunta se refiere explícitamente al número de intentos\n", + "# requeridos hasta que ocurra el primer éxito. Este es el escenario prototípico que maneja la \n", + "# distribución geométrica, donde estamos interesados en contar cuántos intentos son necesarios \n", + "# hasta lograr el primer éxito.\n", + "\n", + "# Por ello, la mejor distribución a usar es la geométrica." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that the representative needs at least three attempts is: 0.4900\n" + ] + } + ], + "source": [ + "# Probabilidad de éxito en el primer intento:\n", + "p_success = 0.3\n", + "\n", + "# Calcular probabilidades para el primer y segundo intento:\n", + "p_first_attempt = p_success\n", + "p_second_attempt = (1 - p_success) * p_success\n", + "\n", + "# Probabilidad de necesitar al menos tres intentos:\n", + "p_at_least_three = 1 - (p_first_attempt + p_second_attempt)\n", + "\n", + "print(f\"The probability that the representative needs at least three attempts is: {p_at_least_three:.4f}\")" ] }, { @@ -107,11 +206,55 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "#code here" + "### Eventos Independientes: Los eventos (visitas al sitio web) ocurren de manera independiente. \n", + "# La visita de un usuario no depende de la visita de otro, lo que es una suposición clave para \n", + "# el modelo de Poisson.\n", + "\n", + "### Frecuencia de Eventos en un Intervalo Fijo: La distribución de Poisson se utiliza para modelar \n", + "# el número de eventos en un intervalo de tiempo o espacio fijo. En este caso, nos interesa el \n", + "# número de visitas a una página web en una hora determinada.\n", + "\n", + "### Tasa de Evento Constante: La tasa promedio de visitas es constante en el tiempo; es decir, \n", + "# esperamos aproximadamente 500 visitas por hora. Esta tasa constante es una característica \n", + "# definitoria de los procesos de Poisson.\n", + "\n", + "### Número Teórico Ilimitado de Eventos: La distribución de Poisson se adecua bien para casos \n", + "# donde, aunque no necesariamente ocurran, es teóricamente posible un número grande de eventos. \n", + "# Aquí el número de visitas puede, en teoría, ser cualquier número entero no negativo.\n", + "\n", + "# Por ello, la mejor distribución a usar es la de Poisson." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability of the server being overwhelmed is: 0.0129\n" + ] + } + ], + "source": [ + "#code here\n", + "\n", + "# Average number of visits per hour\n", + "lambda_visits = 500\n", + "\n", + "# Server's capacity\n", + "capacity = 550\n", + "\n", + "# Calculate the probability that the number of visits is greater than the server's capacity\n", + "probability_overwhelmed = 1 - poisson.cdf(capacity, lambda_visits)\n", + "\n", + "print(f\"The probability of the server being overwhelmed is: {probability_overwhelmed:.4f}\")" ] }, { @@ -123,11 +266,24 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability of being overwhelmed at least once during the day is: 0.2677\n" + ] + } + ], "source": [ - "#code here" + "#code here\n", + "\n", + "# Calculate for 24 hours\n", + "p_overwhelmed_24_hours = 1 - ((1 - probability_overwhelmed) ** 24)\n", + "\n", + "print(f\"The probability of being overwhelmed at least once during the day is: {p_overwhelmed_24_hours:.4f}\")" ] }, { @@ -160,7 +316,49 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "### Modelo de Tiempo entre Eventos en Procesos de Poisson: La distribución exponencial es \n", + "# utilizada para modelar el tiempo entre eventos en un proceso de Poisson. Si los eventos \n", + "# (en este caso, llegadas de clientes) ocurren de manera independiente y a una tasa promedio \n", + "# constante, entonces el tiempo entre estos eventos está bien modelado por una distribución exponencial.\n", + "\n", + "### Eventos Independientes: En nuestro escenario, las llegadas de los clientes son independientes\n", + "# entre sí, lo que significa que la llegada de un cliente no afecta la llegada del siguiente. \n", + "# Esta independencia es una característica clave para aplicar la distribución exponencial.\n", + "\n", + "### Tasa Constante: Tenemos una tasa de llegadas constante, es decir, un cliente llega cada \n", + "# 10 minutos, en promedio. La constancia de esta tasa es otra característica clave que hace \n", + "# a esta situación adecuada para un modelo exponencial.\n", + "\n", + "### Interés en Tiempo Continuo: La distribución exponencial se utiliza cuando estamos interesados\n", + "# en el tiempo continuo entre la ocurrencia de eventos, en lugar de un conteo discreto de eventos\n", + "# en un intervalo de tiempo (que sería modelado con una distribución de Poisson).\n", + "\n", + "# Por ello, la mejor distribución a usar es la exponencial." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that the next customer will arrive within the next 5 minutes is: 0.3935\n" + ] + } + ], + "source": [ + "# Rate of customer arrival per minute\n", + "lambda_rate = 1 / 10\n", + "\n", + "# Calculate the probability of a customer arriving within 5 minutes\n", + "probability_within_5 = expon.cdf(5, scale=1/lambda_rate)\n", + "\n", + "print(f\"The probability that the next customer will arrive within the next 5 minutes is: {probability_within_5:.4f}\")" + ] }, { "cell_type": "markdown", @@ -173,10 +371,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that the employees can take a break is: 0.2231\n" + ] + } + ], + "source": [ + "# Calculate the probability of a customer arriving within 15 minutes\n", + "probability_within_15 = expon.cdf(15, scale=1/lambda_rate)\n", + "probability_break = 1 - probability_within_15\n", + "print(f\"The probability that the employees can take a break is: {probability_break:.4f}\")" + ] }, { "cell_type": "markdown", @@ -196,11 +407,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that a randomly selected bird weighs between 140 and 160 grams is: 0.6827\n" + ] + } + ], "source": [ - "#code here" + "#code here\n", + "\n", + "# Parametros de la distribución normal\n", + "mu = 150 \n", + "sigma = 10 \n", + "\n", + "# Probabilidad para 160 gr y 140 gr\n", + "probability_less_than_160 = norm.cdf(160, loc=mu, scale=sigma)\n", + "probability_less_than_140 = norm.cdf(140, loc=mu, scale=sigma)\n", + "\n", + "# Probabilidad de peso entre esos dos\n", + "probability_between_140_and_160 = probability_less_than_160 - probability_less_than_140\n", + "\n", + "print(f\"The probability that a randomly selected bird weighs between 140 and 160 grams is: {probability_between_140_and_160:.4f}\")\n", + "\n", + "\n" ] }, { @@ -219,11 +453,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that the component fails within the first 30 hours is: 0.4512\n" + ] + } + ], "source": [ - "#code here" + "#code here\n", + "\n", + "# Rate of customer arrival per minute\n", + "lambda_rate = 1 / 50\n", + "\n", + "# Calculate the probability of a customer arriving within 5 minutes\n", + "probability_within_30 = expon.cdf(30, scale=1/lambda_rate)\n", + "\n", + "print(f\"The probability that the component fails within the first 30 hours is: {probability_within_30:.4f}\")" ] } ], @@ -243,7 +493,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.9.1" } }, "nbformat": 4,