Realiser un tableau croisé dynamique et créer un taux de variation entre deux années

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Elodie Perron
Messages : 19
Enregistré le : 18 Mai 2018, 06:36

Realiser un tableau croisé dynamique et créer un taux de variation entre deux années

Messagepar Elodie Perron » 04 Nov 2019, 11:14

Bonjour à tous,

Je souhaiterais réaliser un tableau croisé dynamique sous R, mais je coince...

J'ai le tableau suivant :
ID_clients Segment Agence Trim1_2018 Trim2_2018 Trim3_2018 Trim1_2019 Trim2_2019 Trim3_2019
295669772 Autres Anse Vata 5697742 5693125 3648965 5997742 6593125 3408965
295669773 Bonne Gamme Ducas 5695698 456985 2469869 4862369 75698231 4698231
295669774 Grand Public Alma 5693654 -4779155 1290773 3726996 144803337 5987497
295669775 Patrimoniale Victoire 5691610 -10015295 111677 2591623 213908443 7276763
295669776 Autres Anse Vata 5689566 -15251435 -1067419 1456250 283013549 8566029
295669777 Bonne Gamme Ducas 5687522 -20487575 -2246515 320877 352118655 9855295
295669778 Grand Public Alma 5685478 -25723715 -3425611 -814496 421223761 11144561
295669779 Patrimoniale Victoire 5683434 -30959855 -4604707 -1949869 490328867 12433827
295669780 Autres Anse Vata 5681390 -36195995 -5783803 -3085242 559433973 13723093
295669781 Bonne Gamme Ducas 5679346 -41432135 -6962899 -4220615 628539079 15012359


J'aimerais obtenir le tableau suivant (la variable evolution correspond à (VA-VD)/ABS(VD)*100 soit (5183246-11383220)/ABS(11383220)*100) :
2018 2019 Evolution 2018-2019
Trimestre1 Bonne Gamme 11383220 5183246 -54,47%
Grand Public 11379132 2912500 -74,40%
Patrimoniale 11379132 641754 -94,36%
Autres 11370956 -1628992 -114,33%
Trimestre2 Bonne Gamme 11375044 -3899738 -134,28%
Grand Public 5685478 -814496 -114,33%
Patrimoniale 5695698 -1949869 -134,23%
Autres 5683409 -3085242 -154,29%
Trimestre3 Bonne Gamme 10878944 -4220615 -138,80%
Grand Public 2912500 5698423 95,65%
Patrimoniale 6337452 4569823 -27,89%
Autres -1626973 5698424 450,25%


J'ai donc essayé :

Code : Tout sélectionner

library(dplyr)
library(tidyr)
tab <- test %>% group_by(Agence,Segment) %>% summarise(trim1=sum(Trim1_2018),trim2=sum(Trim2_2018),trim3=sum(Trim3_2018),trim12019=sum(Trim1_2019),trim22019=sum(Trim2_2019),trim32019=sum(Trim3_2019))
tab2 <- tab %>% pivot_longer(c(`trim1`,`trim2`,`trim3`,`trim12019`,`trim22019`,`trim32019`))


Mais je n'obtiens pas du tout le résultat souhaité...

Je vous remercie par avance pour votre aide.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Realiser un tableau croisé dynamique et créer un taux de variation entre deux années

Messagepar Mickael Canouil » 04 Nov 2019, 15:41

Bonjour,

ce n'est pas clair du tout au niveau de la formule puisqu'il n'y a aucune correspondance des noms des variables, mais voici une proposition :

Code : Tout sélectionner

