Análisis bibliométricos

El análisis a través de indicadores de la ciencia suele llevar varios nombres: cienciometría, infometría y bibliometría… Acá vamos a usar el último término porque hace más evidente el papel de la fuente (resultados de búsquedas de bibliografía).

El objetivo de este tutorial es guiarlos en la elaboración de un análisis bibliométrico.

Los análisis bibliométricos buscan medir y ver tendencas en la producción científica. El foco puede ponerse en alguna de estas unidades de análisis:

Acá tienen algunos ejemplos de distintos análisis bibliométricos para que tengan de referencia:

Artículo Criterio / Filtros Preguntas / Indicadores
Becerra, G., & Ratovicius, C. (2022)
  • Buscador = Scopus

  • Criterio = “big data” in title, abstracts, and keywords

  • Subject area = social sciences, psychology and humanities and arts

  • Language = English

  • Publication type = journal articles.

  • RQ1. Production and authorship trends: countries, institutions, collaboration, authors per publications

  • RQ2. Topics and research areas

  • RQ3. Citation: top cited publications, journals for most cited publications?

Guerrero (2019)
  • Buscador = Google Scholar

  • Criterio = [Title/Abstract/Text] “Inspección en Educación” OR “Inspección educativa” OR “Inspección Escolar” OR “Inspección de la Educación” OR “Supervisión educativa” OR “Supervisión centros educativos”

Distribución (comparación) por tema y por: Cantidad de autores, Metodología, Citas, Año de publicación, Indexación, Institución, Referencias más citadas
Pereyra, Romero y Villegas (2015)
  • Buscador = Scielo
  • Criterio = documentos publicados por RMS
  • Estadística de producción (por año)

  • Citación recibida (por año de publicación del artículo citado, por paises de artículos que los citaban)

  • Indicadores bibliométricos (factor de impacto; número de accesos, indicadores de impacto: Scimago JR, F1 Scielo, Q en Scimago)

Fuentes / Bases de datos

Estas son algunas bases que permiten exportar una base con los resultados de una búsqueda.

Cada fuente incluye distintos criterios de búsqueda y devuelve distintos tipos de información.

Scopus: base de datos de revistas de excelencia, ofrece datasets completos y bien estructurados (incluyen abstracts, palabras claves, número de citas, referencias, información de los autores y su afiliación institucional, DOI, etc.) que se pueden bajar en CSV y BIB. CONTRAS: se accede con suscripción institucional

Acá vamos a consultar la producción de UFLO, limitándonos a artículos. El criterio de búsqueda es:

AFFIL ( "universidad de flores" ) AND ( LIMIT-TO ( DOCTYPE , "ar" ) )

uflo_scopus <- read.csv('./biblio/uflo - scopus.csv')
glimpse(uflo_scopus)
Rows: 49
Columns: 35
$ Authors                       <chr> "Franco E.; Coterón J.; Gómez V.; Spray …
$ Author.full.names             <chr> "Franco, Evelia (55735540900); Coterón, …
$ Author.s..ID                  <chr> "55735540900; 57221973608; 57200192794; …
$ Title                         <chr> "A person-centred approach to understand…
$ Year                          <int> 2021, 2017, 2023, 2017, 2019, 2016, 2017…
$ Source.title                  <chr> "Psychology of Sport and Exercise", "Uni…
$ Volume                        <chr> "57", "16", "25", "10", "62", "227", "20…
$ Issue                         <chr> "", "4", "1", "4", "5", "6", "50", "4", …
$ Art..No.                      <chr> "102021", "", "e1742", "e1837", "", "190…
$ Page.start                    <int> NA, 1, NA, NA, 464, NA, 47, NA, 49, 235,…
$ Page.end                      <int> NA, 11, NA, NA, 471, NA, 72, NA, 53, 267…
$ Page.count                    <int> NA, 10, NA, NA, 7, NA, 25, NA, 4, 32, 10…
$ Cited.by                      <int> 3, 2, 0, 9, 14, 20, 7, 10, 0, 9, 21, 25,…
$ DOI                           <chr> "10.1016/j.psychsport.2021.102021", "10.…
$ Link                          <chr> "https://www.scopus.com/inward/record.ur…
$ Affiliations                  <chr> "Universidad Pontificia Comillas, Calle …
$ Authors.with.affiliations     <chr> "Franco E., Universidad Pontificia Comil…
$ Abstract                      <chr> "The present study firstly establishes p…
$ Author.Keywords               <chr> "Burnout; Cluster analysis; Job pressure…
$ Index.Keywords                <chr> "adult; article; burnout; cluster analys…
$ References                    <chr> "Abos A., Haerens L., Sevil-Serrano J., …
$ Correspondence.Address        <chr> "E. Franco; Universidad Pontificia Comil…
$ Editors                       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ Publisher                     <chr> "Elsevier Ltd", "Pontificia Universidad …
$ ISSN                          <chr> "14690292", "16579267", "02113481", "193…
$ ISBN                          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ CODEN                         <chr> "", "", "", "", "POBGA", "WAPLA", "", "E…
$ PubMed.ID                     <int> NA, NA, NA, NA, NA, NA, NA, 28342050, NA…
$ Language.of.Original.Document <chr> "English", "English", "English", "Englis…
$ Abbreviated.Source.Title      <chr> "Psychol. Sport Exerc.", "Univ. Psychol.…
$ Document.Type                 <chr> "Article", "Article", "Article", "Articl…
$ Publication.Stage             <chr> "Final", "Final", "Final", "Final", "Fin…
$ Open.Access                   <chr> "", "All Open Access; Bronze Open Access…
$ Source                        <chr> "Scopus", "Scopus", "Scopus", "Scopus", …
$ EID                           <chr> "2-s2.0-85111182303", "2-s2.0-8504012381…

