Représentations graphiques d’une ascendance

Comme vous avez peut-être pu le remarquer, j’adore la généalogie, la cartographie, mais aussi les statistiques. J’essaie de conjuguer ces trois passions à travers ce blog, en travaillant notamment sur les différentes représentations possibles d’une ascendance.

Lors d’un article précédent, j’avais détaillé 5 méthodes pour réaliser une carte en généalogie. Aujourd’hui, je vous propose de découvrir une autre forme de représentation visuelle, non plus cartographique cette fois mais à base de graphiques. Le but de l’exercice : déterminer l’occupation du territoire par nos ancêtres au fil du temps.

Random Number Multiples - RGB

Préparation des données

Avant toute chose, il nous faut des données à représenter. Comme dans le tutoriel précédent, je vais utiliser un export gedcom de mon fichier Heredis, converti par l’outil Oxy-Gen en base MySQL. Je ne reviens pas sur ces étapes, que vous pouvez consulter dans ce billet : “Convertir ses données en une base MySQL”.

Voici la méthode que j’ai suivie pour obtenir les données qui m’intéressent :

  1. recenser tous les évènements du fichier,
  2. les grouper par commune,
  3. pour chaque commune, retrouver l’évènement le plus ancien et le plus récent,
  4. en déduire une amplitude temporelle, c’est-à-dire un nombre d’années de présence sur la commune,
  5. multiplier cette amplitude par le nombre d’évènements et en déduire un niveau d’importance de la commune dans l’arbre,
  6. classer les résultats par ordre d’importance et prendre les 100 premiers.

Cette procédure, traduite en langage MySQL selon le schéma de ma base, aboutit à la requête suivante :

SELECT c.latitude, c.longitude, z.code, z.libelle AS "nom_dep", c.libelle, COUNT(*) AS "nb", MIN(YEAR(e2.devnt)) AS "début", MAX(YEAR(e2.devnt)) AS "fin", (MAX(YEAR(e2.devnt)) - MIN(YEAR(e2.devnt))) AS "amplitude", (MAX(YEAR(e2.devnt)) - MIN(YEAR(e2.devnt))) * COUNT(*) AS "importance"

FROM oxg_events2 e2, oxg_cities c, oxg_zones z

WHERE e2.id_city = c.id_city

AND e2.id_zone = z.id_zone

GROUP BY e2.id_city

ORDER BY importance DESC

LIMIT 0,100;

NB : Il subsiste un inconvénient à cette méthode. En effet, elle ne prend pas en compte les évènements aux dates imprécises (par exemple “après 1755”), et il m’en reste hélas beaucoup. Cependant, on peut raisonnablement penser qu’ils sont également répartis parmi les communes et que l’incidence est donc minime…

Classement des communes

Je vous retranscris ci-dessous les 10 premiers résultats de la requête, ce qui correspond au top 10 des communes de ma généalogie :

code nom_dep libelle nb debut fin amplitude importance
42 Loire Bellegarde-en-Forez 115 1613 1920 307 35305
70 Haute-Saône Fougerolles 111 1654 1859 205 22755
42 Loire Saint-André-le-Puy 82 1711 1974 263 21566
71 Saône-et-Loire Bosjean 109 1627 1797 170 18530
39 Jura Vernois (Le) 84 1742 1961 219 18396
42 Loire Chevrières 33 1394 1781 387 12771
42 Loire Chalain-le-Comtal 54 1702 1910 208 11232
70 Haute-Saône Selles 47 1653 1870 217 10199
69 Rhône Pomeys 41 1559 1744 185 7585
71 Saône-et-Loire Sens-sur-Seille 49 1583 1728 145 7105

 Premières constatations :

  • 5 communes se détachent nettement :
    • Bellegarde-en-Forez (Loire)
    • Fougerolles (Haute-Saône)
    • Saint-André-le-Puy (Loire)
    • Bosjean (Saône-et-Loire)
    • Le Vernois (Jura)
  • La commune pour laquelle je possède la date la plus ancienne est Chevrières, dans la Loire (le 5 janvier 1394, décès de Jean MITTE de CHEVRIÈRES, premier écuyer du roi Charles V).
  • Commune avec la plus grande amplitude : Chevrières toujours, avec une amplitude de 387 ans (dernier évènement recensé : 24 janvier 1781, décès de Benoît GONON, tisserand).
  • Commune qui a le plus grand nombre d’évènements : Bellegarde-en-Forez (115).

Nous en savons maintenant un peu plus, mais il n’est tout de même pas évident d’entrevoir des tendances avec cette succession de chiffres. C’est ici que les statistiques vont pouvoir nous aider…

Visualisation de données

J’ai retravaillé les données avec le langage de programmation statistique R.

R est un logiciel libre, gratuit et multi-plateforme d’analyse statistique. Accompagné de l’interface R Studio, il permet de générer des graphiques assez facilement et avec peu de lignes de code.

Si vous ne connaissez pas ce logiciel mais que le monde de la visualisation de données vous intéresse, je vous encourage fortement à l’essayer.

Voici les différents graphiques que j’ai pu réaliser (cliquez sur les images pour les voir en grand format).

Classement des communes par ordre d’importance

Classement des communes, par ordre d'importance

Classement des communes par ordre d’importance

Le graphique ci-dessus nous montre le positionnement des 34 premières communes du fichier. Elles se divisent en deux ensembles : le premier, constitué des 5, voire des 8 premières communes ; et les suivantes, qui forment un groupe assez homogène, avec cependant 2 sous-groupes, le premier entre 5000 et 10000, le deuxième entre 1500 et 5000.

On constate que la commune de Bellegarde-en-Forez arrive largement en tête. Elle est donc sans conteste la plus “importante” de mon ascendance, avec un minimum de 115 évènements recensés et une présence sur plus de 3 siècles !

Distribution des villes, par département

Distribution des villes, par département

Distribution des villes, par département

Sur ce graphique, l’écart pris par les 5 premières communes est encore plus visible. Comme on a affecté une couleur différente à chaque département, on perçoit également la prédominance du département de la Loire, en rose.

Les deux premières communes, Bellegarde-en-Forez et Fougerolles ont quasiment le même nombre d’évènements (115 contre 111), mais l’amplitude de la première (307 ans) lui permet d’arriver largement en tête. Ceci tendrait à montrer que mon système de pondération du nombre d’évènements par l’amplitude fonctionne bien. En effet, si l’on prenait seulement en compte l’amplitude, on ne pourrait pas savoir si la commune a réellement été habitée pendant 307 ans (dans l’absolu, il aurait pu s’y dérouler seulement 2 évènements, l’un en 1613, l’autre en 1920). D’où l’intéret du critère d’importance qui favorise les communes qui sont importantes à la fois d’un point de vue du nombre d’évènements (et donc du nombre d’individus) ET de l’amplitude temporelle.

Départements, selon l’importance

Impression confirmée avec ce diagramme à barres montrant la répartition des évènements selon les départements :

Départements, selon l’importance

Départements, selon l’importance

NB : l’échelle ici est logarithmique sinon on ne verrait même pas les petits départements.

Amplitude temporelle par commune

Voici ensuite le graphique que je trouve le plus intéressant : la chronologie du peuplement des communes par mes ancêtres. La forme reprend ce que l’on peut trouver dans un diagramme de Gantt. Ici, afin de conserver une certaine lisibilité, seules les communes ayant plus de 10 évènements sont affichées. Pour le style graphique, je me suis inspirée très modestement de celui de Nicolas Felton.

