CoderCastrov logo
CoderCastrov
Covid-19

Exploratory Analisis Data COVID-19 в Индонезии с использованием Python

Exploratory Analisis Data COVID-19 в Индонезии с использованием Python
просмотров
6 мин чтение
#Covid-19
Table Of Content
    Sumber : klikdokter.com

    Привет, читатели! Это моя первая статья, в которой я анализирую ситуацию с COVID-19 в Индонезии. В этом анализе я использую Python для парсинга веб-страниц с использованием json, полученных с сайта covid19.go.id. Давайте начнем с анализа с фона.

    Контекст

    COVID-19 - это заболевание, которое в настоящее время стало глобальной пандемией. С каждым днем ситуация становится все хуже. Правительства разных стран быстро создают рабочие группы для борьбы с распространением COVID-19 среди населения, в том числе правительство Индонезии. Одним из мер, принимаемых правительством, является сбор и предоставление общественности данных о росте случаев COVID-19. Большинство этих данных сопровождаются панелями и графиками для более легкого понимания информации. Примером такого портала является covid19.go.id. В этом анализе мы будем анализировать данные о COVID-19 на этом портале.

    Шаги, которые нужно выполнить

    Данные, которые мы будем использовать, получаются непосредственно из API (Application Programming Interface), доступного на covid19.go.id. Поэтому в этом проекте мы рассмотрим технику получения данных из API, подготовки данных и визуализации данных.

    Техника получения данных из API

    Как уже упоминалось ранее, мы будем использовать портал covid19.go.id. На этом портале мы видим, что данные с covid19.go.id доступны в общедоступном API по адресу https://data.covid19.go.id/public/api/update.json. Первый шаг - активировать библиотеку requests. Затем мы получаем доступ к API. Для доступа к API мы используем функцию get(), доступную в библиотеке requests. Результат функции сохраняется в объекте с именем response.

    import requests
    api_url = "https://data.covid19.go.id/public/api/update.json"
    resp = requests.get(api_url)

    Оценка ответа

    В ответе API есть три основные информации:

    Статус: Позволяет узнать, успешно ли выполнен запрос, в виде кода. Если код равен 200, то запрос выполнен успешно, 404 означает, что запрашиваемый файл не найден, 500 означает, что запрос был отклонен, 501 означает, что на сервере произошла ошибка. Чтобы узнать статус API, используйте следующий исходный код:

    print(resp.status_code)

    Ответ API со статус-кодом 200 означает, что запрос выполнен успешно и запрошенный контент доступен.

    Заголовки: Позволяет просмотреть метаданные, содержащиеся в заголовке ответа, используя следующий исходный код:

    print(resp.headers)

    Из полученного вывода видно, что тип контента представлен в формате application/json, то есть в формате JSON. Поскольку предоставленный файл уже в формате json, мы можем извлечь его содержимое с помощью метода json(). Метод json() является встроенным методом для извлечения содержимого в формате JSON. Выполните метод json() и сохраните результат в cov_id_raw.

    cov_id_raw = resp.json()

    Тело: Содержит содержимое, запрошенное в запросе.

    Извлечение содержимого ответа

    С помощью функций len() и keys() мы можем узнать количество компонентов и какие компоненты содержатся в cov_id_raw. Затем извлекаем второй ключ и сохраняем его в cov_id_update.

    print('Length of cov_id_raw : %d', %len(cov_id_raw))
    print('Komponen cov_id_raw : %s', %cov_id_raw.keys())
    cov_id_update = cov_id_raw['update']

    В компоненте cov_id_raw видно, что есть 2 списка: список данных и список обновлений. Список представляет собой набор векторов или фреймов данных. Внутри списка все еще есть много наборов данных и каждый тип данных.

    Анализ данных

    Мы будем анализировать данные объекта cov_id_update с помощью следующих вопросов:

    · Когда были обновлены данные о новых случаях?

    · Сколько новых случаев выздоровления?

    · Сколько новых смертей?

    · Сколько всего положительных случаев на данный момент?

    · Сколько всего смертей на данный момент?

    print('Tanggal terbaru data penambahan kasus : ', cov_id_update['penambahan']['tanggal'])
    print('Jumlah penambahan kasus sembuh : ', cov_id_update['penambahan']['jumlah_sembuh'])
    print('Jumlah penambahan kasus meninggal : ', cov_id_update['penambahan']['jumlah_meninggal'])
    print('Jumlah total kasus positif hingga saat ini : ', cov_id_update['penambahan']['jumlah_positif'])
    print('Jumlah total kasus meninggal hingga saat ini : ', cov_id_update['penambahan']['jumlah_meninggal'])

    Как насчет COVID-19 в Индонезии?

    Ранее мы провели анализ данных COVID-19 в Индонезии, используя данные, полученные непосредственно с covid19.go.id. Но как насчет сосредоточиться на данных COVID-19 в Индонезии? Для каждой провинции covid19.go.id предоставляет разные данные в API. Данные о провинции Восточная Ява доступны по адресу https://data.covid19.go.id/public/api/prov_detail_JAWA_TIMUR.json. Для доступа к API используется та же техника, что и ранее. Доступ к API сохраняется в cov_jatim_raw. Вот полный исходный код с результатом:

    jatim_url = "https://data.covid19.go.id/public/api/prov_detail_JAWA_TIMUR.json"
    resp_jatim = requests.get(jatim_url)
    cov_jatim_raw = resp_jatim.json()

    Анализ COVID-19 в Восточной Яве

    Перед анализом данных COVID-19 в Восточной Яве мы должны знать, какие компоненты содержатся в cov_jatim_raw, используя метод keys(), чтобы ответить на следующие вопросы:

    · Сколько всего случаев COVID-19 в Восточной Яве?

    · Какой процент смертности от COVID-19 в Восточной Яве?

    · Какой процент выздоровления от COVID-19 в Восточной Яве?

    print('Nama-nama komponen cov_jatim_raw : %s.' %cov_jatim_raw.keys())
    print('\n Jumlah total kasus COVID-19 di Jawa Timur : %d'%cov_jatim_raw['kasus_total'])
    print('\n Persentase kematian akibat COVID-19 di Jawa Timur : %f.2%%' %cov_jatim_raw['meninggal_persen'])
    print('\n Persentase tingkat kesembuhan dari COVID-19 di Jawa Timur : %f.2%%' %cov_jatim_raw['sembuh_persen'])

    Как насчет графиков?

    После изучения ежедневного прироста случаев, возникает вопрос о том, как развиваются случаи еженедельно. Как это сделать?

    Первым шагом является установка даты в качестве индекса для данных cov_jatim_tidy. Затем применяем временные ряды в pandas, ресемплирование по неделям и используем агрегацию суммирования. Для извлечения информации о неделе в течение года используется weekofyear и year для года. Сохраните в объект с именем cov_jatim_pekanan.

    cov_jatim_pekanan = (cov_jatim_tidy.set_index('tanggal')
                         .resample('W')
                         .sum()
                         .reset_index()
                         .rename(columns={'kasus_baru': 'jumlah'})
                         )
    cov_jatim_pekanan['tahun'] = cov_jatim_pekanan['tanggal'].apply(lambda x: x.year)
    cov_jatim_pekanan['pekan ke-'] = cov_jatim_pekanan['tanggal'].apply(lambda x: x.weekofyear)
    cov_jatim_pekanan = cov_jatim_pekanan[['tahun', 'pekan ke-', 'jumlah']]
    print('Info cov_jatim_pekanan :')
    print(cov_jatim_pekanan.info())
    print('\n Lima data teratas cov_jatim_pekanan :\n', cov_jatim_pekanan.head())

    После проверки данных cov_jatim_pekanan, где количество случаев подсчитывается каждые 7 дней, возникает другой вопрос: как насчет прошлой недели?

    Чтобы ответить на этот вопрос, будет выполнено простое вычисление с использованием следующих шагов:

    · Создание нового столбца, содержащего количество новых случаев за предыдущую неделю. Этот столбец называется jumlah_pekanlalu.

    · Замена значений NaN в столбце jumlah_pekanlalu на значение 0.

    · Сравнение столбца jumlah с jumlah_pekanlalu. Результат сравнения сохраняется в новом столбце с именем lebih_baik, который содержит значение True, если количество новых случаев на этой неделе меньше, чем количество случаев на прошлой неделе.

    Метод shift() используется для создания столбца jumlah_pekanlalu. Вот полный исходный код с результатом:

    cov_jatim_pekanan['jumlah_pekanlalu'] = cov_jatim_pekanan['jumlah'].shift().replace(np.nan, 0).astype(np.int)
    cov_jatim_pekanan['lebih_baik'] = cov_jatim_pekanan['jumlah'] < cov_jatim_pekanan['jumlah_pekanlalu']
    print('Sepuluh data teratas : \n', cov_jatim_pekanan.head(10))

    Для сравнения всех данных на предмет снижения или повышения будет использована диаграмма bar chart. Вот полный исходный код с результатом:

    plt.clf()
    fig, ax = plt.subplots(figsize=(10, 5))
    ax.bar(data=cov_jatim_pekanan, x='pekan ke-', height='jumlah',
           color=['mediumseagreen' if x is True else 'salmon' for x in cov_jatim_pekanan['lebih_baik']])
    fig.suptitle('Kasus Pekanan Positif COVID-19 di Jawa Timur', y=1.00, fontsize=16, fontweight='bold', ha='center')
    ax.set_title('Kolom hijau menunjukkan penambahan kasus baru lebih sedikit dibandingkan satu pekan sebelumnya', fontsize=12)
    ax.set_xlabel('')
    ax.set_ylabel('Jumlah kasus')
    ax.text(1, -0.1, 'Sumber data : covid19.go.id', color='blue', ha='right', transform=ax.transAxes)
    plt.grid(axis='y')
    plt.tight_layout()
    plt.show()

    После изучения еженедельного прироста случаев возникает другой вопрос: как развиваются случаи еженедельно? Это можно узнать, построив график line chart. Вот полный исходный код с результатом:

    plt.clf()
    fig, ax = plt.subplots(figsize=(10, 5))
    cov_jatim_pekanan.plot(x='pekan ke-', kind='line', ax=ax, lv=3, color=['salmon', 'slategrey', 'olivedrab'])
    ax.set_title('Dinamika kasus COVID-19 di Jawa Timur', fontsize=22)
    ax.set_xlabel('')
    ax.set_ylabel('Akumulasi aktif')
    ax.text(1, -0.1, 'Sumber data : covid19.go.id', color='blue', ha='right', transform=ax.transAxes)
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
    plt.grid()
    plt.tight_layout()
    plt.show()

    После изучения динамики активных случаев, возникает вопрос: сколько активных случаев на данный момент? Активные случаи - это случаи, которые находятся в лечении или изоляции. Эта информация фактически предоставляется в ответе API covid19.go.id. Однако я решил посчитать ее самостоятельно. Количество активных случаев можно рассчитать, вычитая накопленное количество положительных случаев из накопленного количества выздоровевших и накопленного количества смертей. Будет использован метод cumsum() для подсчета накопленного значения числового вектора, как показано в следующем исходном коде.

    cov_jatim_akumulasi = cov_jatim_tidy[['tanggal']].copy()
    cov_jatim_akumulasi['akumulasi_aktif'] = (cov_jatim_tidy['kasus_baru'] - cov_jatim_tidy['sembuh'] - cov_jatim_tidy['meninggal']).cumsum()
    cov_jatim_akumulasi['akumulasi_sembuh'] = cov_jatim_tidy['sembuh'].cumsum()
    cov_jatim_akumulasi['akumulasi_meninggal'] = cov_jatim_tidy['meninggal'].cumsum()
    print(cov_jatim_akumulasi.tail())

    Далее будет показана визуализация line chart для данных akumulasi_aktif, akumulasi_sembuh и akumulasi_meninggal.

    plt.clf()
    fig, ax = plt.subplots(figsize=(10, 5))
    ax.plot('tanggal', 'akumulasi_aktif', data=cov_jatim_akumulasi, lw=2)
    ax.set_title('Akumlasi aktif COVID-19 di Jawa Timur', fontsize=22)
    ax.set_xlabel('')
    ax.set_ylabel('Akumulasi aktif')
    ax.text(1, -0.1, 'Sumber data : covid19.go.id', color='blue', ha='right', transform=ax.transAxes)
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
    plt.grid()
    plt.tight_layout()
    plt.show()
    plt.clf()
    fig, ax = plt.subplots(figsize=(10, 5))
    cov_jatim_akumulasi.plot(x='tanggal', kind='line', ax=ax, lv=3, color=['salmon', 'slategrey', 'olivedrab'])
    ax.set_title('Dinamika kasus COVID-19 di Jawa Timur', fontsize=22)
    ax.set_xlabel('')
    ax.set_ylabel('Akumulasi aktif')
    ax.text(1, -0.1, 'Sumber data : covid19.go.id', color='blue', ha='right', transform=ax.transAxes)
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
    plt.grid()
    plt.tight_layout()
    plt.show()

    Это завершает анализ данных COVID-19. Увидимся в следующей статье.