Scielo: buscador de excelencia de revistas de acceso abierto latinoamericanas, ofrece datasets que se pueden exportar en BIB y CSV (los CSV no suelen estar bien estructurados). Incluyen menos datos que Scopus… pero tiene URLs para poder acceder al texto completo.

Acá vamos a buscar sobre “sistemas sociales”:

https://search.scielo.org/?lang=es&count=15&from=0&output=site&sort=&format=summary&fb=&page=1&q=%22sistemas+sociales%22

library(bib2df)
ss_scielo <- bib2df::bib2df(file = './biblio/sistemassociales - scielo.bib')
Warning in readLines(file): incomplete final line found on
'./biblio/sistemassociales - scielo.bib'
Some BibTeX entries may have been dropped.
            The result could be malformed.
            Review the .bib file and make sure every single entry starts
            with a '@'.
Warning: `as_data_frame()` was deprecated in tibble 2.0.0.
ℹ Please use `as_tibble()` (with slightly different semantics) to convert to a
  tibble, or `as.data.frame()` to convert to a data frame.
ℹ The deprecated feature was likely used in the bib2df package.
  Please report the issue to the authors.
glimpse(ss_scielo) 
Rows: 158
Columns: 38
$ CATEGORY     <chr> "ARTICLE", "ARTICLE", "ARTICLE", "ARTICLE", "ARTICLE", "A…
$ BIBTEXKEY    <chr> "TONKONOFF2023", "DI PIETRO2022", "ORTIZ2022", "ALVEAR AT…
$ ADDRESS      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ ANNOTE       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ AUTHOR       <list> "Tonkonoff, Sergio", "Di Pietro, Simone", "Ortiz, Luis, …
$ BOOKTITLE    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ CHAPTER      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ CROSSREF     <chr> "10.17163/uni.n38.2023.10", "10.24201/edu.v37i3.2073", "1…
$ EDITION      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ EDITOR       <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ HOWPUBLISHED <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ INSTITUTION  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ JOURNAL      <chr> "Universitas-XXI, Revista de Ciencias Sociales y Humanas"…
$ KEY          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ MONTH        <chr> "08", "12", "12", "12", "09", "08", "06", "06", "06", "12…
$ NOTE         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ NUMBER       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ ORGANIZATION <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ PAGES        <chr> "231-252", "807-837", "179-195", "9-34", "51-64", "99-116…
$ PUBLISHER    <chr> "scielo", "scielo", "scielo", "scielo", "scielo", "scielo…
$ SCHOOL       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ SERIES       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ TITLE        <chr> "Individuo, sociedad y campo social. Aproximaciones a la …
$ TYPE         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ VOLUME       <chr> "", "37", "9", "", "", "71", "", "31", "101", "18", "9", …
$ YEAR         <dbl> 2023, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 202…
$ LANGUAGE     <chr> "en,  es", "en,  es", "es,  en", "en,  es", "en,  es", "e…
$ URL          <chr> "http://scielo.senescyt.gob.ec/scielo.php?script=sci_artt…
$ TITLE.1      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ JOURNAL.1    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ AUTHOR.1     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ VOLUME.1     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ YEAR.1       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ PUBLISHER.1  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ LANGUAGE.1   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ MONTH.1      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ PAGES.1      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ URL.1        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…

Google Scholar: No es un buscador de calidad; cualquier revista o repositorio sin evaluaciones ni cuidado en la publicación (lo que se traduce en falta de datos para analisis bibliometricos); pero sí es uno de los motores más usados, entonces es importante para una observación de segundo orden.

Para acceder a los datos de Google Scholar (no se puede exportar directamente desde la página) podemos utilizar un programa llamado Publish or Perish:

Acá vamos a buscar sobre “educational coaching”

edu_scholar <- bib2df::bib2df(file = 'biblio/educationalcoaching - scholar.bib')
Some BibTeX entries may have been dropped.
            The result could be malformed.
            Review the .bib file and make sure every single entry starts
            with a '@'.
Column `YEAR` contains character strings.
              No coercion to numeric applied.
