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.
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 :
- recenser tous les évènements du fichier,
- les grouper par commune,
- pour chaque commune, retrouver l’évènement le plus ancien et le plus récent,
- en déduire une amplitude temporelle, c’est-à-dire un nombre d’années de présence sur la commune,
- multiplier cette amplitude par le nombre d’évènements et en déduire un niveau d’importance de la commune dans l’arbre,
- 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
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
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 :
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).
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.
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.
Une présentation très intéressante, merci pour le partage qui donne envie d’appliquer ça à ses propres ancêtres.
J’aimeJ’aime
Merci pour ton commentaire.
Effectivement, dans mon cas, faire cette étude m’a permis de m’intéresser à certaines communes que j’avais tendance à « oublier » dans mes recherches.
J’aimeJ’aime
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’aimeJ’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’aimeJ’aime
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’aimeJ’aime
Merci Catelin pour vos encouragements ! Et revenez quand vous voulez 🙂
J’aimeJ’aime
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’aimeJ’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’aimeJ’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’aimeJ’aime
Bonjour,
J’ai transposé vos scripts R sous mon environnement, le résultat est conforme à vos graphiques.
Merci encore.
JC
J’aimeJ’aime
Mes graphiques :
https://jcstlouis.home.blog/2019/08/16/graphiques-sur-ascendance/
J’aimeJ’aime