Interroger l'ensemble de données COVID-19 à l'aide de BigQuery
Interroger l'ensemble de données COVID19 à l'aide de BigQuery
Cet article est une démonstration de l’utilisation de BigQuery et de l’ensemble de données publiques sur la COVID19.
Pour ce faire, je vais utiliser BigQuery pour obtenir les données de nouveaux cas de COVID19 au Québec et ceux dans la région du Bas-Saint-Laurent. Le Bas-Saint-Laurent est l’endroit où demeurent mes parents et j’aime bien pouvoir suivre l’évolution de la pandémie tous les jours. Ceux de la province de Québec seront utilisés pour comparer les résultats obtenus avec ceux publiés dans les journaux.
Dans ce premier article, je vais utiliser le langage SQL Standard de BigQuery pour extraire les données. Et en même temps calculer la moyenne mobile sur 7 jours, car il est un meilleur indicateur de l’évolution des cas.
Ensemble de données publiques disponibles
Google Cloud offre un grand nombre d’ensembles de données publiques disponibles aux utilisateurs de BigQuery. Il y a plus de 200 ensembles disponibles à ce jour dans divers domaines. Soit la météorologie, les sciences de la vie et de la santé, le transport, les cryptomonnaies et bien d’autres. Beaucoup d’autres organismes rendent leurs données disponibles sous forme d’ensemble de données publiques dans BigQuery, voir les références à la fin de cet article.
L’ensemble de données COVID-19 Open Data
L’ensemble de données COVID-19 est fourni et maintenu par Google. Il utilise les données provenant de divers pays qui rendent publique l’information. Il contient les données journalières sur divers paramètres relatifs à la pandémie tels que les données relatives au nombre de cas, la météo, les données démographiques et autres. Plus d’une quarantaine de champs d’information peuvent être disponibles en fonction de la source de données.
Habituellement, les données proviennent des autorités de santé publique des pays. L’ensemble est mis à jour quotidiennement par des moyens automatisés et manuels.
L’ensemble de données est disponible pour traitement dans la région US et la région EU de Google Cloud.
Les données sont disponibles aussi en format CSV et JSON pour récupération et utilisation par d’autres logiciels d’analyse de données. Elles sont alors disponibles sur Github, le lien est fourni à la fin de l’article.
Cet ensemble contient 1.88 GB de données par pays, région et sous-région.
À la date de publication, il est possible d’utiliser 1TB de traitement BigQuery gratuitement par mois. Aussi pour ceux qui débutent avec BigQuery, il est possible d’explorer le potentiel de BigQuery à l’aide du “Bac à sable BigQuery” sans avoir à fournir une carte de crédit.
Premières requêtes : les cas au Québec du 1er octobre 2020 au 30 novembre 2020
En premier, nous allons effectuer une requête simplifiée pour avoir un aperçu des champs disponibles pour les données de la province de Québec.
SELECT
*
FROM`bigquery-public-data.covid19_open_data.covid19_open_data`
WHERE country_code = 'CA'
AND subregion1_code = 'QC'
AND date > '2020-11-01'
AND date < '2020-11-30'
LIMIT 500
Voici un extrait des données obtenues :
[
{
"date": "2020-11-29",
"location_key": "CA_QC",
"country_code": "CA",
"country_name": "Canada",
"subregion1_code": "QC",
"subregion1_name": "Quebec",
"subregion2_code": null,
"subregion2_name": null,
"iso_3166_1_alpha_2": "CA",
"iso_3166_1_alpha_3": "CAN",
"aggregation_level": "1",
"new_confirmed": "1395",
"new_deceased": "12",
"new_recovered": "1108",
"new_tested": "9360",
"cumulative_confirmed": "141038",
"cumulative_deceased": "7033",
"cumulative_recovered": "122014",
"cumulative_tested": "2177421",
"new_hospitalized_patients": null,
"new_intensive_care_patients": null,
"new_ventilator_patients": null,
"cumulative_hospitalized_patients": null,
"cumulative_intensive_care_patients": null,
"cumulative_ventilator_patients": null,
"current_hospitalized_patients": null,
"current_intensive_care_patients": null,
"current_ventilator_patients": null,
"mobility_transit_stations": "-45",
"mobility_retail_and_recreation": "-21",
"mobility_grocery_and_pharmacy": "-5",
"mobility_parks": "23",
"mobility_residential": "7",
"mobility_workplaces": "-12",
"wikidata_id": "Q176",
"datacommons_id": null,
"openstreetmap_id": "61549",
"latitude": "52.0",
"longitude": "-72.0",
"location_geometry": "POINT(-72 52)",
"average_temperature_celsius": "-5.305556",
"minimum_temperature_celsius": "-9.486111",
"maximum_temperature_celsius": "-2.847222",
"rainfall_mm": "1.143",
"snowfall_mm": null
},
{
"date": "2020-11-02",
"location_key": "CA_QC_2401",
"country_code": "CA",
"country_name": "Canada",
"subregion1_code": "QC",
"subregion1_name": "Quebec",
"subregion2_code": "2401",
"subregion2_name": "Bas-Saint-Laurent",
"iso_3166_1_alpha_2": "CA",
"iso_3166_1_alpha_3": "CAN",
"aggregation_level": "2",
"new_confirmed": "1",
"new_deceased": "0",
"new_recovered": null,
"new_tested": null,
"cumulative_confirmed": "481",
"cumulative_deceased": "7",
"cumulative_recovered": null,
"cumulative_tested": null,
"new_hospitalized_patients": null,
"new_intensive_care_patients": null,
"new_ventilator_patients": null,
"cumulative_hospitalized_patients": null,
"cumulative_intensive_care_patients": null,
"cumulative_ventilator_patients": null,
"current_hospitalized_patients": null,
"current_intensive_care_patients": null,
"current_ventilator_patients": null,
"mobility_transit_stations": null,
"mobility_retail_and_recreation": null,
"mobility_grocery_and_pharmacy": null,
"mobility_parks": null,
"mobility_residential": null,
"mobility_workplaces": null,
"wikidata_id": null,
"datacommons_id": null,
"openstreetmap_id": null,
"latitude": null,
"longitude": null,
"location_geometry": null,
"average_temperature_celsius": null,
"minimum_temperature_celsius": null,
"maximum_temperature_celsius": null,
"rainfall_mm": null,
"snowfall_mm": null
}
]
On s'aperçoit ici que pour le Québec et le Bas-Saint-Laurent, tous les champs ne sont pas remplis. Et aussi que certains champs tels que les données de localisation et conditions météorologiques ne sont pas disponibles pour le Bas-Saint-Laurent.
Cependant, pour les besoins de cet article, j'ai seulement besoin de pouvoir extraire les nouveaux cas confirmés pour le Québec et le Bas-Saint-Laurent.
Cette requête ne doit pas être utilisée fréquemment, car elle utilise la clause SELECT * qui enfreint les règles de bonnes pratiques de BigQuery. Comme BigQuery à l’interne enregistre chaque colonne d’un ensemble des données dans un fichier Capacitor séparé, il est recommandé de spécifiquement identifier les champs requis dans la requête (Voir références). Cela réduit le nombre d’octets qui seront traités et par la même occasion peut réduire les frais d’utilisation.
La nouvelle requête contenant seulement les champs requis sera la suivante :
SELECT
date, country_code, country_name,
subregion1_code, subregion1_name,
subregion2_name,
cumulative_confirmed, cumulative_recovered, cumulative_deceased, cumulative_tested,
new_confirmed,
FROM `bigquery-public-data.covid19_open_data.covid19_open_data`
WHERE country_code = 'CA'
AND subregion1_code = 'QC'
AND date > '2020-10-23'
LIMIT 1000
Calculer une moyenne mobile
Comme on désire à la fin avoir une idée de l’évolution du nombre de cas, une mesure plus juste utilisée par beaucoup de sites d’information est la moyenne mobile sur 7 jours. Cet indicateur donne une meilleure idée de la tendance, car elle supprime les fluctuations qui peuvent par exemple être plus élevées ou moins élevées en raison d’un problème d’entrée de données, de capacité de laboratoire… Elle met l’accent sur la tendance à plus long terme.
Pour comparer avec les données obtenues de l’Institut de la Santé Publique du Québec, nous allons utiliser la moyenne mobile glissante sur 7 jours. La moyenne mobile sur 7 jours correspond au nombre moyen d’évènements (cas ou décès) du jour sélectionné, des 3 jours précédents et des 3 jours suivants.
Il est possible de la calculer directement avec la clause AVG.
SELECT
date, country_code, country_name,
subregion1_code, subregion1_name,
subregion2_name,
cumulative_confirmed, cumulative_recovered, cumulative_deceased, cumulative_tested,
new_confirmed,
AVG(new_confirmed)
OVER (PARTITION BY subregion2_name ORDER BY date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)
AS avg_new_confirmed_7days
FROM `bigquery-public-data.covid19_open_data.covid19_open_data`
WHERE country_code = 'CA'
AND subregion1_code = 'QC'
AND subregion2_name IS NULL
AND date > '2020-10-23'
LIMIT 1000
Cette requête utilise 556 MiB de données alors que la même requête prendrait 1.9 GiB si elle utilisait un SELECT * au lieu de seulement récupérer les colonnes requises pour les traitements que nous allons exécuter par la suite.
date | country_name | subregion1_name | subregion2_name | new_confirmed | avg_new_confirmed_7days |
---|---|---|---|---|---|
2020-12-22 | Canada | Quebec | 2183 | 1867.2857142857142 | |
2020-12-23 | Canada | Quebec | 2247 | 2217.8571428571427 | |
2020-12-24 | Canada | Quebec | 2349 | 2238.5714285714284 | |
2020-12-25 | Canada | Quebec | 0 | 2262.4285714285716 | |
2020-12-26 | Canada | Quebec | 4492 | 2290.714285714286 | |
2020-12-27 | Canada | Quebec | 2291 | 2328.4285714285716 | |
2020-12-28 | Canada | Quebec | 2275 | 2395.5714285714284 | |
2020-12-29 | Canada | Quebec | 2381 | 2796.714285714286 | |
2020-12-30 | Canada | Quebec | 2511 | 2438.714285714286 | |
2020-12-31 | Canada | Quebec | 2819 | 2521.285714285714 | |
2021-01-01 | Canada | Quebec | 2808 | 2560.0 | |
2021-01-02 | Canada | Quebec | 1986 | 2578.1428571428573 | |
2021-01-03 | Canada | Quebec | 2869 | 2596.714285714286 | |
2021-01-04 | Canada | Quebec | 2546 | 2553.8571428571427 | |
2021-01-05 | Canada | Quebec | 2508 | 2522.4285714285716 | |
2021-01-06 | Canada | Quebec | 2641 | 2685.4285714285716 | |
2021-01-07 | Canada | Quebec | 2519 | 2645.285714285714 | |
2021-01-08 | Canada | Quebec | 2588 | 2548.5714285714284 | |
2021-01-09 | Canada | Quebec | 3127 | 2466.5714285714284 | |
2021-01-10 | Canada | Quebec | 2588 | 2385.1428571428573 | |
2021-01-11 | Canada | Quebec | 1869 | 2329.8571428571427 | |
2021-01-12 | Canada | Quebec | 1934 | 2234.1428571428573 | |
2021-01-13 | Canada | Quebec | 2071 | 2105.285714285714 | |
2021-01-14 | Canada | Quebec | 2132 | 2013.2857142857142 | |
2021-01-15 | Canada | Quebec | 1918 | 1951.142857142857 | |
2021-01-16 | Canada | Quebec | 2225 | 1872.857142857143 | |
2021-01-17 | Canada | Quebec | 1944 | 1791.5714285714287 | |
2021-01-18 | Canada | Quebec | 1434 | 1719.0 | |
2021-01-19 | Canada | Quebec | 1386 | 1678.0 | |
2021-01-20 | Canada | Quebec | 1502 | 1600.857142857143 | |
2021-01-21 | Canada | Quebec | 1624 | 1531.2857142857142 | |
2021-01-22 | Canada | Quebec | 1631 | 1498.2857142857142 | |
2021-01-23 | Canada | Quebec | 1685 | 1466.857142857143 | |
2021-01-24 | Canada | Quebec | 1457 | 1442.0 | |
2021-01-25 | Canada | Quebec | 1203 | 1405.4285714285713 | |
2021-01-26 | Canada | Quebec | 1166 | 1357.4285714285713 | |
2021-01-27 | Canada | Quebec | 1328 | 1312.0 | |
2021-01-28 | Canada | Quebec | 1368 | 1278.5714285714287 |
Voici le graphique que présente le nombre de nouveau et la moyenne mobile pour l’ensemble de la province du Québec à partir des données obtenues :
Nombre de nouveau cas selon l'ensemble de données publiques via BigQuery pour la province du Québec
Comparaison avec les données de l’Institut Nationale de la Santé Publique du Québec (INSPQ)
Nombre de nouveau cas selon l'INSPQ
Si l’on compare le graphique provenant de l’INSPQ et celui obtenu par notre requête SQL. On voit que les données sont assez proches sans être exactes. Les données de l’INSPQ sont corrigées lorsque les rapports de journées précédentes ne sont pas exacts. Par exemple, durant la journée du 25 décembre aucun nouveau cas n’a été inscrit alors que le 26 ses nouveaux cas ont été ajoutés à la journée. L’ensemble de données publiques lui n’a pas été corrigé.
Données du Bas-Saint-Laurent
Comme, je m’intéresse au nombre de nouveau cas dans le Bas-Saint-Laurent, voici la nouvelle requête pour extraire et calculer la moyenne mobile :
SELECT
date, country_code, country_name,
subregion1_code, subregion1_name,
subregion2_name,
cumulative_confirmed, cumulative_recovered, cumulative_deceased, cumulative_tested,
new_confirmed,
AVG(new_confirmed)
OVER (PARTITION BY subregion2_name ORDER BY date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)
AS avg_new_confirmed_7days
FROM `bigquery-public-data.covid19_open_data.covid19_open_data`
WHERE country_code = 'CA'
AND subregion1_code = 'QC'
AND subregion2_name = 'Bas-Saint-Laurent'
AND date > '2020-10-23'
LIMIT 1000
Voici le graphique que présente le nombre de nouveau et la moyenne mobile pour le Bas-Saint-Laurent à partir des données obtenues :
Nombre de nouveau cas au Bas-Saint-Laurent selon l'ensemble de données publiques via BigQuery
On remarque que les nouveaux cas ont baissé en janvier par rapport à la période des fêtes.
Conclusion
Cet article démontre comment BigQuery peut être un outil utile pour interroger des ensembles de données publiques. Et qu’il est possible de le faire à l’aide d’outils infonuagiques qui ne demandent pas d’installations sur un poste de travail. En complément, Google Cloud offre la possibilité de créer facilement des tableaux de bord connectés à BigQuery à l’aide de DataStudio. Dans un prochain article, je vais présenter une solution pour rendre disponibles les données de l’ensemble COVID-19 par une API à l’aide de BigQuery et de Cloud Run.
Références
- https://cloud.google.com/bigquery/public-data
- https://console.cloud.google.com/marketplace/product/bigquery-public-datasets/covid19-public-data-program
- https://console.cloud.google.com/marketplace/browse?filter=solution-type:dataset&filter=category:covid19
- https://cloud.google.com/bigquery/docs/sandbox
- https://www.reddit.com/r/bigquery/wiki/datasets
- https://www.inspq.qc.ca/covid-19/donnees
- https://github.com/GoogleCloudPlatform/covid-19-open-data
- https://console.cloud.google.com/marketplace/product/bigquery-public-datasets/covid19-open-data
- https://cloud.google.com/blog/products/gcp/inside-capacitor-bigquerys-next-generation-columnar-storage-format