IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

coronavirus - dataviz avec R


Sujet :

R

  1. #1
    Membre actif
    Avatar de gerard093
    Homme Profil pro
    data scientist
    Inscrit en
    Mai 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : data scientist
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 72
    Points : 235
    Points
    235
    Billets dans le blog
    7
    Par défaut coronavirus - dataviz avec R
    Introduction simple à la visualisation des données - france et monde - pour les décès et le nombre de cas du coronavirus.

    voir le pdf en pièce jointe.

    Si vous avez une solution à proposer pour essayer d'anticiper la fin du confinement !!! publiez !!! je suis sûr que vous aurez des preneurs.
    Certains parlent de solution à partir de la courbe logistique (sur les cumuls ...) alors à vos codes ...

    Je vous mets en pièce jointe le pdf pour les débutants ... et la hard-copy d'un article qui ... marche pas bien (fake ?). Donc si vous avez le code complémentaire ... testé bien sûr !!!
    Images attachées Images attachées

  2. #2
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Bonjour.

    Je n'ai pas les compétences pour faire un modèle de prédiction de la fin du confinement.

    Ce qui suis n'a pas l'objectif de prédire ni de mener a une quelconque conclusion juste a me distraire de mon insomnie. Et pourquoi pas d'inviter à faire vos propres visualisations de donnée, et éventuellement les partager.

    Le lien suivant est donné dans un des PDF fournis par gerard093:

    https://opendata.ecdc.europa.eu/covi...stribution/csv

    0/ Modules:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    library(readr)
    library(RSQLite)
    library(ggplot2)
    library(gridExtra)
    1/ Collecter les data:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # collecte data brute
    d <- read_csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv", 
                         col_types = cols(dateRep = col_date(format = "%d/%m/%Y"))
                  )
     
    # typage
    d$dateRep <- as.factor(d$dateRep)
    d$countriesAndTerritories <- as.factor(d$countriesAndTerritories)
    d$geoId <- as.factor(d$geoId)
    d$countryterritoryCode <- as.factor(d$countryterritoryCode)
    d$continentExp <- as.factor(d$continentExp)
    2/ Comme je ne suis pas encore alèse avec dplyr je passe par du SQLite via R

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # ouverture connexion sur une SQLite en memoire vive
    c <- dbConnect(RSQLite::SQLite(), dbname = ":memory:")
     
    # ecriture des data brute dans un table "data"
    dbWriteTable(c, name = "data", value = d)
    3/ Confection d'une data.frame qui cumul ( jour par jour ) le nombre de cas (Covid-19) par continent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    # creation d'une requete pour cumuler les "cases" et "deaths" par continent
    t <- dbSendQuery(c, "SELECT date(dateRep) AS dateRep
                              , continentExp  AS continent
                              , SUM(cases) OVER ( PARTITION BY continentExp 
                                                  ORDER BY date(dateRep)) AS cum_c
                              , SUM(deaths) OVER ( PARTITION BY continentExp 
                                                  ORDER BY date(dateRep)) AS cum_d
                         FROM data")
     
    # recuperation du resultat de la requete dans un data.frame
    tt <- dbFetch(t)
     
    # liberation de la requete
    dbClearResult(t)
     
    # typage date
    tt$dateRep <- as.POSIXct(tt$dateRep)
    4/ Graphique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # definition du graph
    ggplot(tt) +
      aes(x = tt$dateRep, ) +
      geom_line(aes(y = tt$cum_d), col = "red") +
      geom_line(aes(y = tt$cum_c), col = "blue") +
      facet_wrap( tt$continent ~ . , scales = "free_y") +
      labs(
        x = NULL,
        y = "Nb",
        title = "Nombre de cas / mort cumulé par continent",
        subtitle = "Les cas en Bleu / Les morts en Rouge"
      )
    Nom : 4.png
Affichages : 131
Taille : 50,2 Ko

    5/ Autre graphique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    # nombre de cas / continent
    g1 <- ggplot(tt) +
      aes(x = dateRep, y = cum_c, colour = continent  ) +
      geom_line() +
      labs(
        x = NULL,
        y = "Nombre (cumulé)",
        title = "Cas"
      )
     
    # nombre de morts / continent
    g2 <- ggplot(tt) +
      aes(x = dateRep, y = cum_d, colour = continent ) +
      geom_line() +
      labs(
        x = NULL,
        y = NULL,
        title = "Morts"
      )
     
    g12 <- grid.arrange(g1, g2, ncol = 2, nrow = 1)
    Nom : 5.png
Affichages : 120
Taille : 43,8 Ko

    6/ Focus sur la France:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    ### Focus sur la france
    f <- dbSendQuery(c, "SELECT date(dateRep) AS dateRep
                              , countriesAndTerritories AS pays
                              , SUM(cases) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_c
                              , SUM(deaths) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_d
                         FROM data
                         WHERE countriesAndTerritories = 'France'")
     
    ff <- dbFetch(f)
    dbClearResult(f)
    ff$dateRep <- as.POSIXct(ff$dateRep)
    ggplot(ff) +
      aes(x = dateRep, ) +
      geom_line(aes(y = cum_d), col = "red") +
      geom_line(aes(y = cum_c), col = "blue") +
      labs(
        x = NULL,
        y = "Nb",
        title = "Nombre de cas / mort cumulé pour la France",
        subtitle = "Les cas en Bleu / Les morts en Rouge"
      ) +
      geom_rug(aes(y = cum_d), col = "red", sides = "l") +
      geom_rug(aes(y = cum_c), col = "blue",sides = "l")
    Nom : 6.png
Affichages : 109
Taille : 26,4 Ko

    7/ "Top" 7 des pays (en cas et mort) du continent Europe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    ### Focus sur l'europe Top 7
    e <- dbSendQuery(c, "WITH d AS (SELECT date(dateRep) AS dateRep
                              , countriesAndTerritories AS pays
                              , SUM(cases) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_c
                              , SUM(deaths) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_d
                         FROM data
                         WHERE continentExp = 'Europe'
                         )
                         SELECT *
                         FROM d
                         WHERE pays IN (
                           SELECT pays 
                           FROM (
                             SELECT pays
                                  , MAX(cum_d)AS n
                             FROM d
                             GROUP BY pays
                             ORDER BY n DESC
                             LIMIT 7
                           )
                         )
                         ")
     
    e1 <- dbFetch(e)
    dbClearResult(e)
    e1$dateRep <- as.POSIXct(e1$dateRep)
    ge1 <- ggplot(e1) +
      aes(x = dateRep, y = cum_d, color = pays ) +
      geom_line() +
      labs(
        x = NULL,
        y = NULL,
        title = "Nombre de morts"
      )
     
    ###
    e <- dbSendQuery(c, "WITH d AS (SELECT date(dateRep) AS dateRep
                              , countriesAndTerritories AS pays
                              , SUM(cases) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_c
                              , SUM(deaths) OVER ( PARTITION BY countriesAndTerritories
                                                  ORDER BY date(dateRep)) AS cum_d
                         FROM data
                         WHERE continentExp = 'Europe'
                         )
                         SELECT *
                         FROM d
                         WHERE pays IN (
                           SELECT pays 
                           FROM (
                             SELECT pays
                                  , MAX(cum_c)AS n
                             FROM d
                             GROUP BY pays
                             ORDER BY n DESC
                             LIMIT 7
                           )
                         )
                         ")
     
    e2 <- dbFetch(e)
    dbClearResult(e)
    e2$dateRep <- as.POSIXct(e2$dateRep)
    ge2 <- ggplot(e2) +
      aes(x = dateRep, y = cum_c, color = pays ) +
      geom_line() +
      labs(
        x = NULL,
        y = NULL,
        title = "Nombre de cas"
      )
     
    e12 <- grid.arrange(ge1, ge2, ncol = 1, nrow = 2)
    Nom : 77.png
Affichages : 133
Taille : 62,5 Ko

    7.1/ Pourcentage de mort en fonction du nombre de cas (cumulé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    e <- dbSendQuery(c, "WITH d AS (SELECT dateRep,
                                pays,
                                A.cum_c / pop_2018 * 100 AS per_c,
                                A.cum_d / A.cum_c * 100 AS per_m
                         FROM (
                           SELECT date(dateRep) AS dateRep
                                , countriesAndTerritories AS pays
                                , SUM(cases) OVER ( PARTITION BY countriesAndTerritories
                                                    ORDER BY date(dateRep)) AS cum_c
                                , SUM(deaths) OVER ( PARTITION BY countriesAndTerritories
                                                    ORDER BY date(dateRep)) AS cum_d
                                , popData2018 AS pop_2018
                           FROM data
                           WHERE continentExp = 'Europe'
                         ) AS A
                        )
     
                         SELECT *
                         FROM d
                         WHERE pays IN (
                           SELECT pays 
                           FROM (
                             SELECT pays
                                  , MAX(per_m) AS n
                             FROM d
                             GROUP BY pays
                             ORDER BY n DESC
                             LIMIT 7
                           )
                         )
     
                         ")
     
    ee <- dbFetch(e)
    dbClearResult(e)
    ee
    ee$dateRep <- as.POSIXct(ee$dateRep)
     
    ggplot(ee) +
      aes(x = dateRep, y = per_m, color = pays) +
      geom_line() +
      labs(
        x = NULL,
        y = "%",
        title = "Pourcentage de mort en fonction du nombre de cas (cumulé)"
      )
    Nom : 7.1.png
Affichages : 134
Taille : 67,8 Ko

    7.2/ Pourcentage de cas cumulé en fonction de la population du pays:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    e <- dbSendQuery(c, "WITH d AS (SELECT dateRep,
                                pays,
                                A.cum_c / pop_2018 * 100 AS per_c,
                                A.cum_d / A.cum_c * 100 AS per_m
                         FROM (
                           SELECT date(dateRep) AS dateRep
                                , countriesAndTerritories AS pays
                                , SUM(cases) OVER ( PARTITION BY countriesAndTerritories
                                                    ORDER BY date(dateRep)) AS cum_c
                                , SUM(deaths) OVER ( PARTITION BY countriesAndTerritories
                                                    ORDER BY date(dateRep)) AS cum_d
                                , popData2018 AS pop_2018
                           FROM data
                           WHERE continentExp = 'Europe'
                         ) AS A
                        )
     
                         SELECT *
                         FROM d
                         WHERE pays IN (
                           SELECT pays 
                           FROM (
                             SELECT pays
                                  , MAX(per_c) AS n
                             FROM d
                             GROUP BY pays
                             ORDER BY n DESC
                             LIMIT 7
                           )
                         )
     
                         ")
     
    ee <- dbFetch(e)
    dbClearResult(e)
    ee
    ee$dateRep <- as.POSIXct(ee$dateRep)
    ggplot(ee) +
      aes(x = dateRep, y = per_c, color = pays) +
      geom_line() +
      labs(
        x = NULL,
        y = "%",
        title = "Pourcentage de cas cumulé en fonction de la population du pays"
      )
    Nom : 7.2.png
Affichages : 119
Taille : 40,3 Ko

  3. #3
    Membre actif
    Avatar de gerard093
    Homme Profil pro
    data scientist
    Inscrit en
    Mai 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : data scientist
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 72
    Points : 235
    Points
    235
    Billets dans le blog
    7
    Par défaut merci pour le code sql
    Il nous manque quanf même les graphes camembert !!!

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/03/2020, 21h00
  2. Réponses: 0
    Dernier message: 19/12/2013, 12h44
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo