{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Significativo no es importante\n",
    "\n",
    "El tamaño del efecto, la potencia, y la demostración de que copiando los datos diez veces el valor p se derrumba y el efecto no se mueve.\n",
    "\n",
    "Cuaderno de práctica del capítulo 14 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/tamano-del-efecto/\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: \"bW9udG8gTWF5b3Jpc3RhIHZzIEJvZGVnYSAgICAgIGQgPSArMy4yMzU0IHwgbiA9IDc1MCB5IDcwNwpNYXlvcmlzdGEgdnMgQm9kZWdhIChjb21wcmEpICAgZCA9ICswLjc0OTggfCBuID0gNzUwIHkgNzA3CnNhdGlzZmFjY2lvbiBzZWd1biBjb21wcmEgICAgICBkID0gKzAuMzY4MiB8IG4gPSAxNTkwIHkgMTE3OQpIb3JlY2EgdnMgTWluaW1hcmtldCAoY29tcHJhKSAgZCA9ICswLjEyODMgfCBuID0gNzQyIHkgODAxCmNvbXByYSBUcnVqaWxsbyB2cyBQaXVyYSAgICAgICBkID0gKzAuMDQ2OSB8IG4gPSA0NzEgeSA1MDY=\",\n",
    "    2: \"ZGlmZXJlbmNpYTogMC4wMjMyIHB1bnRvcwpkIGRlIENvaGVuOiAwLjA0NjkKcGFyYSBwb3RlbmNpYSAwLjgwIGhhcmlhbiBmYWx0YSA3MTE0IHBvciBjaXVkYWQKdGVuZW1vczogNDcxIHkgNTA2\",\n",
    "    3: \"Qm9kZWdhICAgICAgZCA9ICswLjQzODMgfCBwID0gOS42MTFlLTA4IHwgbiA9IDI0NSB5IDQxMApIb3JlY2EgICAgICBkID0gKzAuMzQ2MCB8IHAgPSAxLjQwNGUtMDUgfCBuID0gNDM3IHkgMjU1Ck1heW9yaXN0YSAgIGQgPSArMC4yODcxIHwgcCA9IDAuMDAwNTcwNCB8IG4gPSA0ODkgeSAxOTUKTWluaW1hcmtldCAgZCA9ICswLjQ1ODkgfCBwID0gMS4wNjRlLTA5IHwgbiA9IDQxOSB5IDMxOQ==\",\n",
    "    4: \"ZGUgNTcuNzclIGEgNjAlIChzdWJpZGEgZGUgMi4yMyBwdW50b3MpIC0+IDc2MTAgcG9yIHZhcmlhbnRlCmRlIDU3Ljc3JSBhIDYyJSAoc3ViaWRhIGRlIDQuMjMgcHVudG9zKSAtPiAyMTAwIHBvciB2YXJpYW50ZQpkZSA1Ny43NyUgYSA2NSUgKHN1YmlkYSBkZSA3LjIzIHB1bnRvcykgLT4gNzA5IHBvciB2YXJpYW50ZQ==\",\n",
    "    5: \"cGFyYSBkZXRlY3RhciArMC4xIHB1bnRvcyAoZCA9IDAuMDcwNCkgLT4gMzE2NSByZXNwdWVzdGFzIHBvciBncnVwbwpwYXJhIGRldGVjdGFyICswLjIgcHVudG9zIChkID0gMC4xNDA4KSAtPiA3OTEgcmVzcHVlc3RhcyBwb3IgZ3J1cG8KcGFyYSBkZXRlY3RhciArMC4zIHB1bnRvcyAoZCA9IDAuMjExMikgLT4gMzUyIHJlc3B1ZXN0YXMgcG9yIGdydXBvCnBhcmEgZGV0ZWN0YXIgKzAuNSBwdW50b3MgKGQgPSAwLjM1MTkpIC0+IDEyNyByZXNwdWVzdGFzIHBvciBncnVwbw==\",\n",
    "    6: \"TWF5b3Jpc3RhIHN1cGVyYSBhIEJvZGVnYSBlbiAwLjM0OTIgKElDIDk1JTogMC4zMDEyIGEgMC4zOTcxKSwgZWZlY3RvIG1lZGlhbm8gKGQgPSAwLjc1KSwgcCA9IDIuNzNlLTQzLCBuID0gNzUwIHkgNzA3CgpIb3JlY2Egc3VwZXJhIGEgTWluaW1hcmtldCBlbiAwLjA2MjggKElDIDk1JTogMC4wMTQwIGEgMC4xMTE2KSwgZWZlY3RvIGluc2lnbmlmaWNhbnRlIChkID0gMC4xMyksIHAgPSAwLjAxMTgsIG4gPSA3NDIgeSA4MDEKClRydWppbGxvIHN1cGVyYSBhIFBpdXJhIGVuIDAuMDIzMiAoSUMgOTUlOiAtMC4wMzg4IGEgMC4wODUxKSwgZWZlY3RvIGluc2lnbmlmaWNhbnRlIChkID0gMC4wNSksIHAgPSAwLjQ2MywgbiA9IDQ3MSB5IDUwNg==\",\n",
    "    7: \"Y2l1ZGFkICAgICAgZCA9ICAwLjA4MSAgICh0cnVqaWxsbyBjb250cmEgY3VzY28pCmNhbmFsICAgICAgIGQgPSAgMC4wMzQgICAoVGllbmRhIGNvbnRyYSBXaGF0c0FwcCkKY2F0ZWdvcmlhICAgZCA9ICAwLjExNyAgIChBYmFycm90ZXMgY29udHJhIEN1aWRhZG8gcGVyc29uYWwpCnNlZ21lbnRvICAgIGQgPSAgMy4yMzUgICAoTWF5b3Jpc3RhIGNvbnRyYSBCb2RlZ2Ep\",\n",
    "    8: \"Y29waWFuZG8gbG9zIGRhdG9zICAxIHZlY2VzOiBwID0gMS4xODllLTAyICAgZCA9IDAuMTI4Mwpjb3BpYW5kbyBsb3MgZGF0b3MgIDIgdmVjZXM6IHAgPSAzLjcyN2UtMDQgICBkID0gMC4xMjg0CmNvcGlhbmRvIGxvcyBkYXRvcyAgNSB2ZWNlczogcCA9IDEuODIxZS0wOCAgIGQgPSAwLjEyODQKY29waWFuZG8gbG9zIGRhdG9zIDEwIHZlY2VzOiBwID0gMS43MTllLTE1ICAgZCA9IDAuMTI4NA==\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En el capítulo 12 quedó dicho: **significativo no quiere decir\n",
    "importante**.\n",
    "\n",
    "Ahora lo vamos a demostrar de la forma más brutal que se me ocurre 😈"
   ]
  },
  {
   "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",
    "\n",
    "horeca = v.loc[v['segmento'] == 'Horeca', 'compro'].values\n",
    "minimarket = v.loc[v['segmento'] == 'Minimarket', 'compro'].values\n",
    "\n",
    "\n",
    "def d_de_cohen(a, b):\n",
    "    \"\"\"Cuantas desviaciones separan a los dos grupos.\"\"\"\n",
    "    na, nb = len(a), len(b)\n",
    "    juntas = np.sqrt(((na - 1) * a.var(ddof=1) + (nb - 1) * b.var(ddof=1))\n",
    "                     / (na + nb - 2))\n",
    "    return (a.mean() - b.mean()) / juntas\n",
    "\n",
    "\n",
    "for veces in [1, 2, 5, 10]:\n",
    "    a = np.tile(horeca, veces)\n",
    "    b = np.tile(minimarket, veces)\n",
    "    print('copiando los datos x%2d (n=%5d) -> diferencia %.4f | d %.4f | p %.3g'\n",
    "          % (veces, len(a), a.mean() - b.mean(), d_de_cohen(a, b),\n",
    "             stats.ttest_ind(a, b, equal_var=False).pvalue))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Léelo columna por columna 👀\n",
    "\n",
    "La diferencia: **0,0628 siempre**. El tamaño del efecto:\n",
    "**0,1284 siempre**. Y el valor p se derrumba de 0,0118 a\n",
    "0,0000000000000016.\n",
    "\n",
    "**No hay ni un dato nuevo.** Son las mismas 742 ventas copiadas\n",
    "y pegadas. Y aun así el resultado pasa de \"significativo, apenas\" a \"significativo\n",
    "más allá de toda duda\" 🤯\n",
    "\n",
    "Eso es todo lo que hay que saber sobre el valor p: mide\n",
    "*evidencia*, no *importancia*. Y la evidencia crece con la\n",
    "cantidad de datos aunque el efecto sea el mismo.\n",
    "\n",
    "Y hazte esta pregunta cada vez que veas un \"significativo\": **¿cuánto es la diferencia en soles, en clientes o en pedidos?** Si nadie sabe contestarla, ese resultado todavía no sirve para decidir nada 📐"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El tamaño del efecto, que es lo que sí hay que reportar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La **d de Cohen** mide la diferencia en desviaciones estándar,\n",
    "así que no depende ni de las unidades ni de cuántos datos tengas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "d=x¯1−x¯2sjuntas\n",
    "\n",
    "la diferencia medida en desviaciones, que no depende ni de las unidades ni de cuántos datos tengas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compara(a, b, nombre):\n",
    "    d = d_de_cohen(a, b)\n",
    "    if abs(d) < 0.2:\n",
    "        etiqueta = 'insignificante'\n",
    "    elif abs(d) < 0.5:\n",
    "        etiqueta = 'chico'\n",
    "    elif abs(d) < 0.8:\n",
    "        etiqueta = 'mediano'\n",
    "    else:\n",
    "        etiqueta = 'grande'\n",
    "    print('%-28s d = %.4f (%s) | p = %.3g'\n",
    "          % (nombre, d, etiqueta, stats.ttest_ind(a, b, equal_var=False).pvalue))\n",
    "\n",
    "\n",
    "may = v.loc[v['segmento'] == 'Mayorista', 'compro'].values\n",
    "bod = v.loc[v['segmento'] == 'Bodega', 'compro'].values\n",
    "sat_si = v.loc[v['compro'] == 1, 'satisfaccion'].dropna().values\n",
    "sat_no = v.loc[v['compro'] == 0, 'satisfaccion'].dropna().values\n",
    "\n",
    "compara(may, bod, 'Mayorista vs Bodega')\n",
    "compara(sat_si, sat_no, 'satisfaccion, compro vs no')\n",
    "compara(horeca, minimarket, 'Horeca vs Minimarket')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahora sí se pueden ordenar los hallazgos del libro 🏆\n",
    "\n",
    "Mira el segundo: la satisfacción de quien compra es **medio punto más\n",
    "alta** que la de quien no compra, con un p de 10 elevado a -21. Suena\n",
    "enorme. Y el tamaño del efecto es 0,3682, o sea chico: las dos distribuciones se\n",
    "solapan muchísimo.\n",
    "\n",
    "Y el tercero es el que más duele. Horeca contra Minimarket salió significativo\n",
    "en el capítulo 12, aguantó (por poco) la conversación del 11, y su efecto es\n",
    "**0,1283, insignificante**.\n",
    "\n",
    "Los cortes de Cohen (0,2, 0,5 y 0,8) son convenciones suyas y hay que usarlas\n",
    "con cabeza. Pero para ordenar tres hallazgos en una tabla, van perfectas 📋"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La potencia, que es la pregunta de antes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hasta ahora todo era después de recoger datos. La potencia es la pregunta que\n",
    "había que hacerse *antes*: **si el efecto existiera, ¿con cuántos\n",
    "datos lo vería?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generador = np.random.default_rng(7)\n",
    "\n",
    "\n",
    "def potencia(p1, p2, n, repeticiones=2000):\n",
    "    \"\"\"De cuantos experimentos con este efecto real saldria p < 0.05.\"\"\"\n",
    "    aciertos = 0\n",
    "    for _ in range(repeticiones):\n",
    "        a = generador.binomial(1, p1, n)\n",
    "        b = generador.binomial(1, p2, n)\n",
    "        aciertos += stats.ttest_ind(a, b).pvalue < 0.05\n",
    "    return aciertos / repeticiones\n",
    "\n",
    "\n",
    "print('efecto real: 63.21% contra 56.93%')\n",
    "for n in [50, 100, 300, 800, 2000]:\n",
    "    print('  con %4d por grupo -> potencia %.3f' % (n, potencia(0.6321, 0.5693, n)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esto hay que leerlo despacio porque es incómodo 😬\n",
    "\n",
    "Con 100 casos por grupo, **y siendo el efecto real**, solo lo\n",
    "detectarías el 14,5% de las veces. O sea que 85 de cada 100 estudios honestos con\n",
    "ese tamaño concluirían \"no hay diferencia\".\n",
    "\n",
    "Con 300 sigues fallando 6 de cada 10 veces. Hacen falta unos 800 para llegar a\n",
    "la potencia del 80%, que es la convención de \"aceptable\".\n",
    "\n",
    "Y ahora date cuenta de una cosa: la comparación del capítulo 12 se hizo con\n",
    "742 y 801 casos. **Estaba justo en el filo.** Con esa muestra, si\n",
    "hubiera repetido el experimento, tres de cada diez veces no habría encontrado\n",
    "nada 🎲"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La fórmula, para no simular"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "n≈2(zα+zβ)2d2\n",
    "\n",
    "cuántos casos por grupo hacen falta, y como el efecto va al cuadrado abajo, la mitad de efecto cuesta cuatro veces más gente"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "d = d_de_cohen(horeca, minimarket)\n",
    "n_necesario = 2 * (1.96 + 0.84) ** 2 / d ** 2\n",
    "\n",
    "print('efecto observado: d = %.4f' % d)\n",
    "print('para potencia 0.80 hacen falta %.0f casos por grupo' % n_necesario)\n",
    "print()\n",
    "for objetivo, etiqueta in [(0.2, 'insignificante'), (0.5, 'chico'), (0.8, 'mediano')]:\n",
    "    print('para detectar un efecto de %.1f (%s): %.0f por grupo'\n",
    "          % (objetivo, etiqueta, 2 * (1.96 + 0.84) ** 2 / objetivo ** 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "952 por grupo, que cuadra con la simulación (800 daba 0,713) 🎯\n",
    "\n",
    "Y mira la segunda tabla, que es la que hay que tener a mano: para cazar un\n",
    "efecto mediano bastan **24 por grupo**. Para uno chico, 63. Para uno\n",
    "insignificante, 392.\n",
    "\n",
    "Ese 1,96 es el del 95% de siempre, y el 0,84 es el que corresponde a una\n",
    "potencia del 80%. Los dos se pueden cambiar si quieres otro nivel."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El problema al revés: cuando sobra potencia"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Con muestras enormes pasa lo contrario, y también es un problema 🐘\n",
    "\n",
    "Ya lo vimos en el capítulo 5: la prueba de normalidad rechazaba cualquier\n",
    "columna en cuanto había 1.000 filas. La causa es esta misma."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for n in [100, 1000, 10000, 100000]:\n",
    "    a = generador.binomial(1, 0.500, n)\n",
    "    b = generador.binomial(1, 0.505, n)\n",
    "    pv = stats.ttest_ind(a, b).pvalue\n",
    "    print('n=%6d -> diferencia real de 0.5 puntos | p = %.4f %s'\n",
    "          % (n, pv, '<-- significativa' if pv < 0.05 else ''))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Una diferencia de **medio punto porcentual**, que a ningún\n",
    "negocio del mundo le cambia una decisión, sale significativa con 100.000 casos\n",
    "por grupo.\n",
    "\n",
    "Por eso las plataformas grandes que hacen pruebas A/B con millones de usuarios\n",
    "no reportan valores p: reportan el efecto con su intervalo, y tienen un umbral\n",
    "de *relevancia práctica* decidido antes 📏"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error del capítulo"
   ]
  },
  {
   "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.binomtest(5, 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: k (5) must not be greater than n (3).\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cinco éxitos de tres intentos, imposible, y te frena 👍\n",
    "\n",
    "Y el silencioso de siempre, que en este capítulo es especialmente traicionero:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('varianza de un solo dato:', np.array([1.0]).var(ddof=1))\n",
    "print('d de Cohen con un dato:  ', d_de_cohen(np.array([1.0]), np.array([0.0, 1.0])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`nan`, sin aviso. Y en una tabla de resultados con veinte\n",
    "comparaciones, un `nan` perdido entre números se lee como \"no hubo\n",
    "efecto\" 😑\n",
    "\n",
    "La costumbre que salva: **pon el n al lado de cada efecto**. Si\n",
    "ves un `nan` con n = 1, ya sabes que no es un resultado."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cómo se reporta bien, en una línea"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Así no | Así sí |\n",
    "|---|---|\n",
    "| \"La diferencia es significativa (p < 0,05)\" | \"Horeca cierra 6,28 puntos más que Minimarket (IC 95%: 1,40 a 11,16; d = 0,13; n = 742 y 801)\" |\n",
    "| \"No hay diferencia entre ciudades\" | \"No encontramos diferencia entre ciudades; con esta muestra habríamos detectado efectos de 4 puntos o más\" |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La segunda columna se puede discutir. La primera solo se puede creer o no\n",
    "creer 🤝"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y dos más, de la función que escribimos arriba"
   ]
  },
  {
   "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",
    "    d_de_cohen(horeca, minimarket, corregido=True)\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",
    "TypeError: d_de_cohen() got an unexpected keyword argument 'corregido'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La función que escribimos recibe dos cosas y ya. Este error sale mucho trabajando con librerías: uno da por hecho que existe una opción porque sería razonable que existiera. La *g* de Hedges, que es la d corregida para muestras chicas, sí existe, y está en otra librería 🧰"
   ]
  },
  {
   "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",
    "    d_de_cohen(horeca, [])\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",
    "AttributeError: 'list' object has no attribute 'var'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y aquí el que revienta es un detalle del código: `d_de_cohen` llama a `.var()`, que tienen las Series de pandas y no las listas de Python. Es un recordatorio de que las funciones que escribes suponen cosas de lo que reciben, aunque no las digas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practica 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Ordena todos los hallazgos del libro por tamaño\n",
    "\n",
    "Calcula la d de Cohen de las comparaciones que hemos ido\n",
    "haciendo y ponlas en orden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. ¿Qué habría hecho falta para ver la diferencia entre ciudades?\n",
    "\n",
    "Trujillo cierra 2,32 puntos más que Piura y salió p =\n",
    "0,4634. ¿Cuántas ventas harían falta para que ese efecto, si es real, se\n",
    "detectara?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. El efecto que se encoge al mirarlo mejor\n",
    "\n",
    "La satisfacción tenía d = 0,3682 respecto a la compra.\n",
    "Mira si ese efecto sobrevive dentro de cada segmento."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Potencia para una prueba A/B de verdad\n",
    "\n",
    "Quieres probar un cambio en la web que suba la tasa de\n",
    "cierre de 57,77% a 60%. ¿Cuántos visitantes necesitas por variante?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Cuánta gente hace falta para una encuesta de satisfacción\n",
    "\n",
    "Quieres saber si la satisfacción media subió de 3,0 a 3,2.\n",
    "Con la desviación que ya conoces, calcula el tamaño."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Tu informe completo, en una función\n",
    "\n",
    "Junta valor p, tamaño del efecto, intervalo y n en una sola\n",
    "salida que se pueda pegar en un correo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. La d de las cuatro categóricas\n",
    "\n",
    "Calcula la d de Cohen entre el mejor y el peor grupo de cada columna."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. Copia los datos y mira las dos columnas\n",
    "\n",
    "Duplica los datos 1, 2, 5 y 10 veces y mira qué le pasa al valor p y qué le pasa a la d."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 8\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Significativo, y ocho décimas de punto"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahora la trampa que le da título a este capítulo, con números de la base 🤏"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Sale significativo. Con eso en la mano propones cambiar la política de descuentos de un segmento entero.\n",
    "\n",
    "```\n",
    "from scipy import stats\n",
    "\n",
    "# descuento medio\n",
    "# Bodega     0.130   (n = 567)\n",
    "# Mayorista  0.122   (n = 607)\n",
    "\n",
    "print(round(stats.ttest_ind(bodega, mayorista,\n",
    "                            equal_var=False).pvalue, 4))\n",
    "# 0.0449\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",
    "Copiando los mismos datos diez veces, el valor p baja de 0,0118 a 1,6e-15 y la d de Cohen se queda en 0,1284. ¿Qué demuestra?\n",
    "\n",
    "a) Que el valor p mide evidencia y el tamaño del efecto mide importancia\n",
    "\n",
    "b) Que copiar datos mejora el modelo\n",
    "\n",
    "c) Que la d de Cohen no es sensible\n",
    "\n",
    "d) Que hay que usar siempre muestras grandes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 💥 Copiando los mismos datos diez veces, el p pasa de 0,0118 a 1,6e-15 y el\n",
    "efecto se queda en 0,1284. El p mide evidencia, no importancia.\n",
    "\n",
    "- 📏 La d de Cohen mide en desviaciones y no depende del tamaño de muestra.\n",
    "Menos de 0,2 insignificante, 0,5 chico, 0,8 mediano.\n",
    "\n",
    "- 🔦 La potencia es la pregunta de antes. Con 100 por grupo, un efecto real de\n",
    "6,28 puntos se detecta el 14,5% de las veces.\n",
    "\n",
    "- ⚖️ El estudio del capítulo 12 tenía 742 y 801 casos, o sea potencia de\n",
    "alrededor del 70%: tres de cada diez veces no habría encontrado nada.\n",
    "\n",
    "- 🐘 Con muestras enormes todo sale significativo. Medio punto porcentual de\n",
    "diferencia sale con p = 0,0304 usando 100.000 por grupo.\n",
    "\n",
    "- 🧮 Para un efecto mediano bastan 25 por grupo; para uno insignificante,\n",
    "392. Las mejoras chiquitas son carísimas de demostrar.\n",
    "\n",
    "- 📧 Se reporta efecto, intervalo, p y n. Los cuatro, siempre.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Significativo quiere decir \"probablemente no es casualidad\". No quiere\n",
    "decir \"importa\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y traducir un efecto a soles, que es la parte que casi nadie enseña, es\n",
    "exactamente lo que practicamos sobre los datos de cada quien en el\n",
    "[Full Day IA](https://missyera.com/cursos/full-day-ia/) 💜"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué viene ahora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En el capítulo 15 vamos a la relación entre dos variables numéricas: la\n",
    "correlación. Con la frase que hay que decir en voz alta cada vez que aparece\n",
    "una, y con una correlación de este archivo que resultó ser exactamente cero 📉"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 14 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/tamano-del-efecto/\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
}
