Quelle tranche d'age est la plus touchée par le Covid

Ce que les données de santé public france révèlent de la pandémie

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….