{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ¿Qué prueba uso?\n",
    "\n",
    "t, ji cuadrado, ANOVA y las no paramétricas, elegidas por el tipo de variable y comprobadas sobre las mismas ventas.\n",
    "\n",
    "Cuaderno de práctica del capítulo 13 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-prueba-uso/\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: \"Y29tcHJvICAgICAgICAgICAwICAgICAgMQpjYW5hbCAgICAgICAgICAgICAgICAgICAgCk1hcmtldHBsYWNlICA0Ljk0NSAtNC4yMjgKVGllbmRhICAgICAgLTEuNzQ4ICAxLjQ5NQpXZWIgICAgICAgICAtMC4xMzYgIDAuMTE2CldoYXRzQXBwICAgIC0zLjE5NCAgMi43MzE=\",\n",
    "    2: \"Y29tcHJvICAgIDAgIDEKc2VnbWVudG8gICAgICAKRmFsc2UgICAgIDMgIDEKVHJ1ZSAgICAgIDAgIDEKCmVzcGVyYWRvIG1hcyBjaGljbzogMC40MApqaSBjdWFkcmFkbzogcCA9IDAuODE5NQpGaXNoZXI6ICAgICAgcCA9IDAuNDAwMA==\",\n",
    "    3: \"NiBjb21wYXJhY2lvbmVzLCBhbGZhIGNvcnJlZ2lkbyA9IDAuMDA4MwoKQm9kZWdhICAgICAgdnMgSG9yZWNhICAgICAgcCA9IDAuMDAwMDAwICBzaWcgc2lnIGNvcnJlZ2lkbwpCb2RlZ2EgICAgICB2cyBNYXlvcmlzdGEgICBwID0gMC4wMDAwMDAgIHNpZyBzaWcgY29ycmVnaWRvCkJvZGVnYSAgICAgIHZzIE1pbmltYXJrZXQgIHAgPSAwLjAwMDAwMCAgc2lnIHNpZyBjb3JyZWdpZG8KSG9yZWNhICAgICAgdnMgTWF5b3Jpc3RhICAgcCA9IDAuMDAwMTQyICBzaWcgc2lnIGNvcnJlZ2lkbwpIb3JlY2EgICAgICB2cyBNaW5pbWFya2V0ICBwID0gMC4wMTE4MDYgIHNpZyAKTWF5b3Jpc3RhICAgdnMgTWluaW1hcmtldCAgcCA9IDAuMDAwMDAwICBzaWcgc2lnIGNvcnJlZ2lkbw==\",\n",
    "    4: \"Y2xpZW50ZXMgZW4gbG9zIGRvcyB0cmFtb3M6IDUwNwpwcm9tZWRpbyBhbnRlczogICA4MjIuMzQKcHJvbWVkaW8gZGVzcHVlczogNzk4Ljc1CgplbXBhcmVqYWRhOiAgICAgIHAgPSAwLjQ3NzIKc2luIGVtcGFyZWphcjogICBwID0gMC40NzIy\",\n",
    "    5: \"c2luIHRvY2FyIG5hZGE6CiAgdDogICAgICAgICAgICBwID0gMS4wNDJlLTIyMgogIE1hbm4tV2hpdG5leTogcCA9IDYuODA4ZS0xODkKCm1ldGllbmRvIHVuYSB2ZW50YSBkZSA1MDAwMDAgZW4gQm9kZWdhOgogIG1lZGlhIGRlIEJvZGVnYSBwYXNhIGRlIDE3OC43MCBhIDg4NC42NgogIHQ6ICAgICAgICAgICAgcCA9IDAuNTA2MAogIE1hbm4tV2hpdG5leTogcCA9IDYuNjYyZS0xODg=\",\n",
    "    6: \"c2VnbWVudG8gICB2cyBjb21wcm8gIC0+IGppIGN1YWRyYWRvICBwID0gNy4xOTNlLTQyICAKY2l1ZGFkICAgICB2cyBjb21wcm8gIC0+IGppIGN1YWRyYWRvICBwID0gMC45ODEzICAgICAKY2FuYWwgICAgICB2cyBtb250byAgIC0+IEFOT1ZBICAgICAgICBwID0gMC45MDU2ICAgICAKc2VnbWVudG8gICB2cyBtb250byAgIC0+IEFOT1ZBICAgICAgICBwID0gMCAgICAgICAgICA=\",\n",
    "    7: \"QU5PVkEgICAgICAgIDogcCA9IDAuMDAwMDAwZSswMApLcnVza2FsICAgICAgOiBwID0gMC4wMDAwMDBlKzAwCgpwb3IgY2l1ZGFkLCBBTk9WQSAgOiBwID0gMC44NDI5CnBvciBjaXVkYWQsIEtydXNrYWw6IHAgPSAwLjk5MDE=\",\n",
    "    8: \"Y2l1ZGFkICAgICAgY2hpMiA9ICAgICAwLjczICAgcCA9IDAuOTgxMzI1CmNhbmFsICAgICAgIGNoaTIgPSAgICA2NS4zMSAgIHAgPSAwLjAwMDAwMApjYXRlZ29yaWEgICBjaGkyID0gICAgIDEuNjEgICBwID0gMC44MDY3MzQKc2VnbWVudG8gICAgY2hpMiA9ICAgMTk0LjMwICAgcCA9IDAuMDAwMDAw\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya sabes qué es un valor p. Ahora toca la pregunta práctica que atasca a todo\n",
    "el mundo: **¿cuál de todas las pruebas uso?** 🧰\n",
    "\n",
    "La buena noticia es que la respuesta es casi mecánica. Depende del tipo de las\n",
    "dos variables que estés comparando, que es justo lo del capítulo 2."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Lo que comparas | Prueba | Si hay cola o pocos datos |\n",
    "|---|---|---|\n",
    "| Categórica contra categórica | Ji cuadrado | Prueba exacta de Fisher |\n",
    "| Numérica entre 2 grupos | Prueba t | Mann-Whitney |\n",
    "| Numérica entre 3 o más grupos | ANOVA | Kruskal-Wallis |\n",
    "| Numérica contra numérica | Correlación | Spearman (capítulo 15) |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vamos con las tres primeras sobre las ventas de siempre."
   ]
  },
  {
   "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",
    "print('filas:', len(v))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y una pregunta que ordena el capítulo entero: **¿qué tipo de dato tienen las dos cosas que quieres comparar?** Con eso contestado, la prueba se elige sola y no hace falta memorizar nada 🧰"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ji cuadrado: dos categóricas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Es la prueba de la independencia del capítulo 7, con un número encima.\n",
    "Empezamos por la tabla:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tabla = pd.crosstab(v['ciudad'], v['compro'])\n",
    "print(tabla)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "chi2, p, gl, esperados = stats.chi2_contingency(tabla)\n",
    "\n",
    "print('ji cuadrado: %.4f' % chi2)\n",
    "print('grados de libertad: %d' % gl)\n",
    "print('valor p: %.4f' % p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "p = 0,9813. **El 98% de los mundos sin efecto darían una tabla al menos\n",
    "tan desigual como esta** 🤷\n",
    "\n",
    "Este es el número que llevo prometiendo desde el capítulo 1, y ahí está: la\n",
    "ciudad no tiene absolutamente nada que decir sobre si una venta se cierra.\n",
    "\n",
    "Lo bonito de ji cuadrado es lo que hay dentro: compara lo observado con lo que\n",
    "saldría si fueran independientes, que es justo el producto de probabilidades del\n",
    "capítulo 7."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "χ2=∑(O−E)2E\n",
    "\n",
    "sumas, celda por celda, cuánto se aleja lo observado de lo que saldría si las dos columnas fueran independientes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(pd.DataFrame(esperados.round(1), index=tabla.index,\n",
    "                   columns=tabla.columns))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compara con la tabla real: 232 contra 230,6, 218 contra 215,4... Todas\n",
    "pegadas. Por eso el ji cuadrado sale casi cero 🎯\n",
    "\n",
    "Ahora las cuatro categóricas del archivo, de una pasada:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in ['ciudad', 'categoria', 'canal', 'segmento']:\n",
    "    chi2, p, gl, esp = stats.chi2_contingency(pd.crosstab(v[col], v['compro']))\n",
    "    print('%-11s chi2 = %8.4f | p = %.4g' % (col, chi2, p))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está el archivo entero resumido en cuatro líneas 🏆 Segmento y canal\n",
    "mandan; ciudad y categoría no dicen nada.\n",
    "\n",
    "Es exactamente el mismo orden que salió en el capítulo 7 con el cálculo\n",
    "casero. Lo que añade la prueba es el \"cuánto hace falta para no ser casualidad\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora lo que casi nadie hace: mirar los residuos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un ji cuadrado te dice \"aquí pasa algo\" pero no *dónde*. Para eso están\n",
    "los residuos, que miden cuánto se desvía cada celda:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tabla_seg = pd.crosstab(v['segmento'], v['compro'])\n",
    "chi2, p, gl, esp = stats.chi2_contingency(tabla_seg)\n",
    "\n",
    "residuos = (tabla_seg - esp) / np.sqrt(esp)\n",
    "print(residuos.round(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahora sí se ve la película 🎬\n",
    "\n",
    "Un residuo se lee como una puntuación z: por encima de 2 en valor absoluto ya\n",
    "es notable, por encima de 3 es fuerte.\n",
    "\n",
    "- 🔴 **Bodega: +8,299** en la columna de \"no compró\". Es la celda\n",
    "que más manda de toda la tabla: hay muchísimas más bodegas que no compran de las\n",
    "que cabría esperar.\n",
    "\n",
    "- 🟢 **Mayorista: +5,273** en \"sí compró\". La otra punta.\n",
    "\n",
    "- ⚪ **Minimarket: 0,365 y -0,312**. Se comporta exactamente como\n",
    "la media. No aporta nada al resultado.\n",
    "\n",
    "O sea que ese ji cuadrado de 194,30 no viene de los cuatro segmentos: viene\n",
    "sobre todo de Bodega. Si el negocio quiere mover una aguja,\n",
    "**ahí** está la aguja 📍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ANOVA: una numérica entre varios grupos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La prueba t compara dos grupos. Con cuatro, la que toca es ANOVA:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "grupos = [g['monto'].values for _, g in v.groupby('canal')]\n",
    "print('monto por canal:', stats.f_oneway(*grupos))\n",
    "\n",
    "grupos_seg = [g['monto'].values for _, g in v.groupby('segmento')]\n",
    "print('monto por segmento:', stats.f_oneway(*grupos_seg))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los dos extremos posibles, en la misma pantalla 😄\n",
    "\n",
    "Por canal, p = 0,9056: los cuatro canales facturan lo mismo por venta. Por\n",
    "segmento, p = 0,0 literal, o sea tan chico que ni se representa.\n",
    "\n",
    "Y aquí hay una pregunta que quizá te estés haciendo: si tengo cuatro grupos,\n",
    "¿por qué no hago las seis pruebas t de todos contra todos? Porque cada prueba\n",
    "tiene su 5% de falsa alarma, y seis pruebas suben eso al 26%. ANOVA hace una sola\n",
    "pregunta (\"¿hay algún grupo distinto?\") con un solo 5% 🛡️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Las no paramétricas, para cuando hay cola"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ANOVA y la t comparan medias y suponen forma acampanada. Y ya sabemos que el\n",
    "monto tiene una cola de campeonato. La versión que no supone nada compara\n",
    "posiciones en vez de valores:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('ANOVA por canal:          p = %.4f' % stats.f_oneway(*grupos).pvalue)\n",
    "print('Kruskal-Wallis por canal: p = %.4f' % stats.kruskal(*grupos).pvalue)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "0,9056 y 0,8179. Las dos dicen lo mismo, así que la cola no estaba\n",
    "molestando 👍\n",
    "\n",
    "Mi criterio, y te lo doy como criterio y no como ley: **corre las dos y\n",
    "mira si coinciden**. Cuando coinciden, reporta la paramétrica que todo el\n",
    "mundo entiende. Cuando discrepan, la cola sí importa y hay que mirar por qué."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error del capítulo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Quiero ji cuadrado sobre un cruce que no existe:"
   ]
  },
  {
   "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.chi2_contingency([[10, 5], [0, 0]])\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: The internally computed table of expected frequencies has a zero element at (np.int64(1), np.int64(0)).\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ese error es de los que enseñan 🎓\n",
    "\n",
    "Ji cuadrado divide entre los valores esperados. Si una fila entera está vacía,\n",
    "su esperado es cero y la división se va al infinito. No es un capricho del\n",
    "software: la prueba **no está definida** ahí.\n",
    "\n",
    "Y hay un pariente que no da error y que hay que vigilar. La regla es que\n",
    "**ningún esperado debería bajar de 5**:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "chi2, p, gl, esp = stats.chi2_contingency(pd.crosstab(v['ciudad'], v['compro']))\n",
    "print('el esperado mas chico de nuestra tabla: %.1f' % esp.min())\n",
    "\n",
    "pequena = pd.crosstab(v['ciudad'], v['compro']).head(2) // 100\n",
    "print()\n",
    "print(pequena)\n",
    "chi2b, pb, glb, espb = stats.chi2_contingency(pequena)\n",
    "print('esperado mas chico: %.2f | p = %.4f' % (espb.min(), pb))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Con esperados de 1,78 la prueba corre igual y te devuelve un p tan formal como\n",
    "cualquier otro 😑 Solo que no vale nada, porque la aproximación en la que se\n",
    "basa necesita celdas con al menos cinco casos esperados.\n",
    "\n",
    "Para tablas chicas está la prueba exacta de Fisher, que calcula la\n",
    "probabilidad contando todas las tablas posibles en vez de aproximar."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y dos más, y las dos se quejan de lo mismo"
   ]
  },
  {
   "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.f_oneway(v['monto'])\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: At least two samples are required; got 1.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ANOVA compara **varios** grupos, así que con uno no hay nada que comparar. Sale al pasarle la columna entera en vez de la lista de grupos, que es justo la confusión que este capítulo intenta quitar."
   ]
  },
  {
   "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.kruskal(v['monto'])\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",
    "IndexError: tuple index out of range\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y su prima no paramétrica se queja de lo mismo, aunque con un mensaje muchísimo peor: un `IndexError` que no dice nada. Guárdate esto, que vale para toda la librería: **un mensaje malo no significa un error raro**. Cuando no entiendas la queja, lo primero que hay que mirar es si le pasaste los datos con la forma que pedía 🧩"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practica 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. ¿Qué canal manda dentro del ji cuadrado?\n",
    "\n",
    "Ya sabemos que canal sale con p = 4,3e-14. Saca los\n",
    "residuos y di qué canal es el responsable."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. La prueba de Fisher para tablas chicas\n",
    "\n",
    "Coge las ventas de un solo día y compara segmento contra\n",
    "compra con las dos pruebas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Todas contra todas, con y sin corrección\n",
    "\n",
    "Haz las seis comparaciones de segmentos dos a dos y cuenta\n",
    "cuántas salen significativas. Luego aplica la corrección de Bonferroni."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Comparar la misma cosa antes y después\n",
    "\n",
    "Las pruebas de arriba comparan grupos distintos. Prueba la\n",
    "versión emparejada: parte el año y compara los mismos clientes en los dos\n",
    "tramos."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Cuando la paramétrica y la no paramétrica discrepan\n",
    "\n",
    "Fabrica el caso: coge los montos de Bodega, mételes un\n",
    "atípico enorme y mira qué prueba se deja engañar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Tu elector de pruebas\n",
    "\n",
    "Escribe una función que, dadas dos columnas, elija la\n",
    "prueba y la corra."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. La paramétrica y la no paramétrica, lado a lado\n",
    "\n",
    "Corre ANOVA y Kruskal sobre segmento y sobre ciudad, y compara."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. Ji cuadrado sobre las cuatro categóricas\n",
    "\n",
    "Cruza cada columna categórica contra si el pedido cerró, y ordénalas por lo que separan."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 8\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La prueba equivocada sobre los datos correctos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Antes de cerrar, la trampa. Y esta vez el resultado sale bien igual, que es lo que hace que nadie la corrija 😵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Comparas el monto antes y después del descuento para ver cuánto se está regalando. Usas la prueba t de siempre, sale significativo, y lo das por bueno.\n",
    "\n",
    "```\n",
    "from scipy import stats\n",
    "\n",
    "print(stats.ttest_ind(antes, despues).pvalue)\n",
    "# 0.0001\n",
    "\n",
    "print(stats.ttest_rel(antes, despues).pvalue)\n",
    "# 4.4e-176\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",
    "El ji cuadrado del segmento sale 194,30 con p = 7,2e-42. ¿Qué haces después?\n",
    "\n",
    "a) Miro los residuos para saber qué celda manda\n",
    "\n",
    "b) Reporto que el segmento es significativo y sigo\n",
    "\n",
    "c) Hago las seis pruebas de a dos para ver cuáles difieren\n",
    "\n",
    "d) Reviso si la muestra es suficiente"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 🧰 La prueba la elige el tipo de las variables. Dos categóricas, ji cuadrado.\n",
    "Numérica entre dos grupos, t. Entre tres o más, ANOVA.\n",
    "\n",
    "- 📊 Ciudad da p = 0,9813 y categoría 0,8067: nada. Canal 4,3e-14 y segmento\n",
    "7,2e-42: todo.\n",
    "\n",
    "- 🔍 Los residuos dicen dónde está el efecto. Bodega tiene +8,299 en \"no\n",
    "compró\" y Minimarket 0,365, o sea que Minimarket no aporta nada al\n",
    "resultado.\n",
    "\n",
    "- 🛡️ ANOVA en vez de seis pruebas t porque seis pruebas al 5% suben la falsa\n",
    "alarma al 26%.\n",
    "\n",
    "- 👻 Ji cuadrado con esperados de 1,78 corre igual y devuelve un p que no vale\n",
    "nada. Con cinco filas, ji cuadrado dio 0,8195 y Fisher 0,4000 sobre la misma\n",
    "tabla.\n",
    "\n",
    "- 🪨 Una sola venta inventada llevó la prueba t de p = 10⁻²²² a p = 0,5060, y\n",
    "la media de Bodega de 178,70 a 884,66. Mann-Whitney ni se movió.\n",
    "\n",
    "- 🔗 Si puedes emparejar, empareja: la prueba emparejada se quita de encima\n",
    "toda la variación entre individuos.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La prueba no se elige por costumbre. La eligen los tipos de las dos\n",
    "variables que comparas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Las cuatro pruebas de este capítulo salen de `scipy.stats`, que es\n",
    "una línea de import. Si Python todavía te da respeto, empieza por el\n",
    "[libro de Python](https://missyera.com/guias/python-desde-cero/) 🧰"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué viene ahora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo este capítulo devuelve valores p, y ya avisé en el 10 de que un p no\n",
    "mide importancia. En el capítulo 14 vemos lo que hay que reportar al lado:\n",
    "el tamaño del efecto y la potencia 📐"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Qué es la prueba de chi cuadrado?La prueba para saber si dos variables de categorías tienen que ver una con la otra. Canal y si compró o no, por ejemplo.\n",
    "\n",
    "¿Cuándo uso chi cuadrado y cuándo una prueba t?Chi cuadrado cuando las dos variables son categorías. La prueba t cuando comparas el promedio de un número entre dos grupos.\n",
    "\n",
    "¿Qué es ANOVA y en qué se diferencia de la prueba t?ANOVA compara promedios de tres grupos o más. La prueba t solo compara dos, y hacer muchas pruebas t seguidas es como comprar muchos boletos: alguna sale significativa por azar.\n",
    "\n",
    "¿Qué pruebas uso si mis datos no son normales?Las no paramétricas: Mann Whitney en vez de la t, Kruskal Wallis en vez de ANOVA. Trabajan sobre el orden de los datos y no piden campana."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 13 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/que-prueba-uso/\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
}