glimpse(edu_scholar)
Rows: 200
Columns: 32
$ CATEGORY     <chr> "ARTICLE", "ARTICLE", "BOOK", "ARTICLE", "ARTICLE", "ARTI…
$ BIBTEXKEY    <chr> "pop00001", "pop00002", "pop00003", "pop00004", "pop00005…
$ ADDRESS      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ ANNOTE       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ AUTHOR       <list> <"K Okoye", "S Hosseini", "A Arrona-Palacios", "...">, <…
$ BOOKTITLE    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ CHAPTER      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ CROSSREF     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ EDITION      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ EDITOR       <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ HOWPUBLISHED <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ INSTITUTION  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ JOURNAL      <chr> "IEEE …", "Educatio Siglo …", NA, "Journal of School Psyc…
$ KEY          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ MONTH        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ NOTE         <chr> "9 cites: https://scholar.google.com/scholar?cites=153403…
$ NUMBER       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ ORGANIZATION <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ PAGES        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ PUBLISHER    <chr> "ieeexplore.ieee.org", "digibuo.uniovi.es", "books.google…
$ SCHOOL       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ SERIES       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ TITLE        <chr> "Impact of educational coaching programs and mentoring se…
$ TYPE         <chr> NA, "PDF", "BOOK", NA, NA, "PDF", "BOOK", NA, NA, NA, NA,…
$ VOLUME       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ YEAR         <chr> "2021", "2019", "2018", "2023", "2019", "2016", "2018", "…
$ URL          <chr> "https://ieeexplore.ieee.org/abstract/document/9392232/",…
$ FULLTEXT     <chr> "https://ieeexplore.ieee.org/iel7/6287639/9312710/0939223…
$ RELATED      <chr> "https://scholar.google.com/scholar?q=related:s5HbYWL649Q…
$ ABSTRACT     <chr> "… 1) How can we analyze the different (quantitative and …
$ NOTE.1       <chr> "Query date: 2023-06-09 12:03:33", "Query date: 2023-06-0…
$ DOI          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
edu_scholar_metrics <- read.csv('biblio/educationalcoachingmetrics - scholar.csv')
glimpse(edu_scholar_metrics)
Rows: 1
Columns: 34
$ Query             <chr> "\"educational coaching\", no patents"
$ Source            <chr> "Google Scholar"
$ Papers            <int> 200
$ Citations         <int> 5001
$ Years             <int> 93
$ Cites_Year        <dbl> 53.77
$ Cites_Paper       <dbl> 25.01
$ Cites_Author      <dbl> 2881.68
$ Papers_Author     <dbl> 133.92
$ Authors_Paper     <dbl> 1.97
$ h_index           <int> 27
$ g_index           <int> 70
$ hc_index          <int> 22
$ hI_index          <dbl> 12.79
$ hI_norm           <int> 20
$ AWCR              <dbl> 658.38
$ AW_index          <dbl> 25.66
$ AWCRpA            <dbl> 374.66
$ e_index           <dbl> 61.36
$ hm_index          <dbl> 19.15
$ QueryDate         <chr> "2023-06-09 12:04:19"
$ Cites_Author_Year <dbl> 30.98
$ hI_annual         <dbl> 0.22
$ h_coverage        <dbl> 89.9
$ g_coverage        <dbl> 98.5
$ star_count        <int> 12
$ year_first        <int> 1930
$ year_last         <int> 2023
$ ECC               <int> 5001
$ acc1              <int> 60
$ acc2              <int> 43
$ acc5              <int> 24
$ acc20             <int> 7
$ hA                <int> 11

Publish or Perish además nos da acceso a otras fuentes como:

  • OpenAlex: reune varias fuentes, incluso extra-academicas, como wikipedia. Lo mejor es navegar la página y conseguir un ID de alguna entidad que indexa (se puede buscar por conceptos e info de autores); openalex también se puede consultar directo desde R con la librería openalexR y es tan simple como:
library(openalexR)

openalexR::oa_fetch(entity = "works", 
                    author.id = "A4334458703", 
                    verbose = TRUE) %>% glimpse()
  • PubMed: más usada en salud;

  • CrossRef : indexa documentos con DOI. la info que devuelve es básica pero suele ser útil para completar a otras consultas. También se puede acceder directo con el pack rcrossref

Acá vamos con la producción de UFLO, exportado como .JSON desde PoP:

uflo_crossref <- jsonlite::fromJSON(txt = './biblio/uflo - crossref.json')
Warning: JSON string contains (illegal) UTF8 byte-order-mark!
glimpse(uflo_crossref)
Rows: 1,000
Columns: 19
$ type         <chr> "journal-article", "report", "journal-article", "journal-…
$ title        <chr> "A New Indole Derivative from the Red Alga <i>Chondria at…
$ source       <chr> "Journal of Natural Products", NA, "Human-animal interact…
$ issn         <chr> "0163-3864", NA, "2333-522X", "0120-8942", "0001-4842", "…
$ publisher    <chr> "American Chemical Society (ACS)", "siicsalud.com", "CABI…
$ doi          <chr> "10.1021/np980114c", "10.21840/siic/157475", "10.1079/hai…
$ article_url  <chr> "http://dx.doi.org/10.1021/np980114c", "http://dx.doi.org…
$ fulltext_url <chr> "https://pubs.acs.org/doi/pdf/10.1021/np980114c", NA, NA,…
$ rank         <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
$ year         <int> 1998, 2018, 2022, 2022, 2019, 2021, 2013, 2002, 2012, 201…
$ volume       <int> 61, 0, 2022, 31, 52, 3, 61, 50, 2012, 17, 17, 2021, 2022,…
$ issue        <int> 12, 0, 0, 2, 9, 2, 47, 8, 0, 1, 4, 0, 5, 4, 0, 0, 13, 8, …
$ startpage    <int> 1560, 0, 0, 1, 2609, 303, 11603, 2344, 1, 118, 291, 1, 0,…
$ endpage      <int> 1563, 0, 0, 9, 2619, 326, 11609, 2349, 7, 151, 295, 9, 0,…
$ cites        <int> 71, 2, 1, 0, 51, 0, 14, 93, 5, 2, 18, 3, 1, 0, 1, 1, 94, …
$ ecc          <int> 71, 2, 1, 0, 51, 0, 14, 93, 5, 2, 18, 3, 1, 0, 1, 1, 94, …
$ use          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ authors      <list> <"Danilo Davyt", "Walter Entz", "Rafael Fernandez", "Raú…
$ abstract     <chr> NA, NA, "Abstract: Animal Hoarding Disorder (AHD) is a re…