Ce diagramme offre une lecture à la fois horizontale et verticale :

  • En lecture horizontale, on perçoit la durée plus ou moins longue d’occupation de la commune, mais on repère aussi les villes que je qualifierais de “jumelles”, c’est-à-dire géographiquement proches et occupées (et quittées !) à la même période. C’est le cas par exemple de Selles, Pont-du-Bois et Fougerolles, pour la Haute-Saône, de Voiteur et Ladoye-sur-Seille pour le Jura.
  • De haut en bas, dans l’intervalle entre 2 repères (soit 50 ans), on peut connaître précisément les communes concernées pour la période. Ainsi, dans la deuxième moitié du XVIe siècle, les principales communes habitées par mes ancêtres étaient Chevrières, Chazelles-sur-Lyon et Pomeys (toutes les trois dans le comté du Forez), Aix-en-Provence, Sens-sur-Seille (en Saône-et-Loire).
Amplitude temporelle par commune

Amplitude temporelle par commune

Enfin, le même type de diagramme, mais restreint aux communes d’un seul département, celui du Jura, puis celui de la Haute-Saône. Ici, on fait apparaître toutes les communes du département, contrairement au diagramme général.

Communes du Jura : amplitude temporelle

Communes du Jura : amplitude temporelle

Communes de Haute-Saône : amplitude temporelle

Communes de Haute-Saône : amplitude temporelle

NB : Pour information, ce genre de graphiques est également faisable, quoique de façon simplifiée, avec Excel (voir cette méthode).

Merci pour votre attention, et n’hésitez pas si vous avez des questions ou des commentaires.

