{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# La correlación que salió cero\n",
    "\n",
    "Pearson, Spearman, y la frase que hay que decir en voz alta cada vez que aparece un coeficiente.\n",
    "\n",
    "Cuaderno de práctica del capítulo 15 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/correlacion/\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: \"ICAgICAgICAgICAgdW5pZGFkZXMgICAgbW9udG8Kc2VnbWVudG8KQm9kZWdhICAgICAgICAgMTEuMzUgICAxNzguNzAKSG9yZWNhICAgICAgICAgMTEuNTQgICA3NTUuMTgKTWF5b3Jpc3RhICAgICAgMTEuNzMgIDE4NTYuMzQKTWluaW1hcmtldCAgICAgMTEuNzYgICA0MTQuOTIKCmNvbiBsYXMgMzAwMCB2ZW50YXM6ICAgICAgciA9ICswLjAxNzgKY29uIGxhcyA0IG1lZGlhczogICAgICAgICByID0gKzAuNTQzMw==\",\n",
    "    2: \"Y29ycmVsYWNpb24gY29tcHJvLW1vbnRvOiByID0gMC4xOTY3IHwgcCA9IDEuNDdlLTI3CnIgYWwgY3VhZHJhZG86IDAuMDM4NwoKbWVkaWEgc2kgY29tcHJvOiAgICA5MzAuMjQKbWVkaWEgc2kgbm8gY29tcHJvOiA2MzAuNzcKcHJ1ZWJhIHQ6IHAgPSAxLjAzZS0yOA==\",\n",
    "    3: \"bW9udG8gdnMgZGlhczogciA9IC0wLjAwMTggfCBwID0gMC45MjA4CnRvdGFsIG1lbnN1YWwgdnMgbWVzOiByID0gLTAuMDQyMCB8IHAgPSAwLjg2ODU=\",\n",
    "    4: \"cGFyZWphcyByZXZpc2FkYXM6IDE5MApzaWduaWZpY2F0aXZhczogICAgNQogIGM1IHZzIGMxNDogciA9ICswLjAzNjQgfCBwID0gMC4wNDYxCiAgYzggdnMgYzEyOiByID0gLTAuMDQwMSB8IHAgPSAwLjAyNzkKICBjMTEgdnMgYzE2OiByID0gKzAuMDU1NiB8IHAgPSAwLjAwMjMKICBjMTEgdnMgYzE5OiByID0gLTAuMDQ2NyB8IHAgPSAwLjAxMDUKICBjMTUgdnMgYzE2OiByID0gKzAuMDM2MyB8IHAgPSAwLjA0Njc=\",\n",
    "    5: \"dW5pZGFkZXMgICB2cyBtb250byAgICAgICAgcGVhcnNvbiArMC4wMTc4IHwgc3BlYXJtYW4gKzAuMDIyNAp1bmlkYWRlcyAgIHZzIGRlc2N1ZW50byAgICBwZWFyc29uIC0wLjAwNzggfCBzcGVhcm1hbiAtMC4wMDUxCnVuaWRhZGVzICAgdnMgY29tcHJvICAgICAgIHBlYXJzb24gKzAuMDE2NyB8IHNwZWFybWFuICswLjAyMTcKbW9udG8gICAgICB2cyBkZXNjdWVudG8gICAgcGVhcnNvbiAtMC4wMjY1IHwgc3BlYXJtYW4gLTAuMDIwMQptb250byAgICAgIHZzIGNvbXBybyAgICAgICBwZWFyc29uICswLjE5NjcgfCBzcGVhcm1hbiArMC4yMzUxICA8LS0gZGlzY3JlcGFuCmRlc2N1ZW50byAgdnMgY29tcHJvICAgICAgIHBlYXJzb24gKzAuMDUyMCB8IHNwZWFybWFuICswLjA1MjY=\",\n",
    "    6: \"dW5pZGFkZXMgdnMgbW9udG8gICAgICBwZWFyc29uICswLjAxNzggfCBzcGVhcm1hbiArMC4wMjI0IHwgbj0zMDAwCnVuaWRhZGVzIHZzIHNhdGlzZmFjY2lvbiBwZWFyc29uICswLjAwMDAgfCBzcGVhcm1hbiArMC4wMDQ2IHwgbj0yNzY5IHwgc2UgZGVzY2FydGFyb24gMjMxIGZpbGFzCmxhIG51YmUgY29uIGF0aXBpY28gICAgcGVhcnNvbiArMC41MDQ1IHwgc3BlYXJtYW4gLTAuMTE2MCB8IG49MjAwIHwgcGVhcnNvbiB5IHNwZWFybWFuIGRpc2NyZXBhbjogbWlyYSBhdGlwaWNvcyBvIGN1cnZhcwptb250byB2cyBjb21wcm8gICAgICAgIHBlYXJzb24gKzAuMTk2NyB8IHNwZWFybWFuICswLjIzNTEgfCBuPTMwMDA=\",\n",
    "    7: \"UGVhcnNvbjoKICAgICAgICAgICAgICB1bmlkYWRlcyAgbW9udG8gIGRlc2N1ZW50byAgc2F0aXNmYWNjaW9uCnVuaWRhZGVzICAgICAgICAgMS4wMDAgIDAuMDA2ICAgICAtMC4wMDQgICAgICAgIC0wLjAyNAptb250byAgICAgICAgICAgIDAuMDA2ICAxLjAwMCAgICAgLTAuMDI0ICAgICAgICAtMC4wMTAKZGVzY3VlbnRvICAgICAgIC0wLjAwNCAtMC4wMjQgICAgICAxLjAwMCAgICAgICAgLTAuMDE5CnNhdGlzZmFjY2lvbiAgICAtMC4wMjQgLTAuMDEwICAgICAtMC4wMTkgICAgICAgICAxLjAwMAoKU3BlYXJtYW46CiAgICAgICAgICAgICAgdW5pZGFkZXMgIG1vbnRvICBkZXNjdWVudG8gIHNhdGlzZmFjY2lvbgp1bmlkYWRlcyAgICAgICAgIDEuMDAwICAwLjAxMyAgICAgLTAuMDAxICAgICAgICAtMC4wMTkKbW9udG8gICAgICAgICAgICAwLjAxMyAgMS4wMDAgICAgIC0wLjAyMCAgICAgICAgLTAuMDA2CmRlc2N1ZW50byAgICAgICAtMC4wMDEgLTAuMDIwICAgICAgMS4wMDAgICAgICAgIC0wLjAxOQpzYXRpc2ZhY2Npb24gICAgLTAuMDE5IC0wLjAwNiAgICAgLTAuMDE5ICAgICAgICAgMS4wMDA=\",\n",
    "    8: \"c2VnbWVudG8gICAgICBQZWFyc29uICAgICAgICBuCkJvZGVnYSAgICAgICAgICAwLjAxNiAgICAgIDcwNwpIb3JlY2EgICAgICAgICAtMC4wMTYgICAgICA3NDIKTWF5b3Jpc3RhICAgICAgIDAuMDMwICAgICAgNzUwCk1pbmltYXJrZXQgICAgIC0wLjAxMSAgICAgIDgwMQoKVE9ET1MgICAgICAgICAgIDAuMDE4ICAgICAzMDAw\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Última herramienta del libro, y la que más se usa mal: la\n",
    "**correlación** 📈\n",
    "\n",
    "Mide si dos variables se mueven juntas, en una escala de -1 a 1. Cerca de 1,\n",
    "cuando una sube la otra sube. Cerca de -1, cuando una sube la otra baja. Cerca de\n",
    "0, ni idea."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "r=∑(xi−x¯)(yi−y¯)∑(xi−x¯)2∑(yi−y¯)2\n",
    "\n",
    "mide si las dos variables se alejan de su media en la misma dirección, dividido entre lo que se alejan por separado"
   ]
  },
  {
   "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(v[['unidades', 'monto', 'descuento', 'satisfaccion', 'compro']]\n",
    "      .corr().round(4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahí está el hallazgo que llevo prometiendo desde el capítulo 14 👀\n",
    "\n",
    "Y una pregunta antes de mirar ningún número: **¿qué esperarías que estuviera relacionado en tu negocio?** Escríbelo primero. Buscar después de mirar es la forma más rápida de encontrar cosas que no existen 📉"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vender más unidades no da más dinero"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r, p = stats.pearsonr(v['unidades'], v['monto'])\n",
    "\n",
    "print('correlacion unidades-monto: %.4f' % r)\n",
    "print('valor p: %.4f' % p)\n",
    "print('r al cuadrado: %.6f' % (r ** 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**0,0178.** Prácticamente cero, y con p = 0,3291, o sea que ni\n",
    "siquiera se distingue del ruido 🤯\n",
    "\n",
    "Piénsalo un segundo porque es contraintuitivo de verdad: *saber cuántas\n",
    "unidades lleva una venta no te dice absolutamente nada de cuánto dinero\n",
    "factura*.\n",
    "\n",
    "Ese **r al cuadrado** lo dice de la forma más clara que hay:\n",
    "0,000318, o sea que las unidades explican el **0,03%** de la\n",
    "variación del monto. Nada.\n",
    "\n",
    "¿Y por qué? Mira los precios:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "v['precio_unitario'] = v['monto'] / v['unidades']\n",
    "print(v.groupby('segmento')['precio_unitario'].mean().round(2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está 💡 El precio unitario va de 26,59 a 279,61 soles según el segmento.\n",
    "Diez veces de diferencia.\n",
    "\n",
    "Como cada segmento compra alrededor de las mismas 11 unidades por venta (lo\n",
    "vimos en el capítulo 4: la media era 11,60 en todos), lo que decide el monto no\n",
    "son las unidades sino **quién compra**.\n",
    "\n",
    "Y aquí viene la pregunta obligatoria: ¿será que la correlación existe dentro\n",
    "de cada segmento y se pierde al mezclar?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for seg, g in v.groupby('segmento'):\n",
    "    r, p = stats.pearsonr(g['unidades'], g['monto'])\n",
    "    print('%-11s r = %+.4f | p = %.4f | n = %d' % (seg, r, p, len(g)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pues no. Es cero también dentro de cada segmento 😅\n",
    "\n",
    "O sea que este es un cero de verdad, no un artefacto de mezclar. En estas\n",
    "ventas, las unidades y el dinero son variables independientes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La misma correlación con tres formas distintas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahora el aviso que hay que tener grabado. Un coeficiente resume una nube de\n",
    "puntos en un número, y por el camino se pierde muchísimo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generador = np.random.default_rng(7)\n",
    "n = 200\n",
    "\n",
    "x_recta = generador.uniform(0, 10, n)\n",
    "y_recta = 2 * x_recta + generador.normal(0, 4, n)\n",
    "\n",
    "x_curva = generador.uniform(-5, 5, n)\n",
    "y_curva = x_curva ** 2 + generador.normal(0, 3, n)\n",
    "\n",
    "x_nube = np.append(generador.normal(0, 1, n - 1), 15)\n",
    "y_nube = np.append(generador.normal(0, 1, n - 1), 15)\n",
    "\n",
    "print('recta con ruido:  r = %+.4f' % stats.pearsonr(x_recta, y_recta)[0])\n",
    "print('curva en U:       r = %+.4f' % stats.pearsonr(x_curva, y_curva)[0])\n",
    "print('nube + 1 atipico: r = %+.4f' % stats.pearsonr(x_nube, y_nube)[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los tres casos que hay que conocer 🎭\n",
    "\n",
    "**La curva en U da r = -0,0268**, o sea cero. Y sin embargo la\n",
    "relación es perfecta: *y* es exactamente *x* al cuadrado. Lo que\n",
    "pasa es que Pearson solo ve líneas rectas, y una U no lo es.\n",
    "\n",
    "**La nube con un atípico da r = 0,5045**, que en un informe se\n",
    "leería como \"correlación moderada\". Miremos qué pasa si quito esa fila:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('con el atipico:  r = %+.4f' % stats.pearsonr(x_nube, y_nube)[0])\n",
    "print('sin el atipico:  r = %+.4f' % stats.pearsonr(x_nube[:-1], y_nube[:-1])[0])\n",
    "print('Spearman (con el atipico): r = %+.4f' % stats.spearmanr(x_nube, y_nube)[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "De 0,5045 a -0,0917 por **una fila entre doscientas** 😱\n",
    "\n",
    "Y mira lo que hace Spearman: da -0,1160 incluso con el atípico dentro. Como\n",
    "trabaja con posiciones y no con valores, ese punto es solo \"el último de la\n",
    "fila\", igual que pasaba con Mann-Whitney en el capítulo 13."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pearson o Spearman"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|  | Pearson | Spearman |\n",
    "|---|---|---|\n",
    "| Qué mide | Relación en línea recta | Si una sube cuando la otra sube, aunque no sea recta |\n",
    "| Usa | Los valores | Las posiciones |\n",
    "| Atípicos | Le afectan muchísimo | Casi nada |\n",
    "| Cuándo | Datos limpios y relación recta | Ante la duda, esta |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mi costumbre: **calcular las dos y comparar**. Si coinciden,\n",
    "reporta Pearson que se entiende mejor. Si discrepan mucho, hay atípicos o la\n",
    "relación no es recta, y toca mirar 👀"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La frase que hay que decir en voz alta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Correlación no implica causalidad.**\n",
    "\n",
    "Todo el mundo la sabe y casi nadie la aplica. Cuando veas dos cosas que se\n",
    "mueven juntas, hay cuatro explicaciones posibles y solo una es la que quieres:\n",
    "\n",
    "- ➡️ A causa B. Lo que esperabas.\n",
    "\n",
    "- ⬅️ B causa A. Al revés de lo que pensabas.\n",
    "\n",
    "- 🎭 Hay un C que causa las dos. El caso más común y el más traicionero.\n",
    "\n",
    "- 🎲 Casualidad. Si miraste muchas parejas, alguna sale.\n",
    "\n",
    "En este archivo tenemos un ejemplo perfecto del tercero. La correlación entre\n",
    "monto y compra es 0,1967, y podría contarse como \"las ventas grandes se cierran\n",
    "más\". Pero ya sabemos por los capítulos 3 y 13 que hay un C detrás: el\n",
    "**segmento**, que sube las dos cosas a la vez 🎭"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error del capítulo"
   ]
  },
  {
   "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.pearsonr(v['unidades'].head(10), v['monto'].head(5))\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: `x` and `y` must be broadcastable.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dos columnas de largos distintos. Y este error es más común de lo que parece:\n",
    "sale en cuanto filtras una de las dos y la otra no 🙃\n",
    "\n",
    "Lo grave es el caso de al lado, que **no** te frena:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(stats.pearsonr(v['unidades'], v['satisfaccion']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los 231 nulos de satisfacción otra vez, y otra vez en silencio 🕳️ Un\n",
    "`nan` en una matriz de correlaciones pasa desapercibido entre treinta\n",
    "números.\n",
    "\n",
    "Y pandas hace **una tercera cosa distinta**:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('pandas .corr():  %.6f' % v['unidades'].corr(v['satisfaccion']))\n",
    "print('scipy sin nulos: %.6f'\n",
    "      % stats.pearsonr(v.dropna(subset=['satisfaccion'])['unidades'],\n",
    "                       v.dropna(subset=['satisfaccion'])['satisfaccion'])[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pandas no devuelve `nan`: descarta las filas incompletas por su\n",
    "cuenta y te da el número, sin decírtelo.\n",
    "\n",
    "O sea que la misma pareja de columnas te da `nan` con scipy y un\n",
    "número con pandas, y ninguno de los dos te avisa de nada. El problema se ve\n",
    "entero en una matriz de correlaciones, donde **cada celda puede estar\n",
    "calculada con un número distinto de filas**. La del principio del capítulo\n",
    "mezcla celdas de 3.000 filas con celdas de 2.769 😑"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y dos más, y el segundo se ve venir"
   ]
  },
  {
   "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.pearsonr(v['unidades'], v['monto'].head(10))\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: `x` and `y` must be broadcastable.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Una correlación son **pares**: cada unidad va con su monto. Con 3.000 de una y 10 de la otra no hay pares que formar. Sale al filtrar una de las dos columnas y olvidarse de filtrar la otra, que es de los descuidos más comunes que hay."
   ]
  },
  {
   "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[['ciudad', 'monto']].corr(numeric_only=False)\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: could not convert string to float: 'trujillo'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y este es el que se ve venir: la correlación de Pearson mide si dos cosas suben juntas, y \"trujillo\" no sube. Fíjate en que hubo que escribir `numeric_only=False` para llegar a verlo: por defecto pandas se salta las columnas de texto **sin decir nada**, que es cómodo y es justo lo que hace que a veces falte una columna de tu matriz y no lo notes 🚩"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practica 💪"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. La correlación que se infla al agregar\n",
    "\n",
    "Calcula la correlación entre unidades y monto usando las\n",
    "medias de cada segmento en vez de las ventas sueltas. Compara."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. ¿Se puede correlacionar algo que no es numérico?\n",
    "\n",
    "Correlaciona `compro` (que es 0/1) con el monto,\n",
    "y compara con lo que dio la prueba t."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Correlación con el tiempo: ¿el negocio crece?\n",
    "\n",
    "Correlaciona el monto con el número de días desde la\n",
    "primera venta. ¿Hay tendencia?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Cuántas correlaciones falsas salen por mirar de más\n",
    "\n",
    "Genera veinte columnas al azar y mira todas las parejas.\n",
    "¿Cuántas salen significativas?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Pearson contra Spearman en datos de verdad\n",
    "\n",
    "Calcula las dos matrices sobre las columnas numéricas y\n",
    "busca dónde discrepan más."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Tu chequeo de correlación honesto\n",
    "\n",
    "Escribe una función que calcule una correlación y avise de\n",
    "las tres cosas que pueden estar pasando."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Pearson y Spearman, la matriz completa\n",
    "\n",
    "Saca las dos matrices de correlación de las cuatro numéricas y compáralas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. La correlación dentro de cada segmento\n",
    "\n",
    "Calcula la correlación entre unidades y monto dentro de cada segmento y compárala con la global."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 8\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La correlación que apareció al promediar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Antes de cerrar, una trampa que se comete casi siempre con la mejor intención del mundo: la de querer quitarle ruido a los datos 🙃"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Buscas qué explica lo que factura un cliente. Corres la matriz de correlaciones y aparece una de 0,99. Encontraste el motor del negocio.\n",
    "\n",
    "```\n",
    "compraron = v[v['compro'] == 1]\n",
    "print(round(compraron[['monto',\n",
    "                       'monto_final_facturado']].corr().iloc[0, 1], 4))\n",
    "# 0.9899\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",
    "Unidades y monto tienen correlación 0,0178 en las 3.000 ventas, y 0,5433 promediando por segmento. ¿Cuál reportas?\n",
    "\n",
    "a) La de las 3.000 ventas, y aviso de que agregar infla la correlación\n",
    "\n",
    "b) La de 0,5433, que usa datos más limpios\n",
    "\n",
    "c) El promedio de las dos\n",
    "\n",
    "d) Ninguna, porque se contradicen"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 📉 Unidades y monto tienen r = 0,0178, con r² de 0,000318. Vender más\n",
    "unidades no da más dinero, porque el precio unitario va de 26,59 a 279,61 soles\n",
    "según el segmento.\n",
    "\n",
    "- 🎭 Pearson solo ve líneas rectas. Una curva en U perfecta dio r = -0,0268.\n",
    "\n",
    "- 🪨 Un solo dato entre 200 llevó la correlación de -0,0917 a +0,5045. Spearman\n",
    "ni se enteró.\n",
    "\n",
    "- 🏘️ Agregar infla: los mismos datos dieron 0,0178 por venta y 0,5433\n",
    "promediando por segmento. Es la falacia ecológica.\n",
    "\n",
    "- 🔍 190 parejas de columnas de ruido dieron 5 correlaciones significativas.\n",
    "Siempre hay que preguntar cuántas se miraron.\n",
    "\n",
    "- 🗣️ Correlación no implica causalidad, y el caso más común es que haya un\n",
    "tercero causando las dos. Aquí el segmento sube el monto y la compra a la vez.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La correlación mide si dos cosas se mueven juntas. Nunca dice cuál mueve\n",
    "a cuál."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y si de acá quieres pasar a predecir de verdad en vez de solo describir, ese\n",
    "es el salto que hace el [libro de\n",
    "machine learning](https://missyera.com/guias/machine-learning-desde-cero/) 🤖"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué viene ahora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya tienes todas las herramientas. En el capítulo 17 juntamos los errores que\n",
    "invalidan un análisis entero, varios de los cuales fueron saliendo por el camino,\n",
    "y le ponemos nombre al más famoso de todos: la paradoja de Simpson 🎩"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Qué es el coeficiente de correlación?Un número entre menos uno y uno que dice cuánto se mueven dos variables juntas. Cero no significa que no haya relación: significa que no hay relación en línea recta.\n",
    "\n",
    "¿Qué diferencia hay entre Pearson y Spearman?Pearson mide relación en línea recta y se lo comen los datos atípicos. Spearman trabaja sobre el orden de los datos, así que aguanta los atípicos y detecta relaciones que suben o bajan sin ser una recta.\n",
    "\n",
    "¿Correlación implica causalidad?No, y el ejemplo está en este capítulo con datos propios. Dos cosas pueden moverse juntas porque una tercera las mueve a las dos, que es lo que pasa casi siempre.\n",
    "\n",
    "¿Cuándo una correlación es alta?No hay un número universal, depende del campo. Lo que sí se puede decir: en datos de negocio, una correlación de 0,3 ya es algo que vale la pena mirar, y una de 0,95 suele significar que estás midiendo lo mismo dos veces."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 15 de **Estadística desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/estadistica-desde-cero/correlacion/\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
}
