#!/usr/bin/env python # coding: utf-8 # # Основы прикладной математики и информатики # # *Алла Тамбовцева, НИУ ВШЭ* # ## Массивы `numpy` и характеристики дискретных случайных величин–2 # Решим задачи 3-4 из семинарского листочка с использованием Python. # ### Задача 3 # Импортируем библиотеку `numpy` для создания удобных массивов: # In[1]: import numpy as np # Создадим массив `X` со значениями случайной величины `X`: # In[2]: X = np.array([-5, -1, 0, 1, 2]) X # Создадим массив `p` со значениями соответствующих вероятностей (можно прямо в виде обычных дробей, нет необходимости переводить все в десятичный вид): # In[3]: p = np.array([1/5, 2/5, 1/10, 1/10, 1/5]) p # Как и на прошлом семинаре, можем посчитать математическое ожидание: # In[4]: Ex = sum(X * p) # матем ожидание E(X) Ex # Опять сталкиваемся с загадочным видом числа $-0.9$ (если посчитаем вручную, получим ровно $-0.9$). # Теперь посчитаем дисперсию `X`. Вспомним формулу: # # $$D(X) = E(X^2) - (E(X))^2$$ # *Лирическое отступление.* Чтобы получить формулу в таком красивом виде, нужно изменить тип ячейки с *Code* на *Markdown* (см. панель инструментов по меню Jupyter) и ввести следующее: $$D(X) = E(X^2) - (E(X))^2$$ # Эта формула записана в разметке LaTeX. В нем все формулы вводятся в знаках `$` (двойные `$` добавляют выравнивание формулы по центру). # Если считать дисперсию по формуле, то нам необходимо создать массив со значениями $X^2$, посчитать его математическое ожидание, а потом вычесть из него квадрат $E(X)$, которое у нас уже посчитано и сохранено в `Ex`. # In[5]: X2 = X ** 2 # значения случайной величины X^2 X2 # Обратите внимание: возведение в степень в Python возможно только с помощью `**`, символ `^` (как в R) используется для побитного сложения по модулю 2, что никак не относится к степени. # In[6]: Ex2 = sum(X2 * p) # матем ожидание E(X^2) Ex2 # Осталось чуть чуть: # In[7]: Dx = Ex2 - Ex ** 2 # по формуле для дисперсии Dx # Дисперсию нашли. Осталось найти стандартное отклонение $X$. Стандартное отклонение случайной величины – это квадратный корень из дисперсии. В Python функция для извлечения квадратного корня хранится в библиотеке `math` (хотя в `numpy` тоже есть, ее можно вызвать через `np.sqrt()`). # In[9]: import math Sdx = math.sqrt(Dx) Sdx # В дополнение к задаче посчитаем коэффициент вариации: # In[10]: cv = Sdx / Ex cv # Значение коэффициента вариации по модулю значительно превышает 1. С одной стороны, это выглядит странно: такой коэффициент говорит об очень сильном разбросе значений величины `X` относительно среднего. С другой стороны, разброс действительно большой: математическое ожидание равно $-0.9$, а $2/5$ значений $X$ лежат достаточно далеко от этого числа (посмотрите на вероятности $-5$ и $2$). # ### Задача 4 # Теперь, когда мы разобрали алгоритм расчетов математического ожидания и дисперсии в предыдущей задаче, можно легко применить его здесь. Создадим массивы значений `x` и `y` и массивы соотвествующих вероятностей `px` и `py`: # In[11]: x = np.array([2, 3, 4, 5]) y = np.array([2, 3, 4, 5]) px = np.array([0.2, 0.3, 0.25, 0.25]) py = np.array([0.5, 0.05, 0.05, 0.4]) # Теперь посчитаем нужные характеристики и выведем их значения на экран: # In[13]: ex = sum(x * px) ey = sum(y * py) dx = sum(x**2 * px) - ex**2 dy = sum(y**2 * py) - ey**2 print(ex, ey, dx, dy) # вывод на экран # Видно, что хотя средние ожидаемые значения оценок студентов в двух группах отличаются несильно, студенты в первой группе занимаются более стабильно.