{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Todo el trabajo es decidir qué no cuentas\n",
    "\n",
    "De 42.518 celdas sale una frase. Cómo se elige qué corte enseñas, cuál te callas y cuál no te puedes callar.\n",
    "\n",
    "Cuaderno de práctica del capítulo 20 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/que-dejas-fuera/\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: \"QXJlcXVpcGEgICBjb252aWVydGUgMC42MTMgfCBuID0gMjg0CkNoaWNsYXlvICAgY29udmllcnRlIDAuNTkgfCBuID0gMjQ0CkN1c2NvICAgICAgY29udmllcnRlIDAuNjM1IHwgbiA9IDI0NApMSU1BICAgICAgIGNvbnZpZXJ0ZSAwLjY2NyB8IG4gPSA2NgpMaW1hICAgICAgIGNvbnZpZXJ0ZSAwLjU0NSB8IG4gPSA1NQpMw61tYSAgICAgICBjb252aWVydGUgMC41OTcgfCBuID0gNjcKUGl1cmEgICAgICBjb252aWVydGUgMC42MjQgfCBuID0gMjYzClRydWppbGxvICAgY29udmllcnRlIDAuNjMxIHwgbiA9IDI0NApsaW1hICAgICAgIGNvbnZpZXJ0ZSAwLjU5MyB8IG4gPSA1OQ==\",\n",
    "    2: \"Qm9kZWdhICAgICAgZGlmIDAuMDYzIHwgaW50ZXJ2YWxvIGNydXphIGVsIGNlcm86IFRydWUKSG9yZWNhICAgICAgZGlmIDAuMDE2IHwgaW50ZXJ2YWxvIGNydXphIGVsIGNlcm86IFRydWUKTWF5b3Jpc3RhICAgZGlmIDAuMDc1IHwgaW50ZXJ2YWxvIGNydXphIGVsIGNlcm86IFRydWUKTWluaW1hcmtldCAgZGlmIDAuMTIzIHwgaW50ZXJ2YWxvIGNydXphIGVsIGNlcm86IEZhbHNl\",\n",
    "    3: \"Y29uICAxIGNvbXBhcmFjaW9uZXMsIHByb2JhYmlsaWRhZCBkZSBhbCBtZW5vcyB1biBmYWxzbyBwb3NpdGl2bzogNS4wICUKY29uICA1IGNvbXBhcmFjaW9uZXMsIHByb2JhYmlsaWRhZCBkZSBhbCBtZW5vcyB1biBmYWxzbyBwb3NpdGl2bzogMjIuNiAlCmNvbiAyMCBjb21wYXJhY2lvbmVzLCBwcm9iYWJpbGlkYWQgZGUgYWwgbWVub3MgdW4gZmFsc28gcG9zaXRpdm86IDY0LjIgJQpjb24gNDkgY29tcGFyYWNpb25lcywgcHJvYmFiaWxpZGFkIGRlIGFsIG1lbm9zIHVuIGZhbHNvIHBvc2l0aXZvOiA5MS45ICU=\",\n",
    "    4: \"RWwgbWF5b3IgZWZlY3RvIGVzdGEgZW4gTWluaW1hcmtldCBjb24gMTIuMyBwdW50b3MuCkVsIG1lbm9yIGVzdGEgZW4gSG9yZWNhIGNvbiAxLjYgcHVudG9zLg==\",\n",
    "    5: \"Y3J1Y2VzIHNlZ21lbnRvIHBvciBjaXVkYWQ6IDM2CmNvbiBtZW5vcyBkZSAxMDAgZmlsYXMgICAgOiAzNgplbCBtYXMgY2hpY28gICAgICAgICAgICAgIDogMTA=\",\n",
    "    6: \"c2UgcHVlZGUgb21pdGlyIHVzZSB1bmEgcHJ1ZWJhIHQgZGUgV2VsY2ggeSBubyBkZSBTdHVkZW50ClZBIERFTlRSTyAgbG9zIGN1YXRybyBpbnRlcnZhbG9zIHBvciBzZWdtZW50byBjcnV6YW4gZWwgY2VybwpzZSBwdWVkZSBvbWl0aXIgdGFyZGUgdHJlcyBkaWFzIGVuIGxpbXBpYXIgbGFzIGNpdWRhZGVzClZBIERFTlRSTyAgbG9zIGNsaWVudGVzIHNlIHJlcGl0ZW4gZW50cmUgZmlsYXM=\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El capítulo anterior fue cómo se dice. Este es qué se dice, que es más\n",
    "difícil 🌸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La proporción, para que veas el tamaño del descarte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "URL = 'https://missyera.com/static/datasets/ventas-miss-yera.csv'\n",
    "df = pd.read_csv(URL)\n",
    "d = df[['canal', 'compro', 'segmento', 'ciudad']].dropna(subset=['canal', 'compro'])\n",
    "sub = d[d['canal'].isin(['WhatsApp', 'Web'])]\n",
    "\n",
    "print('celdas del archivo:', df.size)\n",
    "print('filas que uso     :', len(sub))\n",
    "print('numeros del titular:', 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "42.518 celdas para decir cuatro números. **Analizar es sobre todo\n",
    "descartar**, y nadie te enseña con qué criterio."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El general, y lo que esconde"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w = sub[sub['canal'] == 'WhatsApp']['compro']\n",
    "b = sub[sub['canal'] == 'Web']['compro']\n",
    "print('diferencia general:', round(float(w.mean() - b.mean()), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "6,9 puntos. Ese es el titular del capítulo 19.\n",
    "Ahora ábrelo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for seg in sorted(sub['segmento'].dropna().unique()):\n",
    "    s = sub[sub['segmento'] == seg]\n",
    "    a = s[s['canal'] == 'WhatsApp']['compro']\n",
    "    c = s[s['canal'] == 'Web']['compro']\n",
    "    print(seg.ljust(11), 'WhatsApp', round(float(a.mean()), 3),\n",
    "          '| Web', round(float(c.mean()), 3),\n",
    "          '| dif', round(float(a.mean() - c.mean()), 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mira la distancia: **Minimarket sube 12,3 puntos y Horeca 1,6**.\n",
    "Casi ocho veces.\n",
    "\n",
    "El 6,9 general no está mal calculado, es un promedio correcto. Lo que pasa es\n",
    "que **cambia la recomendación**: con el general, mueves a todos los\n",
    "clientes a WhatsApp. Con la apertura, no mueves a Horeca, porque el esfuerzo no\n",
    "se va a pagar ahí.\n",
    "\n",
    "Ese es el criterio entero de este capítulo: **se enseña lo que cambia\n",
    "la decisión**. No lo que es interesante, no lo que costó trabajo, no lo\n",
    "que quedó bonito."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y entonces por qué no enseñar todos los cortes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La tentación obvia: si abrir por segmento sirvió, abro por todo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "segs = sub['segmento'].nunique()\n",
    "ciu = sub['ciudad'].nunique()\n",
    "print('segmentos:', segs, '| ciudades:', ciu)\n",
    "print('comparaciones posibles:', segs + ciu + segs * ciu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "49 comparaciones con dos columnas. Con cinco columnas son cientos.\n",
    "\n",
    "Y con 49 comparaciones, **alguna va a salir significativa por\n",
    "casualidad**. Es el p-hacking del capítulo 17,\n",
    "y no deja de serlo porque tú no lo estuvieras buscando a propósito.\n",
    "\n",
    "La diferencia entre abrir por segmento y hacer p-hacking no está en el\n",
    "código: está en **cuándo lo decidiste**. Si el corte lo elegiste\n",
    "antes de mirar, porque el negocio funciona distinto en cada segmento, es\n",
    "análisis. Si lo elegiste después, porque ese era el que daba, es otra cosa.\n",
    "\n",
    "Por eso la lista de cortes que vas a mirar se escribe antes, igual que el\n",
    "criterio de la prueba A/B del capítulo 18."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La tabla que nadie lee"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t = sub.pivot_table(index='segmento', columns='canal',\n",
    "                    values='compro', aggfunc='mean').round(3)\n",
    "print(t.to_string())\n",
    "print('celdas:', t.size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ocho celdas, que ya es una tabla chiquita, y aun así nadie la va a leer en\n",
    "una reunión: van a mirar los números buscando el suyo.\n",
    "\n",
    "Lo que sí se lee es la frase que sale de ahí:\n",
    "\n",
    "*\"Minimarket es donde más sube, doce puntos. Horeca casi no se mueve, así\n",
    "que ahí no lo movería.\"*\n",
    "\n",
    "La tabla va igual, en la lámina o en el anexo, porque quien quiera verificar\n",
    "tiene derecho. Pero la tabla **acompaña** a la frase, no la\n",
    "sustituye 🧾"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Del dato a la recomendación, que son cuatro escalones"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hasta acá el capítulo va de qué cortes enseñas y cuáles no. Falta lo otro: en\n",
    "qué se convierte lo que enseñas.\n",
    "\n",
    "Porque el error más común de un informe no es enseñar de más ni de menos, es\n",
    "**entregar el escalón de abajo y llamarlo conclusión**. Los cuatro\n",
    "son estos:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Escalón | Cómo suena |\n",
    "|---|---|\n",
    "| **El dato** | \"Marketplace convierte 0,461\" |\n",
    "| **El hallazgo** | \"Marketplace convierte bastante menos que los otros tres, y la diferencia no se explica por azar\" |\n",
    "| **La lectura** | \"Ahí llega gente comparando precio, no gente que ya nos venía buscando\" |\n",
    "| **La recomendación** | \"Bajemos la inversión en Marketplace un mes y midamos si las ventas totales caen\" |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El primero no lo discute nadie. El segundo tampoco, si hiciste bien el\n",
    "capítulo 18. **El tercero es donde entra tu\n",
    "criterio y donde te puedes equivocar**, y por eso conviene decirlo como lo\n",
    "que es, una lectura, y no colarla como si fuera dato.\n",
    "\n",
    "Un informe que se queda en el primer escalón obliga a que quien lo lee suba\n",
    "los otros tres, y va a subirlos peor que tú porque no miró los datos. Uno que\n",
    "salta directo al cuarto sin enseñar los de abajo no se puede discutir, y lo que\n",
    "no se puede discutir no se aprueba."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cuando el número te sorprende, búscale una segunda fuente"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y una costumbre que vale por muchas técnicas: **si un resultado te\n",
    "sorprende, confírmalo por otro lado antes de contarlo**.\n",
    "\n",
    "Otro lado significa un dato que se haya generado por un camino distinto. Si el\n",
    "sistema dice que las ventas de un canal cayeron, pregúntale a quien atiende ese\n",
    "canal. Si un grupo de clientes aparece raro, mira tres fichas a mano. Si la\n",
    "encuesta dice una cosa, mira si la operación dice lo mismo.\n",
    "\n",
    "A eso le dicen **triangulación**, y no es desconfianza: es que los\n",
    "errores de carga, los filtros mal puestos y las columnas que cambiaron de\n",
    "significado no avisan, y ninguno de ellos sobrevive a que dos fuentes distintas\n",
    "digan lo mismo.\n",
    "\n",
    "La versión corta, que es la que uso: **un número sorprendente es una\n",
    "hipótesis, no un hallazgo**, hasta que algo que no sea la misma consulta\n",
    "lo confirme 🔍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que no te puedes callar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hasta acá hablamos de elegir. Hay una categoría aparte: lo que se dice\n",
    "aunque estropee tu titular.\n",
    "\n",
    "- **La limitación que cambiaría la conclusión.** Si las filas no\n",
    "son independientes, si el periodo fue raro, si un segmento tiene 30 filas.\n",
    "\n",
    "- **El corte que te salió en contra.** Si abriste por ciudad y\n",
    "en dos no funciona, eso se dice. Callarlo es lo que hace que la próxima vez no\n",
    "te crean.\n",
    "\n",
    "- **Que es correlación y no causa**, cuando no hubo asignación\n",
    "al azar.\n",
    "\n",
    "- **De dónde salieron los supuestos** del cálculo de dinero.\n",
    "\n",
    "La regla que uso: si alguien lo descubriera **después** de\n",
    "decidir, ¿se sentiría engañado? Si la respuesta es sí, va dentro 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error de cortar hasta que no quede nada"
   ]
  },
  {
   "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",
    "    sub[sub['ciudad'] == 'Tarapoto']['compro'].value_counts(normalize=True).loc[1]\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: 1\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un `KeyError` pelado, que no dice nada de lo que pasó de verdad:\n",
    "en Tarapoto no hay ninguna venta, así que no hay nada que contar y no existe la\n",
    "clave.\n",
    "\n",
    "Este error sale cuando encadenas filtros buscando el corte que dé bonito. Y\n",
    "la versión peligrosa es la que **no** revienta: te quedan cuatro\n",
    "filas, sale un 75% espectacular, y ese número acaba en una lámina sin el\n",
    "`n = 4` al lado.\n",
    "\n",
    "La costumbre que lo evita: **imprimir el tamaño del grupo junto al\n",
    "porcentaje, siempre**. No hay excepciones para esa regla."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- De 42.518 celdas salen cuatro números. Analizar es descartar.\n",
    "\n",
    "- Se enseña lo que cambia la decisión.\n",
    "\n",
    "- El promedio general puede ser correcto y esconder lo que importa.\n",
    "\n",
    "- Elegir el corte después de ver los resultados es p-hacking.\n",
    "\n",
    "- La tabla acompaña la frase, no la sustituye.\n",
    "\n",
    "- Lo que se calla se elige; la limitación que cambiaría la conclusión no se\n",
    "elige, va dentro.\n",
    "\n",
    "- El porcentaje sin el tamaño del grupo al lado es medio dato."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "El promedio general dice +6,9 puntos, pero por segmento va de +1,6 en Horeca a +12,3 en Minimarket. ¿Qué llevas a la reunión?\n",
    "\n",
    "a) El general y la apertura por segmento, porque cambian la recomendación: Horeca no se mueve\n",
    "\n",
    "b) Solo el general, porque es el resultado del análisis\n",
    "\n",
    "c) Solo la apertura, porque el detalle siempre es mejor\n",
    "\n",
    "d) Las 49 comparaciones posibles, para que decidan ellos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Siempre el n al lado del porcentaje\n",
    "\n",
    "Mira cuánto cambia la lectura cuando aparece el tamaño."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. El corte que te sale en contra\n",
    "\n",
    "Búscalo a propósito, porque es el que hay que contar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Cuántas comparaciones hacen falta para encontrar algo\n",
    "\n",
    "La cuenta que explica el p-hacking sin fórmulas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. El resumen de una línea, generado\n",
    "\n",
    "Que la frase salga del dato y no de tu memoria."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. La limitación, medida en vez de intuida\n",
    "\n",
    "Cuenta cuántos grupos tienen menos de 100 filas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. La prueba del engaño\n",
    "\n",
    "Aplica la regla a tres cosas que podrías callarte."
   ]
  },
  {
   "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 20 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/que-dejas-fuera/\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
}
