Archives de l’auteur : Alexandre Hobeika et Étienne Ollion

Collecter des donnés sur Wikipédia : l’exemple des salles du culte musulman à Paris

En dépit de critiques récurrentes, on trouve des informations très utiles sur l’encyclopédie en ligne Wikipédia. Et, à condition de savoir les lire (i.e. de pratiquer la critique des sources), elle peut constituer une mine d’or pour les chercheurs. D’aileurs, vous pourriez y contribuer, ou contribuer.

Comment faire pour collecter automatiquement ces informations ? De la même manière qu’on l’a déjà fait, mais le site impose de respecter certaines règles. Examinon-les en repartant de l’exemple des édifices religieux à Paris, traité dans un précédent billet. Cette fois, on s’intéresse au culte musulman.

L’exemple des lieux de culte musulman à Paris

Parmi les différents sites qui répertorient lieux du culte musulman à Paris, Wikipédia semble bien renseigné. Une rapide consultation montre une liste d’environ 75 sites, qu’on va récupérer afin de pouvoir la traiter (statistiques, visualisation), ou la sauvegarder. Assurément, on n’est pas en mesure de dire si elles sont fréquentées, toujours actives, ou si la liste est complète (mais des gens ici ou ont sûrement une idée – ainsi que l’administration française, comme le montrait la thèse de S. Jouanneau).

Et on peut remarquer au passage une distinction qu’on ne retrouve pas chez d’autres groupes religieux plus établis : plus de la moitié des endroits recensés sont des “simples” salles de prières, et pas des édifices spécifiquement religieux (ce qui a sûrement trait à la croissance différentielle des groupes religieux, comme à leur histoire).

Sur Wikipédia, les données sont souvent présentées sous forme de tableaux. Ceux-ci sont décrits par une balise <table> dans le code source. Dans ce cas, leur extraction est très simple, grâce à la fonction readHTMLTable (présentée ici également), que l’on va utiliser.

Le premier “tableau” de la page est la table des matières de l’article, donc on s’intéresse au deuxième (mosquées), et au troisième (salles de prière). La fonction readHTMLTable peut s’utiliser directement avec l’URL (l’adresse) de la page, dans ce cas on extrait les tableaux comme ceci :

# Modules
library(RCurl)
library(XML)

# Adresse de la page Wikipédia
lieux.islam.url <-
  "http://fr.wikipedia.org/wiki/Liste_des_mosqu%C3%A9es_de_Paris"

# Récupération directe des tableaux
lieux.islam.tableaux <- readHTMLTable(lieux.islam.url)
mosquees      <- lieux.islam.tableaux[[2]]
salles.priere <- lieux.islam.tableaux[[3]]

Si on vérifie le contenu de salles.priere, on peut vérifier que ça fonctionne. Reste un problème d’accents, qui se traduit par des choses comme \u0080 (Mac OS) ou des caractères bizarres (Windows) et des avertissements ésotériques comme “it is not known that wchar_t is Unicode on this platform”. Il s’agit d’un malentendu d’encodage, c’est-à-dire d’interprétation des caractères accentués – qu’on traitera en détail prochainement [1].

Pour y remédier, on va adopter une procédure légèrement plus longue. Cela va nous permettre également de se conformer aux conditions d’utilisation de Wikipédia, et plus généralement aux bonnes pratiques de collecte automatique de données.

Collecter, à quelles conditions ?

Collecter automatiquement des données peut être grisant, mais il ne faut pas oublier que l’opération peut être coûteuse pour l’hébergeur (en termes de bande passante, donc d’infrastructures matérielles), et que le droit protège la propriété des données : ce n’est pas parce que vous pouvez les consulter qu’elles sont à vous. Les sites peuvent, au-delà du droit, se protéger par divers outils techniques. Certains vous bloqueront l’accès en cas de non-respect des conditions d’utilisation ; il est donc vivement conseillé de lire celles-ci pour savoir ce que vous êtes autorisé à faire, et comment.

Chez Wikipédia, les données sont librement accessibles, aux conditions des licences Creative Commons et GNU Free Documentation License : en gros, citer vos sources, ne pas en faire un usage commercial, etc. (un peu comme pour ce blog). Concernant la collecte automatisée de données, la règle veut qu’on se présente, qu’on donne les moyens au webmaster de vous contacter par email, et qu’on évite de revenir trop régulièrement. À défaut, l’accès vous sera bloqué après quelques requêtes. On va donc utiliser des fonctions qui permettent de charger des pages web tout en envoyant nos coordonnées au serveur.

