Недавно меня попросили написать отзыв на автореферат кандидатской диссертации, в которой обсуждалось моделирование случайных величин с использованием Python и C++. Я разбираюсь в моделировании, но не в программировании. Обсуждая работу, я поинтересовался у соискателя, почему он выбрал эти инструменты и не рассматривал ли Excel. Он ответил, что в их среде Excel не используется. «А жаль», — подумал я. Особенно учитывая, что в работе выборки не превышали сотни элементов. Excel легко справляется даже с миллионом и имеет десятки встроенных функций для таких целей.
В этой статье в блоге ЛАНИТ я покажу, как с помощью Excel можно эффективно генерировать случайные величины различных распределений и почему этот инструмент не стоит недооценивать.
![](https://habrastorage.org/getpro/habr/upload_files/2c7/26e/526/2c726e5260bf042c487adef8cf28999a.jpg)
С появлением в Excel 2019 новых функций массива генерация случайных чисел существенно упростилась. В Excel также есть десятки статистических функций, возвращающих значения разнообразных распределений, а современные ПК быстро создадут выборку даже в миллион значений. Так почему же не использовать этот широко распространенный инструмент?
В основе моделирования любых распределений лежит равномерное распределение. С него и начнем.
Равномерное распределение
Распределение вероятностей называют равномерным, если на интервале [a, b], которому принадлежат все возможные значения случайной величины X, плотность распределения сохраняет постоянное значение.
Плотность равномерного распределения:
Наиболее интересен случай, когда . Такое равномерное распределение называют стандартным (рис. 1а):
![Рис. 1. Теоретические кривые для непрерывной случайной величины , распределенной равномерно в интервале [0, 1]: (а) плотность вероятности, (б) функция распределения Изображение выглядит как линия, диаграмма, Прямоугольник, График Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/40a/838/0f4/40a8380f47957b1b73890fcc7d6477c3.jpeg)
Интегрируя плотность вероятности (1.2), получаем функцию распределения (рис. 1б):
Процедура в Excel для каждого распределения будет включать:
генерацию массива случайных чисел,
подсчет случайных чисел, попадающих в карманы (они же диапазоны),
построение кривой (или гистограммы) плотности вероятности,
нахождение среднего значения и стандартного отклонения и сравнение с теоретическими значениями для верификации процесса генерации.
Чтобы разыграть (сгенерировать) непрерывную стандартную равномерно распределенную случайную величину в Excel используем формулу:
Здесь – размер выборки,
– минимальное значение,
– максимальное значение,
– задает плотность вероятности (
задала бы функцию распределения). В результате получим вертикальный массив из
десятичных значений в диапазоне от
до
(рис. 2а).
![Рис. 2. Сгенерированное стандартное равномерное распределение: а) фрагмент массива; б) диапазоны и соответствующие им частоты; в) эмпирическая плотность вероятности; Рис. 2. Сгенерированное стандартное равномерное распределение: а) фрагмент массива; б) диапазоны и соответствующие им частоты; в) эмпирическая плотность вероятности;](https://habrastorage.org/getpro/habr/upload_files/2ce/ebf/67c/2ceebf67cd72cd27fe852f37760ef3e2.jpeg)
Для построения гистограммы нужно выбрать интервалы конечной ширины (рис. 2б). Вероятность попадания величины (в результате испытания) в интервал
, принадлежащий интервалу
, равна его длине:
Например, разбивая интервал на 10 равных частей мы получим вероятность случайной величины Х попасть в один из отрезков
(рис. 2в). Если разбить интервал
на 20 равных частей столбцы гистограммы выстроятся на высоте 5%. Вот почему диаграммы плотности вероятности иногда строят без указания чисел по оси ординат.
В приложенном архиве вы найдете Excel-файлы, использованные для моделирования и построения диаграмм. Для уменьшения объема файлов я сохранил их со значением
.
Параметры распределения и статистики выборки
В статистике генеральную совокупность описывают параметрами, обозначаемыми греческими буквами: математическое ожидание , среднеквадратичное отклонение
. Выборки описывают статистиками, обозначаемыми латинскими буквами: среднее арифметическое (или просто среднее)
, стандартное отклонение
.
В реальной жизни ни матожидание , ни среднеквадратичное отклонение
генеральной совокупности неизвестны. Но, извлекая выборку, мы кое-что узнаем о матожидании и среднеквадратичном отклонении. Говорят, что среднее
является оценкой матожидания
, а стандартное отклонение
— оценкой среднеквадратичного отклонения
.
В настоящей заметке параметры генеральной совокупности известны. Их мы используем в формулах Excel при генерации случайных чисел. А получив выборку, мы вычисляем статистики, которые не должны сильно отличаться от параметров.
Матожидание равномерного распределения:
Матожидание стандартного равномерного распределения:
Дисперсия равномерного распределения:
Среднеквадратичное отклонение стандартного равномерного распределения:
Теоретические значения параметров генеральной совокупности и статистики выборки для стандартного равномерного распределения приведены в верхней правой части рис. 2. Мы будем проверять адекватность выборки, сравнивая статистики с параметрами генеральной совокупности.
Статистические функции Excel
В Excel в разделе статистических функций представлено два десятка функций непрерывных распределений. Большинство из них парные, но не все:
![Рис. 3. Функции распределений в Excel Изображение выглядит как текст, снимок экрана, Шрифт, число Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/730/1c2/968/7301c2968fbc2c350f9d41118d535970.jpeg)
Некоторые распределения представлены большим числом функций. Например, СТЬЮДЕНТ.РАСП, СТЬЮДЕНТ.РАСП.2Х, СТЬЮДЕНТ.РАСП.ПХ. Для наших целей достаточно одного представителя от семейства. Рассмотрим структуру функций на примере пары НОРМ.СТ.РАСП и НОРМ.СТ.ОБР.
Синтаксис:
=НОРМ.СТ.РАСП(;ЛОЖЬ) — возвращает плотность вероятности стандартного нормального распределения (рис. 4а);
=НОРМ.СТ.РАСП(;ИСТИНА) — возвращает [интегральную] функцию стандартного нормального распределения (рис. 4б);
=НОРМ.СТ.ОБР — возвращает обратное значение стандартного нормального распределения (рис. 4в). Обратите внимание на аргумент функции —
, вероятность.
![Рис. 4. Теоретические кривые для стандартного нормального распределения: (а) плотность вероятности, (б) функция распределения, в) обратное распределение Рис. 4. Теоретические кривые для стандартного нормального распределения: (а) плотность вероятности, (б) функция распределения, в) обратное распределение](https://habrastorage.org/getpro/habr/upload_files/e3a/d1c/d6d/e3ad1cd6d489e3ee482a2c15356f12f3.jpeg)
Аналогично устроены все функции в таблице на рис. 3. Функции с суффиксом РАСП позволяют строить плотность вероятности и функцию распределения, выбирая соответствующий последний аргумент, а функции с суффиксом ОБР — находить значение распределения по его вероятности. Последние используются для разыгрывания случайной величины.
Алгоритм прост: записываем формулу на основе функции с суффиксом ОБР и вместо одного значения вероятности р подставляем случайный массив десятичных значений от 0 до 1 (рис. 5а).
![Рис. 5. Сгенерированное нормальное распределение: а) фрагмент массива; б) диапазоны и соответствующие им частоты; в) эмпирические плотности вероятности; Рис. 5. Сгенерированное нормальное распределение: а) фрагмент массива; б) диапазоны и соответствующие им частоты; в) эмпирические плотности вероятности;](https://habrastorage.org/getpro/habr/upload_files/8ef/f17/b54/8eff17b54c903915978b7030fbb125ff.jpeg)
В таблице на рис. 3 представлены 8 функций с суффиксом ОБР, которые можно использовать для генерирования случайных величин, что называется «из коробки»: F.ОБР, БЕТА.ОБР, ГАММА.ОБР, ЛОГНОРМ.ОБР, НОРМ.ОБР, НОРМ.СТ.ОБР и СТЬЮДЕНТ.ОБР.
НОРМ.ОБР, НОРМ.СТ.ОБР я описал выше.
Оставшиеся шесть функций:
![Рис. 6. Генерирование случайных величин на основе функций Excel с суффиксом ОБР; эмпирические плотности вероятности, Изображение выглядит как диаграмма, График, линия, текст Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/b15/290/93b/b1529093b5e61296a30210e96dc90b0a.jpeg)
Если в Excel нет готовой функции для генерирования распределения, можно попробовать найти обратную функцию аналитически.
Метод обратной функции
Пусть требуется разыграть непрерывную случайную величину , т. е. получить последовательность ее возможных значений
, зная функцию распределения
.
Если — случайное число в диапазоне
, то возможное значение
разыгрываемой непрерывной случайной величины
с заданной функцией распределения
, соответствующее
, является корнем уравнения
.
Так как в интервале всех возможных значений функция распределения
монотонно возрастает от 0 до 1, то в этом интервале существует, причем только одно, такое значение аргумента
при котором функция распределения примет значение
. Другими словами, уравнение
имеет единственное решение:
где — функция, обратная функции
.
Например, для стандартного нормального распределения функции и
представлены на рис. 4б и 4в. Не всегда (более того, лишь изредка) уравнение
удается решить в явном виде относительно
. Начнем с примера, когда случайная величина
распределена по показательному закону, заданному функцией распределения:
Требуется найти явную формулу для разыгрывания возможных значений . Используя правило
и явный вид функции распределения
можно записать:
Решим это уравнение относительно :
или
Отсюда
Случайное число заключено в интервале
; следовательно, число
также случайное и принадлежит интервалу
. Другими словами, величины
и
распределены одинаково. Поэтому для отыскания хi можно воспользоваться более простой формулой:
![Рис. 7. Теоретические кривые экспоненциального распределения: функция распределения ; обратная функция Изображение выглядит как линия, диаграмма, График, Прямоугольник Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/6de/0fe/0bf/6de0fe0bf1acb6deb76beedf256b5168.jpeg)
Это и есть наш генератор случайной величины, распределенной по экспоненте:
![Рис. 8. Разыгрывание случайной экспоненциально распределенной величины в Excel; иногда для более точной визуализации распределения нужно поиграть с осью ОХ; здесь она сдвинута относительно карманов на 0,1 Изображение выглядит как текст, снимок экрана, Параллельный, линия Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/180/988/f34/180988f34f23a3f1601bf5b1eff3bdbd.jpeg)
При распределении Лапласа (двойного экспоненциального) плотность вероятности случайной величины имеет вид
:
где θ — параметр сдвига (медиана распределения), – параметр масштаба (ширина распределения),
.
Распределение Лапласа с параметром называют стандартным. Его плотность вероятности:
Интегрируя , получаем функцию распределения:
Решая уравнения относительно
, получаем обратную функцию:
![Рис. 9. Генерирование случайной величины, распределенной по Лапласу, Изображение выглядит как текст, диаграмма, снимок экрана, линия Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/f0e/767/900/f0e76790053009b1a285c889ffa8dd2c.jpeg)
Вот еще несколько непрерывных распределений, для которых обратную функцию можно выразить аналитически.
Стандартное распределение Коши:
Стандартное распределение Вейбулла :
,
Стандартное логистическое распределение:
Стандартное распределение Чампернауна:
![Рис. 10. Некоторые аналитически представимые обратные распределения Изображение выглядит как текст, диаграмма, График, линия Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/94b/85e/4e4/94b85e4e496c5ba548d1055f3d2ba36a.jpeg)
Довольно много обратных функций можно найти в классическом Справочнике по вероятностным распределениям Ратмира Николаевича Вадзинского.
Метод исключения
Также встречаются названия метод выборки с отклонением (Rejection Sampling), метод отбраковки, метод принятия-отклонения (Acceptance-Rejection Method), метод фильтрации и алгоритм Неймана (по имени автора).
Пусть есть случайная величина , имеющая плотность вероятности
и функцию распределения
, для которой не получается найти аналитическое выражение для
. Подберем вспомогательную функцию с плотностью вероятности
, для которой относительно легко разыграть случайную величину
по вероятности
, такую что
для всей области определения .
Для простоты в качестве можно взять функцию, распределенную равномерно на области определения
и проходящую через максимум функции
. Это легко сделать, если область определения
ограничена. Если же область определения
не ограничена, нужно задать границы принудительно.
![Рис. 11. Разыгрываемая и вспомогательная распределенная равномерно Изображение выглядит как линия, График, диаграмма, снимок экрана Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/8ff/82f/87b/8ff82f87b62ce7f7657d12f8fc4e1fb8.png)
Алгоритм метода включает три шага.
Сгенерируйте кандидата
из плотности
.
Сгенерируйте случайное число
из равномерного распределения
.
Проверьте условие
. Если оно выполняется, примите
, если нет, отклоните
и перейдите к шагу 1.
Следует помнить, что за пределами заданной области определения останутся значения , которые не появятся в вашей выборке. С другой стороны, чем шире вы зададите область определения, тем меньше значений будет в выборке. Это связано с тем, что на хвостах распределения значения
существенно меньше
и почти все разыгранные значения
будут отклонены.
Теоретическое обоснование метода исключения и много чего еще интересного по теме есть в Хабра-заметке Александра Самарина «Генераторы непрерывно распределенных случайных величин».
Разберем алгоритм в Excel на примере стандартного нормального распределения.
![Рис. 12. Реализация метода исключения в Excel, Изображение выглядит как текст, снимок экрана, число, документ Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/cbd/3ce/3d9/cbd3ce3d96784982c0e637d1ef510e75.jpeg)
Пояснения модели Excel
В ячейках В2:В3 задаю границы области определения и
, значения
и
. В5:В6 — проверяю среднее значение и стандартное отклонение массива значений
, полученных методом исключения. В7:В8 — проверяю среднее значение и стандартное отклонение массива значений
, полученных с помощью функции НОРМ.СТ.ОБР(). D2 — разыгрываю аргумент функций
и
, случайное число
, распределенное равномерно на интервале от
до
. E2 — вычисляю значение
для
, где
— стандартное нормальное распределение F2 — вычисляю значение
, равное максимуму функции
. G2 — разыгрываю случайное число
, распределенное равномерно на интервале
. H2 – если
, возвращаю
, иначе «нет». I2— разыгрываю случайное число
, распределенное по стандартному нормальному распределению, используя функцию Excel «из коробки» НОРМ.СТ.ОБР(). K2 — задаю карманы (диапазоны) для построения диаграммы. L2 — в каждом диапазоне подсчитываю число разыгранных значений по методу исключения. M2 — в каждом диапазоне подсчитываю число разыгранных значений с помощью функции НОРМ.СТ.ОБР().
Напоследок рассмотрим интересную практическую задачу разыгрывания случайной величины.
Скорость сходимости центральной предельной теоремы
Год назад прочитал книгу Нассима Талеба «Статистические последствия жирных хвостов». Книга о математике, лежащей в основе историй Талеба, рассказанных в его предыдущих эссе. В частности автор показывает, что распределения с толстыми хвостами довольно медленно сходятся к нормальному в соответствии с центральной предельной теоремой (ЦПТ):
При конечной дисперсии случайных величин
, распределение суммы этих случайных величин
, нормированное на
, в пределе стремится к нормальному распределению.
Быстрая сходимость равномерного распределения
Если случайная величина равномерно распределена на отрезке
, плотность вероятности
будет постоянной и равной
. Поскольку я использовал
диапазонов, вероятность попасть в один из них равна
или 1% (
на рис. 13). Теперь добавим к
другую случайную величину
, независимую и с таким же распределением. У суммы
распределение будет другим! График плотности вероятности для суммы
стал треугольным. Добавим еще одну переменную, и плотность вероятности
для распределения суммы
станет колоколом. Нам достаточно 3–4 слагаемых, чтобы распределение
приняло вид нормального:
![Рис. 13. Сумма независимых равномерных распределений быстро сходится к нормальному, Изображение выглядит как диаграмма, График, текст Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/130/226/24d/13022624db31451609da21d34c4ed812.jpeg)
В Excel я разыграл случайную равномерно распределенную на отрезке [0,1] величину формулой:
.
Для генерации я использовал среднее двух массивов =
, и т. д.
Медленная сходимость распределения Парето
Плотность вероятности распределения Парето:
где — значение случайной величины,
— показатель распределения, он же параметр формы,
— минимальное значение, которое может принимать случайная величина.
Стандартное распределение Парето определено для на интервале
:
Для получаем:
А обратное распределение имеет вид:
![](https://habrastorage.org/getpro/habr/upload_files/0d0/678/3f3/0d06783f34d442abe7255c6d5ea03eaa.jpg)
Рассмотрим случайную величину , где каждое по отдельности
— независимая случайная величина, распределенная по (3.4). Посмотрим, с какой скоростью
сходится к нормальному распределению при росте
. Для разыгрывания случайной величины
используем сумму
обратных распределений
, деленную на
.
В Excel я применил формулу (авторство принадлежит AlienSx с форума Планета Excel):
где — размер выборки,
— число слагаемых, каждое из которых соответствует
, подробности во вложенном файле «15. ЦПТ. Парето, альфа 2.xlsx».
![Рис. 15. Сходимость суммы стандартных распределений Парето с α = 2, n = 50k Изображение выглядит как диаграмма, График, дизайн Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/ef1/7bd/e08/ef17bde0839467a9a1df5414f5fb6637.jpeg)
Центральная предельная теорема работает, но не так быстро, как ожидалось. Как говорит Насим Талеб: «Распределение Парето так и не приблизилось к гауссиане, хотя при
это произойдет — если у вас хватит терпения и вы будете жить долго-долго».
Вывод
Итак, мы рассмотрели, как с помощью Excel моделировать (разыгрывать) случайные величины с различными законами распределения. Выяснили, что для этого доступны встроенные функции, формулы на основе обратных функций или метод исключения. Оказывается, что возможностей Excel в целом ряде прикладных задач будет вполне достаточно без необходимости прибегать к программированию.
Оставляйте комментарии: мне будет интересно узнать, возникают ли у вас задачи генерации случайных чисел, в каких областях знаний, какие инструменты вы используете.
adeshere
Спасибо за статью, но:
> Метод исключения (...)
существенно меньше
и почти все разыгранные значения
будут отклонены.
...Это связано с тем, что на хвостах распределения значения
Метод, конечно, весьма соблазнительный в силу своей простоты. Настолько, что хочется его применять и вне Excell, где нет ограничений на размер выборки. Но если Вы будете это делать, то трижды проверьте "хвосты" получившейся выборки, прежде чем пускать ее в дело! Я вот однажды обжегся при решении очень похожей задачи. Я строил псевдослучайные временные ряды длиной всего-то в десяток миллиардов отсчетов. Сущая ерунда по сравнению с ожидаемым
периодом повторяемости ГСЧ
Даже если учесть, что я хотел нормальное распределение, а ГСЧ давал равномерное, из-за чего я фактически обращался к ГСЧ 6-12 раз в каждой точке, а потом суммировал полученные значения (ЦПТ!)
В общем, я даже не думал о возможной подставе. Пока внезапно не
обнаружил в своих сигналах квазипериодичность.
Так бы я ее никогда не заметил (там период порядка E+9), но мне пришлось раскапывать один баг, и по ходу дела я на эту квазипериодичность наткнулся
А потом мне попалась вот эта статья, из которой вполне очевидно, что в статистиках второго порядка неидеальность ГСЧ начинает прослеживаться гораздо раньше, если не принимать специальные меры.
Попросту говоря, если вы генерируете более-менее объемную выборку методом исключения (вызывая ГСЧ многократно большее число раз, чем потребный объем выборки), то при этом потенциально возможны всякие неожиданности.
Другой вопрос - насколько они способны исказить целевое распределение. Ответ я не знаю, но вообще было бы интересно, если кто-то такое расследование проведет...
SergBag Автор
Алексей, спасибо за комментарий))
Я когда писал статью, озаботился тем, какой алгоритм генерации случайных чисел (ГСЧ) использует Excel. Это алгоритм Mersenne Twister. Его период порядка Е+6000. Так что в Excel описанная вами проблема не возникла бы. Правда, Excel не справился бы с генераций миллиардов случайных чисел. Подробнее об эксельном ГСЧ https://chatgpt.com/share/67ab2aae-1f68-800f-b57d-1bf6578312e7
adeshere
Да, ГСЧ в современном Exctll явно лучше, чем в фортране 2008 года. Но в моем случае E+9 - это, конечно, не период повторяемости ГСЧ, а период возникновения определенных аномалий в моем сигнале. Причем это не точный период, а плавающий. И вот он на порядки меньше
периода повторяемости самого ГСЧ (около E+18)
RANDOM_NUMBER
Intrinsic Subroutine: Returns one pseudorandom number or an array of such numbers.
CALL RANDOM_NUMBER (harvest)
harvest
(Output) Must be of type real. It can be a scalar or an array variable. It is set to contain pseudorandom numbers from the uniform distribution within the range 0 <= x < 1.
The seed for the pseudorandom number generator used by RANDOM_NUMBER can be set or queried with RANDOM_SEED. If RANDOM_SEED is not used, the processor sets the seed for RANDOM_NUMBER to a processor-dependent value.
The RANDOM_NUMBER generator uses two separate congruential generators together to produce a period of approximately 10**18, and produces real pseudorandom results with a uniform distribution in (0,1). It accepts two integer seeds, the first of which is reduced to the range [1, 2147483562]. The second seed is reduced to the range [1, 2147483398]. This means that the generator effectively uses two 31-bit seeds.
For more information on the algorithm, see the following:
Communications of the ACM vol 31 num 6 June 1988, titled: Efficient and Portable Combined Random Number Generators by Pierre L'ecuyer.
Springer-Verlag New York, N. Y. 2nd ed. 1987, titled: A Guide to Simulation by Bratley, P., Fox, B. L., and Schrage, L. E.
В общем, некая неслучайность присутствует. И при решении некоторых задач это может быть неприятно.
И второй нюанс: если нам нужна выборка большого объема, то мы точно не будем работать в Excell. А значит и обращаться к его ГСЧ не сможем (технически это возможно, но скорость будет несоразмерна задаче). А вот какие ГСЧ используются сейчас в стандартных библиотеках, это вопрос. В моем случае (компиляторы Интел, 2008 год) плюсы и фортран к одному и тому же ГСЧ обращались. Как сейчас - не знаю (компилятор пока не могу обновить), но шанс столкнуться с подобным багом вполне реален. На что собственно и намекает довольно свежая хабровская статья уважаемого @red-cat-fat, которую я упомянул в первом комменте