{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# El titular dice lo que encontraste, no lo que hiciste\n",
    "\n",
    "Los mismos números dan cuatro titulares distintos. Cuál eliges decide si te aprueban el proyecto o te hacen volver con más datos.\n",
    "\n",
    "Cuaderno de práctica del capítulo 19 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/el-titular-va-primero/\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: \"YmFzZSAwLjYgLT4gc3ViaXIgMSBwdW50byBlcyB1biAxLjcgJSBkZSBtZWpvcmEKYmFzZSAwLjMgLT4gc3ViaXIgMSBwdW50byBlcyB1biAzLjMgJSBkZSBtZWpvcmEKYmFzZSAwLjEgLT4gc3ViaXIgMSBwdW50byBlcyB1biAxMC4wICUgZGUgbWVqb3JhCmJhc2UgMC4wMiAtPiBzdWJpciAxIHB1bnRvIGVzIHVuIDUwLjAgJSBkZSBtZWpvcmE=\",\n",
    "    2: \"Ym9yZGUgYmFqbyAgLT4gMTY3MzMgc29sZXMKY2VudHJvICAgICAgLT4gNTYwODYgc29sZXMKYm9yZGUgYWx0byAgLT4gOTU0Mzkgc29sZXM=\",\n",
    "    3: \"V2hhdHNBcHAgLyBXZWIgPSAxLjExOQpXaGF0c0FwcCAtIFdlYiA9IDAuMDY5NA==\",\n",
    "    4: \"ZW50ZXJhICBuID0gMTUyNiB8IGVudHJlIDIuMSB5IDExLjggfCBhbmNobyA5LjcKbWl0YWQgICBuID0gNzYyIHwgZW50cmUgMi41IHkgMTYuMiB8IGFuY2hvIDEzLjcKY3VhcnRvICBuID0gMzgxIHwgZW50cmUgLTEuMSB5IDE4LjEgfCBhbmNobyAxOS4y\",\n",
    "    5: \"cmVsYXRpdm8gICAxMS45JQphYnNvbHV0byAgIDYuOSBwdW50b3MKaW50ZXJ2YWxvICAyLjEgYSAxMS44IHB1bnRvcwpwbGF0YSAgICAgIDU2MDg2IHNvbGVz\",\n",
    "    6: \"dmVudGFzICA6IDE1MjYKY2xpZW50ZXM6IDU3MQp2ZW50YXMgcG9yIGNsaWVudGU6IDIuNjc=\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hiciste el análisis. Los números están bien, la prueba es la que tocaba y el\n",
    "cuaderno corre de arriba abajo.\n",
    "\n",
    "Y ahora tienes que decirlo en una frase, porque nadie va a leer tu cuaderno.\n",
    "Esa frase es el trabajo entero visto desde afuera, y casi nunca se enseña 🌸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Los números que vamos a contar"
   ]
  },
  {
   "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",
    "df = pd.read_csv(URL)\n",
    "df['monto'] = pd.to_numeric(df['monto'], errors='coerce')\n",
    "d = df[['canal', 'compro', 'segmento', 'monto']].dropna(subset=['canal', 'compro'])\n",
    "\n",
    "w = d[d['canal'] == 'WhatsApp']['compro']\n",
    "b = d[d['canal'] == 'Web']['compro']\n",
    "\n",
    "print('WhatsApp: n =', len(w), '| convierte', round(float(w.mean()), 4))\n",
    "print('Web     : n =', len(b), '| convierte', round(float(b.mean()), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dos canales, la conversión de cada uno. De ahí en adelante todo es la misma\n",
    "información contada de maneras distintas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Titular 1: el relativo, que es el que todos usan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dif = float(w.mean() - b.mean())\n",
    "print('sube un', round(dif / float(b.mean()) * 100, 1), '%')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*\"WhatsApp convierte un 11,9% más que la web.\"*\n",
    "\n",
    "Suena bien y es cierto. Y tiene dos trampas que no se ven.\n",
    "\n",
    "La primera: es un **porcentaje de un porcentaje**. La conversión\n",
    "pasó de 58,3% a 65,2%, y eso es un 11,9% más *de lo que ya había*. Quien\n",
    "lo escuche sin pensar va a entender \"sube 11,9 puntos\", que es casi el doble de\n",
    "lo que pasó.\n",
    "\n",
    "La segunda es peor, y se ve mirando un segmento chico:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bodega = d[d['segmento'] == 'Bodega']\n",
    "a2 = bodega[bodega['canal'] == 'WhatsApp']['compro']\n",
    "b2 = bodega[bodega['canal'] == 'Web']['compro']\n",
    "print('Bodega WhatsApp:', round(float(a2.mean()), 4))\n",
    "print('Bodega Web     :', round(float(b2.mean()), 4))\n",
    "print('relativo       :', round((float(a2.mean()) - float(b2.mean()))\n",
    "                                / float(b2.mean()) * 100, 1), '%')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "16,2% en Bodega contra 11,9% general. ¿Bodega es el mejor segmento?\n",
    "\n",
    "No necesariamente: el relativo **crece solo cuando la base es más\n",
    "chica**. Bodega convierte peor de entrada, así que la misma cantidad de\n",
    "puntos parece más. Con una base del 1%, subir un punto es un 100% de mejora, y\n",
    "sigue siendo un punto 🙃"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Titular 2: el absoluto, que es el honesto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('sube', round(dif * 100, 1), 'puntos')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*\"WhatsApp convierte 6,9 puntos más que la web.\"*\n",
    "\n",
    "Menos vistoso, imposible de malinterpretar. Y fíjate en la palabra\n",
    "**puntos**, que no es un adorno: decir \"6,9 por ciento más\" sería\n",
    "mentira, porque el por ciento ya está ocupado por la conversión.\n",
    "\n",
    "Esa distinción entre *puntos porcentuales* y *por ciento* es la\n",
    "que más se confunde en informes reales, y la que más discusiones caras\n",
    "provoca."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Titular 3: el intervalo, que es el que aguanta preguntas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "se = float(np.sqrt(w.var(ddof=1) / len(w) + b.var(ddof=1) / len(b)))\n",
    "lo, hi = dif - 1.96 * se, dif + 1.96 * se\n",
    "print('entre', round(lo * 100, 1), 'y', round(hi * 100, 1), 'puntos')\n",
    "print('valor p:', round(float(stats.ttest_ind(w, b, equal_var=False)[1]), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*\"WhatsApp convierte entre 2 y 12 puntos más.\"*\n",
    "\n",
    "Este es el bueno, y es el que casi nadie pone en el titular porque parece que\n",
    "te estás lavando las manos.\n",
    "\n",
    "Es al revés. Mira lo que hace en una reunión: si alguien te pregunta \"¿y qué\n",
    "tan seguro estás?\", ya lo contestaste. Y si el plan de la empresa necesitaba 10\n",
    "puntos para salir a cuenta, el intervalo te está diciendo que **puede que\n",
    "no alcance**, y eso es exactamente lo que esa persona necesita saber\n",
    "antes de firmar.\n",
    "\n",
    "El valor p dice que la diferencia es real. El intervalo dice\n",
    "**de qué tamaño**. En una reunión el segundo importa más, y lo\n",
    "trabajamos en el capítulo 10."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Titular 4: la plata, que es el que consigue el presupuesto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ticket = float(d['monto'].dropna().mean())\n",
    "print('ticket medio:', round(ticket, 2))\n",
    "for n in (1000, 10000):\n",
    "    print(' con', n, 'clientes ->', round(dif * n, 1), 'ventas mas,',\n",
    "          round(dif * n * ticket), 'soles')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*\"Con 1.000 clientes son unas 69 ventas más, cerca de 56.000 soles.\"*\n",
    "\n",
    "Este es el que hace que alguien deje de mirar el teléfono 💰\n",
    "\n",
    "Y también el más fácil de inflar. Tres cosas que hay que decir en voz alta al\n",
    "darlo:\n",
    "\n",
    "- **De dónde sale el 1.000.** Si te lo inventaste para que el\n",
    "número quede bonito, se nota en la primera pregunta.\n",
    "\n",
    "- **Que el ticket medio es un promedio**, con toda la dispersión\n",
    "que trabajamos en el capítulo 4 detrás.\n",
    "\n",
    "- **Que el rango también se traduce.** Con el borde bajo del\n",
    "intervalo, esos 56.000 se convierten en 17.000. Da menos gusto decirlo y es lo\n",
    "que te salva cuando alguien haga la cuenta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El titular que no sirve, y es el más común"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*\"Analizamos 3.037 ventas con una prueba t de Welch y obtuvimos un p-valor\n",
    "de 0,0053.\"*\n",
    "\n",
    "Eso es lo que **hiciste**, no lo que **encontraste**.\n",
    "Y es el titular de la mitad de los informes que me toca leer.\n",
    "\n",
    "Sale de un miedo razonable: si no digo el método, van a pensar que me lo\n",
    "inventé. Pero el método va en el cuerpo y en el anexo, donde quien quiera\n",
    "revisarlo lo encuentra. El titular es para quien tiene que decidir algo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora dibújalo, que se entiende sin explicar nada"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El titular 3 dice el intervalo con palabras. El problema de decirlo con\n",
    "palabras es que hay que decirlo cuatro veces, una por canal, y para cuando vas\n",
    "por el tercero nadie se acuerda del primero.\n",
    "\n",
    "Se ve muchísimo mejor dibujado, y ni siquiera hace falta una librería de\n",
    "gráficos: con guiones alcanza para la reunión."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Nombres propios para no pisar los de arriba: en un cuaderno que se corre\n",
    "# entero, una variable reutilizada rompe el bloque siguiente y cuesta verlo.\n",
    "intervalos = {}\n",
    "for canal, sub in d.groupby('canal'):\n",
    "    tasa, casos = sub['compro'].mean(), len(sub)\n",
    "    margen = 1.96 * np.sqrt(tasa * (1 - tasa) / casos)\n",
    "    intervalos[canal] = (tasa, tasa - margen, tasa + margen)\n",
    "\n",
    "ANCHO = 46\n",
    "suelo = min(v[1] for v in intervalos.values())\n",
    "techo = max(v[2] for v in intervalos.values())\n",
    "sitio = lambda x: int(round((x - suelo) / (techo - suelo) * (ANCHO - 1)))\n",
    "\n",
    "for canal in sorted(intervalos, key=lambda c: -intervalos[c][0]):\n",
    "    tasa, izq, der = intervalos[canal]\n",
    "    fila = [' '] * ANCHO\n",
    "    for i in range(sitio(izq), sitio(der) + 1):\n",
    "        fila[i] = '-'\n",
    "    fila[sitio(izq)] = fila[sitio(der)] = '|'\n",
    "    fila[sitio(tasa)] = 'O'\n",
    "    print(f'{canal:12} {tasa:.3f}  {\"\".join(fila)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cuatro renglones y ya no hace falta que expliques nada. **Los tres de\n",
    "arriba se pisan entre ellos y el de abajo está solo.**\n",
    "\n",
    "Eso contesta antes de que la pregunten la pregunta que iba a venir: si\n",
    "WhatsApp le gana a Tienda. Con los números pelados, 0,652 contra 0,619 parece una\n",
    "ventaja. Con las barras se ve que las dos rayas se solapan casi enteras, o sea\n",
    "que **con estos datos no puedes sostener que uno le gane al otro**.\n",
    "Lo que sí puedes sostener es lo de Marketplace, que no toca a nadie 📊\n",
    "\n",
    "Y por eso vale la pena dibujarlo aunque el gráfico sea feo: **una barra\n",
    "de error hace visible lo que un promedio esconde**. Cuando enseñas cuatro\n",
    "números a secas, quien mira asume que los cuatro son igual de firmes, y no lo\n",
    "son.\n",
    "\n",
    "Regla práctica para tus informes: si vas a comparar grupos, o dibujas la\n",
    "incertidumbre o dices en una línea cuál es. Un ranking sin eso invita a decisiones\n",
    "que los datos no aguantan."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La regla, en una línea"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Qué cambia, cuánto, con cuánta certeza y qué significa en tu\n",
    "negocio.**\n",
    "\n",
    "Los cuatro juntos caben en una frase:\n",
    "\n",
    "*\"Mover clientes a WhatsApp sube la conversión entre 2 y 12 puntos, o sea\n",
    "entre 17.000 y 95.000 soles al año con 1.000 clientes.\"*\n",
    "\n",
    "Eso es el análisis entero, dicho en el idioma de quien paga 🌟"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error de escribir el titular antes de mirar"
   ]
  },
  {
   "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['segmento'].mean()\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: Cannot perform reduction 'mean' with string dtype\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Parece un error tonto y es el síntoma de algo que no lo es: alguien quiso\n",
    "poner \"el segmento promedio\" en una lámina.\n",
    "\n",
    "No existe un segmento promedio. Lo que existe es el más frecuente, que es la\n",
    "moda del capítulo 3. Cuando un titular pide un\n",
    "número que no se puede calcular, casi siempre es porque la frase se escribió\n",
    "antes que el análisis."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- El titular dice qué encontraste, no qué hiciste.\n",
    "\n",
    "- El relativo exagera, y exagera más cuanto más chica es la base.\n",
    "\n",
    "- Puntos porcentuales y por ciento no son lo mismo.\n",
    "\n",
    "- El intervalo va en el titular, no en el anexo: contesta la pregunta antes\n",
    "de que te la hagan.\n",
    "\n",
    "- Traducir a dinero consigue presupuesto, y hay que traducir también el borde\n",
    "bajo.\n",
    "\n",
    "- Qué cambia, cuánto, con cuánta certeza y qué significa."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "Tienes una diferencia de 6,9 puntos con un intervalo que va de 2,1 a 11,8. ¿Cuál de estos titulares se sostiene si te preguntan?\n",
    "\n",
    "a) WhatsApp convierte entre 2 y 12 puntos más, y con 1.000 clientes son unos 56.000 soles\n",
    "\n",
    "b) WhatsApp convierte 11,9% más que Web\n",
    "\n",
    "c) WhatsApp es mejor canal que Web\n",
    "\n",
    "d) Analizamos 3.037 ventas con una prueba t de Welch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. El relativo crece cuando la base baja\n",
    "\n",
    "Comprueba que el mismo punto de mejora se ve distinto según\n",
    "de dónde partas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Traduce el borde bajo, no solo el centro\n",
    "\n",
    "La cuenta que hay que llevar hecha a la reunión."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. El titular de tu compañero, revisado\n",
    "\n",
    "Comprueba si \"casi el doble\" se sostiene."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Cuánto se ensancha el titular si te falta muestra\n",
    "\n",
    "Ve recortando la muestra y mira el intervalo abrirse."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Escribe las cuatro versiones de un tirón\n",
    "\n",
    "Una función para no volver a improvisar el titular."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. El titular con la limitación dentro\n",
    "\n",
    "Cuenta cuántos clientes distintos hay detrás de esas ventas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 19 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/el-titular-va-primero/\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
}