ScimagoJR: información de revistas de calidad; mantiene el índice de calidad de revistas más utilizado, que las distingue en cuartiles (Q1-Q3), con información anual. Podemos usar el paquete sjrdata para bajar estadisticas de scimago tanto en general, o podemos filtrar alguna revista, e.g., por ISSN (identificador de publicaciones seriadas)

Acá filtramos a la revista Chilena Cinta de Moebio, especializada en epistemología de las ciencias sociales:

# devtools::install_github("ikashnitsky/sjrdata")
library(sjrdata)
scimago_total <- sjrdata::sjr_journals
glimpse(scimago_total)
Rows: 620,540
Columns: 21
$ year                <chr> "1999", "1999", "1999", "1999", "1999", "1999", "1…
$ rank                <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
$ sourceid            <dbl> 16801, 18434, 20651, 18395, 14181, 22126, 20798, 1…
$ title               <chr> "Annual Review of Biochemistry", "Cell", "Annual R…
$ type                <chr> "journal", "journal", "journal", "journal", "journ…
$ issn                <chr> "15454509, 00664154", "00928674, 10974172", "15453…
$ sjr                 <dbl> 50.518, 43.449, 43.020, 35.051, 25.760, 25.272, 22…
$ sjr_best_quartile   <chr> "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q…
$ h_index             <dbl> 305, 814, 309, 226, 248, 453, 417, 267, 75, 414, 4…
$ total_docs_year     <dbl> 30, 351, 29, 25, 21, 298, 151, 104, 48, 193, 296, …
$ total_docs_3years   <dbl> 80, 1340, 81, 61, 60, 889, 438, 318, 55, 203, 757,…
$ total_refs          <dbl> 5913, 15964, 5236, 4134, 3419, 16623, 7770, 5829, …
$ total_cites_3years  <dbl> 3513, 48292, 4116, 1815, 1631, 17391, 9207, 6602, …
$ citable_docs_3years <dbl> 80, 1332, 81, 60, 60, 888, 438, 298, 55, 202, 745,…
$ cites_doc_2years    <dbl> 36.20, 34.68, 47.65, 26.49, 22.79, 18.98, 20.43, 2…
$ ref_doc             <dbl> 197.10, 45.48, 180.55, 165.36, 162.81, 55.78, 51.4…
$ country             <chr> "United States", "United States", "United States",…
$ region              <chr> "Northern America", "Northern America", "Northern …
$ publisher           <chr> "Annual Reviews Inc.", "Cell Press", "Annual Revie…
$ coverage            <chr> "1946-1948, 1950-1960, 1962-2021", "1974-2021", "1…
$ categories          <chr> "Biochemistry (Q1)", "Biochemistry, Genetics and M…
scimago_moebio <- scimago_total %>% filter(issn == "0717554X")
glimpse(scimago_moebio)
Rows: 5
Columns: 21
$ year                <chr> "2017", "2018", "2019", "2020", "2021"
$ rank                <dbl> 32711, 18614, 20258, 13742, 19867
$ sourceid            <dbl> 21100821156, 21100821156, 21100821156, 21100821156…
$ title               <chr> "Cinta de Moebio", "Cinta de Moebio", "Cinta de Mo…
$ type                <chr> "journal", "journal", "journal", "journal", "journ…
$ issn                <chr> "0717554X", "0717554X", "0717554X", "0717554X", "0…
$ sjr                 <dbl> NA, 0.188, 0.171, 0.336, 0.173
$ sjr_best_quartile   <chr> "-", "Q2", "Q2", "Q1", "Q2"
$ h_index             <dbl> 4, 4, 4, 4, 4
$ total_docs_year     <dbl> 28, 40, 28, 24, 12
$ total_docs_3years   <dbl> 0, 28, 68, 96, 92
$ total_refs          <dbl> 432, 532, 387, 377, 194
$ total_cites_3years  <dbl> 0, 8, 20, 36, 42
$ citable_docs_3years <dbl> 0, 28, 68, 96, 92
$ cites_doc_2years    <dbl> 0.00, 0.29, 0.29, 0.37, 0.35
$ ref_doc             <dbl> 15.43, 13.30, 13.82, 15.71, 16.17
$ country             <chr> "Chile", "Chile", "Chile", "Chile", "Chile"
$ region              <chr> "Latin America", "Latin America", "Latin America",…
$ publisher           <chr> "Universidad de Chile, Facultad de Ciencias Social…
$ coverage            <chr> "2017-2021", "2017-2021", "2017-2021", "2017-2021"…
$ categories          <chr> "Philosophy; Social Sciences (miscellaneous)", "Ph…

Aunque también podríamos escrapear la página directamente:

library(rvest)

Attaching package: 'rvest'
The following object is masked from 'package:readr':

    guess_encoding
link <- "https://www.scimagojr.com/journalsearch.php?q=21100790345&tip=sid&clean=0"
scrapear_scimago <- function(link) {
  p <- read_html(link)
  t <- p %>% html_elements(css = ".cellcontent")
  data <- list()
  for( i in 1:length(t)) {
    d <- t[i] %>% html_elements(css = ".cellslide") 
    data[[d[[1]] %>% html_attr("id")]] = d[[2]] %>% html_node("table") %>% html_table()
  }
  return(data)
}

