CoderCastrov logo
CoderCastrov
Парсер

Парсинг данных и регрессия временных рядов с использованием Darts (обучение с учителем) на данных Covid-19 с веб-сайта Правительства Индонезии

Парсинг данных и регрессия временных рядов с использованием Darts (обучение с учителем) на данных Covid-19 с веб-сайта Правительства Индонезии
просмотров
6 мин чтение
#Парсер

Привет! Как мы знаем, тема Covid-19 до сих пор остается актуальной и обсуждаемой. В этом разделе я расскажу о том, как собрать данные с веб-сайта covid-19.go.id и проанализировать их для прогнозирования ежедневного развития случаев Covid-19.

Для сбора данных необходимо сначала посетить веб-сайт https://data.covid19.go.id/public/index.html. На этом сайте используется API в качестве системы, поэтому мы можем получить информацию и сохранить ее в формате JSON. Первым шагом является поиск ссылки на желаемые данные. Это можно сделать, щелкнув правой кнопкой мыши -> Инспектировать -> Сеть -> перезагрузить веб-сайт -> Ссылка на файл JSON, как показано на рисунке 1.

Gambar 1. Hasil Inspect

Затем нужно щелкнуть по файлу и скопировать ссылку, чтобы открыть ее в новой вкладке. Поскольку мы собираем только данные Covid-19 в Индонезии, найдите ссылку, результат которой показан на рисунке 2.

Gambar 2. Data Covid-19 di Indonesia pada Format JSON

Скопированную ссылку нужно поместить в наш интерактивный инструмент Python. Для этой части нам понадобятся библиотеки pandas, numpy, requests, datetime, time, re (regex) и JSON. Процесс импорта данных выполняется, как показано на рисунке 3. (Примечание: сосредоточьтесь на data_url_indonesia)

Gambar 3. Import Data dari Link yang Tersedia

На этом этапе нам нужно проверить импортированный файл, чтобы выбрать столбцы данных (функции), которые мы хотим получить. Поскольку мы собираем только данные столбцов "update" и "harian", нам нужно сохранить эту информацию в формате DataFrame, как показано на рисунке 4.

Gambar 4. Data Hasil Import (kanan) dan Pembuatan Dataframe dari Data Hasil Import (kiri) Gambar 4. Data Hasil Import (kanan) dan Pembuatan Dataframe dari Data Hasil Import (kiri)

Из DataFrame выше (Data_indonesia) видно, что значения каждого столбца все еще не имеют правильного формата. Поэтому здесь будет выполнен этап предварительной обработки данных. Первое, что нужно сделать, это заменить значение {‘value’: 0} на 0 в формате целого числа. Есть много способов сделать это, я использую цикл и функцию map - lambda, как показано на рисунке 5.

Gambar 5. Perubahan Bentuk Nilai menjadi 0 pada Column Dataframe

Затем нужно преобразовать данные в столбце "key_as_string" в формат даты, изменить название столбца на "tanggal" и удалить уникальные компоненты, такие как столбцы "key" и "doc_count". Как и раньше, здесь я использую map - lambda с дополнительными функциями drop и rename, результат которых можно увидеть на рисунке 6.

Gambar 6. Perubahan Bentuk Datetime, Rename, dan Drop Column yang Unique

На этом этапе процесс сбора данных успешно завершен, и рекомендуется сохранить собранные данные в файл csv с помощью функции to_csv для переменной DataFrame.

Теперь перейдем к моделированию данных для прогнозирования ежедневных случаев Covid-19 в Индонезии с помощью регрессии временных рядов. Используется библиотека Darts, которую можно установить по ссылке в сноске. Первым шагом является импорт всех необходимых модулей, как показано на рисунке 7.

Gambar 7. Import Modul Analysis data used Supervased Learning — Regression TimeSeries

Не забудьте проверить данные, которые будут анализироваться, особенно значения NaN. После того, как убедитесь в их безопасности, можно проверить распределение данных, которые будут анализироваться, с помощью функции describe или путем построения гистограммы данных. На рисунке 8 видно, что среднее значение ежедневного числа положительных случаев Covid-19 сильно отличается от 50% данных числа положительных случаев Covid-19, что означает, что данные не имеют нормального распределения. Это можно подтвердить по форме гистограммы, которая имеет "хвостовое" или "распределение с длинным хвостом". Поэтому эти данные нужно преобразовать.

Gambar 8. Bentuk Histogram Jumlah Positif Covid-19 Perharinya (Kiri) dan Hasil Describe Dataframe Covid-19 (Kanan)

