27-28 августа 2019 года во Владивостоке и Приморском крае произошли массовые оползни. К счастью, обошлось без жертв. Однако, материальные потери оказались существенными: разбитые автомобили, перекрытые дороги, поврежденные здания и детские площадки. Оползни сошли в момент прохождения мощного циклона с обильными дождями. Мы робко предположили что "осадки виновны", распаковали методы классической статистики и приступили к исследованию.
TL;DR
Копии архивов исторических данных вместе с кодом статистического анализа на Python здесь. Почитать опубликованную статью в Pure and Applied Geophysics можно тут (upd: DOI).
Данные
Для того что бы исследовать зависимость оползней от выпавших осадков нам нужны две вещи: оползневые случаи и осадки с развитием во времени. С осадками всё относительно просто. Во Владивостоке действует одна из самых старинных станций (WMO Index 31960). Исторические метеорологические данные практически непрерывны с 01 января 1914 года. Архив наблюдений содержит ежедневные измерение температуры воздуха, количества осадков, температуры почвы на глубинах. Кстати, если вам нужны метеоданные для ваших исследований или проектов, то вот сайт с ними.
Набор данных (ката в новом редакторе нет, извините):
Набор данных |
Позиция |
Описание |
Формат |
1 |
Индекс ВМО |
5 |
|
2, 3, 4 |
Год, Месяц, День |
4, 2, 2 |
|
5 |
Общий признак количества температур |
1 |
|
6 |
Минимальная температура воздуха |
5.1 |
|
7 |
Средняя температура воздуха |
5.1 |
|
8 |
Максимальная температура воздуха |
5.1 |
|
9 |
Количество осадков |
5.1 |
|
1 |
Индекс ВМО |
5 |
|
2, 3, 4 |
Год, Месяц, День |
4, 2, 2 |
|
5 |
Температура почвы на глубине 2 см |
5.1 |
|
6 |
Температура почвы на глубине 5 см |
5.1 |
|
7 |
Температура почвы на глубине 10 см |
5.1 |
|
8 |
Температура почвы на глубине 15 см |
5.1 |
|
9 |
Температура почвы на глубине 20 см |
5.1 |
|
10 |
Температура почвы на глубине 40 см |
5.1 |
|
11 |
Температура почвы на глубине 60 см |
5.1 |
|
12 |
Температура почвы на глубине 80 см |
5.1 |
|
13 |
Температура почвы на глубине 120 см |
5.1 |
|
14 |
Температура почвы на глубине 160 см |
5.1 |
|
15 |
Температура почвы на глубине 240 см |
5.1 |
|
16 |
Температура почвы на глубине 320 см |
5.1 |
С оползневыми случаями всё немного сложнее. Готового набора нет. Нам пришлось очень муторно и долго изучать новостные сводки, отмечая даты с оползнями. Каждый найденный оползневой случай соответствует отдельному дню в ряду наблюдений как бинарная переменная. В итоге получилась вот такая табличка. Все остальные дни были отмечены как неоползневые. Ввиду отсутствия объективных данных об оползнях до 1946 года, ряд наблюдений осадков для последующего анализа был сформирован с 01 января 1946 года по 01 апреля 2020 года.
Хорошо! Но с осадками всё не так просто. Дело в том, что на почву влияет не только дождь, который идёт прямо сейчас (Daily Rainfall или DR). Общий "параметр" увлажнения грунта зависит и от предшествующих осадков. И здесь у нас два варианта для создания производных переменных. Первый - это кумулятивное количество осадков c начала года (Cumulative Precipitation или CP). Второй параметр - это предшествующие осадки в определённом временном окне (Antecedent Rainfall или AR). AR придумали наши коллеги из Южной Кореи. Интуитивно, осадки выпавшие два месяца назад должны меньше влиять на некое триггерное увлажнение грунта после которого возникает оползень. В оригинальной работе параметр называется Inter event time definition (IETD) и рассчитывается он каждый час, так как в Южной Корее метеорологические данные более детальные. Параметр IETD в настоящем исследовании может варьироваться от 24 до 46 часов. Это связано с тем, что исходные данные представляют количество осадков за одни сутки и точно определить параметр IETD в часах по имеющимся историческим метеоданным невозможно. В общем случае, безосадочный период фиксируется отсутствием осадков (Rainfall per day = 0) в предшествующие сутки. То есть, если дождь лил непрерывно 7 дней, то AR будет учитывать кумулятивное значение за этот период. Если был 1 "сухой" день до оползня, то AR=0.
Разведочный анализ (Exploratory data analysis, EDA)
Scientific Dataist'ы скажут нам, что данные нужно покрутить, повертеть. Ну что ж, приступим. Для начала взглянем на распределение осадков по месяцам.
Здесь мы видим наибольшее количество осадков с мая по октябрь, что несюрприз для муссонного климата Владивостока. Наибольшее количество дождей выпадает в августе. А та аномальная точка на 500+ миллиметров - это как раз наш август 2019-го.
Теперь посмотрим на данные сверху:
Здесь у нас всего 34 оползня и с явным отрывом лидирует июль и август. Корреляция с осадками на лицо. Стоит отметить, что минимальное количество осадков за сутки для оползневого случая равно 54 мм. Возможно, это значение является критическим для оползневых процессов в нашем городе.
Матрица ковариаций, рассчитанная для всех переменных в результирующем наборе данных, показывает высокую положительную корреляцию температурных переменных 0.45≤ρ≤0.99. С другой стороны, переменные, связанные с осадками, имеют слабую положительную корреляцию между собой 0.058≤ρ≤0.14. В данных наблюдается выраженная положительная корреляция количества осадков в сутки и оползневыми случаями ρ=0.43.
Таким образом, количество осадков в сутки и производные кумулятивные значения являются хорошими кандидатами для построения регрессионной модели. Среди температурных показателей достаточно выбрать только одну переменную, например среднюю дневную температуру (в финальном варианте мы её исключили). Построим отдельную матрицу только для осадков:
Ну и конечно, выпускники факультетов математической статистики скажут нам, что эта табличка нужна в разведочном анализе:
Сводная статистика по набору данных (кат тут не нужен, табличка ещё пригодится) DOI
Variable |
Obs. |
Mean |
Std. Dev. |
Min |
Max |
All the data from 1946 year | |||||
Min air day temp |
26978 |
1.754 |
11.887 |
-30.3 |
24.7 |
Avg air day temp |
26978 |
4.631 |
11.604 |
-27.1 |
27.5 |
Max air day temp |
26978 |
8.736 |
11.643 |
-24.1 |
33.6 |
Temp at a depth (20 cm) |
14581 |
6.274 |
9.554 |
-18.6 |
24.1 |
Temp at a depth (40 cm) |
14565 |
6.510 |
8.455 |
-13.6 |
21.4 |
Temp at a depth (80 cm) |
17844 |
6.483 |
6.919 |
-6.8 |
45.4 |
Temp at a depth (120 cm) |
17896 |
6.510 |
5.764 |
-3.7 |
17.1 |
Temp at a depth (160 cm) |
17802 |
6.607 |
4.982 |
-1.8 |
15.8 |
Temp at a depth (240 cm) |
17865 |
6.716 |
3.776 |
-8.9 |
14.3 |
Landslide |
27119 |
0.001 |
0.035 |
0 |
1 |
Daily rainfall |
26974 |
2.278 |
8.313 |
0.0 |
243.5 |
Cumulative precipitation |
27119 |
368.967 |
334.201 |
0.0 |
1272.1 |
Antecedent rainfall |
27119 |
5.978 |
20.362 |
0.0 |
335.3 |
Data user for logistic regression | |||||
Min air day temp |
199 |
13.664 |
5.283 |
-6.6 |
21.8 |
Avg air day temp |
199 |
15.542 |
4.866 |
-4.8 |
22.8 |
Max air day temp |
199 |
17.982 |
4.880 |
-3.0 |
26.7 |
Temp at a depth (20 cm) |
113 |
15.664 |
4.628 |
-4.8 |
22.3 |
Temp at a depth (40 cm) |
113 |
15.301 |
4.512 |
-4.5 |
20.7 |
Temp at a depth (80 cm) |
129 |
14.038 |
4.134 |
-1.3 |
18.4 |
Temp at a depth (120 cm) |
129 |
12.667 |
3.858 |
-1.0 |
17.1 |
Temp at a depth (160 cm) |
128 |
11.721 |
3.544 |
-0.3 |
15.7 |
Temp at a depth (240 cm) |
129 |
10.058 |
3.049 |
0.7 |
14.3 |
Landslide |
200 |
0.170 |
0.377 |
0 |
1 |
Daily rainfall |
200 |
71.221 |
28.606 |
45.7 |
243.5 |
Cumulative precipitation |
200 |
481.522 |
232.776 |
0.0 |
1168.3 |
Antecedent rainfall |
200 |
23.144 |
38.211 |
0.0 |
200.8 |
Логистическая регрессия
Итак, мы добрались до главного. Тут как то надо обосновывать почему именно логистическая регрессия. Целью исследования было построить некую модель для предсказаний оползневых случаев по метеоданным. Вместе с этим, мы хотели посмотреть как сильно влияют на оползни те или иные переменные. То есть нам важна значимость коэффициентов с оценкой (машинное обучение отменяется). И здесь, кроме logit есть ещё probit. Выбор между этими инструментами - это дело вкуса, если хотите. В геофизике как то принято использовать logit. Кроме этого, logit можно всегда интерпретировать как соотношение шансов, в общем, он теплее.
Запишем отношение шансов формально:
В этой формуле нет температурных осадков. Мы их убрали выполнив линейную регрессию по всем переменным из за низкой статистической значимости. То есть p-значение для двустороннего T-теста больше 10% для каждой температурной переменной. Построить регрессию по всем переменным и убедится в этом можно на основе этого скрипта. Кстати, мы использовали statsmodels. А любителям R рекомендую вот эту статью )
Теперь нам нужно обсудить очень важный момент. Если мы посмотрим на сводную статистику (табличка выше, блок вся дата), то увидим, что оползневых "дней" всего 33 из 27119 (строка Landslide). Кроме того, что данные жутко несбалансированы, это может привести к проблеме quasi-complete separation (варианты перевода приветствуются). Подробно эта проблема описана в работе статистов Albert & Anderson в 1984 году. Интуитивно, выполняя оптимизацию целевой функции, модель нам прочертит границу по 54 мм, которую мы и так видим на рисунке с оползневыми случаями. Но нам, конечно, надо точнее. Нужно знать, если за день выпало больше 54 мм, то какая вероятность того что оползни будут в городской черте. Для этого, мы просто отрежем данные ниже 54 мм (таблица выше, блок данные для регрессии).
Запишем этот ход конем формально:
где
Теперь давайте посчитаем наши коэффициенты (DOI):
Dependent variable: Landslide |
|||
Coefficients |
Marginal effects |
||
Intercept |
-7.009*** (1.038) |
- |
|
Antecedent rainfall |
0.013*** (0.005) |
0.0012*** (<0.001) |
|
Cumulative precipitation |
0.002** (0.001) |
0.0002** (<0.001) |
|
Daily rainfall |
0.048*** (0.009) |
0.0044*** (0.001) |
|
Observations |
200 |
||
LLR p-value |
<0.001*** |
|
|
Note: |
**p<0.05; ***p<0.01 |
Здесь мы видим, что, во первых статистическая значимость теста максимального правдоподобия в норме, т.е. больше 95% для всех переменных. А во вторых интересна оценка "вклада" каждого осадочного параметра в прогнозируемое значение возникновения оползня. В случае линейной регрессии, мы можем просто посмотреть на сами параметры, какой больше тот и круче. В случае logit мы должны продифференцировать относительно каждого коэффициента и получить так называемые маржинальные значения (marginal effects). И на первом месте, по влиянию на вероятность оползня, у нас дневные осадки. Следом, на порядок ниже, идут предшествующие осадки. И самый слабый (но значимый!) - это накопленные осадки с начала года.
Круто! Один результат есть. Но нам ещё нужна предиктивная модель. Для этого нам нужно определить порог срабатывания нашей logit(P) модели. По умолчанию, для logit всё что больше 0.5 и есть кейс. Но мы можем немного поварьировать этот порог и посмотреть на значение наших метрик:
Наши друзья precision и recall. Достаточно распространённые метрики в классификации. Интуитивно, precision это сколько оползней мы вообще правильно обнаружили, а recall это сколько "пропусков" для положительных вариантов. TP - это правильно предсказанный случай, FP - неправильно, FN - неправильно не предсказанный.
Ну и scikit learn нам в помощь:
Методом перебора по всем 33 случаям мы определили оптимальный порог в 0.24 на наших данных. Здесь надо сказать, что мы не делили данные для раздельного обучения и валидации, так как их очень мало.
Матрица несоответствий при классификации оползней на обучающей выборке моделью Logit(P) (200 samples, 0.24 predicted threshold) DOI:
Observed |
Not a landslide |
152 (TN Landslide, TP Not a landslide) |
14 (FP Landslide, FN Not a landslide) |
Landslide |
13 (FN Landslide, FP Not a landslide) |
21 (TP Landslide, TN Not a landslide) |
|
|
|
Not a landslide |
Landslide |
|
|
Predicted |
Производительность модели Logit(P) как классификатора оползневых случаев по обучающей выборке метеоданных (200 samples, 0.24 predicted threshold) DOI
Precision |
Recall |
F1-score |
Support |
|
Not a landslide |
0.93 |
0.92 |
0.92 |
166 |
Landslide |
0.61 |
0.65 |
0.63 |
34 |
Balanced accuracy |
0.78 |
200 |
Ну и, наконец, давайте упростим нашу формулу, что бы вот подставил значения осадков и получил вероятность, потом посмотрел больше ли оно 0.24 и предсказал!
В заключение нашего статистического экскурса стоит сказать, что оползни зависят не только от осадков, но и от других физических параметров, которых у нас не было в распоряжении. Финальная модель, конечно, далека от совершенства. Стоит выполнять раздельную регрессию и валидацию и так далее. Но в качестве первого приближения вполне годится, так как ряд наблюдений это десятки лет.
Комментарии (21)
serhit
15.08.2021 17:54+1Хорошая работа. Вопрос про несбалансированные классы: после отсечения данных с малым количеством осадков - не пробовали вводить веса классов?
И ещё. Не пробовали ли применять upsampling (например с помощью imblearn)? Или для таких исследований это недопустимо?
jamm1985 Автор
15.08.2021 18:13Спасибо за оценку!
Веса классам мы не меняли, потому что в этом случае будет сдвиг в оценке коэффициентов. В этой работе значения коэффициентов это один из результатов. То есть подход чисто статистический.
sshmakov
15.08.2021 18:35+1Извините, можно для тупых немного пояснить, что означает ваша последняя формула? И пару примеров привести, если не трудно?
jamm1985 Автор
16.08.2021 03:05+1Берем конкретный день, например, вчера 15 августа 2021 года. Смотрим показания метеостанции, а именно:
DR - суточное значение осадков за 15 августа;
AR - значение предшествующих осадков. Если дождь лил непрерывно, то это будет кумулятивное значение за все дни непрерывных осадков. Если был один сухой день - 14 августа - то 0.
CP - кумулятивное значение осадков с начала года.
Теперь мы ставим все эти данные с метеостанции в формулу выше и если левая часть больше либо равна 122 то оползень будет (по модели).
Кстати! Здесь есть один очень интересный момент. Если AR и CP равны 0, то что бы сошел оползень (по модели) за день должно выпасть 122 мм осадков! Этот вывод отмечен в статье. И это ещё один аргумент в пользу статистического подхода - мы можем использовать исходные коэффициенты регрессии для таких выводов.
sshmakov
16.08.2021 08:05Спасибо. Двенадцать сантиметров осадков за сутки, наверное, нечастое явление, поэтому постоянно идущие дожди, видимо, чаще становятся причиной оползней. Делим 122 на 0,271, получаем 450 мм. Хм, тоже как бы немало. Трудно представить, что такая масса будет выльется непрерывно в течение, скажем, трёх дней. Предположим, что в день "всего" льется 30 мм, то сколько дней сплошного дождя приведет к оползню? (122-30)/0,271/30=11 дней.
balberbro
15.08.2021 21:56+1Мы робко предположили, а можно уточнение, кто мы? Двфу?
jamm1985 Автор
16.08.2021 03:10В статье стоят авторы и аффилиация: ДВГИ ДВО РАН. В основном работа была выполнена силами сотрудников Сахалинского филиала.
t278
16.08.2021 05:54
avl33
16.08.2021 10:37+1Очень интересная и сильная работа, но - насколько я понимаю для принятия конкретными службами правильным заблаговременных мер (а Вы же о предсказании говорите), нужно знать не только когда, но и где - причем второе куда существеннее первого.
Если бы я принимал решения о том, в какое место надо направить средства (а на все места средств никогда одновременно не хватит) в первую очередь для укрепления склонов от оползней, то полученная Вами информация мне бы никак не помогла.
jamm1985 Автор
16.08.2021 11:13Спасибо за отзыв!
Ну, с одной стороны, вы правы. С другой стороны, есть предупреждающие меры, а есть спасательные работы. Если уже 5 дней льёт дождь, и у вас есть в распоряжении прогноз погоды, то вы можете предсказать высокую вероятность оползней в городской черте. В этом случае, у вас есть время собрать силы и средства для возможных оползней: подготовить технику, проинструктировать спасателей и так далее. Передвижение готового отряда по городу - это часы. А если не подготовится и сойдёт много оползней, то до кого то помощь может во время не дойти.
sav1812
16.08.2021 12:05+1"Если бы я принимал решения о том, в какое место надо направить средства (а на все места средств никогда одновременно не хватит) в первую очередь для укрепления склонов от оползней, то полученная Вами информация мне бы никак не помогла."
Это место известно, и называется оно Владивосток... ;)
И речь там, на мой взгляд, должна идти не о первоочередном месте укрепления склонов, а о принципиальной возможности такого укрепления в масштабах города, доступных технологиях и объёмах требующихся на это средств.
Надо видеть своими глазами Владивосток в период тайфунов...avl33
16.08.2021 13:20+1Отвечу сразу на оба комментария.
"Владивосток" и "городской черте". Оползни безусловно во Владивостоке и в городской черте, но с точки зрения приложения сил и обеспечения безопасности - это всё равно что сказать, что они в России и внутри периметра.
Принципиальная возможность - есть технологии, которые позволяют обеспечить устойчивость склонов практически любой сложности. Вопрос только в средствах - и это не всегда деньги, это ещё и люди, и техника. Если одновременно на все потенциально опасные, с точки зрения оползней, места Владивостока (читай России внутри периметра) попытаться натянуть средства бюджета Владивостока (читай России внутри периметра), то именно в этом случае решение станет принципиально невозможным.
Именно поэтому, для стороны принятия решений, второй критерий - место, куда важнее первого - времени.
По поводу часов - это тоже на самом деле очень открытый вопрос. Давайте представим, что мы точно знаем прогноз погоды на предстоящую неделю и точно знаем, что Ваша формула показывает неизбежность оползней во Владивостоке. Как Вы думаете, какое количество дополнительных ресурсов (в смысле людей и техники) нужно пригнать во Владивосток, если оползни затронут XX% потенциально опасных мест?
Ключевой вопрос здесь - в XX%. Это величина от 0 до 100, причем непредсказуемая, но именно от неё зависит и количество дополнительных людей, и количество дополнительной техники, которые, кстати снова будут из бюджета Владивостока.
Я ни в коем случае не умиляю проделанную работу и повторю ещё раз, она интересная, сильная и важная - проблема оползней на 50% стала прозрачнее и предсказуемей, НО, к сожалению, всё так же далека от решения.
imageman
17.08.2021 17:13Вроде долго работали, составляли матрицы ковариаций.... А откуда у вас в строке Temp at a depth (80 cm) максимальная температура 45 градусов? (Аналогично в некоторых других местах таблицы.) Очистку данных не производили?
Мне кажется несколько надуманной идея использования именно логистической регрессии. В XGBoost можно узнать важность различных признаков. В любом случае было бы интересно взглянуть на точность и сравнить с "большими" дядями по типу XGBoost, нейросетями.
jamm1985 Автор
17.08.2021 17:25Очистку данных производили. Смотрите, пожалуйста, раздел таблицы после заголовка Data user for logistic regression.
Мне кажется несколько надуманной идея использования именно логистической регрессии.
В статье подробно объясняется почему мы использовали этот инструмент - нам нужна была значимость коэффициентов и их оценка. Если вы будете использовать подход ML вы получите модель "черный ящик", где параметры абсолютно ничего не значат.
imageman
17.08.2021 18:02Очистку данных производили
выкинули дни с дождями меньше 45 мм? Ok, пусть (или какую-то ещё очистку производили?).
Вместе с этим, мы хотели посмотреть как сильно влияют на оползни те или иные переменные.
https://habr.com/ru/post/428213/
"Рассчитываем важность фичей с помощью SHAP". Я думаю это может вполне подсветить "черный ящик".
И это не отменяет мысли о сравнении классического подхода и ML подхода для того, что бы узнать насколько сильно мы потеряли в точности. Также отмечу, что подбором гиперпараметров XGBoost и генерацией комбинированных фич можно построить достаточно компактное дерево, которое можно интерпретировать.
jamm1985 Автор
18.08.2021 12:15выкинули дни с дождями меньше 45 мм? Ok, пусть (или какую-то ещё очистку производили?).
Вообще то 54 мм. Все значения проверили, можете сами посмотреть, там всё в порядке.
"Рассчитываем важность фичей с помощью SHAP". Я думаю это может вполне подсветить "черный ящик".
SHAP отличная штука. Кроме этого, есть ещё байесовские нейронные сети - то же интересный подход в этом направлении. Лично меня эта тема очень захватывает. Но вы поймите, мы писали научную статью, рассчитанную на определённое научное сообщество геофизиков, поэтому выбор инструментов был соответсвующий. Кроме этого, положительных классов крайне мало.
piva
Здраствуйте Андрей,
Спасибо, интересная работа. я совсем не из той области знаний, но стало интересно.
Есть ли инструменты для автоматического построения ковариационной матрицы исходя из статистических данных?
jamm1985 Автор
Здравствуйте! Спасибо за отзыв )
Построить ковариационную матрицу можно в excel, R и многих других инструментах. В основном это делается "автоматически" после соответствующей подготовки данных. Я использую python. В этом варианте с данными, на мой взгляд, наиболее удобно работать в pandas. Вот у них есть отличное руководство с примерами. После того как вы загрузили данные в DataFrame матрица строится одним простым методом. Ну а сами значения удобно рисовать функцией heatmap из пакета sns.
Вот пример для рисунка из статьи:
Наверное можно как то более изящно, но этот код кочует из одного скрипта в другой )