{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ¿Movemos clientes a WhatsApp?\n",
    "\n",
    "Una pregunta de negocio de principio a fin, con el informe de una página que se puede defender en una reunión.\n",
    "\n",
    "Cuaderno de práctica del capítulo 22 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/proyecto-final/\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: \"ZGUgNDYuMTMlIGEgNjUuMTMlICgrMTkgcHVudG9zKSAtPiAxMDYgY2xpZW50ZXMgcG9yIGdydXBvCmRlIDQ2LjEzJSBhIDU2LjEzJSAoKzEwIHB1bnRvcykgLT4gMzkwIGNsaWVudGVzIHBvciBncnVwbwpkZSA0Ni4xMyUgYSA1MS4xMyUgKCs1IHB1bnRvcykgLT4gMTU2NiBjbGllbnRlcyBwb3IgZ3J1cG8=\",\n",
    "    2: \"c2F0aXNmYWNjaW9uIG1lZGlhOiBXaGF0c0FwcCAzLjA0MjkgKG49NjUyKSB8IE1hcmtldHBsYWNlIDIuOTY3NyAobj03MTEpCnAgPSAwLjMyNTEKZCA9IDAuMDUzNA==\",\n",
    "    3: \"MjAyNVExICBXaGF0c0FwcCAwLjY2MDcgKG49MTEyKSB8IE1hcmtldHBsYWNlIDAuNTAwMCAobj0xNDApIHwgZGlmICswLjE2MDcKMjAyNVEyICBXaGF0c0FwcCAwLjcxMDkgKG49MTI4KSB8IE1hcmtldHBsYWNlIDAuNDE0OCAobj0xMzUpIHwgZGlmICswLjI5NjEKMjAyNVEzICBXaGF0c0FwcCAwLjU3MDIgKG49MTE0KSB8IE1hcmtldHBsYWNlIDAuNDg3NCAobj0xMTkpIHwgZGlmICswLjA4MjgKMjAyNVE0ICBXaGF0c0FwcCAwLjU5NTAgKG49MTIxKSB8IE1hcmtldHBsYWNlIDAuNTAwMCAobj0xMzgpIHwgZGlmICswLjA5NTAKMjAyNlExICBXaGF0c0FwcCAwLjc2NjEgKG49MTI0KSB8IE1hcmtldHBsYWNlIDAuNDM0OCAobj0xMTUpIHwgZGlmICswLjMzMTMKMjAyNlEyICBXaGF0c0FwcCAwLjYxNjcgKG49MTIwKSB8IE1hcmtldHBsYWNlIDAuNDIyNCAobj0xMTYpIHwgZGlmICswLjE5NDM=\",\n",
    "    4: \"cG9yIHZlbnRhOiAgIGRpZiAwLjE5MzcgfCBJQyBbMC4xNDQxLCAwLjI0MzRdIHwgbiA9IDcxOSB5IDc2Mwpwb3IgY2xpZW50ZTogZGlmIDAuMjA0MCB8IElDIFswLjE0ODYsIDAuMjU5M10gfCBuID0gNDI4IHkgNDQz\",\n",
    "    5: \"Y2xpZW50ZXMgZGUgTWFya2V0cGxhY2U6IDQ0Mwpjb3N0ZSBzaSBlbCBlZmVjdG8gZnVlcmEgY2VybzogUy8gNjY0NQp2YWxvciBzaSBlbCBlZmVjdG8gZXMgZWwgcGVzaW1pc3RhOiBTLyA2Mjc0OAoKZWwgZWZlY3RvIHRlbmRyaWEgcXVlIHNlciBtYXlvciBxdWUgMC4wMTUzIHB1bnRvcyBwYXJhIHBhZ2FyIGVsIGNvc3Rl\",\n",
    "    6: \"V2hhdHNBcHAgICAgIHZzIE1hcmtldHBsYWNlICBkaWYgKzAuMTkzNyBJQyBbKzAuMTQ0MSwgKzAuMjQzNF0gfCBhZ3VhbnRhIGVuIDQvNCBzZWdtZW50b3MKV2hhdHNBcHAgICAgIHZzIFRpZW5kYSAgICAgICBkaWYgKzAuMDM1MiBJQyBbLTAuMDE0MywgKzAuMDg0OF0gfCBhZ3VhbnRhIGVuIDIvNCBzZWdtZW50b3MKVGllbmRhICAgICAgIHZzIFdlYiAgICAgICAgICBkaWYgKzAuMDM5MCBJQyBbLTAuMDEwMywgKzAuMDg4M10gfCBhZ3VhbnRhIGVuIDEvNCBzZWdtZW50b3MKV2ViICAgICAgICAgIHZzIE1hcmtldHBsYWNlICBkaWYgKzAuMTE5NSBJQyBbKzAuMDcwMSwgKzAuMTY4OF0gfCBhZ3VhbnRhIGVuIDQvNCBzZWdtZW50b3M=\",\n",
    "    7: \"Y2l1ZGFkICAgICAgY2llcnJhIGRlIDU2LjklIGEgNTkuMiUsIG8gc2VhIDIuMyBwdW50b3MgZGUgZGlmZXJlbmNpYQpjYW5hbCAgICAgICBjaWVycmEgZGUgNDYuMSUgYSA2NS41JSwgbyBzZWEgMTkuNCBwdW50b3MgZGUgZGlmZXJlbmNpYQpzZWdtZW50byAgICBjaWVycmEgZGUgMzcuNSUgYSA3Mi40JSwgbyBzZWEgMzQuOSBwdW50b3MgZGUgZGlmZXJlbmNpYQpjYXRlZ29yaWEgICBjaWVycmEgZGUgNTUuOSUgYSA1OS4xJSwgbyBzZWEgMy4xIHB1bnRvcyBkZSBkaWZlcmVuY2lh\",\n",
    "    8: \"cHJpbWVyYSBtaXRhZCBkZWwgdGllbXBvOiBjaWVycmEgMC41ODAwIChuPTE1MDApCnNlZ3VuZGEgbWl0YWQ6ICAgICAgICAgICAgY2llcnJhIDAuNTc1MyAobj0xNTAwKQpwID0gMC44Mzk5\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Último capítulo con datos 🎓 Vamos a hacer un análisis entero, de la pregunta\n",
    "al informe, usando todo lo del libro.\n",
    "\n",
    "Y voy a hacerlo en el orden correcto, que es el que casi nunca se sigue: la\n",
    "pregunta y el criterio **primero**, los datos después.\n",
    "\n",
    "Y antes de tocar los datos, contéstate lo mismo que me contesto yo: **¿qué decisión se va a tomar con este análisis?** Si no hay una decisión detrás, lo que te están pidiendo no es un análisis, es un reporte 🎓"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 1: la pregunta y el criterio, antes de mirar nada"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**La pregunta.** Marketplace es el canal que peor cierra y\n",
    "WhatsApp el que mejor. ¿Vale la pena empujar a los clientes de Marketplace hacia\n",
    "WhatsApp?\n",
    "\n",
    "**El criterio, escrito antes.** Me lo tomo en serio si:\n",
    "\n",
    "- 📏 La diferencia es de al menos **5 puntos** de tasa de cierre.\n",
    "Menos de eso no paga el esfuerzo de cambiar un proceso.\n",
    "\n",
    "- 🎯 El intervalo del 95% **no toca el cero**.\n",
    "\n",
    "- 🧩 El efecto **aguanta dentro de cada segmento**. Si solo existe\n",
    "en el total, es Simpson y no me sirve.\n",
    "\n",
    "Escribir esto antes es lo que impide el p-hacking del capítulo 17. Si el\n",
    "resultado sale a 4 puntos, ya no puedo decir \"bueno, 4 también está bien\" 🙅"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 2: cargar y limpiar"
   ]
  },
  {
   "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",
    "print('ventas: %d | clientes: %d | periodo: %s a %s'\n",
    "      % (len(v), v['cliente_id'].nunique(),\n",
    "         v['fecha'].min().date(), v['fecha'].max().date()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y aquí ya anoto una limitación para el informe: **3.000 ventas de 617\n",
    "clientes**, o sea que las filas no son independientes (capítulo 17)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 3: describir antes de concluir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "wa = v[v['canal'] == 'WhatsApp']\n",
    "mp = v[v['canal'] == 'Marketplace']\n",
    "\n",
    "for nombre, g in [('WhatsApp', wa), ('Marketplace', mp)]:\n",
    "    print('%-12s n=%3d | cierre %.4f | monto medio %.2f | mediana %.2f'\n",
    "          % (nombre, len(g), g['compro'].mean(), g['monto'].mean(),\n",
    "             g['monto'].median()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Primer dato importante y que hay que decir en voz alta: **el monto es\n",
    "prácticamente igual en los dos canales** (789 contra 812, y las medianas\n",
    "también).\n",
    "\n",
    "Eso simplifica muchísimo el problema. Solo cambia la tasa de cierre, no el\n",
    "tamaño de la venta, así que todo el efecto se puede traducir a \"cuántas ventas\n",
    "más se cierran\" 💡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 4: la comparación con su intervalo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dif = wa['compro'].mean() - mp['compro'].mean()\n",
    "ee = np.sqrt(wa['compro'].var(ddof=1) / len(wa)\n",
    "             + mp['compro'].var(ddof=1) / len(mp))\n",
    "\n",
    "print('diferencia: %.4f (%.2f puntos)' % (dif, 100 * dif))\n",
    "print('intervalo del 95%%: [%.4f, %.4f]' % (dif - 1.96 * ee, dif + 1.96 * ee))\n",
    "print('valor p: %.3g'\n",
    "      % stats.ttest_ind(wa['compro'], mp['compro'], equal_var=False).pvalue)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "19,37 puntos, con un intervalo que va de 14,41 a 24,34 y no se acerca al\n",
    "cero ✅\n",
    "\n",
    "Los dos primeros criterios se cumplen con muchísimo margen: pedía 5 puntos y\n",
    "hay 19, y el peor caso del intervalo sigue siendo 14 puntos."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 5: el tamaño del efecto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def d_de_cohen(a, b):\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",
    "print('d de Cohen: %.4f' % d_de_cohen(wa['compro'], mp['compro']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "0,3972, o sea **chico tirando a mediano** según los cortes del\n",
    "capítulo 14.\n",
    "\n",
    "Y esto conviene contarlo con cuidado, porque puede sonar a contradicción: 19\n",
    "puntos de diferencia y un efecto \"chico\". Las dos cosas son ciertas. El efecto\n",
    "es chico *en desviaciones* porque una variable 0/1 tiene una dispersión\n",
    "enorme; y 19 puntos son 19 puntos de negocio 💰\n",
    "\n",
    "Por eso hay que reportar los dos números, y por eso el que va primero en el\n",
    "informe es el de puntos."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 6: el paso que casi nadie da"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Antes de creerme nada, el control de Simpson del capítulo 17. ¿Aguanta el\n",
    "efecto dentro de cada segmento?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for seg in sorted(v['segmento'].unique()):\n",
    "    a = wa.loc[wa['segmento'] == seg, 'compro']\n",
    "    b = mp.loc[mp['segmento'] == seg, 'compro']\n",
    "    d = a.mean() - b.mean()\n",
    "    e = np.sqrt(a.var(ddof=1) / len(a) + b.var(ddof=1) / len(b))\n",
    "    print('%-11s WhatsApp %.4f (n=%3d) | Marketplace %.4f (n=%3d) | '\n",
    "          'dif %+.4f IC [%+.4f, %+.4f]'\n",
    "          % (seg, a.mean(), len(a), b.mean(), len(b), d,\n",
    "             d - 1.96 * e, d + 1.96 * e))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Aguanta en los cuatro 🎉\n",
    "\n",
    "Las diferencias van de +15,28 a +27,61 puntos, y **ninguno de los\n",
    "cuatro intervalos toca el cero**. Esto no es Simpson: el efecto está\n",
    "dentro de cada grupo, no lo fabrica la mezcla.\n",
    "\n",
    "Tercer criterio cumplido. Y fíjate en que este paso podría haber tumbado el\n",
    "análisis entero después de cinco pasos de trabajo, que es exactamente por qué se\n",
    "hace 🛡️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paso 7: traducirlo a dinero"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tickets = v.loc[v['compro'] == 1, 'monto_final_facturado']\n",
    "ticket = tickets.median()\n",
    "\n",
    "cierres_extra = dif * len(mp)\n",
    "valor = cierres_extra * ticket\n",
    "\n",
    "print('ticket mediano de una venta cerrada: %.2f' % ticket)\n",
    "print('ventas por Marketplace en el periodo: %d' % len(mp))\n",
    "print('cierres adicionales si tuvieran la tasa de WhatsApp: %.1f' % cierres_extra)\n",
    "print()\n",
    "print('valor central:   S/ %.0f' % valor)\n",
    "print('valor pesimista: S/ %.0f' % ((dif - 1.96 * ee) * len(mp) * ticket))\n",
    "print('valor optimista: S/ %.0f' % ((dif + 1.96 * ee) * len(mp) * ticket))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Entre **62.748 y 105.951 soles** en año y medio 💰\n",
    "\n",
    "Uso la mediana del ticket y no la media a propósito, por lo del capítulo 3: la\n",
    "media está inflada por los mayoristas y daría un número más bonito y menos\n",
    "defendible."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El informe"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo lo anterior cabe en esto, que es lo único que hay que llevar a la\n",
    "reunión 📄"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Apartado | Contenido |\n",
    "|---|---|\n",
    "| **Pregunta** | ¿Conviene mover clientes de Marketplace a WhatsApp? |\n",
    "| **Hallazgo** | WhatsApp cierra 19,37 puntos más (65,51% contra 46,13%), IC 95%: 14,41 a 24,34 puntos |\n",
    "| **Robustez** | Se mantiene en los cuatro segmentos, de +15,28 a +27,61 puntos, ningún intervalo toca el cero |\n",
    "| **Tamaño** | d = 0,40; el monto por venta no cambia entre canales (789 contra 812) |\n",
    "| **Valor** | Entre S/ 62.748 y S/ 105.951 en 18 meses, con ticket mediano de S/ 570,61 |\n",
    "| **Datos** | 3.000 ventas de 617 clientes, enero 2025 a junio 2026 |\n",
    "| **Límites** | Es observacional, no un experimento. Las filas no son independientes. Junio de 2026 está incompleto. |\n",
    "| **Siguiente paso** | Prueba con 100 clientes de Marketplace durante 3 meses |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error que casi me cuesta el informe"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mientras armaba esto escribí el nombre del canal con minúscula, que es como\n",
    "lo escribe medio mundo 🙃"
   ]
  },
  {
   "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",
    "    v.groupby('canal')['compro'].mean()['Whatsapp']\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",
    "KeyError: 'Whatsapp'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Menos mal. Ahora mira exactamente el mismo despiste hecho con un filtro:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('con la W mal escrita: ', v.loc[v['canal'] == 'Whatsapp', 'compro'].mean())\n",
    "print('filas que trae:       ', (v['canal'] == 'Whatsapp').sum())\n",
    "print('bien escrito:         ', v.loc[v['canal'] == 'WhatsApp', 'compro'].mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cero filas y un `nan`, sin protestar. Es el mismo error del\n",
    "capítulo 7, y lo repito aquí a propósito porque en un informe de siete pasos hay\n",
    "veinte filtros, y basta con que uno esté mal 😖\n",
    "\n",
    "Mi regla, después de tropezarme muchas veces: **después de cada filtro,\n",
    "imprime cuántas filas quedaron**. Una línea que no cuesta nada y que caza\n",
    "esto en el segundo en que pasa."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La limitación que hay que decir en voz alta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahora lo más importante del capítulo, que es lo que el análisis\n",
    "**no** demuestra 🗣️\n",
    "\n",
    "Todo esto es **observacional**. Yo no asigné clientes a canales:\n",
    "ellos eligieron. Así que la explicación alternativa está viva y es muy plausible:\n",
    "*quien escribe por WhatsApp ya venía decidido, y quien navega en Marketplace\n",
    "está comparando precios*.\n",
    "\n",
    "Si eso es lo que pasa, el canal no causa nada: refleja la intención que el\n",
    "cliente ya traía. Y mover a la gente de un sitio a otro no movería el resultado\n",
    "ni un punto.\n",
    "\n",
    "Controlar por segmento, que es lo que hicimos, descarta *ese* confusor.\n",
    "No descarta la intención de compra, que no está en los datos 🤷\n",
    "\n",
    "Por eso el siguiente paso del informe no es \"implementar\", es\n",
    "**probar**. Y con los números del capítulo 14 ya sabemos cuánta\n",
    "gente hace falta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y dos más, de los que salen montando el informe"
   ]
  },
  {
   "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",
    "    v.groupby(['ciudad', 'segmento'])['monto'].agg('promedio')\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: 'SeriesGroupBy' object has no attribute 'promedio'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Se llama `mean`. Lo pongo aquí, al final del libro, porque es el error que más veces vas a cometer y nunca deja de dar rabia: uno escribe en español sin darse cuenta 🙃"
   ]
  },
  {
   "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(a, b, 0.8)\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() takes 2 positional arguments but 3 were given\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El 0,8 es el umbral de \"efecto grande\" de la tabla de Cohen, y no es un parámetro de la función: es algo que decides tú al leer el número. Este error es bonito porque nace de una confusión de fondo, **la de mezclar lo que se calcula con lo que se interpreta**, y esa confusión es medio libro."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practica 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Diseña la prueba que hace falta\n",
    "\n",
    "Calcula cuántos clientes de Marketplace necesitas en una\n",
    "prueba real para detectar la mitad del efecto observado."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. ¿Y si el efecto fuera la satisfacción?\n",
    "\n",
    "Comprueba si los clientes de WhatsApp vienen con más\n",
    "satisfacción de partida, que sería una explicación alternativa."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. ¿Se mantiene a lo largo del tiempo?\n",
    "\n",
    "Un efecto que solo existe en unos meses es sospechoso.\n",
    "Comprueba trimestre a trimestre."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. La versión honesta contando clientes\n",
    "\n",
    "Repite el análisis contando clientes en vez de ventas, para\n",
    "respetar la independencia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Lo que pasaría si te equivocaras\n",
    "\n",
    "Calcula el coste de la decisión en el peor caso: que el\n",
    "efecto sea cero y muevas a todos igual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. El análisis entero, en una función\n",
    "\n",
    "Empaqueta todo para poder repetirlo con cualquier par de\n",
    "canales."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. ¿Qué columna explica el cierre?\n",
    "\n",
    "Antes de cerrar el informe, mira cuánto separa cada columna la tasa de cierre."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. ¿Cambió algo con el tiempo?\n",
    "\n",
    "Parte los datos por la mitad del periodo y comprueba si la tasa de cierre se movió."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 8\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La recomendación que le baja la conversión a un segmento"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y para terminar el libro, la trampa que está en el salto del número a la decisión, que es donde de verdad se pierde el dinero 😰"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "La conclusión es clara: WhatsApp convierte 3,5 puntos más que Tienda. Propones mover a todos los clientes a WhatsApp.\n",
    "\n",
    "```\n",
    "# en total\n",
    "# WhatsApp 0.655   Tienda 0.620\n",
    "\n",
    "# dentro de Horeca\n",
    "# WhatsApp 0.658   Tienda 0.759\n",
    "# n = 187 y 166      p = 0.0492\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",
    "WhatsApp cierra 19,37 puntos más que Marketplace y aguanta en los cuatro segmentos. ¿Qué recomiendas?\n",
    "\n",
    "a) Probar con un piloto, porque esto es observacional y no un experimento\n",
    "\n",
    "b) Mover a todos los clientes de Marketplace a WhatsApp\n",
    "\n",
    "c) Cerrar Marketplace\n",
    "\n",
    "d) Nada, porque el efecto es chico (d = 0,40)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 📝 Pregunta y criterio antes de mirar. Escribir \"me lo tomo en serio a partir\n",
    "de 5 puntos\" es lo que impide el p-hacking.\n",
    "\n",
    "- 📊 WhatsApp cierra 19,37 puntos más que Marketplace, IC de 14,41 a 24,34, y\n",
    "el monto por venta no cambia entre canales.\n",
    "\n",
    "- 🧩 El efecto aguanta en los cuatro segmentos, de +15,28 a +27,61. No es\n",
    "Simpson.\n",
    "\n",
    "- 💰 Traducido: entre 62.748 y 105.951 soles en 18 meses, con el ticket\n",
    "mediano y no con la media.\n",
    "\n",
    "- 🗣️ Es observacional. Controlar por segmento descarta ese confusor, no la\n",
    "intención de compra. Por eso el siguiente paso es probar, no implementar.\n",
    "\n",
    "- ⚖️ Con el punto de equilibrio al lado del intervalo (1,53 puntos contra\n",
    "14,41 del peor caso), la decisión se toma sola.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La pregunta y el criterio se escriben antes de mirar los datos. Después,\n",
    "ya no vale."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y si quieres hacer este mismo recorrido con los datos de tu empresa y\n",
    "acompañada, eso es justo lo que hacemos 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": [
    "Se acabó 🎉 En el capítulo 23 te dejo las referencias: qué leer después, qué\n",
    "herramientas usar y de dónde salió cada cosa de este libro."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La estadística es la mitad del trabajo, y esta es la otra"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si terminaste esto, ya sabes lo que separa un número que significa algo de un número que suena bien: de dónde salió la muestra, si la diferencia es real o es ruido, y qué prueba tocaba usar.\n",
    "\n",
    "Ese criterio es exactamente el que falta en la mayoría de los sistemas de IA que veo en empresas: nadie sabe decir si el sistema funciona o solo lo parece. Es lo que se construye en [el curso de ingeniería de IA en producción](https://missyera.com/cursos/ingenieria-de-ia/), donde los evals son el centro y no un adorno del final.\n",
    "\n",
    "Y si lo tuyo no es construir sistemas sino analizar bien, esto que acabas de terminar ya te habilita para eso, que es un oficio entero y con demanda. El capítulo de referencias te deja por dónde seguir sin gastar un sol, y lo que le falta a la estadística para que sea trabajo pagado son las herramientas: sacar el dato tú misma y presentarlo. Eso está en [las clases grabadas de Excel y Power BI](https://missyera.com/cursos/datos/) 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 22 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/proyecto-final/\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
}