Входные данные, которые будут анализироваться с помощью "обучения с учителем" - регрессии временных рядов, вводятся в новый DataFrame. Мы можем построить график, чтобы увидеть развитие случаев Covid-19 в Индонезии. Прежде чем это сделать, ось x в "tanggal" может быть заменена на "День", используя функцию apply и lambda, в которой ранее была определена дата начала Covid-19, как показано на рисунке 9.

Gambar 9. Perubahan Bentuk Data “tanggal” ke “Hari ke-Berapa”

На графике на рисунке 10 видно, что полученный график нелинейный и процесс достаточно случайный. Поэтому в этом разделе ограничимся только данными, представленными голубым графиком, то есть с 440-го дня до 600-го дня.

Gambar 10. Grafik Jumlah Positif Covid-19 Perharinya.

Как уже упоминалось ранее, данные Covid-19 ежедневно не имеют нормального распределения, поэтому требуется преобразование данных. Это необходимо для того, чтобы наша модель избегала "переобучения". В этом разделе я выполняю преобразование данных в логарифмическую функцию. В библиотеке Darts мы можем импортировать модуль "InvertibleMapper", чтобы преобразовать наши данные в форму log1p и обратно в исходную форму с помощью expm1. Синтаксис, используемый, показан на рисунке 11.

Gambar 11. Syntax Transformasi dan Inverse Data pada Fungsi Logaritmik

Затем вводим данные, которые будут моделироваться, и преобразуем их в форму "TimeSeries". Мы также можем проверить форму графика регрессии, чтобы убедиться, что он выглядит хорошо, как показано на рисунке 12.

Gambar 12. Transformasi Data Model ke Bentuk TimeSeries (Kanan) dan Plot Grafik Data Model Setelah Ditransformasi ke dalam Bentuk Logaritmik (Kiri) Gambar 12. Transformasi Data Model ke Bentuk TimeSeries (Kanan) dan Plot Grafik Data Model Setelah Ditransformasi ke dalam Bentuk Logaritmik (Kiri)

После того, как модель преобразования данных считается хорошей, можно разделить данные на две части: обучающие данные (80%) и данные для проверки (20%). Обучающие данные будут использоваться для моделирования программы машинного обучения, а данные для проверки будут использоваться для проверки точности модели программы в прогнозировании данных. Здесь я использую модель регрессии с модулем "ExponentialSmoothing, AutoARIMA, Theta и Prohet". Результаты "Средней абсолютной процентной ошибки" показывают, что модель с модулем ExponentialSmoothing лучше, чем другие 3 модели, с оценкой 1,47% (рисунок 13). Поэтому здесь я буду использовать модуль ExponentialSmoothing в качестве основной программы.

Gambar 13. Nilai Mean Absolute Percentage Error pada Setiap Model.

Модель ExponentialSmoothing снова подгоняется, чтобы она сохранялась в памяти Python, и выполняется прогноз на 26 дней назад от данных модели. Результат показывает, что полученный график выглядит хорошо, и предсказанные значения (голубой график) перекрываются с графиком фактических значений (черный график), как показано на рисунке 14.

Gambar 14. Grafik Model ExponentialSmoothing dalam Bentuk Logaritmik (Kanan) dan Nilai Sebenarnya (Kiri)

Наконец, после получения хорошей модели обучения с учителем, эту модель можно использовать для прогнозирования будущих случаев Covid-19. Например, я буду прогнозировать случаи Covid-19 на 20 дней вперед. Для этого можно взять данные на 20 дней вперед от исходных данных, заменить значения на NaN и преобразовать их в форму TimeSeries, как показано на рисунке 15.

Gambar 15. Data Tanggal Covid-19 untuk 20 Hari ke Depan.

Затем мы можем использовать существующую модель регрессии временных рядов для прогнозирования числа положительных случаев Covid-19 на 20 дней вперед (рисунок 16 (справа)). Полученные данные можно построить на графике, как показано на рисунке 16 (слева). Результат показывает, что количество положительных случаев Covid-19 будет продолжать снижаться ежедневно, но процесс снижения будет достаточно флуктуирующим (иногда будет расти, но в целом будет снижаться).

Gambar 16. Hasil Prediksi Jumlah Orang Positif Covid-19 Perharinya (Kiri) dan Plot Grafik Kasus Covid-19 untuk 20 Hari ke Depan (Kanan)

GitHub - Richard026/Scraping-Data-and-Regression-Model-TimeSeries-Darts

Внесите свой вклад в развитие Richard026/Scraping-Data-and-Regression-Model-TimeSeries-Darts, создав учетную запись на...

github.com

Референс и ссылка на установку Darts:

https://unit8co.github.io/darts/#quick-install