{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9921eafc",
   "metadata": {},
   "source": [
    "<h1><center>Математические методы машинного обучения. Контрольная работа</center></h1>\n",
    "\n",
    "## Оглавление:\n",
    "* [Импортирование библиотек](#[↑]-Импортирование-библиотек);\n",
    "* [Настройка отображения](#[↑]-Настройка-отображения)\n",
    "* [Исходая выборка](#[↑]-Исходная-выборка);\n",
    "1. [Статистики выборки $x_1, \\ldots, x_n$](#[↑]-1.-Статистики-выборки-$x_1,-\\ldots,-x_n$:):\n",
    "    1. [Среднее](#[↑]-A.-Среднее:):\n",
    "        1. [Арифметическое](#[↑]-a.-Арифметическое);\n",
    "        2. [Гармоническое](#[↑]-b.-Гармоническое);\n",
    "        3. [Геометрическое](#[↑]-c.-Геометрическое).\n",
    "    2. [Медиана](#[↑]-B.-Медиана);\n",
    "    3. [Мода](#[↑]-C.-Мода);\n",
    "    4. [Нижний $0,05$-квантиль, верхний $0,05$-квантиль, квантили $Q_1, Q_2, Q_3$, интерквартильный размах](#[↑]-D.-Нижний--и-верхний-$0,05$-квантиль,-квартили-$Q_1,-Q_2,-Q_3$,-интерквартильный-размах);\n",
    "    5. [Выборочная дисперсия:](#[↑]-E.-Выборочная-дисперсия:)\n",
    "        1. [Неисправленная (смещенная)](#[↑]-a.-Несправленная-(смещенная));\n",
    "        2. [Исправленная (несмещенная)](#[↑]-b.-Исправленная-(несмещенная));\n",
    "    6. [Стандартное отклонение](#[↑]-F.-Стандартное-отклонение);\n",
    "    7. [Стандартная ошибка среднего](#[↑]-G.-Стандартная-ошибка-среднего);\n",
    "    8. [Коэффициент вариации](#[↑]-H.-Коэффициент-вариации);\n",
    "    9. [Моменты распределения](#[↑]-I.-Моменты-распределения);\n",
    "    10. [Коэффициент ассиметрии](#[↑]-J.-Коэффициент-ассиметрии);\n",
    "    11. [Коэффициент эксцесса](#[↑]-K.-Коэффициент-эксцесса).\n",
    "2. [Диаграмма Box-whiskers, определение выбросов](#[↑]-2.-Диаграмма-Box-whiskers,-определение-выбросов);\n",
    "3. [Интервальный ряд c использованием формулы Стёрджеса](#[↑]-3.-Интервальный-ряд-c-использованием-формулы-Стёрджеса);\n",
    "4. [График эмпирической функции распределения $F_n$](#[↑]-4.-График-эмпирической-функции-распределения-$F_n$);\n",
    "5. [Проверка распределения на нормальность](#[↑]-5.-Проверка-распределения-на-нормальность:):\n",
    "    1. [Гистрограмма](#[↑]-A.-Гистограмма)\n",
    "    2. [QQ-plot](#[↑]-B.-QQ-plot);\n",
    "    3. [Критерий ассиметрии и эксцесса](#[↑]-С.-Критерий-ассиметрии-и-эксцесса);\n",
    "    4. [Проверка гипотез](#[↑]-D.-Проверка-гипотез);\n",
    "    5. [Критерий согласия хи-квадрат Пирсона](#[↑]-E.-Критерий-согласия-хи-квадрат-Пирсона);\n",
    "    6. [Критерий Колмогорова](#[↑]-F.-Критерий-Колмогорова).\n",
    "6. [Проверка первых 10 значений на нормальность, используя критерий Шапиро-Уилка](#[↑]--6.-Проверка-первых-10-значений-на-нормальность,-используя-критерий-Шапиро-Уилка);\n",
    "7. [$95\\%$-й доверительный интервал для неизвестной генеральной дисперсии](#[%E2%86%91]-7.-$95\\%$-%D0%B9-%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B5%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D0%BE%D0%B9-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%B4%D0%B8%D1%81%D0%BF%D0%B5%D1%80%D1%81%D0%B8%D0%B8);\n",
    "8. [$95\\%$-й доверительный интервал для неизвестного генерального среднего при условии, что](#[%E2%86%91]-8.-$95\\%$-%D0%B9-%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B5%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B3%D0%BE-%D0%BF%D1%80%D0%B8-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B8,-%D1%87%D1%82%D0%BE:):\n",
    "    1. [Генеральные дисперсии известны](#[↑]-A.-Генеральные-дисперсии-известны);\n",
    "    2. [Генеральные дисперсии неизвестны](#[↑]-B.-Генеральные-дисперсии-неизвестны).\n",
    "9. [Разбиение выборки на 2 непересекающиеся группы в пропорции $55/45$ в произвольном порядке и проверка групп](#[↑]-9.-Разбиение-выборки-на-2-непересекающиеся-группы-в-пропорции-$55/45$-в-произвольном-порядке-и-проверка-групп:):\n",
    "    1. [На однородность с использованием критерия Колмогорова-Смирнова](#[↑]-A.-На-однородность-с-использованием-критерия-Колмогорова-Смирнова);\n",
    "    2. [На равенство дисперсий](#[↑]-B.-На-равенство-дисперсий);\n",
    "    3. [На равенство средних](#[↑]-C.-На-равенство-средних).\n",
    "10. [Источники](#[↑]-Источники:)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab3126c6",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) Импортирование библиотек"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "962a13a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy.stats as stats\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from collections import Counter\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46dd3694",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) Настройка отображения"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4ef99936",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       ".output_png {\n",
       "    display: table-cell;\n",
       "    text-align: center;\n",
       "    vertical-align: middle;\n",
       "}\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.core.display import HTML\n",
    "\n",
    "HTML(\"\"\"\n",
    "<style>\n",
    ".output_png {\n",
    "    display: table-cell;\n",
    "    text-align: center;\n",
    "    vertical-align: middle;\n",
    "}\n",
    "</style>\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a5a89d2",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) Исходная выборка"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "82de10f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.sort(np.array([119, 105,  85,  69, 103, 111,  92, 151,  34,  69,\n",
    "                         122, 157,  91,  69, 147,  65, 100, 155,  92, 162,\n",
    "                         100,  94,  95, 128,  59, 130, 122, 154,  70, 105,\n",
    "                          87, 126,  83,  82, 112,  84,  69, 138,  31, 128,\n",
    "                         107, 127, 111, 107,  86, 108, 103, 118,  73,  98,\n",
    "                         148, 106, 142, 148, 118,  44,  92, 121,  41, 144,\n",
    "                          67,  74,  61,  34, 161, 142, 113, 133,  86,  74,\n",
    "                          87, 106,  69,  95,  89, 128, 123,  85, 120, 114,\n",
    "                          69,  83, 102, 125,  92, 136, 110,  86,  77, 140,\n",
    "                         105,  76,  54,  62,  92, 100,  74,  97,  96, 107,\n",
    "                          64, 101, 103,  94, 131, 112,  85, 160, 130,  68,\n",
    "                          74, 137, 109, 114,  92, 144,  64,  81, 165, 144,\n",
    "                          97,  68,  60,  74,  94, 141, 162, 109,  76,  76,\n",
    "                         121,  86,  98,  60, 109, 150,  55,  79,  87, 128,\n",
    "                         106,  84,  57, 120, 101, 106,  90,  74,  70,  76,\n",
    "                         105,  95, 101, 117,  82, 110, 118, 137, 103, 114,\n",
    "                          93, 106, 110, 130,  93, 117, 139,  83,  63,  98,\n",
    "                          97, 120, 101, 104,  88,  79, 108, 129, 122, 118,\n",
    "                         104,  95, 110,  75,  57, 186,  97,  84, 109,  11,\n",
    "                          60,  82, 100,  47,  74, 110, 149, 113, 158, 122,\n",
    "                         103,  89,  64,  82, 115, 186, 200,  41, 139, 112,\n",
    "                         121,  79, 129, 115, 131, 139, 135, 108, 125, 100,\n",
    "                          99,  98, 160,  68, 149,  67,  94, 108, 100,  88,\n",
    "                         116, 123, 100, 121, 154, 109, 103,  31,  74, 105,\n",
    "                         124, 131, 125,  70,  77,  86,  79,  76,  86,  93,\n",
    "                         104,  66,  45, 115,  71,  69,  66, 141,  93, 117,\n",
    "                         138,  58,  58, 119, 137, 110, 140, 103,  60,  45,\n",
    "                         123, 101,  75, 136,  91, 157, 107, 149, 139, 164,\n",
    "                          55,  83,  63,  57,  69, 122,  62, 121, 145,  69,\n",
    "                          71,  81, 119,  47,  87, 107, 107,  23, 117, 132,\n",
    "                         117, 120,  75,  84, 119,  41,  78,  59, 127,  99,\n",
    "                         121, 152,  92,  74,  50, 109, 108, 111, 100,  89,]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "baa0865b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество элементов в выборке = 320\n"
     ]
    }
   ],
   "source": [
    "n = len(data)\n",
    "\n",
    "print(f\"Количество элементов в выборке =\", n)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "761c79e8",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 1. Статистики выборки $x_1, \\ldots, x_n$:\n",
    "### [[↑]](#Оглавление:) A. Среднее:\n",
    "\n",
    "_**Среднее значение**_ — числовая характеристика множества чисел или функций (в математике); — некоторое число, заключённое между наименьшим и наибольшим из их значений. Среднее, как абстрактная характеристика совокупности, отражает типичный уровень (размер) признака, типичные черты и cвойства всех единиц изучаемой совокупности, поэтому среднее отвлекается (абстрагируется) от индивидуальных особенностей отдельных единиц.\n",
    "\n",
    "О разновидностях среднего можно прочитать по [ссылке](https://waksoft.susu.ru/2015/09/26/5-variantov-srednego-ili-kakaya-srednyaya-temperatura-v-bolnitse/)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b56d049",
   "metadata": {},
   "source": [
    "#### [[↑]](#Оглавление:) a. Арифметическое\n",
    "\n",
    "В исходной задаче для получения среднего значения корректно использовать среднее арифметическое, вычисляемое по формуле:\n",
    "\n",
    "$$\\overline{x} = \\frac{x_1 + x_2 + \\ldots + x_n}{n} = \\frac{1}{n}\\sum\\limits_{i=1}^n x_i$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "509c190f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Среднее арифметическое = 100.86\n"
     ]
    }
   ],
   "source": [
    "mean = data.mean()\n",
    "\n",
    "print(f\"Среднее арифметическое = {mean:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "479b1a9a",
   "metadata": {},
   "source": [
    "#### [[↑]](#Оглавление:) b. Гармоническое\n",
    "\n",
    "Используется при расчетах скорости, производительности, цены и рассчитывается по формуле:\n",
    "\n",
    "$$H(x_1, ..., x_n) = \\frac{n}{\\frac{1}{x_1} + \\frac{1}{x_2} + \\ldots + \\frac{1}{x_n}} = \\frac{n}{\\frac{1}{n}\\sum\\limits_{i=1}^n \\frac{1}{x_i}}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "80ca0b43",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Среднее гармоническое = 88.37\n"
     ]
    }
   ],
   "source": [
    "def harmonic_mean(data: np.ndarray) -> float:\n",
    "    return np.size(data) / np.sum(1.0 / data)\n",
    "\n",
    "print(f\"Среднее гармоническое = {harmonic_mean(data):.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "623a1d4c",
   "metadata": {},
   "source": [
    "#### [[↑]](#Оглавление:) c. Геометрическое\n",
    "\n",
    "Используется в расчетах инвестиций, прироста, площади, объёма и рассчитывается по формуле:\n",
    "\n",
    "$$\\overline{x}_{геом} = \\sqrt[n]{\\prod\\limits_{i=1}^n x_i} = \\sqrt[n]{x_1 \\cdot x_2 \\cdot \\ldots \\cdot x_n}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "06fae02d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Среднее геометрическое = 95.48\n"
     ]
    }
   ],
   "source": [
    "def geometric_mean(data: np.ndarray) -> float:\n",
    "    return np.exp(np.log(data).mean())\n",
    "\n",
    "print(f\"Среднее геометрическое = {geometric_mean(data):.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4da9515d",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) B. Медиана\n",
    "\n",
    "В основе среднего значения лежит [закон больших чисел](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB) и допущение, что исходая величина распределена нормально. Это подразумевает, что возможные значения сконцентрированы вокруг некоторого наиболее частого значения, а отклонения и в большую, и в меньшую сторону относительно невелики и равновероятны.\n",
    "\n",
    "В случае отклонения распределения от нормального среднее значение использовать некорректно, так как оно является слишком чувствительным параметром к «выбросам» – нехарактерным для изучаемой выборки, слишком большим или слишком малым значением, поэтому в таких случаях используется медиана. \n",
    "\n",
    "_**Медиана**_ – это значение признака, справа и слева от которого находится равное число наблюдений (по 50%). Этот параметр в отличие от среднего значения устойчив к «выбросам». Заметим также, что медиана может использоваться и в случае нормального распределения – в этом случае медиана совпадает со средним значением.\n",
    "\n",
    "Пусть выборка отсортирована, и размер выборки равен $n$, тогда:\n",
    "\n",
    "• Если $n$ - нечетное, то медиана $Мe = x_{Me} = x_{p+1}$, где $p = \\frac{n-1}{2}$\n",
    "\n",
    "• Если $n$ - четное, то медиана $Мe = x_{Me} = \\frac{x_p + x_{p+1}}{2}$, где $p = \\frac{n}{2}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d0c719ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Медиана выборки = 101.0\n"
     ]
    }
   ],
   "source": [
    "def median(data: np.ndarray) -> float:\n",
    "    return np.median(data)\n",
    "\n",
    "print(f\"Медиана выборки = {median(data)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58741da6",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) C. Мода\n",
    "_**Мода**_ — значение во множестве наблюдений, которое встречается наиболее часто. (Мода = типичность.)\n",
    "\n",
    "Иногда в совокупности встречается более чем одна мода (например: $6, 2, 6, 6, 8, 9, 9, 9, 0$; мода — $6$ и $9$). В этом случае можно сказать, что совокупность мультимодальна. Из структурных средних величин только мода обладает таким уникальным свойством. Как правило, мультимодальность указывает на то, что набор данных не подчиняется нормальному распределению.\n",
    "\n",
    "Мода как средняя величина употребляется чаще для данных, имеющих нечисловую природу. Среди перечисленных цветов автомобилей — _белый, чёрный, синий металлик, белый, синий металлик, белый_ — мода будет равна _белому_ цвету. При экспертной оценке с её помощью определяют наиболее популярные типы продукта, что учитывается при прогнозе продаж или планировании их производства.\n",
    "\n",
    "Определяется по формуле: $$Mo = x_i | m_i = \\max\\limits_{j=\\overline{1, n}}\\{m_j\\}$$\n",
    "\n",
    "Функция, вычисляющая моду выборки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "63a29c49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Мода выборки = [69 74]\n"
     ]
    }
   ],
   "source": [
    "def mode(data: np.ndarray) -> np.ndarray:\n",
    "    vals, counts = np.unique(data, return_counts=True)\n",
    "    return vals[np.where(counts == np.max(counts))]\n",
    "\n",
    "print(f\"Мода выборки = {mode(data)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe087ce2",
   "metadata": {},
   "source": [
    "Проверим функцию на корректность. Для этого подсчитаем количество значений в выборке: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b0bb342d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(69, 9), (74, 9), (100, 8), (92, 7), (103, 7)]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Counter(data).most_common(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a619dd3",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) D. Нижний  и верхний $0,05$-квантиль, квартили $Q_1, Q_2, Q_3$, интерквартильный размах\n",
    "$\\alpha$_**-квантиль (квантиль порядка**_ $\\alpha$) — это значение уровня, ниже которого лежит определенное число наблюдений, соответствующих выбранной частоте $\\alpha$.\n",
    "Таким образом, $\\alpha$-квантиль — это статистика, равная элементу вариационного ряда с номером $[n\\alpha+1]$, где квадратные скобки означают целую часть.\n",
    "\n",
    "Выделяют следующие квантили:\n",
    "* _**Нижний $\\alpha$-квантиль**_ - это о же, что и обычный квантиль порядка $\\alpha$;\n",
    "* _**Верхний $\\alpha$-квантиль**_ - это обычный квантиль порядка $1-\\alpha$.\n",
    "\n",
    "_**Квартили**_ — это квантили, кратные 25%.\n",
    "\n",
    "Выделяют следующие квартили:\n",
    "* $Q_1$ — это $\\frac{1}{4}(n+1)$ — ранжированное наблюдение — _**первый (нижний) квартиль**_ — значение вариационного ряда данных, левее которого находится четверть (25%) всех наблюдений;\n",
    "* $Q_2$ — это $\\frac{1}{2}(n+1) = Me$ — это медиана $Me$, левее и правее которой находится половина всех значений;\n",
    "* $Q_3$ — это $\\frac{3}{4}(n+1)$ — ранжированное наблюдение — _**третий (верхний) квартиль**_ — значение вариационного ряда данных, правее которого находится четверть всех наблюдений.\n",
    "\n",
    "_**Интерквартильный размах**_ — отражает среднюю половину (50%) данных. Вычисляется по формуле:\n",
    "\n",
    "$$IQR = Q_3 - Q_1$$\n",
    "\n",
    "Пример:\n",
    "<img src=\"img/quantiles.jpg\" alt=\"skewness\" width=\"500\"/>\n",
    "\n",
    "Для выборки имеем следующие статистики:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "68f0984b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Нижний 0.05-квантиль = 54\n",
      "Верхний 0.05-квантиль = 152\n",
      "Q1 = 78\n",
      "Q2 = 101\n",
      "Q3 = 121\n",
      "Интерквартильный размах = 43\n"
     ]
    }
   ],
   "source": [
    "def quantile(data: np.ndarray, quantile: float) -> float:\n",
    "    return int(np.quantile(data, quantile))\n",
    "\n",
    "Q1 = quantile(data, 0.25)\n",
    "Q3 = quantile(data, 0.75)\n",
    "\n",
    "IQR = Q3 - Q1\n",
    "\n",
    "print(f\"Нижний 0.05-квантиль = {quantile(data, 0.05)}\",\n",
    "      f\"Верхний 0.05-квантиль = {quantile(data, 1 - 0.05)}\",\n",
    "      f\"Q1 = {Q1}\",\n",
    "      f\"Q2 = {quantile(data, 0.5)}\",\n",
    "      f\"Q3 = {Q3}\",\n",
    "      f\"Интерквартильный размах = {IQR}\", sep=\"\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f97bad0",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) E. Выборочная дисперсия:\n",
    "_**Дисперсия случайной величины**_ — мера разброса значений случайной величины относительно её математического ожидания.\n",
    "\n",
    "_**Выборочная дисперсия**_ — это оценка теоретической дисперсии распределения, рассчитанная на основе данных выборки.\n",
    "\n",
    "Дисперсия имеет размерность, равную квадрату размерности признака. Это значит, к примеру, что если признак $x$ измеряется в рублях, то размерность дисперсии - $[руб^2]$, что является её недостатком.\n",
    "\n",
    "#### [[↑]](#Оглавление:) a. Несправленная (смещенная)\n",
    "\n",
    "Под выборочной дисперсией часто понимают неисправленную (смещенную) выборочную дисперсию. Её формула равна:\n",
    "\n",
    "$$S^2 = \\frac{1}{n}\\sum\\limits_{i=1}^n \\left(x_i-\\overline{x}\\right)^2$$\n",
    "\n",
    "Однако чаще используется формула:\n",
    "$$S^2 = \\frac{1}{n}\\sum\\limits_{i=1}^n x_i^2 - \\left(\\sum\\limits_{i=1}^n x_i \\right)^2 = \\overline{x^2} - \\overline{x}^2$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f38bcd37",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выборочная неисправленная дисперсия = 944.74\n"
     ]
    }
   ],
   "source": [
    "var = np.var(data) # var == variance\n",
    "\n",
    "print(f\"Выборочная неисправленная дисперсия = {var:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2395b8a3",
   "metadata": {},
   "source": [
    "#### [[↑]](#Оглавление:) b. Исправленная (несмещенная)\n",
    "\n",
    "\n",
    "Если в качестве оценки генеральной дисперсии принять выборочную дисперсию $D_в$, то эта оценка будет приводить в систематическим ошибкам, давая заниженное значение генеральной дисперсии $D_г$. Объясняется это тем, что, как можно доказать, выборочная дисперсия является смещенной оценкой, другими словами, математическое ожидание выборочной дисперсии не равно оцениваемой генеральной дисперсии, а равно:\n",
    "\n",
    "$$M[D_в] = \\frac{n}{n-1}D_г$$\n",
    "\n",
    "Легко исправить выборочную дисперсию так, чтобы ее математическое ожидание было равно генеральной дисперсии. Достаточно для этого умножить $D_в$ на дробь $\\frac{n}{n-1}$. Получим формулу _**исправленной выборочной дисперсии**_:\n",
    "$$\\hat{S}^2 = \\frac{n}{n-1}S^2 = \\frac{1}{n-1}\\sum\\limits_{i=1}^n \\left(x_i-\\overline{x}\\right)^2$$\n",
    "\n",
    "Исправленная дисперсия является несмещенной оценкой генеральной дисперсии. Действительно:\n",
    "\n",
    "$$M\\left[\\hat{S}^2\\right] = M\\left[\\frac{n}{n-1}D_г\\right] = \\frac{n}{n-1} M[D_в] = \\frac{n}{n-1}\\cdot \\frac{n-1}{n} D_г = D_г$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7b255796",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выборочная исправленная дисперсия = 947.71\n"
     ]
    }
   ],
   "source": [
    "unbiased_var = np.var(data, ddof=1)\n",
    "\n",
    "print(f\"Выборочная исправленная дисперсия = {unbiased_var:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ada34b1d",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) F. Стандартное отклонение\n",
    "Чтобы избавиться от квадрата размерности признака в дисперсии, была введена такая статистическая характеристика, как _**стандартное (среднее квадратическое) отклонение**_. Формула имеет вид: $$S = \\sqrt{S^2}$$\n",
    "где $S^2$ — [выборочная дисперсия](#[↑]-E.-Выборочная-дисперсия:);\n",
    "\n",
    "Стандартное отклонение, подобно дисперсии, также может быть смещенным и несмещенным. Вычислим смещенное стандартное отклонение:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a9832847",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Смещенное стандартное отклонение = 30.74\n"
     ]
    }
   ],
   "source": [
    "std = np.std(data) # == np.sqrt(var)\n",
    "\n",
    "print(f\"Смещенное стандартное отклонение = {std:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfa3ed1c",
   "metadata": {},
   "source": [
    "А также несмещенное стандартное отклонение:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "6aad883c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Несмещенное стандартное отклонение = 30.78\n"
     ]
    }
   ],
   "source": [
    "unbiased_std = np.std(data, ddof=1)\n",
    "\n",
    "print(f\"Несмещенное стандартное отклонение = {unbiased_std:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31d22e3e",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) G. Стандартная ошибка среднего\n",
    "_**Стандартная ошибка**_ — величина, которая характеризует стандартное (среднеквадратическое) отклонение выборочного среднего. Другими словами, эту величину можно использовать для оценки точности выборочного среднего. Цель этой метрики — помочь определить границы в которых может варьироваться истинное среднее для всей генеральной совокупности на основе некоторой выборки.\n",
    "\n",
    "Чем больше разброс данных, тем больше стандартная ошибка средней – прямо пропорциональная зависимость.\n",
    "\n",
    "Стандартная ошибка среднего рассчитывается по формуле: $$SEM = \\frac{S}{\\sqrt{n}}$$\n",
    "где $S$ — [стандартное отклонение](#[↑]-F.-Стандартное-отклонение);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b3a7cec4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Стандартная ошибка среднего = 1.72\n"
     ]
    }
   ],
   "source": [
    "def sem(data):\n",
    "    return np.std(data) / np.sqrt(np.size(data))\n",
    "\n",
    "print(f\"Стандартная ошибка среднего = {sem(data):.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c057600d",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) H. Коэффициент вариации\n",
    "_**Коэффициент вариации (относительное стандартное отклонение)**_ — мера относительного разброса случайной величины. Показывает, какую долю среднего значения этой величины составляет её средний разброс. Он применяется для сравнения вариативности одного и того же признака в нескольких совокупностях с различным средним арифметическим.\n",
    "\n",
    "Формула коэффициента вариации:\n",
    "$$V_S = \\frac{S}{\\overline{x}}$$\n",
    "где $S$ — [стандартное отклонение](#[↑]-F.-Стандартное-отклонение);\n",
    "\n",
    "Однако чаще используется представление в процентах:\n",
    "$$V_S = \\frac{S}{\\overline{x}}\\cdot100\\%$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2d542368",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коэффициент вариации = 30.47%\n"
     ]
    }
   ],
   "source": [
    "def variation(data: np.ndarray, in_percents=False) -> float:\n",
    "    cv = np.std(data) / np.mean(data)\n",
    "    return cv * 100 if in_percents else cv\n",
    "\n",
    "print(f\"Коэффициент вариации = {variation(data, True):.2f}%\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34be5389",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) I. Моменты распределения\n",
    "_Момент $k$-го порядка_ — среднее арифметическое $k$-й степени отклонения наблюдаемых значений $x_i = (i = 1, 2, \\ldots, n)$ от некоторой постоянной $c$, то есть:\n",
    "$$\\mu_k^{(c)} = \\sum\\limits_{i=1}^n (x_i-c)^k$$\n",
    "При $c=0$ имеем _начальный момент $k$-го порядка_: $$v_k=\\frac{1}{n}\\sum\\limits_{i=1}^n x_i^k$$\n",
    "При $c=\\overline{x}$ имеем _**центральные моменты $k$-го порядка**_: $$\\mu_k^{(c)} = \\sum\\limits_{i=1}^n \\left(x_i-\\overline{x}\\right)^k$$\n",
    "* Если $c=\\overline{x}$ и $k=0$, то $\\mu_0=1$;\n",
    "* Если $c=\\overline{x}$ и $k=1$, то $\\mu_1=0$;\n",
    "* Если $c=\\overline{x}$ и $k=2$, то $\\mu_2$ есть дисперсия: $$\\mu_2 = \\frac{1}{n}\\sum\\limits_{i=1}^n \\left(x_i-\\overline{x}\\right)^2$$\n",
    "\n",
    "Центральные моменты третьего и четвертого порядков обычно используются не сами по себе, а для расчета коэффициентов асимметрии и эксцесса."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78ea5366",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) J. Коэффициент ассиметрии\n",
    "_**Коэффициет ассиметрии**_ — величина, характеризующая асимметрию (скошенности) распределения случайной величины.\n",
    "\n",
    "Определяется по формуле:\n",
    "$$Ac = \\frac{\\mu_3}{S_3}$$\n",
    "где $\\mu_3 = \\frac{1}{n}\\sum\\limits_{i=1}^n \\left(x_i - \\overline{x}\\right)^3$ — [центральный момент третьего порядка](#[↑]-I.-Моменты-распределения), $S$ — [стандартное отклонение](#[↑]-G.-Стандартное-отклонение);\n",
    "\n",
    "* Если $Ac>0$, то распределение имеет правостороннюю ассиметрию (более пологий спуск справа);\n",
    "* Если $Ac<0$, то распределение имеет левостороннюю ассиметрию;\n",
    "* Если $Ac=0$, то это идеально симметричное распределение.\n",
    "\n",
    "<img src=\"img/skewness.jpg\" alt=\"skewness\" width=\"500\"/>\n",
    "\n",
    "Если $|Ac|>0.5$, то ассиметрия существенна."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1dd9e481",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коэффициент ассиметрии = 0.10\n"
     ]
    }
   ],
   "source": [
    "skewness = stats.skew(data, bias=False)\n",
    "\n",
    "print(f\"Коэффициент ассиметрии = {skewness:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7010d567",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) K. Коэффициент эксцесса\n",
    "_**Коэффициент эксцесса**_ — мера остроты пика распределения случайной величины.\n",
    "\n",
    "Определяется по формуле:\n",
    "$$Ek = \\frac{\\mu_4}{S_4}-3$$\n",
    "где $\\mu_4 = \\frac{1}{n}\\sum\\limits_{i=1}^n \\left(x_i - \\overline{x}\\right)^4$ — [центральный момент четвертого порядка](#[↑]-I.-Моменты-распределения), $S$ — [стандартное отклонение](#[↑]-G.-Стандартное-отклонение);\n",
    "\n",
    "* Если $Ek>0$, то пик распределения случайной величины остроконечен;\n",
    "* Если $Ek<0$, то пик распределения случайной величины плосковершинный:\n",
    "<img src=\"img/kurtosis.jpg\" alt=\"kurtosis\" width=\"350\"/>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "0f0095ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коэффициент эксцесса = 0.0227\n"
     ]
    }
   ],
   "source": [
    "kurtosis = stats.kurtosis(data, bias=False)\n",
    "\n",
    "print(f\"Коэффициент эксцесса = {kurtosis:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a085884f",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 2. Диаграмма Box-whiskers, определение выбросов\n",
    "\n",
    "_**Ящик с усами, диаграмма размаха (англ. box-and-whiskers diagram or plot, box plot)**_ — график, использующийся в описательной статистике, компактно изображающий одномерное распределение вероятностей.\n",
    "\n",
    "Такой вид диаграммы в удобной форме показывает медиану (или, если нужно, среднее), нижний и верхний квартили, минимальное и максимальное значение выборки и выбросы. Несколько таких ящиков можно нарисовать бок о бок, чтобы визуально сравнивать одно распределение с другим; их можно располагать как горизонтально, так и вертикально. Расстояния между различными частями ящика позволяют определить степень разброса (дисперсии) и асимметрии данных и выявить выбросы.\n",
    "\n",
    "Сравнение плотности распределения и ящика с усами:\n",
    "<img src=\"img/box_whiskers_1.jpg\" alt=\"kurtosis\" width=\"350\"/>\n",
    "\n",
    "Сопоставление нормального распределения и ящика с усами:\n",
    "<img src=\"img/box_whiskers_2.jpg\" alt=\"kurtosis\" width=\"450\"/>\n",
    "\n",
    "Построим ящик с усами для исходной выборки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c6208cd7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "box_plt = plt.boxplot(data, vert=False)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1893e051",
   "metadata": {},
   "source": [
    "_**Выброс**_ (англ. outlier) — резко отклоняющееся значение наблюдаемой величины. Выбросом считается наблюдение, которое лежит аномально далеко от остальных из серии параллельных наблюдений.\n",
    "\n",
    "Поскольку множество статистических методов «буксуют» на выборках с выбросами, выбросы приходится обнаруживать (желательно — автоматически) и исключать из выборки. Простейшие способы основаны на межквартильном расстоянии — например, считать выбросами всё, что не попадает в диапазон:\n",
    "$$[Q1-1.5\\cdot IQR, Q3+1.5\\cdot IQR]$$\n",
    "\n",
    "Более тонкие критерии — критерий Шовене, критерий Граббса, критерий Пирса, критерий Диксона.\n",
    "\n",
    "Получим выбросы исходной выборки, используя межквартильное расстояние:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "acb0ecfe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбросы исходной выборки = [ 11 186 186 200]\n"
     ]
    }
   ],
   "source": [
    "print(\"Выбросы исходной выборки =\",\n",
    "      data[(data < Q1 - 1.5 * IQR) | (data > Q3 + 1.5 * IQR)])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbe27c2f",
   "metadata": {},
   "source": [
    "Также можно получить выбросы, используя объект `boxplot`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "907ab77f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбросы исходной выборки = [ 11 186 186 200]\n"
     ]
    }
   ],
   "source": [
    "outliers = box_plt[\"fliers\"][0].get_data()[0]\n",
    "\n",
    "print(\"Выбросы исходной выборки =\",\n",
    "      outliers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "33d37000",
   "metadata": {},
   "outputs": [],
   "source": [
    "del box_plt, outliers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58a5bc41",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 3. Интервальный ряд c использованием формулы Стёрджеса\n",
    "_**Сгруппированным интервальным (непрерывным) вариационным рядом**_ называют ранжированные по значению признака интервалы $(a_i \\leq x < b_i)$, где $i=1, 2, \\cdots, k$, указанные вместе с соответствующими частотами $m_i$ числа наблюдений, попавших в $i$-й интервал или относительными частотами $\\frac{m_i}{n}$.\n",
    "\n",
    "Построение интервального вариационного ряда начинают с определения числа $k$, обозначающее количество интервалов. Оно должно быть оптимальным. Если оно будет малым, то гистограмма получется слишком сглаженной (oversmoothed) и потеряет все особенности изменчивости данных. Если будет большим, то мы не сможем оценить плотность распределения изучаемых данных по числовой оси: гистограмма получится недосглаженная (undersmoothed), с незаполненными интервалами, неравномерная.\n",
    "\n",
    "Чаще всего для определения числа $k$ используется _**формула Стёрджеса**_:\n",
    "\n",
    "$$k=1+ \\lfloor \\log_2n \\rfloor = 1 + \\lfloor 3,22 \\lg n \\rfloor $$\n",
    "где $\\lfloor \\dots \\rfloor$ — округление вниз до целого;\n",
    "\n",
    "Алгоритм построения интервального ряда получается следующим:\n",
    "1. Определение $x_{max}$ и $x_{min}$ в имеющейся выборке;\n",
    "2. Определение размаха варьирования признака $R = x_{max} - x_{min}$;\n",
    "3. Определение количества бинов $k$ формулой Стёрджеса;\n",
    "4. Определение ширины интервала $h = \\frac{R}{k}$;\n",
    "5. Определение граничных значений интервалов $(a_i, b_i)$. Рекомендуется отступить влево от нижнего предела варьирования $a_1 = x_{min} - \\frac{h}{2}$. Верхняя граница первого интервала $b_1 = a_1 + h$. Далее используют итеративную формулу: $a_{i+1} = b_i$; $b_i = a_i + h$. Построение интервалов продолжается до тех пор, пока начало следующего по порядку интервала не будет равным или больше $x_{max}$;\n",
    "6. Группировка результатов наблюдения: при просмотре статистических данных значения признака разносятся по соответствующим интервалам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "68722e85",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Оптимальное количество интервалов = 9\n",
      "Получившийся интервальный ряд = [ 11.  32.  53.  74.  95. 116. 137. 158. 179. 200.]\n"
     ]
    }
   ],
   "source": [
    "# Правило Стёрджеса -> оптимальное число бинов в гистограмме\n",
    "def sturges(arr: np.ndarray) -> int:\n",
    "    return int(1 + np.floor(np.log2(len(arr))))\n",
    "\n",
    "occur, intervals = np.histogram(data, bins=sturges(data))\n",
    "\n",
    "print(f\"Оптимальное количество интервалов = {sturges(data)}\",\n",
    "      f\"Получившийся интервальный ряд = {intervals}\", sep=\"\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a722c6f",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 4. График эмпирической функции распределения $F_n$\n",
    "_**Эмпирическая функция распределения (функция распределения выборки)**_ — функция, которая определяет для каждого значения $x$ частоту событий $X<x$ и предназначена для оценки _теоретической функции распределения_ генеральной совокупности в математической статистике.\n",
    "\n",
    "Эмпирическая функция распределения находится по формуле: $$F_n = \\frac{n_x}{n}$$\n",
    "где $n_x$ — количество вариантов, меньших $x$, $n$ — объём выборки.\n",
    "\n",
    "Функция распределения $F_x$ генеральной совокупности называется _теоретической функцией распределения_. Отличие эмпирической функции от теоретической состоит в том, что теоретическая функция определяет вероятность события $X<x$, а эмпирическая стремится к ней при большом количестве испытаний.\n",
    "\n",
    "Несколько примеров плотностей вероятности и функций распределения:\n",
    "<img src=\"img/cdf.jpg\" alt=\"cdf\" width=\"800\"/>\n",
    "\n",
    "Вычислим эмпирическую функцию распределения для исходной выборки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "5bb6910c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Эмпирическая функция распределения\n",
    "def ecdf(X: np.ndarray, size: int = None) -> np.ndarray:\n",
    "    return np.arange(1, len(X) + 1) / len(X) if size is None else np.arange(1, len(X) + 1) / size\n",
    "\n",
    "plt.step(data, ecdf(data))\n",
    "\n",
    "plt.ylabel('$F_n$', fontsize=20)\n",
    "plt.xlabel('$x$', fontsize=20)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ef8b45c",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 5. Проверка распределения на нормальность:\n",
    "### [[↑]](#Оглавление:) A. Гистограмма\n",
    "Проверим распределение на нормальность с использованием гистограммы: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "c208b513",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Гистограмма\n",
    "plt.hist(data, bins=sturges(data), density=True)\n",
    "\n",
    "# Нормальное распределение\n",
    "x_pdf = np.linspace(np.min(data), np.max(data), 1000)\n",
    "y_pdf = stats.norm.pdf(x_pdf, loc=mean, scale=std)\n",
    "\n",
    "plt.plot(x_pdf, y_pdf, lw=4, c='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71af701b",
   "metadata": {},
   "source": [
    "Заметим, что данные исходной выборки распределены нормально"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06189954",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) B. QQ-plot\n",
    "_**QQ-plot (график квантиль-квантиль)**_ — графический метод определения принадлежности выборки определенному распределению, дополнительно позволяющий:\n",
    "* Оценивать степень отклонения данных от теоретического распределения;\n",
    "* Читать медиану, дисперсию и наклон функции распределения;\n",
    "* Сравнивать две выборки между собой.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "b746842d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "stats.probplot(data, dist=\"norm\", plot=plt)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eee2c834",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) С. Критерий ассиметрии и эксцесса\n",
    "\n",
    "Критерий [ассиметрии](#[↑]-J.-Коэффициент-ассиметрии) и [эксцесса](#[↑]-K.-Коэффициент-эксцесса) мы уже рассчитывали выше. Они получились достаточно близки к нулю:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "26ed3873",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коэффициент ассиметрии = 0.10\n",
      "Коэффициент эксцесса = 0.02\n"
     ]
    }
   ],
   "source": [
    "print(f\"Коэффициент ассиметрии = {skewness:.2f}\",\n",
    "      f\"Коэффициент эксцесса = {kurtosis:.2f}\", sep=\"\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8905c1d9",
   "metadata": {},
   "source": [
    "Так как критерии ассиметрии и эксцесса могут иметь место и для распределений, отличных от нормального, то этот критерий следует воспринимать как критерий установления отклонения от нормальности распределения, но не установления нормальности."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "1c43f6a4",
   "metadata": {},
   "outputs": [],
   "source": [
    "del skewness, kurtosis"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bba6f915",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) D. Проверка гипотез\n",
    "Критерием согласия называется метод проверки гипотезы о предполагаемом законе неизвестного распределения.\n",
    "\n",
    "_**Критерий согласия**_ — алгоритм, предназначенный для проверки гипотезы $H_0$ о том, что ряд наблюдений $x_1, x_2, \\cdots x_n$ образует случайную выборку, извлеченную из генеральной совокупности $X$ с функцией распределение $F(x)=F(x,\\theta)$:\n",
    "\n",
    "$$H_0: F_n(x)=F(x,\\theta)$$\n",
    "\n",
    "где $F_n(x)$ эмпирическая функция распределения, $\\theta=(\\theta_1, \\theta_2, \\cdots, \\theta_k)$ — вектор параметров. Общий вид функции $F(x, \\theta)$ считается известным, а параметры $\\theta_1, \\theta_2, \\cdots, \\theta_k$ могут быть как известными, так и неизвестными.\n",
    "\n",
    "Большинство критериев согласия основаны на использовании различных мер расстояний между анализируемой эмпирическое функцией $F_n(x)$ распределения, определенной по выборке, и функцией распределения $F(x, \\theta)$ генеральной совокупности $X$\n",
    "\n",
    "$\\alpha$_**-уровень (уровень значимости)**_ — пороговый уровень статистической значимости; вероятность ошибочно отклонить нулевую гипотезу. Чем меньше $\\alpha$-уровень, тем меньше риск совершения этой ошибки. Устанавливается исследователем произвольно (обычно принимается равным $0.05$, $0.01$ или $0.001$). Примем уровень значимости равным $0.05$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "3e0690f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "confidence = 0.05"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b1eab1d",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) E. Критерий согласия хи-квадрат Пирсона\n",
    "Данный критерий служит для проверки гипотезы о том, что генеральная совокупность, из которой извлечена выборка, имеет заданный закон распределения. Применяется при объемах выборки $n \\geq 50$.\n",
    "\n",
    "Пусть имеется выборка $\\{x_i\\}_{i=1}^n$ объема $n$. Необходимо проверить гипотезу о том, что выборка была извлечена из генеральной совокупности, распределенной по закону с функцией распределения $F(x, \\theta)$:\n",
    "$$H_0 : F_n(x) = F(x, \\theta)$$\n",
    "\n",
    "где $\\theta$ — известный вектор параметров теоретического закона\n",
    "\n",
    "По выборке $\\{x_i\\}_{i=1}^n$ получим эмпирическое распределение в виде дискретного или интервального вариационного ряда:\n",
    "<img src=\"img/chi-squared_test.jpg\" alt=\"chi-squared_test\" width=\"500\"/>\n",
    "\n",
    "где $m_i$ - количество наблюдений в $i$-м интервале.\n",
    "\n",
    "Обозначим через $p_i$ вероятности попадания $i$-й интервал $\\left(i=\\overline{1, k}\\right)$, соответствующие теоретическому закону с функцией распределения $F(x, \\theta)$:\n",
    "\n",
    "$$p_i = P\\left(a_{i} < x < b_{i}\\right) = F\\left(b_{i}, \\theta\\right) - F\\left(a_{i}, \\theta\\right)$$\n",
    "\n",
    "Вероятности $p_i$ можно рассматривать как _теоретические частости_:\n",
    "$$p_i=\\frac{m'_i}{n}$$\n",
    "где $$m'_i=np_i$$\n",
    "\n",
    "Величины $m'_i$ можно рассматривать как теоретические частоты, т.е. количества элементов выборки, которые должны были попасть в каждый интервал, если бы случайная величина имела выбранный закон распределения $F(x, \\theta)$, параметры которого совпадают с их то тчечными оценками по выборке.\n",
    "\n",
    "Каждая из величин $$\\frac{m_i - m'_i}{\\sqrt{m'_i}}$$\n",
    "\n",
    "представляет собой относительное отклонение частоты от теоретической частоты и имеет стандартное нормальное распределение. Соответственно, _сумма квадратов этих величин имеет распределение хи-квадрат_.\n",
    "\n",
    "Справедлива следующая теорема.\n",
    "\n",
    "---\n",
    "\n",
    "**Теорема.** Величина $$\\chi^2_n = \\sum\\limits_{i=1}^k \\frac{(m_i-np_i)^2}{np_i} = \\sum\\limits_{i=1}^k \\frac{\\left(m_i-m'_i\\right)^2}{m'_i}$$\n",
    "\n",
    "является случайной и, если верна проверяемая гипотеза $H_0 : F_n(x)= F(x, \\theta)$, распределена по закону $\\chi^2$ с числом степеней свободы $v=k-1-r,$ где $k$ — число частичных интервалов выборки, $r$ — число параметров преполагаемого распределения.\n",
    "\n",
    "---\n",
    "\n",
    "Далее вычисляем теоретическое (истинное) $\\chi^2_{v;\\alpha}$ для заданной вероятности $\\alpha$:\n",
    "\n",
    "$$\\chi^2_{v;\\alpha} | P\\left(\\chi^2 > \\chi^2_{v;\\alpha}\\right) = \\alpha$$\n",
    "\n",
    "То есть $\\chi^2_{v;\\alpha}$ — $\\alpha$-квантиль распределения хи-квадрат. Его также называют _критическим значением_ и находят по таблицам распределения $\\chi^2$.\n",
    "\n",
    "Гипотеза $H_0$ отвергается на уровне значимости $\\alpha$, если вычисленное значение $\\chi^2_n$ окажется больше критического $\\chi^2_{v;\\alpha}$:\n",
    "\n",
    "$$\\chi^2_n > \\chi^2_{v;\\alpha}$$\n",
    "\n",
    "Геометрически это означает, что $\\chi^2_n$ попадает в правостороннюю критическую область, граница которой при заданном уровне значимости $\\alpha$ равна $\\chi^2_{v;\\alpha}$\n",
    "\n",
    "Иногда оценивается вероятность получить значение статистики $\\chi^2_n$:\n",
    "\n",
    "$$p\\_value = P\\left(\\chi^2 > \\chi^2_n \\right)$$\n",
    "\n",
    "Если $p\\_value < \\alpha$, то гипотеза $H_0$ отвергается.\n",
    "\n",
    "---\n",
    "\n",
    "Для _проверки гипотезы о нормальном законе распределения_ находим вероятности по формуле:\n",
    "$$p_i = p\\left(x_i < x < x_{i+1}\\right) = \\Phi\\left(\\frac{x_{i+1} - \\overline{x}}{S}\\right) - \\Phi\\left(\\frac{x_i - \\overline{x}}{S}\\right)$$\n",
    "где $n$ — объем выборки; $x_i, x_{i+1}$ — левая и правая границы $i$-го интервала; $\\Phi$ — функция стандартного нормального распределения; $\\overline{x}$ — выборочное среднее; $S$ — исправленное стандартное отклонение. Далее находим теоретические частоты $m'_i = np_i$\n",
    "\n",
    "Поскольку нормальное распределение характеризуется 2 параметрами $\\mu$ и $\\sigma$, то $r=2$ и число степеней свободы $v=n-3$.\n",
    "\n",
    "---\n",
    "\n",
    "Вычислим теоретические частоты $m'_i$ для исходной выборки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "e41d06c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Теоретические частоты = [3.4568097474664263, 15.098115892487069, 42.03427772166201, 74.65478800282929, 84.62272793942867, 61.226142268367205, 28.267755294164374, 8.32308541501277, 1.5614375004549785]\n"
     ]
    }
   ],
   "source": [
    "cdf = stats.norm.cdf\n",
    "\n",
    "m_t = [(cdf(intervals[i+1], mean, std) - cdf(intervals[i], mean, std)) * n\n",
    "        for i in range(len(intervals) - 1)]\n",
    "\n",
    "print(f\"Теоретические частоты = {m_t}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac411229",
   "metadata": {},
   "source": [
    "Затем вычислим значение $\\chi^2_n$ по формуле:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "50ad6918",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Хи-квадрат = 4.011\n"
     ]
    }
   ],
   "source": [
    "chi_sq = np.sum((occur - m_t) ** 2 / m_t)\n",
    "\n",
    "print(f\"Хи-квадрат = {chi_sq:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5493b6b6",
   "metadata": {},
   "source": [
    "Получим критическое значение $\\chi^2_{v;\\alpha}$, используя функцию `chi2.ppf` из модуля `scipy.stats`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "80a43fd9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Критическое значение = 12.592\n"
     ]
    }
   ],
   "source": [
    "crit_val = stats.chi2.ppf(1 - confidence, sturges(data) - 3)\n",
    "\n",
    "print(f\"Критическое значение = {crit_val:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8610140d",
   "metadata": {},
   "source": [
    "Таким образом, неравенство $\\chi^2_n > \\chi^2_{v;\\alpha}$ не выполняется. Следовательно, гипотеза $H_0$ о нормальности распределения не отвергается."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30d31307",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) F. Критерий Колмогорова\n",
    "\n",
    "Если невозможно эффективно применять хи-квадрат на маленьких выборках, то в таких случаях часто используется _**критерий Колмогорова**_. Данный критерий также предназначен для проверки простых гипотез о принадлежности анализируемой выборки некоторому полностью известному параметрическому закону распределения.\n",
    "\n",
    "Применяется критерий Колмогора по следующей схеме:\n",
    "1. Строится эмпирическая функция $F_n(x)$:\n",
    "\n",
    "2. Определяется мера расхождения между теоретическим и эмпирическим распределением по формуле $D_n = \\max\\limits_i |F_n(x_i) - F(x_i)|$ и вычисляется величина: $$k_n = \\sqrt{n}{D_n}$$\n",
    "3. Находится критическое значение $k_\\alpha$. Значение можно найти в соответствующих таблицах или приблизительно рассчитать по формуле:\n",
    "\n",
    "$$k_\\alpha \\approx \\sqrt{\\frac{1}{2} \\ln \\frac{2}{\\alpha}}$$\n",
    "\n",
    "4. Если $k_n > k_\\alpha$, то нулевая гипотеза $H_0$ о том, что случайная величина $X$ имеет заданный закон распределения, отвергается. Иначе гипотеза не противоречит опытным данным.\n",
    "\n",
    "Реализуем функции, необходимые для проверки нулевой гипотезы о принадлежности выборки нормальному распределнию критерием Колмогорова:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "ff1e0330",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Теоретическая функция нормального распределения\n",
    "def tcdf(X: np.ndarray) -> np.ndarray:\n",
    "    return np.array([cdf(x, loc=X.mean(), scale=X.std()) for x in X])\n",
    "\n",
    "# Мера расхождения между теоретической и эмпирической функцией\n",
    "def Dn(Ft: np.ndarray, Fx: np.ndarray) -> float:\n",
    "    return np.max(np.abs(Ft - Fx))\n",
    "\n",
    "# Статистика критерия Колмогорова\n",
    "def kn(Dn: float, n: int) -> float:\n",
    "    return np.sqrt(n) * Dn\n",
    "\n",
    "# Критическое значение для статистики критерия Колмогорова\n",
    "def k_conf(confidence: float) -> float:\n",
    "    return np.sqrt(0.5 * np.log(2 / confidence))\n",
    "\n",
    "# Конвертация в стандартное нормальное распределение\n",
    "def to_std_norm_dist(X: np.ndarray) -> np.ndarray:\n",
    "    return (X - X.mean()) / X.std()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "becd5b0d",
   "metadata": {},
   "source": [
    "В соответствии со схемой последовательно воспользуемся ими. Вычислим $D_n$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "9a16af40",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Мера расхождения Dn = 0.031\n"
     ]
    }
   ],
   "source": [
    "print(f\"Мера расхождения Dn = {Dn(tcdf(data), ecdf(data)):.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e27159c4",
   "metadata": {},
   "source": [
    "Вычислим статистику критерия Колмогорова $k_n$ и критическое значение $k_\\alpha$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "cf47f372",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Статистика Колмогорова kn = 0.561\n",
      "Критическое значение k_confidence = 1.358\n"
     ]
    }
   ],
   "source": [
    "print(f\"Статистика Колмогорова kn = {kn(Dn(tcdf(data), ecdf(data)), n):.3f}\")\n",
    "print(f\"Критическое значение k_confidence = {k_conf(0.05):.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5288885a",
   "metadata": {},
   "source": [
    "Таким образом, неравенство $k_n > k_\\alpha$ не выполняется. Следовательно, гипотеза нормальности нормальности распределения не отвергается.\n",
    "\n",
    "---\n",
    "\n",
    "Проверим правильность вычислений с помощью функции `kstest` из `scipy.stats`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "c4706555",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Мера расхождения Dn = 0.031 \n",
      "p_value = 0.902\n"
     ]
    }
   ],
   "source": [
    "print(\"Мера расхождения Dn = {:.3f} \\np_value = {:.3f}\".format(*stats.kstest(to_std_norm_dist(data), 'norm')))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec5027a2",
   "metadata": {},
   "source": [
    "Меры расхождения $Dn$ равны и $p\\_value > \\alpha = 0.05$. Таким образом, гипотеза о нормальности распределения также не отвергается."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d370c113",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:)  6. Проверка первых 10 значений на нормальность, используя критерий Шапиро-Уилка\n",
    "_**Критерий Шапиро-Уилка**_ предназначен для проверки на нормальность распределения выборок, численностью от 3 до 50. В отличии от критериев Пирсона и Колмогорова, критерий Шапиро–Уилка может быть использовал лишь для проверки распределения на нормальность.\n",
    "\n",
    "Пусть имеется выборка $(x_1, x_2, \\cdots, x_n)$, где $3 \\leq n \\leq 50$. Вычисления производятся по формуле:\n",
    "\n",
    "$$W=\\frac{b^2}{S^2}$$\n",
    "где $S^2 = \\sum\\limits_{i=1}^n \\left(x_i-\\overline{x}\\right)^2$ — квадрат оценки среднеквадратического отклонения Ллойда; $b = \\sum\\limits_{i=1}^k a_{n-i+1}(x_{n-i+1}-x_i)$; $k=\\frac{n}{2}$, eсли $n$ - четное, иначе $k=\\frac{n-1}{2}$; $a_{n-i+1}(i=1, \\cdots, k)$ — известные константы, которые вычисляются, либо берутся из заданных таблиц:\n",
    "\n",
    "<img src=\"img/shapiro_1.jpg\" alt=\"shapiro_1\" width=\"600\"/>\n",
    "\n",
    "Если $W<W(\\alpha)$, то нулевая гипотеза нормальности распределения отклоняется на уровне значимости $\\alpha$. Значения $W(\\alpha)$ также приводятся в таблицах:\n",
    "<img src=\"img/shapiro_2.jpg\" alt=\"shapiro_2\" width=\"600\"/>\n",
    "\n",
    "_Полные таблицы приведены в книге Кобзарь А.И. — Прикладная математическая статистика. Для инженеров и научных работников._\n",
    "\n",
    "Вычислим $W$ для первых десяти значений в отсортированной исходной выборке:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "61e00421",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W = 0.879\n"
     ]
    }
   ],
   "source": [
    "N = 10\n",
    "a = np.array([0.5739, 0.3291, 0.2141, 0.1224, 0.0399])\n",
    "\n",
    "b = np.sum([a[i] * (data[N-i-1] - data[i]) for i in range(N // 2)])\n",
    "W = b**2 / (N * np.var(data[:N]))\n",
    "\n",
    "print(f\"W = {W:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5ab048d",
   "metadata": {},
   "source": [
    "Если принять уровень значимости $\\alpha$ равным $0.05$, то, используя прикрепленную выше таблицу, можно найти значение $W(\\alpha)$. Видим, что при $n=10$ и $\\alpha=0.05$: $$W(\\alpha)=0.842$$\n",
    "\n",
    "Таким образом, неравенство $W < W(\\alpha)$ не выполняется. Следовательно, гипотеза нормальности распределения принимается.\n",
    "\n",
    "Посчитаем также критерий Шапиро-Уилка с использованием функции `shapiro` из `scipy.stats`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "9bd6420b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ShapiroResult(statistic=0.8784602880477905, pvalue=0.12528105080127716)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stats.shapiro(data[:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cd16f8b",
   "metadata": {},
   "source": [
    "Заметим, что функция возвращает ещё один параметр $p\\_value$. Если $p\\_value < \\alpha$, то гипотеза отвергается.\n",
    "\n",
    "В нашем случае $0.125 \\nless 0.05$, что также подтвержает гипотезу нормальности распределения."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "99788e5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "del a, b, N"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf7ab12c",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 7. $95\\%$-й доверительный интервал для неизвестной генеральной дисперсии"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a20b50e0",
   "metadata": {},
   "source": [
    "Доверительный интервал для неизвестной генеральной дисперсии имеет следующий вид:\n",
    "\n",
    "$$\\left(\\frac{(n-1) \\cdot S^2}{\\chi_l^2(\\alpha)}; \\frac{(n-1) \\cdot S^2}{\\chi_r^2(\\alpha)}\\right)$$\n",
    "\n",
    "где $S^2$ — исправленная выборочная дисперсия, $\\chi^2$ — распределения с $n-1$ степенью свободы, причем в таблице ищем $\\frac{\\alpha}{2}$ и $1 - \\frac{\\alpha}{2}$ соответственно."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "a7a8d558",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Доверительный интервал для дисперсии: (816.25, 1113.86)\n"
     ]
    }
   ],
   "source": [
    "chi_l = stats.chi2.ppf(confidence / 2, n - 1)\n",
    "chi_r = stats.chi2.ppf(1 - confidence / 2, n - 1)\n",
    "\n",
    "D_conf_interval = ((n - 1) * unbiased_var / chi_r, (n - 1) * unbiased_var / chi_l)\n",
    "\n",
    "print(\"Доверительный интервал для дисперсии:\",\n",
    "      \"({:.2f}, {:.2f})\".format(*D_conf_interval))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a88d86c",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 8. $95\\%$-й доверительный интервал для неизвестного генерального среднего при условии, что:\n",
    "### [[↑]](#Оглавление:) A. Генеральные дисперсии известны\n",
    "_Использовать данные, полученные в пункте 7_\n",
    "\n",
    "Доверительный интервал для среднего с известной дисперсией имеет вид:\n",
    "\n",
    "$$\\left(\\overline{x} - \\frac{\\sigma}{\\sqrt{n}} \\cdot z_\\alpha;\\; \\overline{x} + \\frac{\\sigma}{\\sqrt{n}} \\cdot z_\\alpha\\right)$$\n",
    "\n",
    "где $\\sigma$ — выборочное несмещенное стандартное отклонение, $z_\\alpha$ — квантиль нормального распределения уровеня $1 - \\frac{\\alpha}{2}$\n",
    "\n",
    "или\n",
    "\n",
    "$$\\left(\\overline{x} - \\Delta;\\; \\overline{x} + \\Delta\\right)$$\n",
    "\n",
    "где $\\Delta = \\frac{\\sigma}{\\sqrt{n}} \\cdot z_\\alpha$;\n",
    "\n",
    "Чтобы вычислить выборочное несмещенное стандартное отклонение, извлечем корень из уже вычисленной исправленной (несмещенной) дисперсии:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "08049484",
   "metadata": {},
   "outputs": [],
   "source": [
    "unbiased_std = np.sqrt(unbiased_var)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8a715a0",
   "metadata": {},
   "source": [
    "Вычислим $\\Delta$ и получим доверительные интервалы для неизвестного генерального среднего:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "893a28db",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Доверительный интервал для неизвестного генерального среднего: (97.49, 104.24)\n"
     ]
    }
   ],
   "source": [
    "delta = stats.distributions.norm.ppf(1 - confidence / 2) * unbiased_std / np.sqrt(n)\n",
    "E_conf_interval = mean - delta, mean + delta\n",
    "\n",
    "print(\"Доверительный интервал для неизвестного генерального среднего:\",\n",
    "      \"({:.2f}, {:.2f})\".format(*E_conf_interval))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2581d068",
   "metadata": {},
   "source": [
    "Проверим полученные результаты с использованием встроенных функций:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "64ae0742",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Доверительный интервал для неизвестного генерального среднего: (97.48, 104.25)\n"
     ]
    }
   ],
   "source": [
    "def confidence_interval(data: np.ndarray, conf: float = 0.95) -> tuple[float, float]:\n",
    "    return stats.t.interval(conf, len(data)-1, data.mean(), stats.sem(data))\n",
    "\n",
    "print(\"Доверительный интервал для неизвестного генерального среднего:\",\n",
    "      \"({:.2f}, {:.2f})\".format(*confidence_interval(data)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45c39bca",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) B. Генеральные дисперсии неизвестны\n",
    "\n",
    "Если выборка больше 30, но стандартное отклонение нам неизвестно, то вместо $\\sigma$ мы будем использовать выборочное стандартное отклонение:\n",
    "\n",
    "$$s = \\sqrt{\\frac{1}{n-1}\\sum_\\limits{i=1}^n \\left( x_i - \\overline{x} \\right)^2}$$\n",
    "\n",
    "Таким образом, доверительный интервал для среднего при неизвестной дисперсии, но большой выборке ($n > 30$), имеет вид:\n",
    "\n",
    "\n",
    "$$\\left(\\overline{x}-\\frac{s}{\\sqrt{n}}z_\\alpha;\\; \\overline{x}+\\frac{s}{\\sqrt{n}}z_\\alpha\\right)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "045c7c7f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Доверительный интервал для неизвестного генерального среднего: (97.49, 104.24)\n"
     ]
    }
   ],
   "source": [
    "s = np.sqrt(np.sum((data - mean) ** 2) / (n - 1))\n",
    "delta = stats.norm.ppf(1 - confidence / 2) * s / (n ** 0.5)\n",
    "E_conf_interval = (mean - delta, mean + delta)\n",
    "\n",
    "print(\"Доверительный интервал для неизвестного генерального среднего:\",\n",
    "      \"({:.2f}, {:.2f})\".format(*E_conf_interval))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a8583da",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) 9. Разбиение выборки на 2 непересекающиеся группы в пропорции $55/45$ в произвольном порядке и проверка групп:\n",
    "\n",
    "Разбиваем выборку по условию:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "871e0c0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размерность выборок = (176, 144)\n"
     ]
    }
   ],
   "source": [
    "sample_1, sample_2 = train_test_split(data, train_size=0.55, random_state=0)\n",
    "\n",
    "n1, n2 = len(sample_1), len(sample_2)\n",
    "\n",
    "print(f\"Размерность выборок = {(n1, n2)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1135b7ef",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) A. На однородность с использованием критерия Колмогорова-Смирнова\n",
    "\n",
    "Критерий Колмогорова-Смирнова используется для проверки гипотезы об однородности выборок, то есть гипотезу о том, что рассматриваемые выборки извлечены из одной и той же генеральной совокупности:\n",
    "\n",
    "$$H_0 : F_1(x) = F_2(x)$$\n",
    "\n",
    "Статистика критерия Колмогорова-Смирнова имеет вид:\n",
    "\n",
    "$$k_{n, m} = \\sqrt{\\frac{nm}{n+m}} \\cdot D_{n, m} = \\sqrt{\\frac{nm}{n+m}} \\cdot sup_x |F_n(x) - F_m(x)|$$\n",
    "\n",
    "где $F_n(x)$ и $F_m(x)$ — эмпирические функции распределения, построенные по двум выборкам с объемами $n$ и $m$.\n",
    "\n",
    "Если $k_{n,m}>k_\\alpha$, то нулевая гипотеза однородности выборок отклоняется на уровне значимости $\\alpha$.\n",
    "\n",
    "Напишем ряд функций, позволяющих вычислить статистику критерия Колмогорова-Смирнова:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "62648a70",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Частотности\n",
    "def freq(data: np.ndarray, ranges: np.ndarray) -> np.ndarray:\n",
    "    return np.unique(np.digitize(data, ranges), return_counts=True)[1]\n",
    "\n",
    "# Выборочная эмпирическая функция распределения\n",
    "def samp_ecdf(data: np.ndarray, ranges: np.ndarray) -> np.ndarray:\n",
    "    return np.cumsum(freq(data, ranges)) / len(data)\n",
    "\n",
    "# Статистика критерия Колмогорова-Смирнова\n",
    "def k_stat(data1: np.ndarray, data2: np.ndarray, ranges: np.ndarray) -> float:\n",
    "    n, m = len(data1), len(data2)\n",
    "    F1, F2 = samp_ecdf(data1, ranges), samp_ecdf(data2, ranges)\n",
    "    return Dn(F1, F2) * np.sqrt(n * m) / (n + m)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c6a8bca",
   "metadata": {},
   "source": [
    "Вычислим статистику критерия Колмогорова-Смирнова:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "d9932786",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Статистика критерия Колмогорова-Смирнова = 0.024\n"
     ]
    }
   ],
   "source": [
    "print(f\"Статистика критерия Колмогорова-Смирнова = {k_stat(sample_1, sample_2, intervals):.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd6835ae",
   "metadata": {},
   "source": [
    "Вычислим критическое значение $k_\\alpha$, воспользовавшись уже реализованной в критерии Колмогорова функцией:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "e20b2df0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Критическое значение k_alpha = 1.358\n"
     ]
    }
   ],
   "source": [
    "print(f\"Критическое значение k_alpha = {k_conf(confidence):.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3d5c237",
   "metadata": {},
   "source": [
    "Таким образом, неравенство $k_{n,m}>k_\\alpha$ не выполняется. Следовательно, нулевая гипотеза однородности двух выборок принимается."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d085550f",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) B. На равенство дисперсий \n",
    "\n",
    "Для проверки выборок на равенство дисперсий воспользуемся критерием Фишера.\n",
    "\n",
    "_**Критерий Фишера (F-test):**_ Нулевая гипотеза $H_0 : \\sigma_1^2 = \\sigma_2^2$ принимается на уровне значимости $\\alpha$, если выполняется неравенство:\n",
    "\n",
    "$$F\\left(1-\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right) \\leq F \\leq F\\left(\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right)$$\n",
    "\n",
    "где $k_1=n_1-1$; $k_2=n_2-1$; $n_1$, $n_2$ — объем первой и второй выборки соответственно; $\\alpha$ — уровень значимости; $F = \\frac{S_1^2}{S_2^2}$ — отношение несмещенных выборочных дисперсий; $F\\left(1-\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right)$ — верхний квантиль уровня $1-\\frac{\\alpha}{2}$ распределения Фишера-Снедекора (т.е. соответствует нижнему квантилю уровня $\\frac{\\alpha}{2}$); $F\\left(\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right)$ — верхний квантиль уровня $\\frac{\\alpha}{2}$ распределения Фишера-Снедекора.\n",
    "\n",
    "Вычислим статистику F-теста:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "347a8a5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F = 1.052\n"
     ]
    }
   ],
   "source": [
    "F = np.var(sample_1, ddof=1) / np.var(sample_2, ddof=1)\n",
    "\n",
    "print(f\"F = {F:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7c570fd",
   "metadata": {},
   "source": [
    "Рассчитаем число степеней свобод $k_1$ и $k_2$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "df64f1d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "k1 = n1 - 1\n",
    "k2 = n2 - 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b26d19f",
   "metadata": {},
   "source": [
    "Вычислим квантили распределения Фишера-Снедекора, используя встроенную в `scipy.stats` функцию `f.ppf`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "fbca4e45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F1 = 0.733\n",
      "F  = 1.052\n",
      "F2 = 1.372\n"
     ]
    }
   ],
   "source": [
    "F1 = stats.f.ppf(confidence / 2, k1, k2)\n",
    "F2 = stats.f.ppf(1 - confidence / 2, k1, k2)\n",
    "\n",
    "print(f\"F1 = {F1:.3f}\", f\"F  = {F:.3f}\", f\"F2 = {F2:.3f}\", sep='\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa5140cc",
   "metadata": {},
   "source": [
    "Таким образом, неравенство $F\\left(1-\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right) \\leq F \\leq F\\left(\\frac{\\alpha}{2};\\;k_1;\\;k_2\\right)$ выполняется. Следовательно, гипотеза о равенстве дисперсий двух выборок принимается."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "241a7935",
   "metadata": {},
   "source": [
    "### [[↑]](#Оглавление:) C. На равенство средних\n",
    "_Дисперсии неизвестны, но равны_\n",
    "\n",
    "Выполним проверку гипотезы о равенстве средних, используя _**t-критерий Стьюдента**_ при условии, что _дисперсии двух величин неизвестны, но равны._\n",
    "\n",
    "Объединим две выборки в одну и определим для неё смешанную выборочную дисперсию по формуле:\n",
    "\n",
    "$$S^2 = \\frac{(n_1-1) \\cdot S_1^2 + (n_2-1) \\cdot S_2^2}{(n_1-1)+(n_2-1)} = \\frac{(n_1-1) \\cdot S_1^2 + (n_2-1) \\cdot S_2^2}{n_1+n_2-2}$$\n",
    "\n",
    "где $S_1^2$ и $S_2^2$ — несмещенные оценки дисперсий двух величин."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "ff45ce68",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Смешанная выборочная дисперсия S2 = 950.326\n"
     ]
    }
   ],
   "source": [
    "mixed_var = ((n1 - 1)*np.var(sample_1, ddof=1) + (n2 - 1)*np.var(sample_2, ddof=1)) / (n1 + n2 - 2)\n",
    "\n",
    "print(f\"Смешанная выборочная дисперсия S2 = {mixed_var:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eef59a21",
   "metadata": {},
   "source": [
    "Для проверки гипотезы $H_0$ вычислим значение статистики Стьюдента:\n",
    "\n",
    "$$t_{n_1+n_2-2} = \\frac{\\overline{x} - \\overline{y}}{\\sqrt{\\frac{S^2}{n_1} + \\frac{S^2}{n_2}}} = \\frac{\\overline{x} - \\overline{y}}{S\\sqrt{\\frac{1}{n_1} + \\frac{1}{n_2}}}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "b88f4ca1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t = 0.3470\n"
     ]
    }
   ],
   "source": [
    "t = (np.mean(sample_1) - np.mean(sample_2)) / np.sqrt(mixed_var / n1 + mixed_var / n2)\n",
    "print(f't = {t:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6978270b",
   "metadata": {},
   "source": [
    "Далее вычислим $p\\_value$ для полученного значения:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "a45338a5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p_value = 0.729\n"
     ]
    }
   ],
   "source": [
    "p_value = 2 * (1 - stats.t.cdf(t, n1 + n2 - 2))\n",
    "\n",
    "print(f\"p_value = {p_value:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5eacf2c6",
   "metadata": {},
   "source": [
    "Таким образом, неравенство $p\\_value > \\alpha$ выполняется. Следовательно, нулевая гипотеза о равенстве средних двух выборок не отвергается.\n",
    "\n",
    "Проверим вычисления с использованием встроенной в `scipy.stats` функции `ttest_ind`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "207fba41",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p_value = 0.729\n"
     ]
    }
   ],
   "source": [
    "_, p_value = stats.ttest_ind(sample_1, sample_2)\n",
    "\n",
    "print(f\"p_value = {p_value:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "da03647a",
   "metadata": {},
   "source": [
    "## [[↑]](#Оглавление:) Источники:\n",
    "\n",
    "1. [Лекции](https://drive.google.com/drive/folders/1-0zTBtqIs2QcZgU-NlHdmjqCXddveyLB);\n",
    "2. [Лекция 5. Доверительные интервалы](https://mse.msu.ru/wp-content/uploads/2020/03/%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F-5-%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D1%8B.pdf);"
   ]
  }
 ],
 "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.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}