Основы прикладной математики и информатики

Алла Тамбовцева, НИУ ВШЭ

Массивы 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
Out[2]:
array([-5, -1,  0,  1,  2])

Создадим массив p со значениями соответствующих вероятностей (можно прямо в виде обычных дробей, нет необходимости переводить все в десятичный вид):

In [3]:
p = np.array([1/5, 2/5, 1/10, 1/10, 1/5])
p
Out[3]:
array([0.2, 0.4, 0.1, 0.1, 0.2])

Как и на прошлом семинаре, можем посчитать математическое ожидание:

In [4]:
Ex = sum(X * p) # матем ожидание E(X)
Ex
Out[4]:
-0.8999999999999998

Опять сталкиваемся с загадочным видом числа $-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
Out[5]:
array([25,  1,  0,  1,  4])

Обратите внимание: возведение в степень в Python возможно только с помощью **, символ ^ (как в R) используется для побитного сложения по модулю 2, что никак не относится к степени.

In [6]:
Ex2 = sum(X2 * p) # матем ожидание E(X^2)
Ex2
Out[6]:
6.3

Осталось чуть чуть:

In [7]:
Dx = Ex2 - Ex ** 2 # по формуле для дисперсии
Dx
Out[7]:
5.49

Дисперсию нашли. Осталось найти стандартное отклонение $X$. Стандартное отклонение случайной величины – это квадратный корень из дисперсии. В Python функция для извлечения квадратного корня хранится в библиотеке math (хотя в numpy тоже есть, ее можно вызвать через np.sqrt()).

In [9]:
import math

Sdx = math.sqrt(Dx)
Sdx
Out[9]:
2.3430749027719964

В дополнение к задаче посчитаем коэффициент вариации:

In [10]:
cv = Sdx / Ex
cv
Out[10]:
-2.603416558635552

Значение коэффициента вариации по модулю значительно превышает 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) # вывод на экран
3.55 3.3499999999999996 1.1475000000000009 2.0275000000000016

Видно, что хотя средние ожидаемые значения оценок студентов в двух группах отличаются несильно, студенты в первой группе занимаются более стабильно.