Согласно исследованию Национальной медицинской библиотеки США, наибольшему риску развития СПИДа подвержены бедные люди в развивающихся странах. Эти люди подвергаются большему риску из-за отсутствия у них доступа к медицинским услугам и информации о ВИЧ и СПИДе. Существует огромная потребность в международной помощи, чтобы остановить передачу СПИДа в развивающихся странах, и это привело к тому, что США отказались от финансовой поддержки программ планирования семьи, чтобы сосредоточиться на программах лечения/обучения ВИЧ/СПИДа.

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

Набор данных также содержит надежные данные о процентной доле ВИЧ-инфицированных, проживающих в каждой стране с 1990 по 2018 год.

Ранее я использовал Многомерное вменение признаков Склеарна для оценки показателей распространения ВИЧ в 1980-х годах, когда болезнь начала быстро распространяться.

Модуль вменения многомерных признаков от sklearn — очень классный модуль, и в 1980-х годах я смог получить ценную информацию о показателях распространения ВИЧ. Но значения, предсказанные моделью, оказались не такими точными, как я надеялся.

Вот тут-то и появляется Prophet. Prophet — это программное обеспечение с открытым исходным кодом, выпущенное основной командой Facebook по обработке и анализу данных. Это процедура прогнозирования, которая выполняется быстро и обеспечивает полностью автоматические прогнозы.

Учебник Томаса Винсента по Цифровому океану был чрезвычайно полезен, когда научил меня начинать использовать Prophet.

Набор данных «Показатели мирового развития» невероятно огромен и содержит более 400 000 строк данных.

Я решил сосредоточиться только на развивающихся странах с высоким уровнем распространения ВИЧ. Этими странами были Лесото, Ботсвана, Замбия, Малави и Уганда.

df = pd.DataFrame()
df = pd.read_csv('WDIData.csv')
# remove unnecessary data
new_df = pd.DataFrame()
new_df = df.iloc[75154:]
# clean up dataframe a bit 
new_df = new_df.drop(['Country Code', 'Indicator Code', 'Unnamed: 63'], axis =1)
column_list = list(new_df.columns)
# countries to focus on 
countries = ['Lesotho', 'Botswana', 'Zimbabwe', 'Zambia', 'Malawi', 'Uganda']
# create list of years to focus on and created indicators that I want on my new dataframe
column_list = list(new_df.columns)
years = []
years = column_list[32:61]
indicators = ['Country Name', 'Indicator Name']
# create dataframe for HIV percentage by country
rates_df = pd.DataFrame(columns = new_df.columns)
for i in countries:
    x = new_df[(df['Country Name'] == i) & (df['Indicator Name'] == 'Prevalence of HIV, total (% of population ages 15-49)')]
    rates_df = rates_df.append(x)

Теперь, когда у меня были очищенные данные, пришло время подготовить их для Prophet.

Prophet может предсказывать значения только для одной страны одновременно, поэтому мне пришлось создавать новые фреймы данных для каждой страны.

lesotho = rates_df.iloc[[0]].T
lesotho.head()

Приведенный выше код берет первую строку данных, соответствующую стране Лесото, и создает из нее новый транспонированный фрейм данных.

Затем я создал аналогичные фреймы данных для каждой страны.

С помощью Prophet данные, которые передаются, должны быть объектом даты и времени и значением. В моих новых фреймах данных значение года было просто значением типа с плавающей запятой, и мне пришлось преобразовать их в объекты даты и времени, чтобы их использовал Пророк.

lesotho_df.index = pd.to_datetime(lesotho.index)

Приведенный выше код принимает значения года в индексе и преобразует их в объекты даты и времени.

Требование для использования модуля Prophet заключается в том, что передаваемый фрейм данных должен иметь имена столбцов «ds» и «y», указывающие дату и значение.

lesotho_df.index.names = ['ds']
lesotho_df = lesotho_df.rename(columns={'Lesotho':'y'})
lesotho_df = pd.DataFrame(lesotho.to_records())

С помощью приведенного выше кода я смог создать обновленный фрейм данных, который содержал объекты даты и времени и имел правильные имена столбцов. Теперь я был готов передать эти данные в Prophet.

Первый шаг требовал подгонки моей модели пророка к данным о ВИЧ в Лесото. В Prophet встроен очень полезный модуль make_future_dates, который принимает два аргумента: количество периодов и частоту. Мои данные были годовыми, поэтому я использовал «Y» для своей частоты и 5 периодов, чтобы предсказать скорости на 5 лет вперед.

my_model = Prophet(interval_width=0.95)
my_model.fit(lesotho_df)
future_dates = my_model.make_future_dataframe(periods=5, freq='Y')

Фрейм данных будущих дат содержит все прошлые даты плюс 5 новых дат каждый год впереди следующего.

forecast = my_model.predict(future_dates)
forecast[['ds','yhat', 'yhat_lower','yhat_upper']].tail()

DS — отметка даты прогнозируемого значения. Yhat представляет прогнозируемое значение нашей метрики. Yhat_lower — это нижняя граница наших прогнозов, а yhat_upper — верхняя граница наших прогнозов.

Используя этот новый фрейм данных будущих дат, мы можем увидеть прогнозы на следующие 5 лет.

Черные точки представляют фактические значения набора данных, а синяя линия представляет прогнозируемое значение. Модель пророка предсказывает рост заболеваемости ВИЧ в Лесото в ближайшие 5 лет.

Я повторил описанные выше шаги, чтобы сгенерировать прогнозы для остальных стран, на которых решил сосредоточиться.

Одна интересная вещь, которая сразу же бросилась мне в глаза, это сходство между графиком Зимбабве и графиком Замбии. Сначала я подумал, что это ошибка с моей стороны, но после некоторых исследований я обнаружил, что причина, по которой их курсы так тесно связаны, заключается в том, что это соседние страны. Тот факт, что географические местоположения находятся так близко, что это влияет на уровень заболеваемости ВИЧ, был интересной частью моего анализа.

Общий вывод из предсказанных Пророком значений заключается в том, что уровень заболеваемости ВИЧ в этих странах будет расти, что вызывает тревогу. Но я не уверен на 100% в этих предсказанных значениях, поскольку доверительные интервалы на этих графиках довольно велики.

Забегая вперед, я хочу провести дополнительные исследования и создать более надежный набор данных, учитывающий другие факторы, такие как расходы на здравоохранение, уровень рождаемости и другие показатели заболеваемости. Я особенно хочу посмотреть на другие показатели заболеваемости, чтобы увидеть, являются ли люди в этих странах более восприимчивыми к ВИЧ из-за того, что их иммунная система слабее из-за распространенности этих других заболеваний.

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