{
 "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": [
    "## 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
}