Pour cela, et toujours avec R, on prend un chemin découpé en plusieurs étapes. Les fonctions de très “haut niveau”, c’est-à-dire qui font beaucuop d’opérations complexes en une seule fois, ne permettent en effet pas toujours de contrôler assez finement la communication avec le serveur. Notre programme commence donc par la préparation d’une ligne, appellée User-Agent, qu’on envoie au serveur pour lui signaler notre identité (personnelle et logicielle) lorsqu’on lui demande une page [2].

Ici, cette ligne est de la forme “RCurl (mon.adresse@moi.net)”, RCurl étant le “navigateur” qu’on utilise. On la communique comme ceci :

# Modules utilisés ici
library(RCurl)
library(XML)

# Adresse (URL) de la page
lieux.islam.url <-
  "http://fr.wikipedia.org/wiki/Liste_des_mosqu%C3%A9es_de_Paris"

# Identifiant que l'on envoie à Wikipedia pour se présenter
# À remplacer par votre email !
mon.adresse.mail <- "mon.adresse@moi.net"

# Assemblage du message qui va être envoyé
identifiant <- paste("RCurl", " (",
                     mon.adresse.mail, ")",
                     sep="")

# Requête
page.brute <- getURL(url = lieux.islam.url,
                     useragent = identifiant)

# On traite ensuite cet objet, pour en analyser la structure
page.lignes <- readLines(tc <- textConnection(page.brute))
               close(tc)
page.parsed <- htmlTreeParse(page.lignes,
                             useInternalNodes=TRUE,
                             asText=TRUE)

La variable page.brute est le contenu de la page web chargée, en HTML. On la transforme en lignes (page.lignes), puis on analyse sa structure (parse). On pourra ensuite appliquer la fonction de lecture simplifiée des tableaux vue précédemment. Mais avant cela on va enlever les accents du texte.

Enlever les accents

L’intérêt de cette procédure est d’avoir un contrôle fin sur les opérations de téléchargement et de transformation de la page web. En particulier, on va pouvoir enlever les accents du texte, ce qui évitera toute confusion d’encodage [3].

On utilise ici une fonction que l’on a détaillée ailleurs, et que l’on appelle Unaccent().

Le moment le plus propice pour appliquer cette fonction, dans les opérations traitement de la page, est lorsqu’elle est sous forme de lignes, à l’étape page.lignes. Les accents (ou plutôt l’encodage) sont à ce moment correctement traités.

Le programme intégral

On reprend ainsi les morceaux présentés plus haut. Au passage, on englobe les opérations dont le résultat ne nous intéresse pas dans une fonction, ce qui évite de les garder en mémoire.

# Modules utiles
library(RCurl)
library(XML)

# Adresse (URL) de la page
lieux.islam.url <-
  "http://fr.wikipedia.org/wiki/Liste_des_mosqu%C3%A9es_de_Paris"

# Identifiant que l'on enverra à Wikipedia pour se présenter
# À remplacer par votre email !
mon.adresse.email <- "mon.adresse@moi.net"

# Définition d'une fonction d'enlèvement des accents (et des '`^")
Unaccent <- function(text) {
  text      <- gsub("['`^\"]", " ", text)
  text.unac <- iconv(text, to="ASCII//TRANSLIT")
  text.unac <- gsub("['`^\"]", "", text.unac)
  return(text.unac)
}

# Fonction de téléchargement, enlèvement des accents,
# et analyse (parsing) de la structure HTML
GetUnaccentURL <- function(url.page, email='') {
  identifiant <- paste("RCurl", " (",
                       email, ")",
                       sep="")
  page.brute <- getURL(url = url.page,
                       useragent = identifiant)
  page.lignes <- readLines(tc <- textConnection(page.brute))
                 close(tc)
  page.lignes.unac <- Unaccent(page.lignes)
  page.parsed <- htmlTreeParse(page.lignes.unac,
                               useInternalNodes=TRUE,
                               asText=TRUE)
  return(page.parsed)
}

# Téléchargement de la page sur les lieux de culte musulman
lieux.islam <- GetUnaccentURL(url.page = lieux.islam.url,
                              email = mon.adresse.email)

# Extraction des tableaux
mosquees      <- readHTMLTable(lieux.islam, which=2)
salles.priere <- readHTMLTable(lieux.islam, which=3)

Et voilà [4] !

On peut maintenant cartographier ces résultats : il suffit de géocoder les adresses obtenues.