11 réflexions sur “Représentations graphiques d’une ascendance

  1. Article très intéressant pour moi, qui ai un peu le même tropisme analytique que vous 😉
    Merci pour les outils que vous nous faites découvrir et les méthodes que vous développez avec patience et pédagogie.

    J’aime

    • « tropisme analytique » : j’adore l’expression, qui me va bien j’avoue 🙂 Merci pour ces compliments qui me font d’autant plus plaisir que votre site est celui qui m’a donné envie d’ouvrir ce blog !
      À ce propos, ravie qu’il ait repris du service 😉 …
      Merci encore et bonne continuation.

      J’aime

  2. Bonjour.
    Joli travail !
    Personnellement, étant plus doué dans la manipulation d’Excel, j’avais créé en plus un petit système annexé qui m’indiquait les « périodes creuses » avec l’évolution des habitants vers d’autres lieux (par exemple : déménagements – abandon d’un fief ou d’une demeure, puis retour – lieux de travail – etc.) L’intérêt : ne pas confondre des patronymes, et le calcul de l’évolution des us et coutumes et de leurs implications sur le territoire français.
    Quoiqu’il en soit, votre étude est intéressante. Votre blog également, je reviendrai vous lire plus longuement. Amicalement. Catelin.

    J’aime

  3. Bonjour,
    Très beaux graphiques sur votre généalogie, J’aimerai en faire autant !
    Je connais très bien les outils BDD (environnement, SQL, base Heredis…) mais je n’ai jamais utilisé ce langage R. Comme exemple de départ, pouvez-vous me communiquer vos scripts R pour comprendre la génération de ces graphiques à travers les fonctions utilisées ?
    Merci d’avance pour votre réponse.
    Très cordialement.
    JC

    J’aime

    • Bonjour JC, merci pour votre commentaire.
      Cet article date un peu maintenant (5 ans !), donc je ne garantis pas que le code R soit encore optimal de nos jours. Voici tout de même le code source de 3 graphiques de l’article :

      # Classement des communes par ordre d'importance

      library(ggplot2)
      library(ggthemes)

      ggplot(ds[1:34,], aes(x = importance, y = reorder(libelle, importance),
      colour = nom_dep)) +
      geom_point(size = 5) +
      scale_x_continuous(breaks = seq(5000, 35000, 5000), limits = c(0, 36000),
      expand = c(0, 0)) +
      scale_y_discrete(expand = c(0, 0.5)) +
      labs(x = "Importance", y = NULL) +
      ggtitle("Classement des communes, par ordre d'importance") +
      theme_bw() +
      scale_color_gdocs(name = "Départements") +
      theme(panel.grid.major.y = element_line(colour = "grey70"),
      panel.grid.major.x = element_blank(),
      panel.grid.minor = element_blank(),
      panel.border = element_blank(),
      legend.justification=c(1,0), legend.position =c (1,0),
      legend.background = element_rect(colour = "white"),
      legend.key = element_blank(),
      plot.title = element_text(size = 13, face = "bold", vjust = 2),
      axis.text.x = element_text(size = rel(1.2)),
      axis.text.y = element_text(size = 13, lineheight = 1),
      axis.title.x = element_text(size = 13, vjust = 0),
      axis.ticks.y = element_blank())


      # Amplitude temporelle des communes qui ont plus de 10 évènements

      library(ggplot2)
      library(ggthemes)
      library(grid)

      ggplot(ds[ds$nb > 10,], aes(colour=nom_dep)) +
      geom_segment(aes(x = debut, xend = fin, y = reorder(libelle, -debut), yend = libelle),
      size = 1.5) +
      xlab("") + ylab ("") +
      scale_x_continuous(breaks = seq(1400, 2000, 50), limits = c(1390, 2020), expand = c(0,0)) +
      ggtitle("AMPLITUDE TEMPORELLE PAR COMMUNE") +
      theme_minimal() +
      scale_color_gdocs(name = "Départements") +
      theme(plot.background = element_rect(fill = "#36394A"),
      plot.margin = unit(c(1, 0, 0, 0), "cm"),
      legend.key = element_blank(),
      legend.title = element_blank(),
      legend.text = element_text(colour="white", size=10),
      panel.grid.major.x = element_line(colour = "gray70", linetype = "dotted"),
      panel.grid.major.y = element_line(colour = "gray50"),
      panel.grid.minor = element_blank(),
      plot.title = element_text(size = 11, face = "bold", vjust = 2, colour = "white"),
      axis.text.x = element_text(colour = "white"),
      axis.text.y = element_text(size = 9, colour = "white"),
      axis.ticks = element_blank())


      library(ggplot2)
      library(grid)

      ggplot(ds[ds$code == "39",]) +
      geom_segment(aes(x = debut, xend = fin, y = reorder(libelle, -debut), yend = libelle),
      colour = "#E3DF0C", size = 2) +
      xlab("") + ylab("") +
      scale_x_continuous(breaks = seq(1600, 2000, 50), limits = c(1600, 1970), expand = c(0,0)) +
      ggtitle("COMMUNES DU JURA : AMPLITUDE TEMPORELLE") +
      theme_minimal() +
      theme(plot.background = element_rect(fill = "#36394A"),
      plot.margin = unit(c(1, 1, 0, 0), "cm"),
      legend.position = "none",
      panel.grid.minor = element_blank(),
      panel.grid.major.x = element_line(colour = "gray70", linetype = "dotted"),
      plot.title = element_text(size = 11, vjust = 2, colour = "white", face = "bold"),
      axis.text = element_text(size = 10, colour = "white"),
      axis.ticks = element_blank())

      « ds » est le fichier .csv de classement des communes, de ce format :

      "latitude","longitude","code","libelle","libelle","nb","début","fin","amplitude","importance"
      45.646622,4.298920,42,"Loire","Bellegarde-en-Forez",115,1613,1920,307,35305

      J’aime

      • Merci beaucoup pour votre prompte réponse.
        Il ne me reste plus qu’à examiner et étudier les fonctions du code qui génère ces graphiques. J’avoue que les guides de référence du langage R sont très difficiles à comprendre et manquent d’exemples clairs et précis.
        Je ne manquerait pas de vous tenir au courant de mes progrès.
        Très cordialement. Bonne continuation dans vos travaux et vos recherches.
        JC

        J’aime

  4. Bonjour,
    J’ai transposé vos scripts R sous mon environnement, le résultat est conforme à vos graphiques.
    Merci encore.
    JC

    J’aime

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.