{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tres distribuciones y el teorema que lo explica todo\n",
    "\n",
    "Binomial, Poisson y normal, con datos de verdad. Y por qué la campana aparece aunque tus datos no la tengan.\n",
    "\n",
    "Cuaderno de práctica del capítulo 8 de **Estadística desde cero**, de Miss Yera.\n",
    "\n",
    "Corre de arriba abajo. Si lo abres en Google Colab no necesitas instalar nada.\n",
    "\n",
    "Capítulo completo: https://missyera.com/guias/estadistica-desde-cero/distribuciones/\n",
    "\n",
    "Los ejercicios están al final y traen una celda vacía debajo de cada uno. Las\n",
    "respuestas viven en el cuaderno de soluciones, y merece la pena pelearse un\n",
    "rato antes de abrirlo 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Antes de empezar\n",
    "\n",
    "Esta celda baja el ayudante que corrige tus ejercicios. Después, en cada\n",
    "ejercicio que se pueda corregir solo, vas a ver `%%revisa` arriba de la celda:\n",
    "escribe tu respuesta debajo, ejecuta, y te digo si te salió 💛"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import urllib.request\n",
    "\n",
    "# El ayudante de los cuadernos. Trae la corrección de los ejercicios y, en los\n",
    "# capítulos de consola, la celda mágica que ejecuta los comandos. Se baja en\n",
    "# vez de venir pegado aquí para que siempre sea el último.\n",
    "urllib.request.urlretrieve(\n",
    "    \"https://missyera.com/static/cuadernos/revisa.py\", \"revisa.py\")\n",
    "import revisa\n",
    "revisa.carga({\n",
    "    1: \"dW4gY29tZXJjaWFsLCB1biBtZXM6ICAgICAgIDAuMDMzMzM0CmVsIG1pc21vLCBkb3MgbWVzZXM6ICAgICAgICAwLjAwMTExMQphbGd1bm8gZGUgMzAsIGVuIHVuIG1lczogICAgMC42MzgzNDc=\",\n",
    "    2: \"Qm9kZWdhICAgICAgbWVkaWEgMS44NTU2IHwgdmFyaWFuemEgMS4wNjA3IHwgcmF6b24gMC41NzIKSG9yZWNhICAgICAgbWVkaWEgMS43OTY2IHwgdmFyaWFuemEgMC44NTE3IHwgcmF6b24gMC40NzQKTWF5b3Jpc3RhICAgbWVkaWEgMS44MzM3IHwgdmFyaWFuemEgMC45MjgyIHwgcmF6b24gMC41MDYKTWluaW1hcmtldCAgbWVkaWEgMS45NjMyIHwgdmFyaWFuemEgMS4yMjk2IHwgcmF6b24gMC42MjY=\",\n",
    "    3: \"cHJvbWVkaW9zIGRlICAgNSAtPiBhc2ltZXRyaWEgLTAuMTEzNCB8IHZhbG9yZXMgZGlzdGludG9zIDYKcHJvbWVkaW9zIGRlICAzMCAtPiBhc2ltZXRyaWEgLTAuMDg5OSB8IHZhbG9yZXMgZGlzdGludG9zIDE4CnByb21lZGlvcyBkZSAxMDAgLT4gYXNpbWV0cmlhIC0wLjAwNzkgfCB2YWxvcmVzIGRpc3RpbnRvcyAzNApwcm9tZWRpb3MgZGUgNTAwIC0+IGFzaW1ldHJpYSAtMC4wMDc0IHwgdmFsb3JlcyBkaXN0aW50b3MgNzA=\",\n",
    "    4: \"cGFyYSB1biBlcnJvciBlc3RhbmRhciBkZSAxMDAgc29sZXMgaGFjZW4gZmFsdGEgICAgICAgNTcgdmVudGFzCnBhcmEgdW4gZXJyb3IgZXN0YW5kYXIgZGUgIDUwIHNvbGVzIGhhY2VuIGZhbHRhICAgICAgMjI2IHZlbnRhcwpwYXJhIHVuIGVycm9yIGVzdGFuZGFyIGRlICAyNSBzb2xlcyBoYWNlbiBmYWx0YSAgICAgIDkwNSB2ZW50YXMKcGFyYSB1biBlcnJvciBlc3RhbmRhciBkZSAgMTAgc29sZXMgaGFjZW4gZmFsdGEgICAgIDU2NTUgdmVudGFz\",\n",
    "    5: \"dG90YWwgbWVuc3VhbCBzaW11bGFkbzogbWVkaWEgMTM0NjczIHwgZGVzdmlhY2lvbiAxNDQzMwplbCA5MCUgZGUgbG9zIG1lc2VzIGNhZSBlbnRyZSAxMTE1OTggeSAxNTg4ODI=\",\n",
    "    6: \"dGFzYTogMC4wMDcwMCAtPiBlc3BlcmFkYXMgMjEuMApkZXN2aWFjaW9uIGRlIHVuYSBQb2lzc29uOiA0LjU4CgpyYW5nbyB0aXBpY286IGRlIDEyIGEgMzAKUCh2ZXIgNDAgbyBtYXMpID0gMC4wMDAxNDQ=\",\n",
    "    7: \"cHJvbWVkaWFuZG8gIDEgcGVkaWRvczogZGVzdmlhY2lvbiBkZSBsYXMgbWVkaWFzICA3MzMuNzMKcHJvbWVkaWFuZG8gIDIgcGVkaWRvczogZGVzdmlhY2lvbiBkZSBsYXMgbWVkaWFzICA1MjUuNzIKcHJvbWVkaWFuZG8gIDUgcGVkaWRvczogZGVzdmlhY2lvbiBkZSBsYXMgbWVkaWFzICAzMzkuMzAKcHJvbWVkaWFuZG8gMzAgcGVkaWRvczogZGVzdmlhY2lvbiBkZSBsYXMgbWVkaWFzICAxMzUuNzIKCmxhIGRlc3ZpYWNpb24gZGUgdW4gcGVkaWRvIHN1ZWx0byBlcyA3NTEuOTk=\",\n",
    "    8: \"cGVkaWRvcyBwb3IgbWVzOgpmZWNoYQoxICAgICAzMzkKMiAgICAgMzA2CjMgICAgIDM1OQo0ICAgICAzMjMKNSAgICAgMzY1CjYgICAgIDI5Mgo3ICAgICAxNjQKOCAgICAgMTU2CjkgICAgIDE3OQoxMCAgICAxODEKMTEgICAgMTc3CjEyICAgIDE1OQoKbWVkaWEgMjUwLjAsIHZhcmlhbnphIDc1MzYuNA==\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Una distribución es **una forma que se repite**. Y lo bonito es\n",
    "que en la práctica casi todo se parece a una de tres 🎴\n",
    "\n",
    "No te voy a hacer memorizar fórmulas. Vamos a ver cuál encaja con qué parte\n",
    "de estas ventas, y por qué."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from scipy import stats\n",
    "\n",
    "URL = 'https://missyera.com/static/datasets/ventas-miss-yera.csv'\n",
    "\n",
    "\n",
    "def carga_limpia(url):\n",
    "    \"\"\"La misma del capítulo 2.\"\"\"\n",
    "    v = pd.read_csv(url).drop_duplicates()\n",
    "    v['ciudad'] = (v['ciudad'].str.strip().str.lower()\n",
    "                   .str.normalize('NFKD')\n",
    "                   .str.encode('ascii', 'ignore').str.decode('utf-8'))\n",
    "    v['monto'] = pd.to_numeric(v['monto'].str.replace(',', '.'))\n",
    "    for col in ['fecha', 'fecha_ultima_compra']:\n",
    "        f = pd.to_datetime(v[col], format='%Y-%m-%d', errors='coerce')\n",
    "        falta = f.isna() & v[col].notna()\n",
    "        f[falta] = pd.to_datetime(v.loc[falta, col], format='%d/%m/%Y',\n",
    "                                  errors='coerce')\n",
    "        v[col] = f\n",
    "    return v\n",
    "\n",
    "\n",
    "v = carga_limpia(URL)\n",
    "print('filas:', len(v))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Antes de arrancar, una pregunta: **¿alguien te ha dicho alguna vez que uses la normal porque \"todo tiende a la normal\"?** Esa frase está a medias, y la mitad que falta es la que importa 🔔"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La binomial: contar éxitos en intentos fijos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La pregunta que contesta: *\"de 20 visitas comerciales, ¿cuántas van a\n",
    "cerrar?\"*. Hay un número fijo de intentos y cada uno sale bien o mal."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "P(X=k)=(nk)pk(1−p)n−k\n",
    "\n",
    "la probabilidad de k éxitos en n intentos, contando de cuántas formas pueden repartirse esos k entre los n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = v['compro'].mean()\n",
    "n = 20\n",
    "\n",
    "print('probabilidad de cierre: %.4f' % p)\n",
    "print()\n",
    "for k in [8, 10, 12, 14, 16]:\n",
    "    print('P(cerrar exactamente %2d de 20) = %.4f' % (k, stats.binom.pmf(k, n, p)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lo más probable es cerrar 12, y aun así solo pasa el 17,61% de las veces.\n",
    "Fíjate en eso, que es lo que la gente no espera: **ni siquiera el\n",
    "resultado más probable es probable** 🎲\n",
    "\n",
    "Y esto ya sirve para algo práctico. Un comercial cierra 16 de 20 y todo el\n",
    "mundo aplaude. ¿Es mérito o es suerte?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('media esperada:  %.2f cierres' % (n * p))\n",
    "print('desviacion:      %.4f' % np.sqrt(n * p * (1 - p)))\n",
    "print()\n",
    "print('P(cerrar 16 o mas de 20) = %.6f' % (1 - stats.binom.cdf(15, n, p)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un 3,33%. O sea que cerrar 16 de 20 pasa una de cada treinta veces\n",
    "**solo por azar**, sin que el comercial haga nada especial 😬\n",
    "\n",
    "Si tienes treinta comerciales, cada mes va a haber uno que lo consiga. Y si\n",
    "lo premias, estás premiando una moneda.\n",
    "\n",
    "Ese cálculo, \"qué probabilidad hay de ver algo así de bueno por pura suerte\",\n",
    "es exactamente un valor p. Lo formalizamos en el capítulo 12, pero ya lo acabas\n",
    "de hacer 😎"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Poisson: contar sucesos en un periodo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La pregunta cambia: ya no hay 20 intentos. *\"¿Cuántas ventas voy a tener\n",
    "mañana?\"*. Puede ser cualquier número."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "P(X=k)=λke−λk!\n",
    "\n",
    "la probabilidad de ver k sucesos en un periodo donde en promedio se ven lambda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "por_dia = v.groupby(v['fecha'].dt.date).size()\n",
    "\n",
    "print('dias con actividad: %d' % len(por_dia))\n",
    "print('media:    %.4f ventas por dia' % por_dia.mean())\n",
    "print('varianza: %.4f' % por_dia.var())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Media 5,5866 y varianza 5,4146. Prácticamente iguales 👀\n",
    "\n",
    "Eso es **la firma de una Poisson**, y es su rareza más útil: es\n",
    "la única distribución común donde la media y la varianza son el mismo número. Si\n",
    "las mides y coinciden, tienes una Poisson delante casi seguro.\n",
    "\n",
    "Vamos a comprobar si de verdad encaja, contando cuántos días hubo con cada\n",
    "cantidad de ventas:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "lam = por_dia.mean()\n",
    "\n",
    "print(' ventas | observados | esperados por Poisson')\n",
    "for k in range(0, 12):\n",
    "    print('   %2d   |    %4d    |   %7.2f'\n",
    "          % (k, (por_dia == k).sum(), len(por_dia) * stats.poisson.pmf(k, lam)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Encaja bastante bien 🎯 Observados y esperados se siguen la pista en todo el\n",
    "rango.\n",
    "\n",
    "Y hay una discrepancia que merece la pena mirar: la Poisson espera unos 2\n",
    "días con **cero** ventas y en los datos hay **cero días con\n",
    "cero ventas**.\n",
    "\n",
    "Eso no es un fallo de la Poisson, es cómo construí la cuenta: agrupé por las\n",
    "fechas *que aparecen en el archivo*, así que un día sin ninguna venta\n",
    "sencillamente no existe en esa lista. Es un sesgo de selección puesto por mí sin\n",
    "darme cuenta, y de esos hay muchos en el capítulo 17 🕳️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La normal y por qué está en todas partes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En el capítulo 5 vimos que el monto **no** es normal: asimetría\n",
    "1,3405, cola larga por la derecha.\n",
    "\n",
    "Y aun así la normal va a aparecer. Mira lo que pasa si en vez de mirar ventas\n",
    "sueltas miro *promedios* de ventas:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generador = np.random.default_rng(7)\n",
    "montos = v['monto'].values\n",
    "\n",
    "print('las ventas sueltas: asimetria %.4f' % v['monto'].skew())\n",
    "print()\n",
    "for n in [2, 5, 30, 100]:\n",
    "    medias = pd.Series([generador.choice(montos, n).mean() for _ in range(2000)])\n",
    "    print('promedios de %3d ventas -> asimetria %+.4f | desviacion %6.2f'\n",
    "          % (n, medias.skew(), medias.std()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mira la columna de la asimetría bajando: **1,3405, luego 1,0091, 0,6173,\n",
    "0,3223 y 0,0518** 😍\n",
    "\n",
    "Eso es el **teorema central del límite**, y es probablemente el\n",
    "resultado más importante de toda la estadística. Dice que:\n",
    "\n",
    "**los promedios se vuelven acampanados aunque los datos de los que\n",
    "salen no lo sean.**\n",
    "\n",
    "Por eso la normal está en todas partes: casi nunca trabajamos con datos\n",
    "sueltos, trabajamos con promedios, proporciones y totales. Y todos esos se\n",
    "comportan como una campana aunque el material de origen sea un desastre.\n",
    "\n",
    "Fíjate también en la otra columna, la de la desviación, que baja de 531 a 76.\n",
    "No baja de cualquier manera:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for n in [2, 5, 30, 100]:\n",
    "    print('n=%3d -> formula: %.2f' % (n, v['monto'].std() / np.sqrt(n)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "531,74 contra 531,09. 137,29 contra 138,92. Clavado 🎯\n",
    "\n",
    "Esa fórmula, **desviación dividida entre la raíz de n**, se\n",
    "llama **error estándar** y es la pieza central de todo lo que\n",
    "viene. Es literalmente la respuesta a \"cuánto se equivoca un promedio\".\n",
    "\n",
    "Y mira lo que dice esa raíz cuadrada: para que tu promedio sea el doble de\n",
    "preciso necesitas **cuatro veces** más datos. Para diez veces más\n",
    "preciso, cien veces más datos. Es la razón por la que las encuestas serias\n",
    "tienen 1.000 personas y no 100.000: la mejora deja de compensar 💸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ¿Y el famoso \"con 30 basta\"?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Habrás oído que con 30 datos ya vale. Míralo otra vez en la tabla: con 30\n",
    "ventas la asimetría todavía es **0,3223**. No es cero.\n",
    "\n",
    "El \"30\" es una regla de dedo que funciona cuando los datos de partida no\n",
    "están muy torcidos. Con una cola como la del monto hacen falta más. Con 100 ya\n",
    "estamos en 0,0518, que sí es despreciable.\n",
    "\n",
    "La versión honesta de la regla: **cuanto más torcidos los datos, más\n",
    "promedio hace falta**. Y se comprueba en tres líneas, como acabamos de\n",
    "hacer 🙌"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error del capítulo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Quiero una muestra de 5.000 ventas distintas para hacer el experimento más\n",
    "grande:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito.** Se ejecuta dentro de un `try` para que puedas seguir con \"ejecutar todo\" y aun así ver la queja."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    generador.choice(montos, 5000, replace=False)\n",
    "except Exception as e:\n",
    "    print(f'{type(e).__name__}: {e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "ValueError: Cannot take a larger sample than population when replace is False\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Solo hay 3.000 ventas, no puedo sacar 5.000 sin repetir. Justo 👍\n",
    "\n",
    "Lo interesante es que el experimento de arriba **sí** repetía\n",
    "(`replace=True` es lo que hace `choice` por defecto), y eso\n",
    "no es un descuido: es la técnica. Se llama remuestreo, y consiste en tratar tus\n",
    "datos como si fueran la población y sacar muestras con reposición.\n",
    "\n",
    "Y ojo con el pariente silencioso de este error:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('P(cerrar 25 de 20 intentos) =', stats.binom.pmf(25, 20, p))\n",
    "print('media de una binomial con p=1.5:', stats.binom(20, 1.5).mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pedirle 25 éxitos de 20 intentos devuelve 0.0, que es correcto pero se parece\n",
    "mucho a \"es muy improbable\" cuando en realidad es \"eso no puede pasar\". Y una\n",
    "probabilidad de 1,5 devuelve `nan` sin quejarse 😑"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cuál usar, en una tabla"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Si cuentas | Distribución | Señal para reconocerla |\n",
    "|---|---|---|\n",
    "| Éxitos en n intentos fijos | Binomial | Hay un máximo posible |\n",
    "| Sucesos en un periodo | Poisson | Media y varianza parecidas |\n",
    "| Promedios, totales, proporciones | Normal | Casi siempre, por el TLC |\n",
    "| Tiempo hasta que pase algo | Exponencial | Muchos cortos, pocos larguísimos |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y dos más, de pedirle a una distribución algo imposible"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito.** Se ejecuta dentro de un `try` para que puedas seguir con \"ejecutar todo\" y aun así ver la queja."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    generador.poisson(-3)\n",
    "except Exception as e:\n",
    "    print(f'{type(e).__name__}: {e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "ValueError: lam < 0 or lam is NaN\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La Poisson cuenta cosas que pasan, y su parámetro es **cuántas pasan en promedio**. Menos tres pedidos por día no existe. Cuando una distribución se queja del parámetro, casi siempre te está diciendo que le pediste algo que el mundo no puede hacer."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito.** Se ejecuta dentro de un `try` para que puedas seguir con \"ejecutar todo\" y aun así ver la queja."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    stats.binom.rvs(10, 1.4, size=5)\n",
    "except Exception as e:\n",
    "    print(f'{type(e).__name__}: {e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "ValueError: Domain error in arguments. The `scale` parameter must be positive for all distributions, and many distributions have restrictions on shape parameters. Please see the `scipy.stats.binom` documentation for details.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lo mismo con la binomial: su segundo parámetro es una probabilidad y 1,4 no lo es. El mensaje es largo y genérico porque scipy usa el mismo para todas sus distribuciones, así que lo útil está al final, en el nombre de la que se quejó 🔍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practica 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. ¿Es raro cerrar 16 de 20 dos meses seguidos?\n",
    "\n",
    "Ya sabemos que cerrar 16 de 20 pasa el 3,33% de las veces.\n",
    "Calcula la probabilidad de que le pase al mismo comercial dos meses seguidos, y\n",
    "la de que le pase a alguno de 30 comerciales en un mes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. ¿Encaja Poisson también por segmento?\n",
    "\n",
    "Comprueba la firma de la Poisson (media parecida a\n",
    "varianza) en las ventas diarias de cada segmento."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. El TLC con la peor columna posible\n",
    "\n",
    "Aplica el mismo experimento a algo mucho más torcido que el\n",
    "monto: la columna `compro`, que solo tiene ceros y unos. ¿Cuántos\n",
    "hacen falta?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. El error estándar, y cuánto cuesta mejorarlo\n",
    "\n",
    "Calcula cuántas ventas necesitas para que el error estándar\n",
    "del promedio baje a 50, a 25 y a 10 soles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Simula un mes de ventas\n",
    "\n",
    "Con la Poisson de las ventas diarias y la distribución de\n",
    "montos, simula 30 días y mira cuánto varía el total mensual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. ¿Cuántas ventas negativas esperabas?\n",
    "\n",
    "Sabemos que hay 21 ventas negativas en 3.000. Si fueran\n",
    "cosa del azar con esa tasa, ¿cuánto variarían de un archivo a otro?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. El teorema central del límite, a mano\n",
    "\n",
    "Promedia 1, 2, 5 y 30 pedidos al azar, dos mil veces cada uno, y mira cuánto varían esos promedios."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. ¿Los pedidos por mes son Poisson?\n",
    "\n",
    "Cuenta los pedidos de cada mes y compara su media con su varianza."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 8\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El teorema que casi todo el mundo cita al revés"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahora una que se oye mucho en reuniones y que casi nunca se dice bien. Las dos mitades son verdad y no significan lo que parece 🎯"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Necesitas cuántas ventas grandes esperar para preparar el stock. Tienes la media y la desviación, así que usas la normal, que es lo que se hace.\n",
    "\n",
    "```\n",
    "from scipy import stats\n",
    "\n",
    "mu, sd = v['monto'].mean(), v['monto'].std()\n",
    "segun_campana = 1 - stats.norm.cdf(3000, mu, sd)\n",
    "real = (v['monto'] > 3000).mean()\n",
    "\n",
    "print(round(segun_campana * 100, 2), round(real * 100, 2))\n",
    "# 0.17 1.23\n",
    "```\n",
    "\n",
    "**¿Qué está mal?** La respuesta está en el cuaderno de soluciones. Míralo tú primero."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "Las ventas diarias tienen media 5,5866 y varianza 5,4146. ¿Qué te dice eso?\n",
    "\n",
    "a) Que se comportan como una Poisson, que es la única común donde media y varianza coinciden\n",
    "\n",
    "b) Que la varianza está mal calculada\n",
    "\n",
    "c) Que los datos son normales\n",
    "\n",
    "d) Que hay poca variación día a día"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 🎯 Binomial para éxitos en intentos fijos. Cerrar 16 de 20 pasa el 3,33% de\n",
    "las veces por puro azar, y en un equipo de 30 le pasa a alguien el 63,83% de los\n",
    "meses.\n",
    "\n",
    "- 📅 Poisson para sucesos en un periodo. Su firma es media parecida a\n",
    "varianza: aquí 5,5866 y 5,4146.\n",
    "\n",
    "- 🔔 El teorema central del límite: los promedios se acampanan aunque los\n",
    "datos no. La asimetría bajó de 1,3405 a 0,0518 promediando de a 100.\n",
    "\n",
    "- 📐 Error estándar = desviación entre raíz de n. Para el doble de precisión,\n",
    "cuatro veces más datos.\n",
    "\n",
    "- ⚠️ El \"con 30 basta\" es una regla de dedo. Con esta cola, a los 30 la\n",
    "asimetría todavía era 0,3223.\n",
    "\n",
    "- 🎰 Simulando solo con la tasa diaria y la forma de los montos salió un rango\n",
    "mensual de 111.598 a 158.882, y los meses reales fueron de 103.474 a 164.313.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El teorema central del límite habla de los promedios, no de tus datos.\n",
    "No son lo mismo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo lo de este capítulo se calcula con `scipy.stats` y numpy, y si\n",
    "esas dos te suenan a chino, empiezan desde cero en el\n",
    "[libro de Python](https://missyera.com/guias/python-desde-cero/) 🐍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué viene ahora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya tenemos el error estándar, que es la pieza que faltaba. En el capítulo 10\n",
    "la usamos para lo que todo el mundo quiere: poner un margen de error a un\n",
    "número y decir \"está entre esto y esto\" 📊"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Qué es la distribución binomial?La que cuenta cuántos éxitos salen en un número fijo de intentos, cuando cada intento sale bien con la misma probabilidad. Cuántos de cien visitantes compran es exactamente eso.\n",
    "\n",
    "¿Qué es la distribución de Poisson?La que cuenta cuántas veces pasa algo en un rato, cuando pasa poco y al azar. Cuántos reclamos llegan en una hora es el caso de manual, y el de verdad también.\n",
    "\n",
    "¿Cuándo uso binomial y cuándo Poisson?Binomial cuando sabes cuántos intentos hubo. Poisson cuando no hay intentos que contar, solo un periodo de tiempo y cosas que van llegando.\n",
    "\n",
    "¿Qué es la distribución t de Student?La hermana de la normal para cuando tienes pocos datos. Es más ancha, o sea más prudente, y se va pareciendo a la normal a medida que la muestra crece.\n",
    "\n",
    "¿Qué es el teorema central del límite?Que si promedias muestras de cualquier cosa, esos promedios se reparten como una campana aunque los datos originales no lo hagan. Es la razón de que la normal aparezca en todas partes.\n",
    "\n",
    "¿Qué es el error estándar?La desviación estándar de los promedios de muestra, no de los datos. Dice cuánto bailaría tu promedio si repitieras el muestreo, y es lo que hay detrás del margen de error."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 8 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/distribuciones/\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
