import pandas as pd
import numpy as np
import scipy as sp
import plotly.figure_factory as ff
import plotly.graph_objects as go
from plotly.offline.offline import plot
from plotly.subplots import make_subplots
from datetime import datetime
https://www.data.gouv.fr/fr/datasets/donnees-hospitalieres-relatives-a-lepidemie-de-covid-19/
df = pd.read_csv('donnees-hospitalieres-classe-age-covid19-2021-11-06-19h09.csv', sep=";")
df.head()
reg | cl_age90 | jour | hosp | rea | HospConv | SSR_USLD | autres | rad | dc | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 2020-03-18 | 0 | 0 | NaN | NaN | NaN | 0 | 0 |
1 | 1 | 9 | 2020-03-18 | 0 | 0 | NaN | NaN | NaN | 0 | 0 |
2 | 1 | 19 | 2020-03-18 | 0 | 0 | NaN | NaN | NaN | 0 | 0 |
3 | 1 | 29 | 2020-03-18 | 0 | 0 | NaN | NaN | NaN | 0 | 0 |
4 | 1 | 39 | 2020-03-18 | 0 | 0 | NaN | NaN | NaN | 0 | 0 |
df['cl_age90'].unique()
array([ 0, 9, 19, 29, 39, 49, 59, 69, 79, 89, 90])
Remove unused columns and 0 class age
df.drop(['HospConv', 'SSR_USLD', 'reg'], axis=1, inplace=True)
df = df[df['cl_age90'] != 0]
Evolution du covid par âge
def reduce(age):
if age in [9, 19, 29]:
return '-30 ans'
if age in [39, 49, 59]:
return '30-60 ans'
if age in [69, 79]:
return '60-80 ans'
if age in [89, 90]:
return '+80 ans'
df['age'] = df['cl_age90'].apply(reduce)
data = df.drop('cl_age90', axis=1).groupby(['age', 'jour']).sum()
groups = [('-30 ans', 'rgb(180,151,231)'),
('30-60 ans', 'rgb(201,219,116)'),
('60-80 ans', 'rgb(246,207,113)'),
('+80 ans', 'rgb(102,197,204)')]
data
hosp | rea | autres | rad | dc | ||
---|---|---|---|---|---|---|
age | jour | |||||
+80 ans | 2020-03-18 | 826 | 94 | 0.0 | 76 | 146 |
2020-03-19 | 1314 | 125 | 0.0 | 144 | 236 | |
2020-03-20 | 1498 | 131 | 0.0 | 192 | 283 | |
2020-03-21 | 1764 | 148 | 0.0 | 237 | 348 | |
2020-03-22 | 2022 | 161 | 0.0 | 281 | 413 | |
... | ... | ... | ... | ... | ... | ... |
60-80 ans | 2021-11-02 | 2898 | 603 | 68.0 | 156739 | 31082 |
2021-11-03 | 2937 | 607 | 67.0 | 156852 | 31095 | |
2021-11-04 | 2906 | 615 | 67.0 | 156979 | 31117 | |
2021-11-05 | 2920 | 617 | 67.0 | 157089 | 31126 | |
2021-11-06 | 2857 | 617 | 66.0 | 157201 | 31135 |
2396 rows × 5 columns
fig = go.Figure()
for i, c in groups:
x = data.loc[i]
fig.add_trace(go.Bar(name=i, x=x.index, y=x['hosp'], marker_color=c))
fig.update_layout(barmode='stack', title="Nombre d'hospitalisations chaque jour")
# fig.show()
plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div')
fig = go.Figure()
for i, c in groups:
x = data.loc[i]
fig.add_trace(go.Bar(name=i, x=x.index, y=x['rea'], marker_color=c))
fig.update_layout(barmode='stack', title="Nombre de réaminations chaque jour")
# fig.show()
plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div')
fig = go.Figure()
for i, c in groups:
x = data.loc[i]
fig.add_trace(go.Bar(name=i, x=x.index, y=(x['dc'] - x['dc'].shift(1)).clip(lower=0), marker_color=c))
fig.update_layout(barmode='stack', title="Nombre de décès chaque jour")
# fig.show()
plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div')
fig = go.Figure()
for i, c in groups:
x = data.loc[i]
fig.add_trace(go.Bar(name=i, x=x.index, y=x['dc'], marker_color=c))
fig.update_layout(barmode='stack', title="Nombre de décès cumulés")
# fig.show()
plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div')
Age moyen d’un français mort du covid
def classe_age_to_mean_age(cl):
if cl == 90: # Si classe +90 ans, on retient 95 ans en moyenne
return 95
else: # Autres on retire 4, ex classe 79 (70 à 80) -> 75 ans en moyenne
return cl - 4
moyenne = (df["cl_age90"].apply(classe_age_to_mean_age) * df["dc"]).sum() / df["dc"].sum()
print(np.around(moyenne), "ans en moyenne")
81.0 ans en moyenne
Résultat en accord avec cet article : https://www.lefigaro.fr/sciences/plus-de-90-des-deces-du-covid-19-surviennent-chez-les-plus-de-65-ans-20210119
Bonus : Calcul Probabilité Veran
Véran est tombé sur deux personnes de moins de 30 ans et moins de 40 ans en ouvrant au hasard deux portes à l’hopital. Quelle est la probabilité d’un tel évènement ?
https://youtu.be/FNeBVbUo4Ns?t=62
df.head()
proba = df.drop(['jour', 'age', 'autres', 'rad', 'dc', 'rea'], axis=1)
proba = proba.groupby(['cl_age90']).sum()
proba.columns = ['hospitalisation']
proba
hospitalisation | |
---|---|
cl_age90 | |
9 | 25456 |
19 | 34775 |
29 | 116774 |
39 | 230535 |
49 | 443368 |
59 | 984884 |
69 | 1728398 |
79 | 2336084 |
89 | 2676130 |
90 | 1277138 |
proba = proba.cumsum() / proba.sum() * 100
fig = go.Figure()
for c in proba.columns:
x = proba[c]
fig.add_trace(go.Scatter(name=c, x=x.index, y=x))
fig.update_layout(
title="Probabilité Véran",
xaxis_title='personne agée de moins de ... (ans)',
yaxis_title="Probabilité de la trouver à hopital")
# fig.show()
plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div')
print(0.018*0.041 * 100, "%")
0.07379999999999999 %
La probabilité de tomber sur une personne de moins de 29 est de 1,8%, la probabilité de tomber sur une personne de moins de 39 ans est de 4,1%, la probabilité de cumuler les deux est donc de 0,07% …
Véran a donc eu moins d’une chance sur mille de se retrouver dans une telle situation. De là à dire qu’il ment….