Критерий Дарбина-Уотсона (Durbin–Watson statistic) - один из самых распространенных критериев для проверки автокорреляции. Данный критерий входит в стандартный инструментарий python: присутствует в таблице выдачи результатов регрессионного анализа модуля линейной регрессии Linear Regression; может быть рассчитан с помощью функции statsmodels.stats.stattools.durbin_watson. К сожалению, стандартные инструменты python не позволяют получить табличные значения статистики критерия Дарбина-Уотсона, нам предлагается воспользоваться методом грубой оценки: считается, что при расчетном значении статистики критерия в интервале  автокорреляция отсутствует (см. Durbin–Watson statistic). Однако, для качественного статистического анализа такой подход неприемлем. Представляет интерес реализовать в полной мере критерий Дарбина-Уотсона средствами python, добавив этот важный критерий в инструментарий специалиста DataScience. В данном обзоре мы коснемся только собственно критерия Дарбина-Уотсона и его применения для выявления автокорреляции. Особенности построения регрессионных моделей и прогнозирования в условиях автокорреляции (двухшаговый метод наименьших квадратов и пр.) мы рассматривать не будем. Как и в предыдущем обзоре, здесь будут использованы несколько пользовательских функций для решения разнообразных задач. Все эти функции созданы для облегчения работы и уменьшения размера программного кода. Данные функции загружается из пользовательского модуля my_module__stat.py, который доступен в моем репозитории на GitHub. Вот перечень данных функций: graph_plot_sns_np - функция строит линейный график средствами seaborn; graph_regression_plot_sns - функция строит график регрессионной модели и график остатков средствами seaborn; regression_error_metrics - функция возвращает ошибки аппроксимации регрессионной модели; graph_hist_boxplot_probplot_sns - функция позволяет визуализировать исходные данные для одной переменной путем одновременного построения гистограммы, коробчатой диаграммы и вероятностного графика средствами seaborn; имеется возможность выбирать, какие графики строить (h - hist, b - boxplot, p - probplot); norm_distr_check - проверка нормальности распределения исходных данных с использованием набора из нескольких статистических тестов. Goldfeld_Quandt_test, Breush_Pagan_test, White_test - проверка гетероскедастичности с использование тестов Голдфелда-Квандта, Бриша-Пэгана и Уайта соответственно; graph_regression_pair_predict_plot_sns - прогнозирование: построение графика регрессионной модели (с доверительными интервалами) и вывод расчетной таблицы с данными для заданной области значений X. В процессе данного обзора мы создаем пользовательскую функцию Durbin_Watson_test, которая проверяет гипотезу о наличии автокорреляции (она тоже включена в пользовательский модуль my_module__stat.py). Информацию о критерии Дарбина-Уотсона можно почерпнуть в [1, с.659], [2, с.117], [3, с.239], [4, с.188], а также: Durbin–Watson statistic Критерий Дарбина — Уотсона Итак, предположим, мы рассматриваем регрессионную модель: или в матричном виде: Критерий Дарбина-Уотсона применяется в ситуации, когда регрессионные остатки связаны автокорреляционной зависимостью 1-го порядка [2, с.111]: где  - некоторое число (), а случайные величины  удовлетворяют требованиям, предъявляемым к регрессионным остаткам классической модели (т.е. равенство нулю среднего значения, постоянство дисперсии и некоррелированность между собой): Проверяется нулевая гипотеза об отсутствии автокорреляции:  Альтернативной гипотезой может быть: существование отрицательной автокорреляции (левосторонняя критическая область):  существование положительной автокорреляции (правосторонняя критическая область):  существование автокорреляции вообще (двусторонняя критическая область):  Расчетное значение статистики критерия Дарбина-Уотсона имеет вид: где  - остатки (невязки) регрессионной модели. По таблицам (см. [1, с.659],  [2, с.402], [3, с.291]) в зависимости от уровня значимости  (5%, 2.5%, 1%), числа параметров регрессионной модели  (кроме свободного члена ) (от 1 до 5) и объема выборки  (от 15 до 100) определяются критические значения статистики Дарбина-Уотсона: нижний  и верхний  предел. Правила принятия гипотез по критерию Дарбина-Уотсона выглядят довольно своеобразно - критические значения образуют пять областей различных статистических решений (причем критические границы принятия  и непринятия  не совпадают): Значение  Принимается гипотеза Вывод  отвергается , принимается  есть положительная автокорреляция   неопределенность  принимается  автокорреляция отсутствует   неопределенность  отвергается , принимается  есть отрицательная автокорреляция Есть очень удачная мнемоническая схема, приведенная в [3, с.240]: Особенности критерия Дарбина-Уотсона: Критические значения критерия табулированы для объема выборки от 15 до 100, аппроксимаций мне обнаружить не удалось. При меньших значениях критерий применять нельзя, при больших - очевидно, приходиться пользоваться грубым оценочным правилом: при расчетном значении статистики критерия в интервале  автокорреляция отсутствует (см. https://en.wikipedia.org/wiki/Durbin–Watson_statistic). Критерий позволяет выявить только автокорреляцию 1-го порядка. Отклонение нулевой гипотезы не означает, что автокорреляции нет вообще - возможно наличие автокорреляции более высоких порядков. Критерий построен в предположении, что регрессоры  и ошибки  не коррелированы, поэтому его нельзя применять, в частности, для моделей авторегрессии [4, с.191]. Критерий не подходит для моделей без свободного члена . Критерий имеет зону неопределенности, когда нет оснований ни принимать, ни отвергать нулевую гипотезу. Между статистикой критерия и коэффициентом автокорреляции существует приближенное соотношение: Существуют и другие критерии для проверки автокорреляции (тест Бройша-Годфри, Льюнга-Бокса и пр.). Как было указано выше, большой проблемой является отсутствие табличных значений статистики критерия Дарбина-Уостона в стандартном инструментарии python. Для реализации возможностей данного критерия в полном объеме нам потребуется оцифровка весьма объемных таблиц критических значений. Я решил добавить в обзор этот раздел, хотя, строго говоря, можно было обойтись и без него, а сразу воспользоваться оцифрованными таблицами статистики критерия Дарбина-Уотсона. Однако, если мы хотим выполнять качественный статистический анализ, неизбежно придется работать с большим количеством статистических критериев и далеко не все из них реализованы в python. Критерий Дарбина-Уотсона - это только один из многих. Количество критериев, рассматриваемых в литературе по прикладной статистике в последние годы постоянно увеличивается. Специалисту придется реализовывать многие критерии самостоятельно и одна из проблем, с которой придется столкнуться - это таблицы критических значений. Далеко не все табличные значения имеют аппроксимации, а значит придется каким-то образом оцифровывать эти таблицы. Небольшие таблицы можно сохранить в файлах вручную, а вот такой подход с объемными таблицами (как в нашем случае) - это слишком непроизводительно и нерационально. В общем, на мой взгляд, представляет интерес разобрать пример оцифровки статистических таблиц на примере нашего критерия Дарбина-Уотсона - это позволит специалистам сэкономить человеко-часы работы и облегчить совершенствование инструментов статистического анализа. Замечу сразу, что я не являюсь глубоким специалистом в области анализа и обработки изображений и текстов на python - это не совсем мой профиль. Профессионалы в этой области, возможно, раскритикуют то, как решается поставленная задача и предложат более удачное решение. Если будет так - то заранее спасибо. Я же эту задачу старался решить наиболее простым и рациональным способом, доступным для широкого круга специалистов. На всякий случай могу процитировать Давоса Сиворта из "Игры престолов": "Простите за то, что увидите". Алгоритм действий: Для оцифровки я использовал таблицы, приведенные в [3, с.290-292]. Сканируем таблицы, сохраняем в виде jpg-файлов (Durbin_Watson_test_1.jpg, Durbin_Watson_test_2.jpg, Durbin_Watson_test_3.jpg) в папке text_processing, расположенной внутри папки с рабочим .ipynb-файлом: Распознаем текст (я воспользовался онлайн-сервисом https://convertio.co/), полученные текстовые файлы Durbin-Watson-test-1.ocr.txt, Durbin-Watson-test-2.ocr.txt, Durbin-Watson-test-3.ocr.txt также помещаем в папке text_processing. Откроем файлы, запишем содержимое файлов в переменные, каждая из которых соответствует одной странице: С остальными файлами - действуем аналогично: Видим, что переменные представляют собой списки, элементами которых является строки. Для облегчения дальнейшей обработки данных создадим список, элементами которого являются переменные-страницы: Далее я не стал публиковать здесь скриншоты с обработкой страниц - из-за экономии места. В ipyng-файле, который доступен в моем репозитории, весь процесс обработки представлен достаточно подробно.  Исключаем все строки, которые начинаются не с цифр; при этом воспользуемся алгоритмом перезаписи списка: Исключаем из текста управляющие символы (\t, \n) - с помощью регулярных выражений (regex) (модуль re): Удаляем все символы, кроме цифр, точек, запятых и пробелов: Заменяем запятые на точки: Разделяем строки: Сохраняем данные в DataFrame - для этого создадим список Durbin_Watson_list_df, элементами которого являются отдельные DataFrame, каждый из которых соответствует отдельной странице: Исправляем вручную отдельные аномалии, возникшие при распознавании отсканированных данных - к сожалению, работы вручную совсем избежать не удается. Корректируем DataFrame, соответствующий 1-й странице: Корректируем DataFrame, соответствующий 2-й странице: Корректируем DataFrame, соответствующий 3-й странице: Обращаем внимание, что откорректированные вручную значения являются числовыми, а все остальные значения - еще имеют строковый тип. 11. Преобразуем значения из строкового в числовой тип: Корректируем структуру DataFrame: меняем индекс - индексом теперь будет объем выборки n каждый DataFrame снабжаем мультииндексом по столбцам (подробнее см. [7, с.169]) Объединяем отдельные DataFrame в один: Итак, мы сформировали DataFrame с оцифрованными данными таблиц критических значений статистики Дарбина-Уотсона. Получить доступ к данным теперь очень просто - например, нам требуется вывести табличные значения статистики критерия при объеме выборки , доверительной вероятности  и числе параметров регрессионной модели : Построим график табличных значений. График получился весьма объемным - 3х5 элементов - однако он необходим: на графике можно увидеть те ошибки (пики и впадины), которые мы могли пропустить при ручной обработке ранее (некорректно отсканированные и распознанные цифры), тогда придется вернуться к этапу 10. Сохраняем полученный DataFrame в csv-файл, помещаем его в папку table, расположенную внутри папки с рабочим .ipynb-файлом (в которой папку table у нас хранятся файлы с данными из статистических таблиц): Табличные значения статистики критерия Дарбина-Уотсона у нас теперь имеются, можем приступать к созданию пользовательской функции. Рассчитать статистику критерия Дарбина-Уотсона мы можем с помощью функции statsmodels.stats.stattools.durbin_watson. Создадим пользовательскую функцию Durbin_Watson_test для проверки гипотезы об автокорреляции: Протестируем созданную функцию - будем моделировать временные ряды с различными свойствами и выполнять проверку автокорреляции: Смоделируем временной ряд с трендом, без автокорреляции остатков: Смоделируем временной ряд без тренда: Смоделируем временной ряд с трендом, с положительной автокорреляцией: Смоделируем временной ряд с трендом, с отрицательной автокорреляцией: Смоделируем временной ряд без тренда, с положительной автокорреляцией: Смоделируем временной ряд без тренда, с отрицательной автокорреляцией: Конечно, данный вычислительный эксперимент не может претендовать на всеобъемлемость, однако определенный любопытный предварительный вывод можно сделать: при наличии любого тренда (даже если этот тренда представляет собой равенство постоянной величине ) критерий Дарбина-Уотсона выдает нам наличие положительной автокорреляции (даже если в модели автокорреляция не заложена нет или она отрицательная). Такой вывод нужно исследовать более глубоко, но это не входит в цель данного обзора. Специалист должен помнить об особенностях критерия Дарбина-Уотсона. Теперь мы можем перейти к практическим примерам. В качестве исходных данных рассмотрим динамику показателей индексов пересчета сметной стоимости проектно-изыскательских работ в РФ. Эти показатели ежеквартально публикует Министерство строительства и ЖКХ РФ, а все проектные и изыскательские организации используют эти показатели при составлении смет на свои работы. В данном случае мы имеем набор показателей в виде временного ряда, для которого будем строить регрессионную модель долговременной тенденции (тренда), и остатки этой регрессионной модели будем исследовать на автокорреляцию. Исходные данные содержаться в файле Ежеквартальные индексы ПИР.xlsx, который помещен в папку data. Прочитаем xlsx-файл: Не будем подробно останавливаться на содержимом файла и его первичной обработке - это выходит за пределы данного обзора. Специалисты, причастные к сфере строительства и проектирования, поймут, а для остальных специалистов эти цифры можно воспринимать по аналогии с индексами инфляции Росстата и Минэкономразвития. Прочитаем из этого файла интересующие нас данные - индексы изменения сметной стоимости проектных работ к уровню цен на 01.01.2001 г.: Сохраним также вспомогательные (технические) переменные, необходимые при анализе временных рядов - дату (Date) и номер наблюдения (T): Для удобства дальнейшей работы сформируем сформируем отдельный DataFrame: Настройка заголовков: Построим линейную регрессионную модель и проведем ее экспресс-анализ: Формализация модели: График модели: Ошибки аппроксимации модели: Проверка нормальности распределения остатков: Проверка гетероскедастичности: Проверка автокорреляции: Как видим, результат совпадает со значением статистики критерия в таблице выдачи регрессионного анализа. Выводы по результатам анализа модели: Итак, мы провели статистический анализ регрессионной модели и установили: Регрессионная модель хорошо аппроксимирует фактические данные. Остатки модели имеют нормальное распределение (хотя результаты тестов противоречивы). Коэффициент детерминации значим; модель объясняет 97% вариации независимой переменной. Коэффициенты регрессии значимы. Обнаружена гетероскедастичность. Тест критерия Дарбина-Уотсона свидетельствует о наличии значимой положительной автокорреляции остатков. Резюме - несмотря на вроде бы формально хорошие качественные показатели, нам следует признать эту модель некачественной и отвергнуть по следующим негативным причинам: На графике модели хорошо заметна точка излома, которая говорит о смене тенденции (существуют специальные статистические тесты для проверки гипотез о смене тенденции, например, тест Чоу, но мы в данном обзоре рассматривать их не будем). График остатков показывает нам крайне неприглядную картину: на начальном этапе тенденции явно прослеживаются колебания, а после точки излома тенденция вообще кардинально меняется. Противоречивость тестов проверки нормальности распределения остатков. Наличие гетероскедастичности. Наличие автокорреляции. Явление автокорреляции может возникать в случае смены тенденции [5, с.118]. Тот факт, что распределение остатков признается нормальным по результатам таких тестов как Шапиро-Уилка, Эппса-Палли, Андерсона-Дарлинга может иметь разные причины, например, мы можем иметь дело со смесью двух распределений. Этот вопрос требует отдельного тщательного исследования. Применение построенной модели приведет к ошибке, так как модель хорошо аппроксимирует существующие данные, но из-за смены тенденции неспособна дать качественный прогноз. Проиллюстрировать это можно, построив доверительный интервалы прогноза (формально мы можем это сделать, так как распределение остатков признано нормальным): Нет, такой прогноз нам не нужен. Рассмотрим пример множественной линейной регрессионной модели, приведенный в источнике [6, с.192]. В качестве исходных данных рассматриваются ряд макроэкономических показателей США за 1960-1985 гг. (в сопоставимых ценах 1982 г., млрд.долл): DPI - годовой совокупный располагаемый личный доход; CONS - годовые совокупные потребительские расходы; ASSETS - финансовые активы населения на начало календарного года. Предполагается, что между переменной CONS и регрессорами DPI, ASSETS имеется линейная регрессионная связь. Исходные данные содержаться в файле Macroeconomic_indicators_USA_1960_1985.csv, который помещен в папку data. Прочитаем csv-файл: Построим линейную регрессионную модель и проведем ее экспресс-анализ: График модели: Ошибки аппроксимации модели: Проверка нормальности распределения остатков: Прроверка гетероскедастичности: Проверка автокорреляции: Выводы по результатам анализа модели: Как видим, в целом результаты расчетов совпадают с результатами из первоисточника [6], в части выявления автокорреляции аналогично. Информация к размышлению. Анализ показывает, что модель хорошо аппроксимирует фактические данные, но имеет место отклонение от нормального закона распределения остатков, противоречивые выводы о гетероскедастичности и наличие автокорреляции, то есть модель некачественная. Также мы видим, что динамика макроэкономических показателей свидетельствует о наличии трендов, однако, если в модель добавить еще один фактор - год или номер наблюдения - то, этот фактор окажется незначимым. В дальнейшем автор при анализе остатков модели [6, с.198] выявляет структурный сдвиг (обусловленный мировым топливно-энергетическим кризисом в 1973 г.) и вводит в модель фиктивные переменные, учитывающие этот структурный сдвиг Итак, подведем итоги: мы рассмотрели способы реализации в полной мере критерия Дарбина-Уотсона средствами python, создали пользовательскую функцию, уменьшающую размер кода; разобрали пример оцифровки таблицы критических значений статистического критерия для реализации пользовательской функции. Исходный код находится в моем репозитории на GitHub. Надеюсь, данный обзор поможет специалистам DataScience в работе. Кобзарь А.И. Прикладная математическая статистика. Для инженеров и научных работников. - М.: ФИЗМАТЛИТ, 2006. - 816 с. Айвазян С.А. Прикладная статистика. Основы эконометрики: В 2 т. - Т.2: Основы эконометрики. - 2-е изд., испр. - М.: ЮНИТИ-ДАНА, 2001. - 432 с. Фёрстер Э., Рёнц Б. Методы корреляционного и регрессионного анализа / пер с нем. - М.: Финансы и статистика, 1983. - 302 с. Магнус Я.Р. и др. Эконометрика. Начальный курс - М.: Дело, 2004. - 576 с. Тихомиров Н.П., дорохина Е.Ю. Эконометрика. - М.: Экзамен, 2003. - 512 с. Носко В.П. Эконометрика. Кн.1. Ч.1, 2. - М.: Издательский дом "Дело" РАНХиГС, 2011. - 672 с. Вандер Плас Дж. Python для сложных задач: наука о данных и машинное обучение. - СПб: Питер, 2018. - 576 с.  Инженер