Aperçu local des articles retirés de Retraction Watch

Où l’on récupère les données brutes de la base de données des articles retirés de Retraction Watch pour en extraire des données sur une institution en particulier avec quelques visualisations.
HumanitésNumériques
Author

Pascal Martinolli

Published

January 14, 2026

Retraction Watch

Retraction Watch une plateforme (blogue et base de données bibliographiques) crée par Ivan Oransky et Adam Marcus en 2010.

Elle surveille, rapporte et analyse les rétractations d’articles scientifiques, ainsi que les problèmes d’intégrité dans la recherche (données frauduleuses, plagiat, etc.).

Depuis 2023, elle verse ses données dans CrossRef. CrossRef donne accès à ces données via son API mais surtout dans notre cas aujourd’hui via un dépôt dans la forge logicielle GitLab à https://gitlab.com/crossref/retraction-watch-data

Traitement des données

  • Créer un dossier RW_local sur son ordinateur pour toutes les données du projet.
  • Telécharger le fichier retraction_watch.csv et le placer dans le dossier RW_local
  • Ouvrir le logiciel R Studio
    • Create a new R script
    • Créer un fichier main.R dans le dossier RW_local

Copier-coller ce code dans le fichier main.R :

setwd("C:/Users/martinop/Downloads/RW_local")   
# remplacer par l'emplacement de votre dossier 

retraction_watch <- read.csv("retraction_watch.csv")
df <- retraction_watch

df_local <- df[
  grepl(
    "universite de montreal|university of montreal|U de Montreal|U of Montreal|UdeM",
    # remplacer par le nom et les alias de votre institution
    tolower(iconv(df$Institution, to = "ASCII//TRANSLIT")),  
    # ignore les majuscules et les accents
    ignore.case = TRUE
  ),
]

Cliquer sur Run (ligne par ligne ou tout).

Ce programme va charger les 68 000 enregistrements de la base et ne conserver que ceux dont la colonne Institution (des auteurs) contient les mots que vous avez demandé.

Dans mon cas, il en reste 43. On peut le voir dans le menu Environment à droite (43 obs. of 20 variables).

Visualisations

Afficher la liste de tous les titres

cat(paste(df_local$Title, collapse = "\n"))

Graphe de la date de publication originale

# Convert "MM/DD/YYYY 0:00" → Date
df_local$OriginalPaperDate <- as.Date(df_local$OriginalPaperDate,
                                     format = "%m/%d/%Y %H:%M")
# Extraire l'année
df_local$year <- format(df_local$OriginalPaperDate, "%Y")

# Draw a histogram
barplot(
  table(df_local$year),
  main = "UdeM – Original Paper Dates by Year",
  xlab = "Year",
  ylab = "Count",
  las = 2
)

Graphe des raisons de rétractations

# Compter les occurrences des raisons
reason_counts <- sort(table(df_local$Reason), decreasing = FALSE)

# Plus d’espace pour les labels
par(mar = c(5, 30, 4, 2))   # bottom, left, top, right (agrandir surtout à gauche)

# Barplot simple
barplot(
  reason_counts,
  horiz = TRUE,
  main = "Distribution des raisons de rétractations",
  xlab = "Nombre",
  #ylab = "Raisons",
  las = 1,
  cex.names = .8
)

Graphe des auteurs


# Extraire tous les auteurs, séparer par ";", nettoyer les espaces
all_authors <- unlist(strsplit(df_local$Author, ";"))   # sépare tous les auteurs
all_authors <- trimws(all_authors)                     # retire les espaces
all_authors <- all_authors[all_authors != ""]          # enlève les vides

# Compter la fréquence
author_counts <- table(all_authors)

# Trier par fréquence décroissante
author_counts <- sort(author_counts, decreasing = FALSE)

# Ajuster les marges pour avoir de la place pour les noms
par(mar = c(5, 20, 4, 2))  # bottom, left, top, right

# Barplot horizontal
barplot(
  author_counts,
  horiz = TRUE,
  las = 1,           # labels horizontaux
  cex.names = 0.7,   # taille des noms
  main = "Distribution des auteurs",
  xlab = "Nombre"
)

Graphe des revues

# Nettoyer les journaux
all_journals <- trimws(df_UdeM$Journal)
all_journals <- all_journals[all_journals != ""]  # enlever vides

# Compter la fréquence
journal_counts <- table(all_journals)
journal_counts <- sort(journal_counts, decreasing = FALSE)   

# Ajuster marges pour les labels
par(mar = c(5, 25, 4, 2))  # agrandir la marge gauche pour les noms

# Barplot horizontal
barplot(
  journal_counts,
  horiz = TRUE,
  las = 1,           # labels horizontaux
  cex.names = 0.7,   # taille des noms
  main = "Distribution des revues",
  xlab = "Nombre"
)

Graphe des pays des auteurs

# Extraire tous les pays, séparer par ";", nettoyer les espaces
all_countries <- unlist(strsplit(df_local$Country, ";"))   # sépare 
all_countries <- trimws(all_countries)                     # retire les espaces
all_countries <- all_countries[all_countries != ""]          # enlève les vides

# Compter la fréquence
country_counts <- table(all_countries)

# Trier par fréquence décroissante
country_counts <- sort(country_counts, decreasing = FALSE)

# Ajuster les marges pour avoir de la place pour les noms
par(mar = c(5, 20, 4, 2))  # bottom, left, top, right

# Barplot horizontal
barplot(
  country_counts,
  horiz = TRUE,
  las = 1,           # labels horizontaux
  cex.names = 0.7,   # taille des noms
  main = "Distribution des pays",
  xlab = "Nombre"
)