using TidierHace unos días leía que se había retractado un artículo muy citado sobre los beneficios del uso de la IA en el aprendizaje. El resultado era muy contraintuitivo y, de hecho, no es cierto.
Esto me hizo pensar que últimamente han aumentado mucho el número de retractaciones de artículos de investigación y me planteé ver la evolución. De paso era una buena excusa para aprender un par de cosas sobre el procesado de datos con Julia y el paquete de análisis de datos Tidier.jl, que está inspirado en el tidyverse de R.
Carga de la librería
El uso es muy sencillo, solo tenemos que cargar la librería Tidier y ya se ocupa de todo:
Datos a procesar
Lo primero es encontrar una base de datos con artículos retirados. Afortunadamente Retraction Watch recoge esta información, que habitualmente se encuentra muy dispersa.
Tiene la base de datos en un fichero CSV que podemos leer:
rdb = read_csv("https://gitlab.com/crossref/retraction-watch-data/-/raw/main/retraction_watch.csv");He añadido un ; para evitar la salida del comando, ya que muestra las primeras y las últimas entradas de la base de datos y no se trata de que la lectura de este post quede muy farragosa.
Podemos hacernos una idea de la estructura de la base de datos con @glimpse:
@glimpse rdbRows: 70529
Columns: 21
.Record ID Union{Missing, Int64}70871, 70868, 70751, 70731, 70730, 70729, 70
.Title Union{Missing, String}The Uptake of Apoptotic Cells Drives Coxiel
.Subject Union{Missing, String}(BLS) Microbiology;(HSC) Medicine - General
.Institution Union{Missing, String}Unité de Recherche sur les Maladies Infecti
.Journal Union{Missing, String}PLoS Pathogens, PLoS Neglected Tropical Dis
.Publisher Union{Missing, String}PLoS, PLoS, Elsevier, Springer - Nature Pub
.Country Union{Missing, String}France, Senegal, Egypt, Saudi Arabia, China
.Author Union{Missing, String}Marie Benoit;Eric Ghigo;Christian Capo;Didi
.URLS Union{Missing, String}https://retractionwatch.com/?s=Didier+Raoul
.ArticleType Union{Missing, String}Research Article;, Research Article;, Clini
.RetractionDateUnion{Missing, InlineStrings.String31}5/12/2026 0:00, 5/26/2026 0
.RetractionDOI Union{Missing, String}10.1371/journal.ppat.1014210, 10.1371/journ
.RetractionPubMedIDUnion{Missing, Int64}42118727, 42189775, 42139973, 0, 0, 0, 0
.OriginalPaperDateUnion{Missing, InlineStrings.String31}5/16/2008 0:00, 9/14/201
.OriginalPaperDOIUnion{Missing, String}10.1371/journal.ppat.1000066, 10.1371/jou
.OriginalPaperPubMedIDUnion{Missing, Int64}18483547, 20856858, 33045448, 0, 0, 0
.RetractionNatureUnion{Missing, InlineStrings.String31}Retraction, Retraction, R
.Reason Union{Missing, String}Author Unresponsive;Concerns/Issues about H
.Paywalled Union{Missing, InlineStrings.String7}No, No, No, No, No, No, No,
.Notes Union{Missing, String}missing, missing, missing, missing, missing
.Column21 Missing missing, missing, missing, missing, missing, missi
Las columnas que nos van a interesar son RetractionDate y ArticleType, ya que me quiero centrar solo en los artículos de investigación. No quiero que aparezcan ni los estudios clínicos, comunicaciones a congresos o artículos de revisión.
Tabla con las estadísticas anuales
Tidier.jl es fantástico para trabajar con datos, es realmente sencillo. El procesado de las más de 70_000 entradas de la base de datos es casi instantáneo y con una sintaxis muy sencilla. Era la primera vez que lo utilizaba y solo me ha costado leer el tutorial y echar un par de vistazos a la documentación.
Todo el procesao se hace aquí:
tabla = @chain rdb begin
@filter ArticleType=="Research Article;"
@mutate(Year = year(mdy_hm(RetractionDate)))
@group_by Year
@summarise n=n()
@arrange desc(Year)
end| Row | Year | n |
|---|---|---|
| Int64 | Int64 | |
| 1 | 2026 | 717 |
| 2 | 2025 | 3499 |
| 3 | 2024 | 5793 |
| 4 | 2023 | 11820 |
| 5 | 2022 | 4406 |
| 6 | 2021 | 4229 |
| 7 | 2020 | 2777 |
| 8 | 2019 | 2628 |
| 9 | 2018 | 1664 |
| 10 | 2017 | 1389 |
| 11 | 2016 | 1391 |
| 12 | 2015 | 1172 |
| 13 | 2014 | 790 |
| ⋮ | ⋮ | ⋮ |
| 44 | 1983 | 5 |
| 45 | 1982 | 5 |
| 46 | 1981 | 2 |
| 47 | 1980 | 3 |
| 48 | 1977 | 9 |
| 49 | 1975 | 2 |
| 50 | 1971 | 1 |
| 51 | 1970 | 1 |
| 52 | 1968 | 1 |
| 53 | 1967 | 2 |
| 54 | 1966 | 1 |
| 55 | 1960 | 1 |
Aquí hay una secuencia de operaciones para crear una tabla, que he llamado tabla, con el número de retrataciones por año:
- Selección con
@filterde las entradas de la base de datos que son artículos de investigación. - Creación de la columna
Yeara partir de la fecha de retirada del artículo. - Agrupamos con
@group_bylas entradas de la base de datos por años. - Con
@summarisecontamos el número de artículos en cada grupo. - Para que la tabla quede más arreglada, la ordenamos en orden descendente de año con
@arrange.
Viendo la tabla, se observa como el número de retractaciones aumenta con los años.
Creación de figuras
Una tabla está bien, pero (casi) siempre es mejor un gráfico.
Hacer los gráficos también es muy sencillo:
ggplot(tabla, @aes(x=Year, y=n)) +
geom_line(color=:teal, linewidth=2) +
geom_point(color=:red, stroke=1, strokecolor="black", size=15, alpha=0.8) +
theme_light()Puede resultar interesante representar en eje y en escala logarítmica, lo que también resulta muy sencillo:
ggplot(tabla, @aes(x=Year, y=n)) +
geom_line(color=:teal, linewidth=2) +
geom_point(color=:red, stroke=1, strokecolor="black", size=15, alpha=0.8) +
scale_y_log10() +
theme_light()Conclusión
La primera conclusion es que Tidier.jl es una maravilla. Es rápido y fácil de usar. Se entiende que tidyverse y ggplot sean razones por las que hay muchos usuarios de R.
La segunda conclusión es que entre el uso de la IA, la falta de honradez de algunos autores, la presión por publicar, etc. está haciendo que el número de retractaciones de papers se esté disparando y nada hace pensar que la situación vaya a mejorar. Todo lo contrario.