La distribution géographique apparaît clairement localisée dans l’Est parisien, soit les quartiers les moins bourgeois de la capitale ; plus le quinzième arrondissement. Les salles de prière sont globalement situées dans les mêmes quartiers que les mosquées, mais avec de fortes variations.


  1. En deux mots, le problème est le suivant : les fichiers informatiques sont constitués d’octets, des blocs élémentaires de mémoire qui peuvent prendre chacun 256 valeurs. Pour communiquer un texte, il faut transformer la suite des caractères en une série d’octets, donc de valeurs entières entre 0 et 255, et pour cela utiliser un code. Si le code employé pour déchiffrer la suite de ces valeurs numériques n’est pas le même que celui employé la créer, alors cela déforme le texte initial. Les “encodages” désignent, dans le sens usuel (qui est assez imprécis), les différents codes utilisés, dont les plus généraux se nomment ASCII, iso–8859–1 (ou Latin–1), ou encore Unicode / UTF–8.  ↩

  2. Cette méthode n’est pas vraiment un outil de sécurisation : il est possible de déclarer une fausse identité sans difficulté, et le serveur n’a aucun moyen de le contrôler. En réalité, elle est utilisée sur le web avec une visée surtout pratique : en déclarant quel est votre navigateur et sa version (par exemple, “Mozilla/5.0 (X11; Ubuntu; Linux i686; rv : 15.0) Gecko/20100101” désigne Firefox 15.0 pour Ubuntu), le serveur peut savoir comment vous envoyer une page adaptée aux capacités techniques du navigateur, ou au format d’écran de votre machine (ordinateur, téléphone mobile, tablette, etc.).  ↩

  3. Plus précisément, les caractères latins non-accentuées, disons le clavier américain, sont transcrits de la même manière par les différents encodages occidentaux standards. On peut donc se tromper d’encodage dans l’interprétation de tels textes, le résultat est toujours correct. Désaccentuer un texte permet ainsi de ne (presque) plus se soucier des questions.  ↩

  4. On aurait pu, en réalité, éviter d’enlever les accents, en appliquant la transformation suivante à la fin (et avec un équivalent pour salles.priere) : for(i in 1:length(mosquees)) {mosquees[[i]] <- iconv(from="UTF-8", to="LATIN1", mosquees[[i]])}. Celle-ci est applicable au résultat de l’extraction directe des tableaux, mais ne permet pas de se conformer à la politique d’identification de Wikipédia.  ↩

La féminisation des revues de sociologie depuis 1960

Billet écrit par B. Coulmont, A. Hobeika et É. Ollion, et publié conjointement sur http://coulmont.com et http://data.hypotheses.org

Dans un récent article (PDF), West (un biologiste, pas la sociologue du genre) et ses collègues montraient à partir des articles de JSTOR que si le sex-ratio évolue sensiblement au cours des dernières décennies, l’égalité n’est pas encore de mise entre hommes et femmes dans les publications. Ils soulignaient en particulier que les hommes sont toujours sur-représentés dans des positions de prestige (premier et dernier auteur).

Qu’en est-il en France ? Partant d’une base des revues de sciences sociales françaises compilée par A. Hobeika et E. Ollion dans le cadre d’une recherche en cours sur l’histoire de la discipline par ses publications[1], on obtient une image de la sociologie dans le temps.

D’un point de vue global, au cours des années soixante aux années quatre-vingt-dix, la féminisation progresse, mais très lentement : 81% des auteurs sont des hommes dans les années 1960, ils ne sont plus que 71% dans les années 1990[2].

pie60s

pie90s

 

 

La féminisation est aussi très inégale suivant les revues. Certaines (Archives de sciences sociales des religions, Économie et statistique, Population) voient la part des auteures féminines augmenter substantiellement, alors que d’autres restent des bastions masculins (comme les Actes de la recherche en sciences sociales et la Revue française de sociologie)[3].

paletteRdYlBu

Déterminer le sexe des auteurs à partir de leurs prénoms ?

Pour établir le sexe des auteurs, nous nous sommes appuyés sur leur prénom, méthode utilisée par West (cité plus haut) ou par Carrasco pour retrouver le sexe des pacsés [Carrasco V., 2007. — « Le pacte civil de solidarité : une forme d’union qui se banalise ». Infostat justice, 97 pp. 1–4.]

Mais quand on cherche à inférer le sexe du prénom, plusieurs méthodes sont possibles.

La première consiste à faire ce codage manuellement : la familiarité avec la discipline permet de savoir que Claude Poliak n’a pas le même sexe que Claude Dargent, que Dominique Méda et Dominique Wolton non plus. Mais c’est très chronophage.

Parmi les techniques de codage automatique, deux autres sont possibles. On peut établir une liste de prénoms indiscutablement sexués (Baptiste, Yvette, Émile) à partir d’annuaires, et leur attribuer une valeur (M/F ou 0/1), laissant indéterminés les prénoms épicènes. Toutefois, si on dispose du fichier des prénoms (INSEE), une autre possibilité est d’associer à chaque prénom un score (de féminité, de masculinité) en fonction de son usage social : ainsi 99,95% des Catherine, au XXe siècle en France, ont été déclarées à la naissance comme étant du sexe féminin ; ce chiffre est de 0,08% pour les Simon. Les Dominique sont à 41% des filles, les Claude le sont à 12%, etc. Utiliser cette méthode revient donc à supposer que les prénoms des sociologues ont la même fréquence d’utilisation pour des hommes/femmes que dans la société française toute entière, ce qui semble raisonnable.

On a ici mené un test de ces méthodes, en recodant manuellement le sexe des auteurs pour une revue, la Revue Française de Sociologie. On compare les résultats à ceux des deux autres procédures. Pour la période 1960-1999, le nombre d’articles de cette revue dans notre base est de 1723. En excluant ceux pour lesquels aucun auteur n’est mentionné[4], on a in fine 1329 prénoms.

Les trois méthodes donnent sensiblement le même résultat, malgré des nombres de cas différents sur lesquels elles butent (« NA méthode » ci-dessous). Avec 17 prénoms non-détectés seulement (parfois répétés, d’où les 28 NA), le fichier des prénoms (INSEE) apparaît comme une solution à la fois commode et efficace pour un traitement automatisé tel que celui qu’on vient de faire[5].

Codage manuel Liste restreinte de prénoms Fichier des prénoms
Homme 79.08 78.64 78.67
Femme 20.92 21.35 21.33
Nb. individus 1329/1723 1063/1723 1301/1723
Infos manquantes 394 394 394
NA méthode 0 266 28

 

Des chiffres sur la situation dans la sociologie étasunienne, calculés avec des méthodes similaires, sont disponibles chez Neal Caren et chez Philip Cohen.

Et ci-dessous le graphique avec l’ensemble des revues de sociologies prises en compte dans l’analyse (cliquer pour agrandir).
All-BuYlRd


[1] Elle recense les publications dans les revues de sociologie française depuis les années 1960 (articles et symposiums, mais pas compte-rendus). La base est organisée par signatures : chaque ligne désigne un auteur et un article (par exemple, Bourdieu P. & Wacquant L. 1999 donne lieu à deux lignes dans la base : une pour chaque auteur).

[2] La base recense plus de 20 000 articles et comptes-rendus dans une vingtaine de journaux : Agora, Actes de la Recherche en Sciences Sociales, Archives de Sciences Sociales des Religions, Critique internationale, Déviance et société, Espace population et sociétés, économie et statistiques, Genèses, Pôle Sud, Politix, Population, Réseaux, la Revue Française de Sociologie, Sociétés contemporaines, Sociologie et santé, Tiers-Monde. Elle s’appuie largement sur les données du site Persée, complétées ponctuellement pour les revues qui en sont absentes.

[3] Dont B. Lahire disait récemment qu’elles étaient « les deux revues françaises de sociologie les plus académiques »).

[4] Soit il n’y en avait pas, soit on n’a pas réussi à le dissocier du nom dans les rares cas où les deux n’étaient pas clairement séparés. C’est une limite de ce traitement complètement automatisé, même si on a de bonnes raisons de penser que cela ne change rien aux résultats présentés ici.

[5] Si les prénoms sont à l’avenir plus épicènes, alors cette méthode pourrait s’avérer problématique. Elle l’est parfois entre pays, Jean Leca n’étant pas du même sexe que Jean Comaroff.

 

Et pourtant, ils mentent…

Âges déclarés et sites de rencontres : une procédure de collecte automatisée de données

S’il est un fait sur lequel s’accordent toutes les études sur les sites de rencontre, c’est la tendance de leurs utilisateurs à sous-déclarer leur âge. Il est souvent démontré en comparant les profils en ligne à une source d’information plus fiable, le plus souvent un entretien. On propose de retrouver ce résultat  à partir d’une analyse quantitative faite à distance, sans rencontrer d’usager de ces sites, et en quelques minutes. Disons le immédiatement, les résultats obtenus sont moins riches et plus incertains qu’une véritable enquête. Mais parce que l’objectif est d’illustrer les techniques de collecte automatique de données, on repart de ce fait bien établi pour proposer une méthode pas-à-pas.

Lire la suite sur Quanti