test <- read.delim(sep = " ", text = "ID_clients Segment Agence Trim1_2018 Trim2_2018 Trim3_2018 Trim1_2019 Trim2_2019 Trim3_2019
295669772 Autres Anse Vata 5697742 5693125 3648965 5997742 6593125 3408965
295669773 Bonne Gamme Ducas 5695698 456985 2469869 4862369 75698231 4698231
295669774 Grand Public Alma 5693654 -4779155 1290773 3726996 144803337 5987497
295669775 Patrimoniale Victoire 5691610 -10015295 111677 2591623 213908443 7276763
295669776 Autres Anse Vata 5689566 -15251435 -1067419 1456250 283013549 8566029
295669777 Bonne Gamme Ducas 5687522 -20487575 -2246515 320877 352118655 9855295
295669778 Grand Public Alma 5685478 -25723715 -3425611 -814496 421223761 11144561
295669779 Patrimoniale Victoire 5683434 -30959855 -4604707 -1949869 490328867 12433827
295669780 Autres Anse Vata 5681390 -36195995 -5783803 -3085242 559433973 13723093
295669781 Bonne Gamme Ducas 5679346 -41432135 -6962899 -4220615 628539079 15012359")

Code : Tout sélectionner

library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#>     filter, lag
#> The following objects are masked from 'package:base':
#>
#>     intersect, setdiff, setequal, union
library(tidyr)

Code : Tout sélectionner

# long format
step1 <- test %>%
  pivot_longer(
    cols = starts_with("Trim"),
    names_to = c("Trimestre", "Année"),
    names_pattern = "Trim(.*)_(.*)",
    values_to = "X"
  )

Code : Tout sélectionner

step1
#> # A tibble: 60 x 6
#>    ID_clients Segment Agence Trimestre Année       X
#>    <fct>      <fct>   <fct>  <chr>     <chr>   <int>
#>  1 Autres     Anse    Vata   1         2018  5697742
#>  2 Autres     Anse    Vata   2         2018  5693125
#>  3 Autres     Anse    Vata   3         2018  3648965
#>  4 Autres     Anse    Vata   1         2019  5997742
#>  5 Autres     Anse    Vata   2         2019  6593125
#>  6 Autres     Anse    Vata   3         2019  3408965
#>  7 Bonne      Gamme   Ducas  1         2018  5695698
#>  8 Bonne      Gamme   Ducas  2         2018   456985
#>  9 Bonne      Gamme   Ducas  3         2018  2469869
#> 10 Bonne      Gamme   Ducas  1         2019  4862369
#> # … with 50 more rows

Code : Tout sélectionner

# wide format for year summary, i.e., sum
step2 <- step1 %>%
  group_by(Agence, Segment, Trimestre) %>%
  pivot_wider(
    names_from = Année,
    values_from = X,
    values_fn = list(X = ~sum(.x, na.rm = TRUE))
  ) %>%
  ungroup()

Code : Tout sélectionner

step2
#> # A tibble: 15 x 6
#>    ID_clients   Segment  Agence  Trimestre    `2018`     `2019`
#>    <fct>        <fct>    <fct>   <chr>         <int>      <int>
#>  1 Autres       Anse     Vata    1          17068698    4368750
#>  2 Autres       Anse     Vata    2         -45754305  849040647
#>  3 Autres       Anse     Vata    3          -3202257   25698087
#>  4 Bonne        Gamme    Ducas   1          17062566     962631
#>  5 Bonne        Gamme    Ducas   2         -61462725 1056355965
#>  6 Bonne        Gamme    Ducas   3          -6739545   29565885
#>  7 Grand        Public   Alma    1          11379132    2912500
#>  8 Grand        Public   Alma    2         -30502870  566027098
#>  9 Grand        Public   Alma    3          -2134838   17132058
#> 10 Patrimoniale Victoire 5691610 1         -10015295  213908443
#> 11 Patrimoniale Victoire 5691610 2            111677    7276763
#> 12 Patrimoniale Victoire 5691610 3           2591623          0
#> 13 Patrimoniale Victoire 5683434 1         -30959855  490328867
#> 14 Patrimoniale Victoire 5683434 2          -4604707   12433827
#> 15 Patrimoniale Victoire 5683434 3          -1949869          0

Code : Tout sélectionner

# Compute evolution and order/arrange columns/rows
step3 <- step2 %>%
  mutate(`Evolution 2018-2019` = (`2019` - `2018`) / abs(`2018`) * 100) %>%
  select(Trimestre, everything()) %>%
  arrange(Trimestre)

Code : Tout sélectionner

step3
#> # A tibble: 15 x 7
#>    Trimestre ID_clients  Segment  Agence   `2018`  `2019` `Evolution 2018-…
#>    <chr>     <fct>       <fct>    <fct>     <int>   <int>             <dbl>
#>  1 1         Autres      Anse     Vata     1.71e7  4.37e6             -74.4
#>  2 1         Bonne       Gamme    Ducas    1.71e7  9.63e5             -94.4
#>  3 1         Grand       Public   Alma     1.14e7  2.91e6             -74.4
#>  4 1         Patrimonia… Victoire 5691610 -1.00e7  2.14e8            2236.
#>  5 1         Patrimonia… Victoire 5683434 -3.10e7  4.90e8            1684.
#>  6 2         Autres      Anse     Vata    -4.58e7  8.49e8            1956.
#>  7 2         Bonne       Gamme    Ducas   -6.15e7  1.06e9            1819.
#>  8 2         Grand       Public   Alma    -3.05e7  5.66e8            1956.
#>  9 2         Patrimonia… Victoire 5691610  1.12e5  7.28e6            6416.
#> 10 2         Patrimonia… Victoire 5683434 -4.60e6  1.24e7             370.
#> 11 3         Autres      Anse     Vata    -3.20e6  2.57e7             902.
#> 12 3         Bonne       Gamme    Ducas   -6.74e6  2.96e7             539.
#> 13 3         Grand       Public   Alma    -2.13e6  1.71e7             902.
#> 14 3         Patrimonia… Victoire 5691610  2.59e6  0.                -100 
#> 15 3         Patrimonia… Victoire 5683434 -1.95e6  0.                 100


Pour partager des données et être sûr qu'elles sont lues correctement (ce n'est pas le cas ici) : Comment insérer des données dans un message ?

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Elodie Perron
Messages : 19
Enregistré le : 18 Mai 2018, 06:36

Re: Realiser un tableau croisé dynamique et créer un taux de variation entre deux années

Messagepar Elodie Perron » 05 Nov 2019, 08:40

Merci beaucoup pour ta réponse rapide !! Et toutes mes excuses pour la structure de mes données... j'ai bien pris connaissance du lien.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité