{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "66e110d9-c66c-4c2a-af84-2ee34cf75678",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7c057fc-c37d-49d6-b14b-3ce20d0c03e0",
   "metadata": {},
   "source": [
    "# Метод оценки удачи в \"Blood Bowl\"\n",
    "\"Blood Bowl\" как игра содержит в себе значительный элемент удачи, так что вопрос об измерении этой удачи встаёт весьма часто. В этой работе я пытаюсь разработать методику оценки удачи тренеров, опирающуюся на анализ результатов их бросков кубов."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6fb4e40-5a6c-4871-b4e9-b652c339f1bd",
   "metadata": {},
   "source": [
    "## Входные данные для анализа\n",
    "\"Blood Bowl\" - игра, где приходится кидать много кубов. В течение матча каждый тренер делает более сотни отдельных независимых бросков с разнообразными шансами успеха, провала и нейтрального исхода. Для начала анализа мы должны собрать все броски кубов для обоих тренеров: их шансы, результаты и количества. Это можно делать вручную; автоматизация процесса возможна, но лежит за пределами моей компетенции.\n",
    "\n",
    "В результате мы получим для каждого тренера список отдельных бросков кубов вида [[chance_1, weight_1], [chance_2, weight_2], ... [chance_n, weight_n]], где chance - вероятность отдельного броска, weight - вес: был ли результат положительным (1), нейтральным (0) или отрицательным (-1).\n",
    "\n",
    "Сумма всех возможных весов для каждого отдельного броска должна быть 0, т.е. у вас не может быть броска без положительного или отрицательного исхода (если вы делаете такие броски - не включайте их в список, они всё равно не влияют на вашу удачу).\n",
    "\n",
    "Сумма всех возможных вероятностей для каждого отдельного броска должна быть 1, по определению вероятности."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28c99169-b0dc-4375-8a18-796b3fb7cf8f",
   "metadata": {},
   "source": [
    "## Рабочая гипотеза\n",
    "Для каждого броска добавим новую метрику \"удача\", $luck = \\frac{w\\,e\\,i\\,g\\,h\\,t}{c\\,h\\,a\\,n\\,c\\,e}$  \n",
    "У неё есть несколько полезных свойств:\n",
    "<ul>\n",
    "    <li>знак, показывающий, был ли результат положительным или отрицательным;</li>\n",
    "    <li>её величина по модулю тем больше, чем маловероятнее был бросок;</li>\n",
    "    <li>ожидаемая суммарная удача для \"справедливых\" бросков кубов равна 0.</li>\n",
    "</ul>\n",
    "Докажем последнее утверждение. Представьте, что вы кидаете кубы n раз с шансом положительного исхода p, шансом отрицательного исхода q, шансом нейтрального исхода (1-p-q). Тогда со \"справедливыми\" кубами вы ожидаете получить положительный исход np раз, нейтральный исход n(1-p-q) раз и отрицательный nq раз. Ваша суммарная удача будет $\\frac{1}{p}np+\\frac{0}{1-p-q}n(1-p-q)+\\frac{-1}{q}nq = n - n = 0$  \n",
    "  \n",
    "Такой же (при \"справедливом\" распределении удачи) должна быть суммарная удача за весь матч (далее \"cumulative luck\", CL). Если вы получили больше положительных исходов, чем ожидалось, ваше CL будет больше 0. Если больше отрицательных - меньше 0."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5581e0a4-465e-483c-92cc-f4a843da157f",
   "metadata": {},
   "source": [
    "## Сравнение удачи\n",
    "Для каждого тренера у нас есть список удач всех его бросков вида [[luck_1], [luck_2], ... [luck_n]]. Рассчитайте суммарную удачу тренера за весь матч как сумму всех удач его бросков \n",
    "$CL = \\sum_{i=1}^n luck_i$  \n",
    "\n",
    "Вы получите 2 числа (вероятно, не равных 0 и друг другу). Давайте попробуем оценить статистическую значимость различий между ними.  \n",
    "\n",
    "Я предлагаю принять за нулевую гипотезу равенство настоящих CL тренеров, а затем оценить её p-value, сравнивая доверительные интервалы для наблюдаемых CL тренеров (используя [статью](https://www.researchgate.net/publication/7994369_Inference_by_Eye_Confidence_Intervals_and_How_to_Read_Pictures_of_Data)), построенные методом бутстрапа.  \n",
    "\n",
    "Теперь мы способны ответить на следующие вопросы:\n",
    "<ul>\n",
    "    <li>насколько значимо отличаются CL каждого тренера от ожидаемого значения (0);</li>\n",
    "    <li>насколько значимо отличаются CL каждого тренера друг от друга.</li>\n",
    "</ul>\n",
    "Это даёт нам статистический метод оценки удачи тренеров в матче."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1f45b31-303c-4f0d-be06-c4855559486c",
   "metadata": {},
   "source": [
    "## Пример\n",
    "Давайте внесём в таблицу собранные данные тестового матча"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cb207a6a-b54c-4606-b921-12ab1bfa00c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "coach_1 = 'coach_1'\n",
    "coach_2 = 'coach_2'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "4ef98d2a-b073-4a14-b32a-58081ca9518b",
   "metadata": {},
   "outputs": [],
   "source": [
    "index_1 = pd.MultiIndex.from_product(\n",
    "    [\n",
    "        [\n",
    "            '1D6_4+',\n",
    "            'kickoff',\n",
    "            '2D_0_vs_Bl',\n",
    "            '2D6_9+',\n",
    "            '1D6_2+',\n",
    "            '2D_Bl_vs_0',\n",
    "            '2D6_10+',\n",
    "            '2D_Bl_or_W_vs_Bl',\n",
    "            '1D_0_vs_0_or_Bl',\n",
    "            '1D6_3+',\n",
    "            '2D6_8+',\n",
    "            '-2D_push',\n",
    "            '1D6_6+',\n",
    "            '1D_Bl_vs_0'\n",
    "        ], \n",
    "        ['success', 'neutral', 'failure']\n",
    "    ], \n",
    "    names=['action', 'result']\n",
    ")\n",
    "\n",
    "index_2 = pd.MultiIndex.from_product(\n",
    "    [\n",
    "        [\n",
    "            '1D6_4+',\n",
    "            'kickoff',\n",
    "            '1D6_2+',\n",
    "            '2D_Bl_vs_0',\n",
    "            '2D6_8+',\n",
    "            '2D6_7+',\n",
    "            '3D_0_vs_0',\n",
    "            '1D6_3+',\n",
    "            '2D_0_vs_0',\n",
    "            '3D_0_vs_Dodge',\n",
    "            '1D6_6+',\n",
    "            '2D_0_vs_Dodge',\n",
    "            '2D_Bl_vs_Dodge',\n",
    "            '2D6_6+',\n",
    "            '2D_Bl_vs_Blodge',\n",
    "            '1D_0_vs_0_or_Bl'\n",
    "        ], \n",
    "        ['success', 'neutral', 'failure']\n",
    "    ], \n",
    "    names=['action', 'result']\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "2148b728-149b-4fed-a001-b4335752158f",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_coach_1 = pd.DataFrame(\n",
    "    data=[\n",
    "        [1/2, 1, 6], \n",
    "        [0, 0, 0], \n",
    "        [1/2, -1, 10],\n",
    "        [6/36, 1, 0],\n",
    "        [22/36, 0, 2],\n",
    "        [8/36, -1, 0],\n",
    "        [20/36, 1, 4],\n",
    "        [12/36, 0, 0],\n",
    "        [4/36, -1, 0],\n",
    "        [10/36, 1, 3],\n",
    "        [0, 0, 0],\n",
    "        [26/36, -1, 4],\n",
    "        [5/6, 1, 53],\n",
    "        [0, 0, 0],\n",
    "        [1/6, -1, 13],\n",
    "        [27/36, 1, 2],\n",
    "        [8/36, 0, 1],\n",
    "        [1/36, -1, 0],\n",
    "        [1/6, 1, 0],\n",
    "        [0, 0, 0],\n",
    "        [5/6, -1, 8],\n",
    "        [20/36, 1, 3],\n",
    "        [15/36, 0, 4],\n",
    "        [1/36, -1, 0],\n",
    "        [1/3, 1, 2],\n",
    "        [1/3, 0, 0],\n",
    "        [1/3, -1, 2],\n",
    "        [4/6, 1, 9],\n",
    "        [0, 0, 0],\n",
    "        [2/6, -1, 2],\n",
    "        [15/36, 1, 2],\n",
    "        [0, 0, 0],\n",
    "        [21/36, -1, 2],\n",
    "        [16/36, 1, 1],\n",
    "        [0, 0, 0],\n",
    "        [20/36, -1, 0],\n",
    "        [1/6, 1, 0],\n",
    "        [0, 0, 0],\n",
    "        [5/6, -1, 1],\n",
    "        [3/6, 1, 3],\n",
    "        [2/6, 0, 1],\n",
    "        [1/6, -1, 1] \n",
    "    ], \n",
    "    index=index_1, \n",
    "    columns=['chance', 'weight', 'amount']\n",
    ")\n",
    "\n",
    "df_coach_2 = pd.DataFrame(\n",
    "    data=[\n",
    "        [1/2, 1, 8], \n",
    "        [0, 0, 0], \n",
    "        [1/2, -1, 7],\n",
    "        [6/36, 1, 0],\n",
    "        [22/36, 0, 1],\n",
    "        [8/36, -1, 0],\n",
    "        [5/6, 1, 16],\n",
    "        [0, 0, 0],\n",
    "        [1/6, -1, 4],\n",
    "        [27/36, 1, 12],\n",
    "        [8/36, 0, 5],\n",
    "        [1/36, -1, 0],\n",
    "        [15/36, 1, 16],\n",
    "        [0, 0, 0],\n",
    "        [21/36, -1, 18],\n",
    "        [21/36, 1, 6],\n",
    "        [0, 0, 0],\n",
    "        [15/36, -1, 8],\n",
    "        [152/216, 1, 2],\n",
    "        [56/216, 0, 0],\n",
    "        [8/216, -1, 0],\n",
    "        [4/6, 1, 3],\n",
    "        [0, 0, 0],\n",
    "        [2/6, -1, 1],\n",
    "        [20/36, 1, 6],\n",
    "        [12/36, 0, 1],\n",
    "        [4/36, -1, 1],\n",
    "        [91/216, 1, 0],\n",
    "        [117/216, 0, 1],\n",
    "        [8/216, -1, 0],\n",
    "        [1/6, 1, 3],\n",
    "        [0, 0, 0],\n",
    "        [5/6, -1, 2],\n",
    "        [11/36, 1, 0],\n",
    "        [21/36, 0, 1],\n",
    "        [4/36, -1, 0],\n",
    "        [20/36, 1, 4],\n",
    "        [15/36, 0, 0],\n",
    "        [1/36, -1, 0],\n",
    "        [26/36, 1, 1],\n",
    "        [0, 0, 0],\n",
    "        [10/36, -1, 0],\n",
    "        [11/36, 1, 0],\n",
    "        [24/36, 0, 2],\n",
    "        [1/36, -1, 0],\n",
    "        [2/6, 1, 0],\n",
    "        [2/6, 0, 1],\n",
    "        [2/6, -1, 0]   \n",
    "    ], \n",
    "    index=index_2, \n",
    "    columns=['chance', 'weight', 'amount']\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81281c35-0b13-4e14-b7b6-0a83060ca08a",
   "metadata": {},
   "source": [
    "Проверим входные данные."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "c582039b-9384-4d56-993f-fc66745ac24f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>chance</th>\n",
       "      <th>weight</th>\n",
       "      <th>amount</th>\n",
       "      <th>luck</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>action</th>\n",
       "      <th>result</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_4+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>-1</td>\n",
       "      <td>10</td>\n",
       "      <td>-2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">kickoff</th>\n",
       "      <th>success</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.611111</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.222222</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-4.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_0_vs_Bl</th>\n",
       "      <th>success</th>\n",
       "      <td>0.555556</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1.800000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.111111</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-9.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_9+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.277778</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.722222</td>\n",
       "      <td>-1</td>\n",
       "      <td>4</td>\n",
       "      <td>-1.384615</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_2+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>53</td>\n",
       "      <td>1.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>-1</td>\n",
       "      <td>13</td>\n",
       "      <td>-6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_Bl_vs_0</th>\n",
       "      <th>success</th>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.222222</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.027778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-36.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_10+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>-1</td>\n",
       "      <td>8</td>\n",
       "      <td>-1.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_Bl_or_W_vs_Bl</th>\n",
       "      <th>success</th>\n",
       "      <td>0.555556</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1.800000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.416667</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.027778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-36.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D_0_vs_0_or_Bl</th>\n",
       "      <th>success</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>-3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_3+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.666667</td>\n",
       "      <td>1</td>\n",
       "      <td>9</td>\n",
       "      <td>1.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>-3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_8+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.416667</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.583333</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.714286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">-2D_push</th>\n",
       "      <th>success</th>\n",
       "      <td>0.444444</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.555556</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.800000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_6+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D_Bl_vs_0</th>\n",
       "      <th>success</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>-6.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            chance  weight  amount       luck\n",
       "action           result                                      \n",
       "1D6_4+           success  0.500000       1       6   2.000000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.500000      -1      10  -2.000000\n",
       "kickoff          success  0.166667       1       0   6.000000\n",
       "                 neutral  0.611111       0       2   0.000000\n",
       "                 failure  0.222222      -1       0  -4.500000\n",
       "2D_0_vs_Bl       success  0.555556       1       4   1.800000\n",
       "                 neutral  0.333333       0       0   0.000000\n",
       "                 failure  0.111111      -1       0  -9.000000\n",
       "2D6_9+           success  0.277778       1       3   3.600000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.722222      -1       4  -1.384615\n",
       "1D6_2+           success  0.833333       1      53   1.200000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.166667      -1      13  -6.000000\n",
       "2D_Bl_vs_0       success  0.750000       1       2   1.333333\n",
       "                 neutral  0.222222       0       1   0.000000\n",
       "                 failure  0.027778      -1       0 -36.000000\n",
       "2D6_10+          success  0.166667       1       0   6.000000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.833333      -1       8  -1.200000\n",
       "2D_Bl_or_W_vs_Bl success  0.555556       1       3   1.800000\n",
       "                 neutral  0.416667       0       4   0.000000\n",
       "                 failure  0.027778      -1       0 -36.000000\n",
       "1D_0_vs_0_or_Bl  success  0.333333       1       2   3.000000\n",
       "                 neutral  0.333333       0       0   0.000000\n",
       "                 failure  0.333333      -1       2  -3.000000\n",
       "1D6_3+           success  0.666667       1       9   1.500000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.333333      -1       2  -3.000000\n",
       "2D6_8+           success  0.416667       1       2   2.400000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.583333      -1       2  -1.714286\n",
       "-2D_push         success  0.444444       1       1   2.250000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.555556      -1       0  -1.800000\n",
       "1D6_6+           success  0.166667       1       0   6.000000\n",
       "                 neutral  0.000000       0       0        NaN\n",
       "                 failure  0.833333      -1       1  -1.200000\n",
       "1D_Bl_vs_0       success  0.500000       1       3   2.000000\n",
       "                 neutral  0.333333       0       1   0.000000\n",
       "                 failure  0.166667      -1       1  -6.000000"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_coach_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a338b6ae-4923-40b3-9453-00b4e8deb2d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>chance</th>\n",
       "      <th>weight</th>\n",
       "      <th>amount</th>\n",
       "      <th>luck</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>action</th>\n",
       "      <th>result</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_4+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>-1</td>\n",
       "      <td>7</td>\n",
       "      <td>-2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">kickoff</th>\n",
       "      <th>success</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.611111</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.222222</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-4.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_2+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>16</td>\n",
       "      <td>1.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>-1</td>\n",
       "      <td>4</td>\n",
       "      <td>-6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_Bl_vs_0</th>\n",
       "      <th>success</th>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>12</td>\n",
       "      <td>1.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.222222</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.027778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-36.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_8+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.416667</td>\n",
       "      <td>1</td>\n",
       "      <td>16</td>\n",
       "      <td>2.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.583333</td>\n",
       "      <td>-1</td>\n",
       "      <td>18</td>\n",
       "      <td>-1.714286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_7+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.583333</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>1.714286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.416667</td>\n",
       "      <td>-1</td>\n",
       "      <td>8</td>\n",
       "      <td>-2.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">3D_0_vs_0</th>\n",
       "      <th>success</th>\n",
       "      <td>0.703704</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1.421053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.259259</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.037037</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-27.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_3+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.666667</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>-3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_0_vs_0</th>\n",
       "      <th>success</th>\n",
       "      <td>0.555556</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>1.800000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.111111</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>-9.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">3D_0_vs_Dodge</th>\n",
       "      <th>success</th>\n",
       "      <td>0.421296</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2.373626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.541667</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.037037</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-27.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D6_6+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.166667</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_0_vs_Dodge</th>\n",
       "      <th>success</th>\n",
       "      <td>0.305556</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3.272727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.583333</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.111111</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-9.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_Bl_vs_Dodge</th>\n",
       "      <th>success</th>\n",
       "      <td>0.555556</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1.800000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.416667</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.027778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-36.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D6_6+</th>\n",
       "      <th>success</th>\n",
       "      <td>0.722222</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.384615</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.277778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-3.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2D_Bl_vs_Blodge</th>\n",
       "      <th>success</th>\n",
       "      <td>0.305556</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3.272727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.027778</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-36.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1D_0_vs_0_or_Bl</th>\n",
       "      <th>success</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>neutral</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>failure</th>\n",
       "      <td>0.333333</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-3.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           chance  weight  amount       luck\n",
       "action          result                                      \n",
       "1D6_4+          success  0.500000       1       8   2.000000\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.500000      -1       7  -2.000000\n",
       "kickoff         success  0.166667       1       0   6.000000\n",
       "                neutral  0.611111       0       1   0.000000\n",
       "                failure  0.222222      -1       0  -4.500000\n",
       "1D6_2+          success  0.833333       1      16   1.200000\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.166667      -1       4  -6.000000\n",
       "2D_Bl_vs_0      success  0.750000       1      12   1.333333\n",
       "                neutral  0.222222       0       5   0.000000\n",
       "                failure  0.027778      -1       0 -36.000000\n",
       "2D6_8+          success  0.416667       1      16   2.400000\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.583333      -1      18  -1.714286\n",
       "2D6_7+          success  0.583333       1       6   1.714286\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.416667      -1       8  -2.400000\n",
       "3D_0_vs_0       success  0.703704       1       2   1.421053\n",
       "                neutral  0.259259       0       0   0.000000\n",
       "                failure  0.037037      -1       0 -27.000000\n",
       "1D6_3+          success  0.666667       1       3   1.500000\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.333333      -1       1  -3.000000\n",
       "2D_0_vs_0       success  0.555556       1       6   1.800000\n",
       "                neutral  0.333333       0       1   0.000000\n",
       "                failure  0.111111      -1       1  -9.000000\n",
       "3D_0_vs_Dodge   success  0.421296       1       0   2.373626\n",
       "                neutral  0.541667       0       1   0.000000\n",
       "                failure  0.037037      -1       0 -27.000000\n",
       "1D6_6+          success  0.166667       1       3   6.000000\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.833333      -1       2  -1.200000\n",
       "2D_0_vs_Dodge   success  0.305556       1       0   3.272727\n",
       "                neutral  0.583333       0       1   0.000000\n",
       "                failure  0.111111      -1       0  -9.000000\n",
       "2D_Bl_vs_Dodge  success  0.555556       1       4   1.800000\n",
       "                neutral  0.416667       0       0   0.000000\n",
       "                failure  0.027778      -1       0 -36.000000\n",
       "2D6_6+          success  0.722222       1       1   1.384615\n",
       "                neutral  0.000000       0       0        NaN\n",
       "                failure  0.277778      -1       0  -3.600000\n",
       "2D_Bl_vs_Blodge success  0.305556       1       0   3.272727\n",
       "                neutral  0.666667       0       2   0.000000\n",
       "                failure  0.027778      -1       0 -36.000000\n",
       "1D_0_vs_0_or_Bl success  0.333333       1       0   3.000000\n",
       "                neutral  0.333333       0       1   0.000000\n",
       "                failure  0.333333      -1       0  -3.000000"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_coach_2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45cc68b4-db90-4560-b69d-6b5e37615bf6",
   "metadata": {},
   "source": [
    "Добавим метрику \"luck\" и трансформируем данные в удобные для работы списки."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "8ef8dd92-4156-4af1-888d-5e92b05141fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_coach_1['luck'] = (df_coach_1.weight / df_coach_1.chance)\n",
    "df_coach_2['luck'] = (df_coach_2.weight / df_coach_2.chance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "b49b1a68-d68f-4b61-b5dd-5c1585147e81",
   "metadata": {},
   "outputs": [],
   "source": [
    "coach_1_luck_list = []\n",
    "for i in df_coach_1.itertuples():       # берём каждый ряд\n",
    "   for j in range(i.amount):\n",
    "       coach_1_luck_list.append(i.luck) # добавляем удачу в список столько раз, сколько бросков с такой удачей мы сделали\n",
    "       \n",
    "coach_2_luck_list = []\n",
    "for i in df_coach_2.itertuples():       # берём каждый ряд\n",
    "   for j in range(i.amount):\n",
    "       coach_2_luck_list.append(i.luck) # добавляем удачу в список столько раз, сколько бросков с такой удачей мы сделали"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eabb5ce3-74e5-4128-aa7b-74226d8c371c",
   "metadata": {},
   "source": [
    "Посчитаем суммарную удачу за весь матч."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "db60b7a0-d52c-40a0-b00e-db1518d33e47",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cumulative luck of coach_1: -2.\n",
      "Cumulative luck of coach_2: 42.\n"
     ]
    }
   ],
   "source": [
    "coach_1_CL = sum(coach_1_luck_list)\n",
    "coach_2_CL = sum(coach_2_luck_list)\n",
    "print(f'Cumulative luck of {coach_1}: {coach_1_CL:.0f}.')\n",
    "print(f'Cumulative luck of {coach_2}: {coach_2_CL:.0f}.')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a694624-6bbb-487f-93f5-9474c0ae08b9",
   "metadata": {},
   "source": [
    "Построим доверительные интервалы для CL с помощью бутстрапа."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "6ba57d23-2a5f-47e1-8273-6d8aec4acf14",
   "metadata": {},
   "outputs": [],
   "source": [
    "def bootstrap_sum(lucklist, n=10000, confidence_level=0.95):\n",
    "    '''\n",
    "    Функция принимает на вход список удач, при желании можно изменить количество подвыборок и размер ДИ.\n",
    "    Возвращает нижнюю и верхнюю границы ДИ для CL.\n",
    "    '''\n",
    "    sum_luck = []\n",
    "    for i in range(n):\n",
    "        sample = pd.Series(lucklist).sample(frac=1, replace=True)\n",
    "        sample_sum = sample.sum()\n",
    "        sum_luck.append(sample_sum)\n",
    "    ci_low = pd.Series(sum_luck).quantile((1 - confidence_level)/2)\n",
    "    ci_high = pd.Series(sum_luck).quantile(1 - (1 - confidence_level)/2)\n",
    "    return ci_low, ci_high"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "e6d3e369-7a99-456a-9c89-e9297b6a5ca1",
   "metadata": {},
   "outputs": [],
   "source": [
    "coach_1_ci_low, coach_1_ci_high = bootstrap_sum(coach_1_luck_list, n=50000)\n",
    "coach_2_ci_low, coach_2_ci_high = bootstrap_sum(coach_2_luck_list, n=50000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "cd4c1cae-d7c4-4270-a26f-089dda1f304d",
   "metadata": {},
   "outputs": [],
   "source": [
    "if coach_1_CL < coach_2_CL:\n",
    "    top_margin = coach_1_ci_high\n",
    "    low_margin = coach_2_ci_low\n",
    "    top_CL = coach_2_CL\n",
    "    low_CL = coach_1_CL\n",
    "else:\n",
    "    top_margin = coach_2_ci_high\n",
    "    low_margin = coach_1_ci_low\n",
    "    top_CL = coach_1_CL\n",
    "    low_CL = coach_2_CL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "8b35deba-d817-47d6-9de3-091857328c84",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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EJs2bZKWhYSEiCVLlojIyEgRGRkppk2bJqysrMSUKVP0nhsQECACAgKk+2vWrBEAxMcffywiIiLErl27xKJFi8Tw4cONfl7Jycni0KFDws3NTTRv3lx63xkZGSIhIUF4eHiI8uXLi0WLFokdO3aIYcOGCQDio48+ktrIWwc8PDxEYGCg+OWXX0RERISIjo4u8P+LKA/DDJV59evXF9WrVxdarVZalp2dLby9vQUAsXr1amn5vHnzxLx580RERISIiIgQEydOFNbW1qJmzZri/v37Ul18fLxo3LixACAAiKCgIJGWlib2798vrKysDH50CmPq1KkCgIiMjDRas2jRIgFArF+/Xm/57NmzBQAREREhLQMgXF1dRUpKil6/zczMRFhYmLQs7wf7559/1mvzyTBz4cIFAUCMGjVKr27VqlUCgF4IGDRokLC1tRXXrl3Tq507d64AIAWmvB8yX19fKRgIIcTRo0cFALFmzRppmY+Pj/Dx8RHp6elGP58OHTqIihUriuTkZL3lw4YNE2q1Wty9e9foc4UwHmaeDIrr168XAKTAIoQQwcHBwsvLy6DNvJDw66+/6i0/duyYACAWLFig9/rm5ubi0qVLerV37twRlpaWYsKECXrLe/XqJVxdXUV2dna+70er1Yrs7GwxdepU4eTkJHQ6nfTYk2Fm2LBholy5cvm2UxAvLy8RHByst+yzzz4TAMSRI0f0ln/00UdCoVBI7zFvHfDx8RFZWVlP9fpE3M1EZd7HH3+My5cvY9iwYbh58yZiY2MxePBgXLt2DUDuMTJ5Ro0ahVGjRqFdu3Zo164dpk+fjhUrVuDixYtYvHixVOfq6oojR44gOjoaN2/exNatW2Fubo5Bgwbh888/R7Vq1fDrr7+idu3acHR0ROfOnREbG2uyn9u3b0f16tXRtm1bozV79uyBjY2NdKxOnrxdI0+eORUYGAg7Ozu9fru4uEjvvSjyhv3feecdveW9evWChYX+4XdbtmxBYGAg3N3dkZOTI906deoEANi3b59efXBwMMzNzaX7devWBQCpn5cvX8Y///yD999/H2q1Ot/+ZWRkYPfu3ejRowesra31XjcoKAgZGRn57roqjK5du+rdf7J/pmzZsgXlypVDly5d9PpUv359uLm54Y8//jBou3r16nrLnJyc0KVLFyxfvlzaRXPv3j1s3LgR7777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8+mVVK25ElAbnzxN99gxljlQIgdKZFoAyoJWS3MloCpkJ4paa1nIyQKLVAtAWcgJAItSCwD2RdiPXqTacqVfWwLbCF9fQKEwvT78++/juS+31toa8PY2/pw6dcygtLErVB8AcBuRp4BtxDPVlsFtRKEn2izcqxIRkRwtXlzaPSAqebwCMBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJGsMMERERyRrDDBEREckawwwRERHJWqmGmcqVK0OhUOjdPvvsM72a69evo0uXLrCxsYGzszOGDx+OrKysUuoxERERvWgsSrsDU6dOxcCBA6X7tra20r+1Wi2Cg4NRvnx5/Pnnn0hMTET//v0hhMB3331XGt0lIiKiF0yphxk7Ozu4ubnl+1hERATOnz+P2NhYuLu7AwC++uorhISEYMaMGbC3t3+eXSUiIqIXUKkfMzN79mw4OTmhfv36mDFjht4upEOHDqFOnTpSkAGADh06IDMzEydOnDDaZmZmJlJSUvRuREREVDaVapgZMWIE1q5di71792LYsGGYP38+hgwZIj0eHx8PV1dXvec4ODjA0tIS8fHxRtsNCwuDRqORbpUqVSqx90DydeHCBXTt2hUajQZ2dnZo2rQprl+/Lj3+448/olWrVrC3t4dCoUBSUlLpdZaIiIwq9jATGhpqcFDvk7fjx48DAEaNGoWAgADUrVsXH3zwARYtWoQlS5YgMTFRak+hUBi8hhAi3+V5xo8fj+TkZOkWGxtb3G+TZO6ff/5BixYtULNmTfzxxx84ffo0vvjiC6jVaqkmLS0NHTt2xIQJE0qxp0REVJBiP2Zm2LBh6N27t8maypUr57u8adOmAICrV6/CyckJbm5uOHLkiF7NvXv3kJ2dbTBi8ziVSgWVSlW0jtNLZeLEiQgKCsKcOXOkZd7e3no1I0eOBAD88ccfz7FnRERUVMU+MuPs7IyaNWuavD3+1+/j/v77bwBAhQoVAADNmjVDVFQU4uLipJqIiAioVCo0bNiwuLtOLwmdToetW7eievXq6NChA1xcXODn54cNGzaUdteIiOgplNoxM4cOHcLXX3+NU6dOITo6GuvXr8egQYPQtWtXeHp6AgDat2+PWrVqoV+/fvj777+xe/dujB07FgMHDuSZTPTUEhISkJqailmzZqFjx46IiIhAjx498Prrr2Pfvn2l3T0iIiqiUgszKpUK69atQ6tWrVCrVi1MmjQJAwcOxJo1a6Qac3NzbN26FWq1Gs2bN0evXr3QvXt3zJ07t7S6TTK0atUq2NraSrdLly4BALp164ZRo0ahfv36+Oyzz9C5c2csWrSolHtLRERFVWrXmXn11Vdx+PDhAus8PT2xZcuW59AjKqu6du0KPz8/6X758uVhYWGBWrVq6dW98sor+PPPP59394iI6BmV+kXziEqanZ0d7Ozs9JY1btxYGqHJc/nyZXh5eT3PrhERUTFgmKGX0rhx4/DWW2+hZcuWCAwMxI4dO7B582a9M5fi4+MRHx+Pq1evAgDOnj0LOzs7eHp6wtHRsZR6TkRETyr1KwATlYYePXpg0aJFmDNnDnx9ffF///d/+PXXX9GiRQupZtGiRWjQoIE0d1jLli3RoEEDbNq0qbS6TURE+VAIIURpd6KkpaSkQKPRIDk5mWdBUYkaOBCIijL+eFQUkJqqv8zWFqhTx3S7deoAixc/e/+IiOSksL/f3M1EVIyiooBCHNeuJzW16M8hIqJHuJuJiIiIZI1hhoiIiGSNYYaIiIhkjcfMEBWjgg7k/fdfIC1Nf5m1NfDEHJdFbpeI6GXGMENUjHjGERHR88fdTERERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRrDDNEREQkawwzREREJGsMM0RERCRr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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlim(0, 3)\n",
    "plt.ylim(round(min(coach_2_ci_low, coach_1_ci_low), -2)-50, round(max(coach_2_ci_high, coach_1_ci_high), -2)+50)\n",
    "\n",
    "plt.plot([1, 1], [coach_1_ci_low, coach_1_ci_high], color='b', linewidth=4)\n",
    "plt.plot([2, 2], [coach_2_ci_low, coach_2_ci_high], color='b', linewidth=4)\n",
    "plt.plot([1, 2], [coach_1_CL , coach_2_CL ], color='b',  marker='o', linewidth=2)\n",
    "plt.plot([1-0.05, 1+0.05], [coach_1_ci_high, coach_1_ci_high], color='b', linewidth=4)\n",
    "plt.plot([1-0.05, 1+0.05], [coach_1_ci_low, coach_1_ci_low], color='b', linewidth=4)\n",
    "plt.plot([2-0.05, 2+0.05], [coach_2_ci_low, coach_2_ci_low], color='b', linewidth=4)\n",
    "plt.plot([2-0.05, 2+0.05], [coach_2_ci_high, coach_2_ci_high], color='b', linewidth=4)\n",
    "\n",
    "plt.text(1-0.1, coach_1_ci_low, f'{coach_1_ci_low:.0f}', ha='right', va='bottom')\n",
    "plt.text(1-0.1, coach_1_ci_high, f'{coach_1_ci_high:.0f}', ha='right', va='bottom')\n",
    "plt.text(2+0.1, coach_2_ci_low,  f'{coach_2_ci_low:.0f}', ha='left', va='bottom')\n",
    "plt.text(2+0.1, coach_2_ci_high,  f'{coach_2_ci_high:.0f}', ha='left', va='bottom')\n",
    "plt.text(2+0.1, coach_2_CL,  f'{coach_2_CL:.0f}', ha='left', va='bottom')\n",
    "plt.text(1-0.1, coach_1_CL,  f'{coach_1_CL:.0f}', ha='right', va='bottom')\n",
    "plt.text(0.7, 20, 'expected luck', ha='right', va='top')\n",
    "\n",
    "plt.axhline(y=top_margin, color='r', linestyle='--')\n",
    "plt.axhline(y=low_margin, color='r', linestyle='--')\n",
    "\n",
    "if top_margin > low_margin:\n",
    "    plt.fill_betweenx(y=[top_margin, low_margin], x1=0, x2=5, color='green', alpha=0.1)\n",
    "else:\n",
    "    plt.fill_betweenx(y=[top_margin, low_margin], x1=0, x2=5, color='red', alpha=0.1)\n",
    "    \n",
    "plt.axhline(y=0, color='g', linestyle='--')\n",
    "\n",
    "plt.xticks([1, 2], [f\"{coach_1}'s luck\", f\"{coach_2}'s luck\"])\n",
    "plt.title(\"95% confidence intervals for \\n cumulative luck\")\n",
    "\n",
    "#plt.savefig('95_ci_CL.jpeg') # раскомментируйте строку, если хотите сохранить картинку\n",
    "plt.show()\n",
    "sns.despine()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d5d83231-1d26-433a-a694-ed62e9f7ef69",
   "metadata": {},
   "outputs": [],
   "source": [
    "average_margin = ((top_margin - low_CL) + (top_CL - low_margin)) / 2\n",
    "overlap = (top_margin - low_margin) / average_margin"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a71cf145-1e01-4761-b84f-6d33635d116c",
   "metadata": {},
   "source": [
    "С помощью рекомендаций из [статьи](https://www.researchgate.net/publication/7994369_Inference_by_Eye_Confidence_Intervals_and_How_to_Read_Pictures_of_Data) оценим p-value, измеряя степень пересечения наших доверительных интервалов. Цитирую: \"Rule of Eye 4: For a comparison of two independent means, p <.05 when the overlap of the 95% CIs is no more than about half the average margin of error, that is, when proportion overlap is about .50 or less.\" Другими словами, CL тренеров будут статистически значимо различаться, если их 95%-ные доверительные интервалы пересекаются не более чем на 0.5 от средней погрешности.   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "da6b4e69-78c9-4fd7-a8a7-ee75b943926b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "95% CI overlap is 1.19, more than 0.5;\n",
      "assume p-value > 0.05 and no significant difference between coaches' CL.\n"
     ]
    }
   ],
   "source": [
    "if overlap > 0.5:\n",
    "    print(f\"95% CI overlap is {overlap:.2f}, more than 0.5;\\nassume p-value > 0.05 and no significant difference between coaches' CL.\")\n",
    "else:\n",
    "    print(f\"95% CI overlap is{overlap:.2f}, less than 0.5;\\nassume p-value <= 0.05 and significant difference between coaches' CL.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c7301c8-1390-4351-ac05-5ef59ee37610",
   "metadata": {},
   "source": [
    "Как мы видим, в этом случае 95%-ные доверительные интервалы для суммарной удачи обоих тренеров значительно пересекаются, и оба ДИ включают в себя ожидаемое значение CL (0). В данном случае мы не можем сказать, что один тренер был удачливее другого или удачливее теоретически ожидаемого. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ee3b77d0-f975-46f1-a020-d3f21122c7f3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
