{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы прикладной математики и информатики\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Массивы `numpy` и характеристики дискретных случайных величин–2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Решим задачи 3-4 из семинарского листочка с использованием Python." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем библиотеку `numpy` для создания удобных массивов:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создадим массив `X` со значениями случайной величины `X`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-5, -1, 0, 1, 2])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([-5, -1, 0, 1, 2])\n", "X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создадим массив `p` со значениями соответствующих вероятностей (можно прямо в виде обычных дробей, нет необходимости переводить все в десятичный вид):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.2, 0.4, 0.1, 0.1, 0.2])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = np.array([1/5, 2/5, 1/10, 1/10, 1/5])\n", "p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как и на прошлом семинаре, можем посчитать математическое ожидание:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.8999999999999998" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ex = sum(X * p) # матем ожидание E(X)\n", "Ex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Опять сталкиваемся с загадочным видом числа $-0.9$ (если посчитаем вручную, получим ровно $-0.9$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь посчитаем дисперсию `X`. Вспомним формулу:\n", "\n", "$$D(X) = E(X^2) - (E(X))^2$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Лирическое отступление.* Чтобы получить формулу в таком красивом виде, нужно изменить тип ячейки с *Code* на *Markdown* (см. панель инструментов по меню Jupyter) и ввести следующее: " ] }, { "cell_type": "raw", "metadata": {}, "source": [ "$$D(X) = E(X^2) - (E(X))^2$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Эта формула записана в разметке LaTeX. В нем все формулы вводятся в знаках `$` (двойные `$` добавляют выравнивание формулы по центру)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если считать дисперсию по формуле, то нам необходимо создать массив со значениями $X^2$, посчитать его математическое ожидание, а потом вычесть из него квадрат $E(X)$, которое у нас уже посчитано и сохранено в `Ex`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([25, 1, 0, 1, 4])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X2 = X ** 2 # значения случайной величины X^2\n", "X2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Обратите внимание: возведение в степень в Python возможно только с помощью `**`, символ `^` (как в R) используется для побитного сложения по модулю 2, что никак не относится к степени." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.3" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ex2 = sum(X2 * p) # матем ожидание E(X^2)\n", "Ex2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось чуть чуть:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.49" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Dx = Ex2 - Ex ** 2 # по формуле для дисперсии\n", "Dx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Дисперсию нашли. Осталось найти стандартное отклонение $X$. Стандартное отклонение случайной величины – это квадратный корень из дисперсии. В Python функция для извлечения квадратного корня хранится в библиотеке `math` (хотя в `numpy` тоже есть, ее можно вызвать через `np.sqrt()`)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3430749027719964" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "\n", "Sdx = math.sqrt(Dx)\n", "Sdx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В дополнение к задаче посчитаем коэффициент вариации:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.603416558635552" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cv = Sdx / Ex\n", "cv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Значение коэффициента вариации по модулю значительно превышает 1. С одной стороны, это выглядит странно: такой коэффициент говорит об очень сильном разбросе значений величины `X` относительно среднего. С другой стороны, разброс действительно большой: математическое ожидание равно $-0.9$, а $2/5$ значений $X$ лежат достаточно далеко от этого числа (посмотрите на вероятности $-5$ и $2$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь, когда мы разобрали алгоритм расчетов математического ожидания и дисперсии в предыдущей задаче, можно легко применить его здесь. Создадим массивы значений `x` и `y` и массивы соотвествующих вероятностей `px` и `py`:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "x = np.array([2, 3, 4, 5])\n", "y = np.array([2, 3, 4, 5])\n", "\n", "px = np.array([0.2, 0.3, 0.25, 0.25])\n", "py = np.array([0.5, 0.05, 0.05, 0.4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь посчитаем нужные характеристики и выведем их значения на экран:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.55 3.3499999999999996 1.1475000000000009 2.0275000000000016\n" ] } ], "source": [ "ex = sum(x * px)\n", "ey = sum(y * py)\n", "\n", "dx = sum(x**2 * px) - ex**2\n", "dy = sum(y**2 * py) - ey**2\n", "\n", "print(ex, ey, dx, dy) # вывод на экран" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Видно, что хотя средние ожидаемые значения оценок студентов в двух группах отличаются несильно, студенты в первой группе занимаются более стабильно." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }