Алла Тамбовцева, НИУ ВШЭ
numpy
и характеристики дискретных случайных величин–2¶Решим задачи 3-4 из семинарского листочка с использованием Python.
Импортируем библиотеку numpy
для создания удобных массивов:
import numpy as np
Создадим массив X
со значениями случайной величины X
:
X = np.array([-5, -1, 0, 1, 2])
X
array([-5, -1, 0, 1, 2])
Создадим массив p
со значениями соответствующих вероятностей (можно прямо в виде обычных дробей, нет необходимости переводить все в десятичный вид):
p = np.array([1/5, 2/5, 1/10, 1/10, 1/5])
p
array([0.2, 0.4, 0.1, 0.1, 0.2])
Как и на прошлом семинаре, можем посчитать математическое ожидание:
Ex = sum(X * p) # матем ожидание E(X)
Ex
-0.8999999999999998
Опять сталкиваемся с загадочным видом числа $-0.9$ (если посчитаем вручную, получим ровно $-0.9$).
Теперь посчитаем дисперсию X
. Вспомним формулу:
Лирическое отступление. Чтобы получить формулу в таком красивом виде, нужно изменить тип ячейки с Code на Markdown (см. панель инструментов по меню Jupyter) и ввести следующее:
Эта формула записана в разметке LaTeX. В нем все формулы вводятся в знаках $
(двойные $
добавляют выравнивание формулы по центру).
Если считать дисперсию по формуле, то нам необходимо создать массив со значениями $X^2$, посчитать его математическое ожидание, а потом вычесть из него квадрат $E(X)$, которое у нас уже посчитано и сохранено в Ex
.
X2 = X ** 2 # значения случайной величины X^2
X2
array([25, 1, 0, 1, 4])
Обратите внимание: возведение в степень в Python возможно только с помощью **
, символ ^
(как в R) используется для побитного сложения по модулю 2, что никак не относится к степени.
Ex2 = sum(X2 * p) # матем ожидание E(X^2)
Ex2
6.3
Осталось чуть чуть:
Dx = Ex2 - Ex ** 2 # по формуле для дисперсии
Dx
5.49
Дисперсию нашли. Осталось найти стандартное отклонение $X$. Стандартное отклонение случайной величины – это квадратный корень из дисперсии. В Python функция для извлечения квадратного корня хранится в библиотеке math
(хотя в numpy
тоже есть, ее можно вызвать через np.sqrt()
).
import math
Sdx = math.sqrt(Dx)
Sdx
2.3430749027719964
В дополнение к задаче посчитаем коэффициент вариации:
cv = Sdx / Ex
cv
-2.603416558635552
Значение коэффициента вариации по модулю значительно превышает 1. С одной стороны, это выглядит странно: такой коэффициент говорит об очень сильном разбросе значений величины X
относительно среднего. С другой стороны, разброс действительно большой: математическое ожидание равно $-0.9$, а $2/5$ значений $X$ лежат достаточно далеко от этого числа (посмотрите на вероятности $-5$ и $2$).
Теперь, когда мы разобрали алгоритм расчетов математического ожидания и дисперсии в предыдущей задаче, можно легко применить его здесь. Создадим массивы значений x
и y
и массивы соотвествующих вероятностей px
и py
:
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])
Теперь посчитаем нужные характеристики и выведем их значения на экран:
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) # вывод на экран
3.55 3.3499999999999996 1.1475000000000009 2.0275000000000016
Видно, что хотя средние ожидаемые значения оценок студентов в двух группах отличаются несильно, студенты в первой группе занимаются более стабильно.