Продолжаю цикл статей основанных на анализе базы московских больных. В настоящей второй части я буду анализировать влияние загрязнение воздуха на тяжесть течения заболевания. В этом нам поможет сайт с открытыми данными г. Москвы, на котором представлена информация с небольшого количества метеорологических станций.
Первая часть: Мегаанализ распространения Covid-19 в Москве
Итак, на портале открытых данных правительства Москвы есть наборы данных: "Автоматические станции контроля загрязнения атмосферы" и "Среднемесячные показатели загрязнения атмосферного воздуха".
Первый набор данных дает привязки метеостанций к геокоординатам, что позволяет нам с помощью geopandas построить такую симпатичную карту (территория новой Москвы в статье не рассматривается, поскольку на ней сравнительно небольшое количество заболевших):
Второй набор предлагает различные характеристики воздуха, из которых я использовал только те, у которых указано ПДК. Дело в том, что среди составляющих есть также "безобидные" компоненты, которые не оказывают отрицательного влияния на здоровье (и потому не имеют ПДК). Очевидно, что рассмотрение таких компонентов выходит за рамки статьи. Также не все станции способны обрабатывать полный набор загрязнений. Например, 'Бензол' имеет ПДК, но построить разностный анализ по нескольким станициям, которые его измеряют, просто невозможно.
В силу сказанного выше, исследовались следующие загрязения воздуха: 'Взвешенные частицы РМ10', 'Взвешенные частицы РМ2.5', 'Диоксид азота', 'Диоксид серы', 'Метан', 'Озон', 'Оксид азота', 'Оксид углерода', 'Сероводород'.
Чтобы получить загрязение воздуха непосредственно по месту проживания пациента выполнялась линейная интерполяция относительно базовых станций. Если же пациент проживал на окраине города и не был окружен базовыми станциями, то применялась экстраполяция по методу ближайшего соседа. Таким образом для разных загрязнений воздуха можно получить карты, на которых по оси Z отложено значение в долях ПДК (если кому- то будут интересны распределения других загрязнений воздуха, то напишите в комментариях, и я для вас построю эти отчеты):
Борьба с корреляциями
Для начала давайте решим чем же так плохи корреляции в наших фичах. Например, у нас в наборе есть данные гео- координат места жительства большого числа пациентов. Если в набор фичей добавить гео- координаты, то CatBoost (именно этот эстиматор будет использоваться для анализа) может разбить выборку именно по координатным зонам, тем самым вобрав всю полезную информацию, относящуюся к расположению (например, стоимости жилья, молодость "новостроечных" семей, политические предпочтения районов...). В том числе мы получим нулевую важность фичей загрязнения воздуха. Поэтому из набора необходимо исключить данные гео- координат.
С другой стороны, фичи тех или иных характеристик загрязений воздуха могут сильно коррелировать между собой, перетягивая "одеяло важности" на себя. Ведь логично преположить, что у них единый источник (например, выхлопные газы автомобилей), который производит большое количество разнокачественных загрязнений (и потому они коррелируют).
Поэтому необходимо проанализировать полезность использования метода главных компонентов (PCA). Напомню, что этот метод требует нормализации, без которого получаются очень странные результаты. После выполнения PCA- анализа нас ждет сюрприз: чтобы сохранить 95% дисперсии необходимо использовать 8 из 9 фичей загрязения воздуха. Конечно, можно было бы перейти к 8 новым векторам, но автор считает, что затрудение анализа подобных суперпозиций не окупает достигаемого незначительно выигрыша. Поэтому метод PCA не применялся, и тепловая карта матрицы корреляции Пирсона выглядит следующим образом:
Как видим ситуация вполне пристойная, поэтому еще раз утверждаемся в ненужности PCA- преобразования исходных фичей.
Анализ влияния загрязнения воздуха на тяжесть протекания заболевания
Итак, все подготовительные действия выполнены можно переходить к основной цели публикации.
Для тех кто не читал предыдущую публикацию (ай- яй- яй!) напомню, что как бригада СМП, так и врачи в стационаре для каждого пациента указывали тяжесть течения заболевания: 'Легкое течение', 'Средней тяжести', 'Тяжелое течение' + я добавил значение 'Умер'. Эти значения будут являться целевыми метками, что позволит натренировать Catboost на предсказывание тяжести течения заболевания.
После выполнения фитинга можно будет проанализировать как наличие фич, связанных с загрязнением воздуха, улучшает прогноз по выбранным метрикам: для этого необходимо сравнить результаты с перемешанными анализируемые фичами (исключение фичей является не совсем корректным способом оценки влияния на результат). Есть и второй способ: библиотека CatBoost предоставляет возможность исследования 'Shap values', т.е. то как зафиченная модель использовала те или иные фичи.
Замечу, что для анализа воздуха по месту проживания пациента использовалось два варианта: расчет среднего загрязенения воздуха за последний год и за последний месяц (март 2020 года). Оказалось, что более сильное влияние на результат оказывает второй вариант, поэтому именно он в дальнейшем и используется. Поскольку на момент базы данных (апрель 2020 года) Москву "закрыли" и произошло заметное улучшение воздуха, то влияние загрязения воздуха при нахождении пациентов в стационаре не выполнялось.
Разумеется дополнительно автор произвел все необходимые действия (причем итеративно, чтобы на поверхности ошибок попасть в оптимальную точку):
Подобрал параметры, чтобы избежать переобучения.
Выполнил отбраковку "мусорных" фичей.
Для каждой фичи подобрал подходящее пенальти (использовалась L2- регуляризация).
Настроил оптимальные гиперпараметры.
Каждый шаг выполнялся с 25 различными начальными случайными состояниями эстиматора и 25 случайными разбиениями выборки. Это позволило сделать анализ не зависящий от превратностей судьбы.
В таблице представлены два сравнения: пп1 vs 2 и пп.3 vs 4
В первом сравнении (пп1 vs 2) используются все фичи (кроме гео- координат, которые бы "съели" часть важности фичей загрязнения воздуха). Его необходимо выполнить, поскольку вырезаемая область находится в многомерном гиперпространстве признаков, и решение о проведении разделяющей поверхности принимается на основании всей совокупности признаков. Другими словами, фичи загрязнения воздуха в некоторых случаях могут "сработать" только в тандеме с другими фичами: например, стать "добивающим" фактором для групп риска.
Второе сравнение (пп.3 vs 4) необходимо чтобы избежать "насыщения": все дополнительные фичи кроме пола и возраста были проигнорированы. В этом случае, фичи, связанные с загрязением воздуха, могут проявить себя как самостоятельные факторы.
Характер использованных фич |
Тяжесть заболевания |
Метрики |
1. Все фичи (кроме гео- координат) |
Тяжелое течение Умер |
Logloss = 17.6 Logloss = 5.1 |
2. Все фичи (кроме гео- координат), фичи загрязнения воздуха перемешаны |
Тяжелое течени |
Logloss = 17.6 Logloss = 5.1 |
3. Пол + Возвраст + загрязенения воздуха |
Тяжелое течение
|
Logloss = 41.2 |
4. Пол + Возраст, фичи загрязенения воздуха перемешаны. |
Тяжелое течение |
Logloss = 41.5 |
Из приведенной таблицы видно, что загрязнение не оказывает значимого влияния на результаты. Но может где- то закралась ошибка? Давайте проверим результат по графикам ShapValues, которые постфактум покажут как Catboost использовал фичи. Графики приведены для тяжелого течения заболевания, поскольку для умерших они практически идентичны.
По оси Х даны значения величины (для загрязнений воздуха- доли ПДК), а по оси Y вклад фичи в общий скор. Положительные значения "помогают" отнести экземпляр к искомому классу, а отрицательные вносят вклад в отрицание принадлежности классу, т.е. понижая тяжесть заболевания. Видно что все загрязнения воздуха имеют очень маленький вклад на уровне 0.1 и практически не оказывают влияние на принятое решение по каждому пациенту. Для сравнения приведено влияние на результат других фичей: на этом графике нужно смотреть на возможный потенциал влияния (масштаб по оси Y), оказываемый другими фичами (и сравнивать его с влиянием загрязнений воздуха).
Важна также "логичность" графика по фиче: единый результат мы должны получить в достаточно широком интервале значений (без странных плаваний и рывков). Таким характером обладают Диоксид азота, Оксид углерода, Диоксид серы и Сероводород. Но у двух последних небольшие значения приводят к повышению тяжести течения, при этом доли ПДК низки, что заставляет усомниться в их правильном влиянии. Возможно это влияние оставленой корреляции: теперь эстиматор, "разбрасывая" общую составляющую, в одних коррелирующих фичах может сделать положительное отклонение, а в других- отрциательное, сохранив верным только итоговую влияние. Оксид углерода влияет верно, но на низких значениях ПДК (выше 0.2), что возможно является верным. Уверенно- корректный вклад делает Диоксид азота, у которого на высоких значениях превышения ПДК происходит усиление тяжести заболевания.
Вышеизложенный анализ позволяет однозначно сделать вывод: загрязнение воздуха, при котором жил пациент, не оказало значимого эффекта на тяжесть течения заболевания.
P.S. Работа выполнена с использованием свободного ПО, разработчикам которого я благодарен.
Комментарии (10)
cosmolev
03.10.2021 16:05+1Разница в загрязнении воздуха в пределах одного города не даст никакого статистически значимого эффекта.
Надо сравнивать области с разными уровнями загрязнений. В Москве в среднем воздух достаточно хороший. Её надо сравнивать с местами с действительно грязным воздухом: Красноярск зимой, Паданская равнина зимой. Но тогда конечно чистого сравнения не выйдет из-за разницы в социо-экономических факторах.
PythonAnalyst Автор
03.10.2021 16:14Я не зря привел графики загрязненности воздуха: в разных районах Москвы бывают достаточно серьезные всплески тех или иных загрязнений. Причем это реальные данные станций, которые занимаются измерениями, а не мои размышления.
cosmolev
03.10.2021 16:36+1Я же не говорю что вы данные из пальца высосали - я говорю что усреднённо в пределах одного города это не даст статически значимого результата.
Я живу в регионе где зимой очень плохой воздух и можно сказать глубоко погружен в тему.
Мне попадалось на глаза исследование где высчитывали разницу в средней продолжительности жизни обитателей района грязным воздухом (Паданская равнина - 2й по загрязнённости воздух евросоюза из-за высокой плотности населения и окружённости горами) и благоприятного района. Там разница в продолжительности жизни была всего лишь в 8 месяцев. А вы хотите в пределах одного города диаметром в 25 километров полезный сигнал уловить - нет его там.
quakz
03.10.2021 19:50А будет ссылка на репозиторий с кодом?
PythonAnalyst Автор
03.10.2021 21:17Беда в том, что проект очень большой, а каждая из приводимых мной статей составляет очень маленькую часть этого проекта. Поэтому включать ссылку на весь код в подобных статьях некорректно: народ просто в нем утонет. Плюс ко всему необходимы исходные данные: как база ковидных больных, так и ряд дополнительных файлов (например, в этой публикации используются данные по загрязнению воздуха).
Но если вам все же интересно посмотреть на мое творчество, то, пожалуйста:
2PAE
04.10.2021 06:59+1загрязнение воздуха, при котором жил пациент
Возможно глупый вопрос, а загрязнение при котором болел пациент, оказывает?
PythonAnalyst Автор
04.10.2021 07:15"Поскольку на момент базы данных (апрель 2020 года) Москву "закрыли" и произошло заметное улучшение воздуха, то влияние загрязения воздуха при нахождении пациентов в стационаре не выполнялось."
Я помню какое было божественно- красивое небо, когда "закрыли" Москву. Поэтому рука не поднялась предположить, что тот апральский воздух мог как- то навредить людям.
Akr0n
18.10.2021 07:37Коков уровень доверия к официальным данным по загрязнению? Не пробовали сравнивать как они соотносятся с открытыми системами мониторинга типа sensor.community?
PythonAnalyst Автор
21.10.2021 09:17Я не вижу причин не доверять данным по загрязенению воздуха. Не думаю, что есть более качественная информация по этой теме, поэтому никаких сравнений не делал.
bee4
Отрицательный результат - тоже результат. Спасибо за труды.