scimago_scrap <- scrapear_scimago(link = link)
str(scimago_scrap)
List of 9
 $ svgquartiles          : tibble [6 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Category: chr [1:6] "Social Sciences (miscellaneous)" "Social Sciences (miscellaneous)" "Social Sciences (miscellaneous)" "Social Sciences (miscellaneous)" ...
  ..$ Year    : int [1:6] 2017 2018 2019 2020 2021 2022
  ..$ Quartile: chr [1:6] "Q4" "Q4" "Q4" "Q4" ...
 $ svgsjr                : tibble [6 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ Year: int [1:6] 2017 2018 2019 2020 2021 2022
  ..$ SJR : num [1:6] 0.102 0.121 0.112 0.103 0.108 0.114
 $ svgtotaldocs          : tibble [7 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ Year     : int [1:7] 2016 2017 2018 2019 2020 2021 2022
  ..$ Documents: int [1:7] 14 12 10 10 12 1 5
 $ svgcitesperdoc        : tibble [21 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Cites per document: chr [1:21] "Cites / Doc. (4 years)" "Cites / Doc. (4 years)" "Cites / Doc. (4 years)" "Cites / Doc. (4 years)" ...
  ..$ Year              : int [1:21] 2016 2017 2018 2019 2020 2021 2022 2016 2017 2018 ...
  ..$ Value             : num [1:21] 0 0.071 0.308 0.417 0.261 0.182 0.182 0 0.071 0.308 ...
 $ svgcitesselfcites     : tibble [14 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Cites: chr [1:14] "Self Cites" "Self Cites" "Self Cites" "Self Cites" ...
  ..$ Year : int [1:14] 2016 2017 2018 2019 2020 2021 2022 2016 2017 2018 ...
  ..$ Value: int [1:14] 0 0 2 9 2 0 2 0 1 8 ...
 $ svgexternalcitesperdoc: tibble [14 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Cites: chr [1:14] "External Cites per document" "External Cites per document" "External Cites per document" "External Cites per document" ...
  ..$ Year : int [1:14] 2016 2017 2018 2019 2020 2021 2022 2016 2017 2018 ...
  ..$ Value: num [1:14] 0 0.083 0.25 0.176 0.094 0.094 0.13 0 0.071 0.308 ...
 $ svginternational      : tibble [7 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ Year                       : int [1:7] 2016 2017 2018 2019 2020 2021 2022
  ..$ International Collaboration: num [1:7] 7.14 8.33 0 0 25 0 20
 $ svgcitable            : tibble [14 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Documents: chr [1:14] "Non-citable documents" "Non-citable documents" "Non-citable documents" "Non-citable documents" ...
  ..$ Year     : int [1:14] 2016 2017 2018 2019 2020 2021 2022 2016 2017 2018 ...
  ..$ Value    : int [1:14] 0 2 2 2 0 0 0 0 12 24 ...
 $ svguncited            : tibble [14 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ Documents: chr [1:14] "Uncited documents" "Uncited documents" "Uncited documents" "Uncited documents" ...
  ..$ Year     : int [1:14] 2016 2017 2018 2019 2020 2021 2022 2016 2017 2018 ...
  ..$ Value    : int [1:14] 0 13 21 25 27 29 18 0 1 5 ...

JStor / Constellate: permite construir bases de datos, filtrarlas, y bajar los metadatos, pero también otros elementos (unigramas, full-text, etc.) que se usan en text-mining. Generalmente incluye a revistas de larga data de varias fuentes, que fueron digitalizadas.CONTRA: no suele incluir keywords y abstracts.

Acá nuestro único criterio / filtro fue “educational coaching”:

edu_constellate <- read.csv(file = './biblio/educationalcoaching - constellate.csv')
glimpse(edu_constellate)
Rows: 137
Columns: 23
$ id                 <chr> "https://chroniclingamerica.loc.gov/lccn/sn84020645…
$ title              <chr> "The Montgomery advertiser. [volume] : (Montgomery,…
$ isPartOf           <chr> "The Montgomery advertiser. [volume] : (Montgomery,…
$ publicationYear    <int> 1909, 1913, 2012, 2021, 1909, 1928, 2022, 2016, 201…
$ doi                <chr> "", "", "10.4135/9781446247549", "10.1111/papt.1226…
$ docType            <chr> "newspaper", "newspaper", "book", "article", "newsp…
$ docSubType         <chr> "", "", "", "", "", "", "null", "", "", "", "", "",…
$ provider           <chr> "loc-chronam", "loc-chronam", "portico", "portico",…
$ collection         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ datePublished      <chr> "1909-05-26", "1913-03-12", "2012-01-01", "2021-03-…
$ issueNumber        <chr> "", "", "", "1", "", "", "2", "", "", "", "", "155"…
$ volumeNumber       <int> NA, NA, NA, 94, NA, NA, 11, NA, NA, NA, NA, 2017, N…
$ url                <chr> "https://chroniclingamerica.loc.gov/lccn/sn84020645…
$ creator            <chr> "", "", "Sarah Fletcher; Carol Mullen", "Jeetender …
$ publisher          <chr> "Screws, Cory & Glass", "Times Pub. Co.", "SAGE Pub…
$ language           <chr> "eng", "eng", "eng", "eng", "eng", "eng", "eng", "e…
$ pageStart          <chr> "1", "1", "", "141", "1", "1", "", "", "", "1", "1"…
$ pageEnd            <chr> "12", "16", "", "172", "12", "4", "", "", "", "14",…
$ placeOfPublication <chr> "Montgomery, Ala.", "Washington [D.C.]", "", "", "M…
$ keyphrase          <chr> "", "committee; senator gallinger; president; distr…
$ wordCount          <int> 66313, 80728, 236343, 19140, 73249, 10625, 57749, 4…
$ pageCount          <int> 12, 16, 568, 32, 12, 4, 108, 795, 281, 14, 14, 10, …
$ outputFormat       <chr> "unigram; fullText", "unigram; bigram; trigram; ful…

Estructura de un reporte bibliométrico

Hay muchos tipos de reportes o artículos bibliométricos, con distintos objetivos y distintos indicadores, de modo que no hay una estructura canónica pero, como en última instancia no dejan de ser artículos, lo mejor es seguir la estructura típica IMRD y asegurarnos de aclarar lo específico de un bibliométrico:

  1. Título (claro y que dé ganas de leerlo)

  2. Resumen (100-200 palabras mencionando el tema, comentando el objetivo o preguntas, y las principales conclusiones. ¡Se escribe al final!)

  3. Introducción

    1. Dar un contexto del tema (si es una institucion su historia y actualidad, si es un tema su relevancia y el estado del conocimiento, si es un autor su importancia para un campo)

    2. Estado del arte, o algo aproximado a ello (¿qué dicen otros trabajos sobre esto? ¿o somos los primeros?)

    3. Objetivos del trabajo, o preguntas que se van a responder

  4. Metodología

    1. Fuentes de información (¿qué bases de datos o motores de búsqueda se usaron?)

    2. Criterios de búsqueda y fecha (la idea es que sea transparente la construcción de la base, y que otros puedan replicar los análisis)

    3. Criterios de exclusión y otras decisiones en la conformación de las bases

    4. Técnicas y herramientas de procesamiento (¿se usó R, packages, biblioshiny, vosViewer? ¿qué preprocesamientos y limpiezas se realizaron?)

  5. Resultados

    1. Indicadores que respondan los objetivos y las preguntas. Se suelen presentar incluyendo:

      1. pregunta o nombre del indicador (con alguna explicación si es un índice)

      2. gráficos y tablas

      3. 1 o 2 párrafos breves que incluyan la interpretación de los graficos o tablas

  6. Discusión

    1. Retomar el sentido del trabajo: objetivos y preguntas

    2. Síntesis de las principales conclusiones (1 o 2 oraciones para responder a cada pregunta)

    3. Contextualización de los resultados (¿estos datos confirman alguna tendencia? ¿siguen alguna ley o descripción teórica sobre el tema? ¿dan cuenta de algún estado particular de la ciencia y el conocimiento?)

    4. Evaluación acerca de si el objetivo se cumplió y mención sobre lo que faltó, o recomendación para futuros trabajos.

Preguntas / Indicadores

En esta sección compilamos algunas preguntas típicas con las que se construyen indicadores en bibliometría. Estas preguntas se pueden complejizar, por ejemplo, volviendose comparativas (entre 2 corpus) o haciendo foco en un subset (e.g., argentinos vs. resto del mundo), o combinando varias preguntas en una misma tabla o gráfico.

Recuerden que no todo se puede contestar con cualquier dataset. En algunos casos vamos a necesitar información que sólo nos da Scopus (si es info de artículos), o sólo ScimagoJR (si es info de revista), o que sólo nos da Constellate o Scielo (si queremos trabajar con los textos completos, algo más propio de text-mining que de un análisis bibliométrico).

A la hora de plantear y responder preguntas tengan en mente siempre que lo que estamos buscando es caracterizar la comunicación científica de un tema o la producción científica de una entidad. Es decir, estamos operando como sociólogo/as que se preguntan cómo funciona un campo, sabiendo que el mismo se constituye entre colaboraciones y conflictos, y que queremos observar en dicha comunicación cómo se condiciona lo que en ese campo se conoce a partir de cuestiones materiales (institucionales, geográficas-políticas, “colegios invisibles”, etc.). Obviamente, sin conocimiento (o interés) por el tema, va a ser muy dificil poder hacer preguntas y lecturas interesantes.

Producción / Evolución

  • ¿cuántos artículos se han publicado por año?

  • ¿hay un incremento o una tendencia de publicación?

  • ¿en qué idiomas se publica?

  • ¿en qué formato se publica?

Algunos ejemplos con código:

uflo_scopus %>%   
  count(Year) %>%    
  ggplot(aes(x=Year,y=n)) +    
  geom_line() +    
  geom_point() +   
  geom_label(aes(label=n)) +   
  theme_minimal() 

# mismo grafico pero distinguiendo el idioma

uflo_scopus %>%   
  count(Year, Language.of.Original.Document) %>%    
  ggplot(aes(x=Year,y=n, color=Language.of.Original.Document)) +    
  geom_line() +    
  geom_point() +   
  geom_label(aes(label=n)) +   
  theme_minimal()

Autoría y colaboración

  • ¿cuántos autores hay por documento? ¿cómo han variado los artículos escritos por más de 1 autor?

  • ¿qué instituciones son las que más publican? ¿esto varía por años?

  • ¿qué países son los que más publican? ¿esto varía por años?

  • ¿qué autores, países e instituciones son las que más colaboran entre sí?

En Scopus, autores, instituciones y demás información que suele incluir más de un elemento, se suele incluir separado por “;”. Para trabajar con estos valores podemos cortarlos y armar una tabla tidy, asegurándonos de guardar algún identificador que luego podamos usar para referenciar que esos elementos van juntos.

Algunos ejemplos con código:

# vamos a generar una tabla tipo tidy de autores
# (en estos ejemplos uso select() para quedarme solo con los campos que voy a trabajar, para simplificar el resultado)

autores <- uflo_scopus %>% 
  select(Authors, DOI) %>% # vamos a trabajar sobre Authors, el DOI es para volver a unirlos
  mutate(autor = str_split(Authors, pattern = ";")) %>% # str_split genera una columna, con una lista para cada celda
  select(-Authors) %>% 
  filter(!is.na(DOI), DOI != "") %>%
  unnest(autor) %>% # unnest separa los elementos de una lista, generando una tabla larga (formato tidy)
  mutate(autor = trimws(autor)) # trimws borra espacios en blanco de más

glimpse(autores)
Rows: 295
Columns: 2
$ DOI   <chr> "10.1016/j.psychsport.2021.102021", "10.1016/j.psychsport.2021.1…
$ autor <chr> "Franco E.", "Coterón J.", "Gómez V.", "Spray C.M.", "Franco E."…
# alternativamente, otra cosa que podriamos hacer es agregar una columna con la cantidad de autores

uflo_scopus %>%
  select(Authors, DOI) %>% 
  mutate(autores = str_split(Authors, pattern = ";")) %>%
  mutate(cant_autores = lengths(autores)) %>% 
  glimpse()
Rows: 49
Columns: 4
$ Authors      <chr> "Franco E.; Coterón J.; Gómez V.; Spray C.M.", "Franco E.…
$ DOI          <chr> "10.1016/j.psychsport.2021.102021", "10.11144/Javeriana.u…
$ autores      <list> <"Franco E.", " Coterón J.", " Gómez V.", " Spray C.M.">…
$ cant_autores <int> 4, 4, 2, 3, 13, 4, 1, 6, 5, 1, 3, 6, 2, 2, 1, 5, 3, 16, 4…

Una vez que tenemos una tabla tidy podemos hacer algunas cosas interesantes, como ver la co-ocurrencia (o la co-relación) entre elementos, según algún criterio (como la identidad en otra columna, en nuestro caso DOI). Para esto vamos a usar la librería widyr

Luego, vamos a usar la librería tidygraph para convertir esas co-ocurrencias en grafos (redes), y gggraph para graficarlas al estilo ggplot.

Un grafo, lo que abajo va a ser autores_juntos es básicamente un listado de elementos numerados (llamados nodos), y una tabla de relaciones entre (los números de esos) elementos (llamados edges).

library(widyr)
library(ggraph)

autores_juntos <- autores %>% 
  widyr::pairwise_count(
    item = autor, 
    feature = DOI) %>% # cruzá autores, tomando DOI como criterio
  tidygraph::as_tbl_graph(., directed = FALSE) # y dale forma de grafo

autores_juntos # veamos el grafo que se armó
# A tbl_graph: 245 nodes and 8812 edges
#
# An undirected multigraph with 13 components
#
# A tibble: 245 × 1
  name           
  <chr>          
1 Coterón J.     
2 Gómez V.       
3 Spray C.M.     
4 Pérez-Tejero J.
5 Barakat R.     
6 Díaz-Blanco A. 
# ℹ 239 more rows
#
# A tibble: 8,812 × 3
   from    to     n
  <int> <int> <dbl>
1     1    17     2
2     2    17     2
3     3    17     1
# ℹ 8,809 more rows
autores_juntos %>% # ahora vamos a graficarlo
  ggraph::ggraph(layout='fr') +
    geom_node_point() + # node_point pone un punto por cada nodo
    geom_node_text(aes(label = name), 
                   repel = TRUE,
                   max.overlaps = 10) + # node_text agrega el nombre de cada nodo
    geom_edge_link() + # edge_link agrega lineas entre nodos
    theme_graph()

Como podemos ver hay algunas redes de colaboración. Vamos a intentar agregarle más propiedades (e.g., la cantidad de artículos) así entendemos un poco mejor cómo funcionan estas redes. Para eso vamos a tener que manipular nuestro grafo, por ejemplo, operando sobre los nodos o los edges, asi que carguemos la librería tidygraph

library(tidygraph)

# vamos a hacer una tabla que cuente la cantidad de articulos por autor

autores_articulos <- autores %>% count(autor) 

autores_juntos_2 <- autores  %>% 
  widyr::pairwise_count(
    item = autor, 
    feature = DOI) %>% # cruza autores, tomando DOI como criterio
  tidygraph::as_tbl_graph(., directed = FALSE) %>% # y dale forma de grafo
  activate(nodes) %>% # ahora vamos a darle una propiedad a cada nodo
  left_join( # el left_join cruza tablas
    autores_articulos, # le sumamos la tabla con el recuento de autore
    by = c("name"="autor"))

autores_juntos_2 # veamos el grafo que se armó. vean que ahora en la tabla de nodos tenemos la columna n con la cantidad de artículo de cada autor
# A tbl_graph: 245 nodes and 8812 edges
#
# An undirected multigraph with 13 components
#
# A tibble: 245 × 2
  name                n
  <chr>           <int>
1 Coterón J.          2
2 Gómez V.            4
3 Spray C.M.          1
4 Pérez-Tejero J.     1
5 Barakat R.          1
6 Díaz-Blanco A.      1
# ℹ 239 more rows
#
# A tibble: 8,812 × 3
   from    to     n
  <int> <int> <dbl>
1     1    17     2
2     2    17     2
3     3    17     1
# ℹ 8,809 more rows
autores_juntos_2 %>% 
  ggraph::ggraph(layout='fr') +
    geom_node_point(aes(size=n)) + # mapeamos la cantidad de articulos al tamaño de la pelota
    geom_node_text(aes(label = name, size = n), 
                   repel = TRUE, 
                   max.overlaps = 15) + # mapeamos la cantidad de articulos al tamaño del texto
    geom_edge_link() +
    theme_graph()

¿Y países? Esta es difícil porque el dato del país viene adentro de un gran string de texto en las afiliaciones (que además son varias por cada registro, ya que corresponden a cada autor, y pueden haber varios). Para poder extraerlo vamos a necesitar parsearlo con una función. Luego, vamos a armar una tabla tidy, como antes.

extraer_paises <- function(string){
  # esta funcion extra texto a partir de un string, buscando la ultima ";"
  # lo que esta entre comillas más abajo se llama REGEX es una forma de parsear texto en base a regularidades
  country <- str_extract(string, "(?<=,\\s)[^,]*$")
  return(country)
}

autores_paises <- uflo_scopus %>%
  select(Authors, Affiliations) %>%
  mutate(
    aff = str_split(Affiliations, pattern = ";"), # generamos una lista con cada afiliacion
    paises = lapply(aff, FUN = extraer_paises)) %>% # a la lista le aplicamos una funcion que extrae paises   
  select(-Affiliations) %>%
  unnest(paises) 

glimpse(autores_paises)
Rows: 300
Columns: 3
$ Authors <chr> "Franco E.; Coterón J.; Gómez V.; Spray C.M.", "Franco E.; Cot…
$ aff     <list> <"Universidad Pontificia Comillas, Calle Universidad Comillas…
$ paises  <chr> "Spain", "Spain", "Argentina", "United Kingdom", "Spain", "Spa…

Información de las revistas

  • ¿cuáles son las revistas en las que más se publica?

  • ¿cómo han variado sus rankings (e.g., el Q de ScimagoJR) y métricas (e.g., h-Index de una revista)?

  • ¿cómo varía el total de citas por documentos, las citas externas y las auto-citas (una medida de cuan amplia es la discusión, o por el contrario si los investigadores sólo hablan consigo mismos)? (todo esto lo encontramos en ScimagoJR o en algunas métricas de Google que podemos ver vía PoP)

  • ¿cuáles son los artículos más citados de las revistas?

Referencias y citas

  • ¿cuáles son los artículos más citados del corpus?

  • ¿cuáles son las referencias (citas hacia afuera) más comunes? ¿quienes son los autores centrales del campo? (esto es MUY dificil: hay que parsear cada referencia, y luego uniformizarlas… lo vemos en la materia de text-mining!)

Temas

  • ¿cuáles son los keywords más recurrentes? (si usan una base de Scopus está bueno distinguir los keywords provistos por el autor, y los asignados por las revistas/bases)

  • ¿hay cambios entre temas (según sus keywords) entre períodos?

  • ¿cuáles son las categorías? (algunas bases ofrecen una clasificación tipo subject que aplica al artículo o la revista)

Para hacer nubes de palabras (un gráfico muy poco estandarizado pero visualmente lindo y muy usado) tenemos que empezar por parsear las keywords y contarlas.

keywords <- uflo_scopus %>% 
  select(DOI, Author.Keywords) %>%
  mutate(
    keyword = str_split(Author.Keywords, 
                        pattern = ";")) %>% # generamos una lista con cada keyword
  select(-Author.Keywords) %>%
  unnest(keyword) %>%
  mutate(
    keyword = trimws(tolower(keyword)) # los uniformizamos, borrando espacio y mandando a minuscula
  ) %>%
  filter(keyword != "")

glimpse(keywords)
Rows: 226
Columns: 2
$ DOI     <chr> "10.1016/j.psychsport.2021.102021", "10.1016/j.psychsport.2021…
$ keyword <chr> "burnout", "cluster analysis", "job pressures", "pe teachers’ …
keywords_contados <- keywords %>% 
  count(keyword) 

Luego, podemos usar una librería para extender ggplot: ggwordcloud. Hay varios parámetros interesantes asi que no se olviden de chusmear la documentación.

library(ggwordcloud)
Warning: package 'ggwordcloud' was built under R version 4.2.3
keywords_contados %>%
  filter(n>1) %>%
  ggplot(aes(label = keyword, 
             size = n, 
             color = factor( # color se puede mapear como una estetica... de modo que podríamos pintar palabras según algun criterio piola...
               sample.int(10, 
                          nrow(keywords_contados %>% filter(n>1)), 
                          replace = TRUE)),
             )) +
  geom_text_wordcloud_area() +
  theme_minimal()

Otras herramientas

Además de realizar los análisis a mano para hacer estudios bibliométricos se puede recurrir a algunas herramientas que trabajan directamente con las bases de datos que exportamos de scopus, wos, y demás.

Biblioshiny

Una de las herramientas más completas es biblioshiny, una app interactiva que viene en la librería bibliometrix (que permite calcular indicadores bibliométricos más estandarizados a partir de bases de datos de distintas fuentes). Como cualquier shinyapp biblioshiny se carga desde R y corre en una ventana de navegador.

library(bibliometrix)
bibliometrix::biblioshiny()

VosViewer

Otra herramienta muy usada es VosViewer, cuyo foco es analizar redes , y que ya viene con funciones de machine learning para detectar comunidades y grupos, y que permite ajustar los gráficos facilmente (evitando los problemas de visualización que tenemos a la hora de hacerlos en R).

Lo pueden descargar de acá y ver el manual. También tienen un buen tutorial por acá: https://www.youtube.com/watch?v=O50b05CGk-k