API mining and data wrangling with R

Session 07 - Exercise

Published

24.06.2024

Quarto Document Link to source file

Ziel der Anwendung: Eingrenzung der Suchergebnisse
  • In folgenden Übungsaufgaben dienen dazu, die Datengrundlage für die in den nächsten Sitzungen anstehende(n) Textanalyse(n) weiter inhaltlich plausibel einzugrenzen bzw. zu präzisieren.

  • Finales Ziel ist die Erstellung eines Code-Chunks, mit dessen Hilfe der Datensatz review_subsample erstellt werden soll. Bitte arbeitet die Übung durch, wir besprechen zu Anfang der nächsten Sitzung dann eure Vorschläge.

Background

Todays’s data basis: OpenAlex

OpenAlex is a free and open catalog of the global research system. It’s named after the ancient Library of Alexandria and made by the nonprofit OurResearch.

At the heart of OpenAlex is our dataset—a catalog of works. A work is any sort of scholarly output. A research article is one kind of work, but there are others such as datasets, books, and dissertations. We keep track of these works—their titles (and abstracts and full text in many cases), when they were created, etc. But that’s not all we do. We also keep track of the connections between these works, finding associations through things like journals, authors, institutional affiliations, citations, topics, and funders. There are hundreds of millions of works out there, and tens of thousands more being created every day, so it’s important that we have these relationships to help us make sense of research at a large scale.

Preparation

Wichtige Information
  • Bitte stellen Sie sicher, dass Sie das jeweilige R-Studio Projekt zur Übung geöffnet haben. Nur so funktionieren alle Dependencies korrekt.
  • Um den einwandfreien Ablauf der Übung zu gewährleisten, wird für die Aufgaben auf eine eigenständige Datenerhebung verzichtet und ein Übungsdatensatz zu verfügung gestelt.

Packages

  • Zum Laden der Pakete wird das Paket pacman::pload() genutzt, dass gegenüber der herkömmlichen Methode mit library() eine Reihe an Vorteile hat:

    • Prägnante Syntax
    • Automatische Installation (wenn Paket noch nicht vorhanden)
    • Laden mehrerer Pakete auf einmal
    • Automatische Suche nach dependencies
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  here, qs, # file management
  magrittr, janitor, # data wrangling
  easystats, sjmisc, # data analysis
  ggpubr, # visualization
  openalexR, 
  tidyverse # load last to avoid masking issues
  )

Import und Vorverarbeitung der Daten

# Import from local
review_works <- qs::qread(here("data/session-07/openalex-review_works-2013_2023.qs"))

# Create correct data
review_works_correct <- review_works %>% 
    mutate(
        # Create additional factor variables
        publication_year_fct = as.factor(publication_year), 
        type_fct = as.factor(type)
        )

🛠️ Praktische Anwendung

Achtung, bitte lesen!
  • Bevor Sie mit der Arbeit an den folgenden 📋 Exercises beginnen, stellen Sie bitte sicher, dass Sie alle Chunks des Abschnitts Preparation gerendert haben. Das können Sie tun, indem Sie den “Run all chunks above”-Knopf des nächsten Chunks benutzen.
  • Bei Fragen zum Code lohnt sich ein Blick in den Showcase (.qmd oder .html). Beim Showcase handelt es sich um eine kompakte Darstellung des in der Präsentation verwenden R-Codes. Sie können das Showcase also nutzen, um sich die Code-Bausteine anzusehen, die für die R-Outputs auf den Slides benutzt wurden.

📋 Exercise 1: Sprache der Publikationen

Ziel der Aufgabe
  • Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis von deren Sprache (language)
  • Hintergrundinformation zur Variable language finden Sie in der API-Dokumentation von OpenAlex.
  • Nutzen Sie die Funktion sjmisc::frq() und schauen Sie sich im Datensatz review_works_correct die Variablen language an. Verwenden Sie das Argument sort.frq = "desc", um die Häufigkeit der Sprachen absteigend zu sortieren.
  • Notieren Sie sich den jeweilgen ISO 639-1 language code, um Ihn später bei 📋 Exercise 4: Erstellung Subsample als Filter zu nutzen.
Lösung anzeigen
review_works_correct %>% 
    sjmisc::frq("language", sort.frq = "desc")
language <character> 
# total N=93655 valid N=93476 mean=10.33 sd=2.27

Value |     N | Raw % | Valid % | Cum. %
----------------------------------------
en    | 90653 | 96.79 |   96.98 |  96.98
id    |  1118 |  1.19 |    1.20 |  98.18
pt    |   521 |  0.56 |    0.56 |  98.73
es    |   309 |  0.33 |    0.33 |  99.06
tr    |   182 |  0.19 |    0.19 |  99.26
ko    |   130 |  0.14 |    0.14 |  99.40
fr    |   127 |  0.14 |    0.14 |  99.53
ru    |    72 |  0.08 |    0.08 |  99.61
de    |    59 |  0.06 |    0.06 |  99.67
it    |    43 |  0.05 |    0.05 |  99.72
pl    |    36 |  0.04 |    0.04 |  99.76
fa    |    20 |  0.02 |    0.02 |  99.78
ro    |    20 |  0.02 |    0.02 |  99.80
ja    |    19 |  0.02 |    0.02 |  99.82
ca    |    16 |  0.02 |    0.02 |  99.84
uk    |    16 |  0.02 |    0.02 |  99.86
ar    |    15 |  0.02 |    0.02 |  99.87
th    |    14 |  0.01 |    0.01 |  99.89
nl    |    13 |  0.01 |    0.01 |  99.90
sv    |    13 |  0.01 |    0.01 |  99.91
hr    |    11 |  0.01 |    0.01 |  99.93
hu    |    11 |  0.01 |    0.01 |  99.94
sl    |    10 |  0.01 |    0.01 |  99.95
af    |     8 |  0.01 |    0.01 |  99.96
cs    |     6 |  0.01 |    0.01 |  99.96
da    |     5 |  0.01 |    0.01 |  99.97
el    |     5 |  0.01 |    0.01 |  99.97
bg    |     4 |  0.00 |    0.00 |  99.98
zh-cn |     4 |  0.00 |    0.00 |  99.98
et    |     3 |  0.00 |    0.00 |  99.99
lt    |     3 |  0.00 |    0.00 |  99.99
fi    |     2 |  0.00 |    0.00 |  99.99
mk    |     2 |  0.00 |    0.00 |  99.99
no    |     2 |  0.00 |    0.00 | 100.00
ta    |     2 |  0.00 |    0.00 | 100.00
cy    |     1 |  0.00 |    0.00 | 100.00
hi    |     1 |  0.00 |    0.00 | 100.00
<NA>  |   179 |  0.19 |    <NA> |   <NA>
Lösung anzeigen
# Notiz(en)
# - Überwiegende Anzahl der heruntergeladenen Datenbankbeiträge ist in englischer Sprache (en) verfasst.
# -Die Sprache en wird als Filterkriterium für die Erstellung des Subsamples genutzt, auch um spätere Probleme bei der Analyse durch multi-linguale Texte zu vermeiden.

📋 Exercise 2: Typ der Publikationen

Ziel der Aufgabe
  • Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis deres Typen (type).
  • Hintergrundinformation zur Variable type finden Sie in der API-Dokumentation von OpenAlex.
  • Nutzen Sie die Funktion sjmisc::frq() und schauen Sie sich im Datensatz review_works_correct die Variablen type an. Verwenden Sie das Argument sort.frq = "desc", um die Typen in Abhängigkeit Ihrer Häufigkeit absteigend zu sortieren.
  • Notieren Sie sich die Ausprägungen der Variable type, die aus Ihrer Sicht später bei 📋 Exercise 4: Erstellung Subsample als Filter genutzt werden soll.
Lösung anzeigen
review_works_correct %>% 
    sjmisc::frq("type", sort.frq = "desc")
type <character> 
# total N=93655 valid N=93655 mean=3.09 sd=4.64

Value                   |     N | Raw % | Valid % | Cum. %
----------------------------------------------------------
article                 | 73716 | 78.71 |   78.71 |  78.71
review                  |  6437 |  6.87 |    6.87 |  85.58
preprint                |  3570 |  3.81 |    3.81 |  89.40
book-chapter            |  2860 |  3.05 |    3.05 |  92.45
libguides               |  2414 |  2.58 |    2.58 |  95.03
dataset                 |  1471 |  1.57 |    1.57 |  96.60
peer-review             |  1400 |  1.49 |    1.49 |  98.09
dissertation            |   975 |  1.04 |    1.04 |  99.13
report                  |   422 |  0.45 |    0.45 |  99.58
book                    |   167 |  0.18 |    0.18 |  99.76
other                   |    64 |  0.07 |    0.07 |  99.83
paratext                |    57 |  0.06 |    0.06 |  99.89
erratum                 |    47 |  0.05 |    0.05 |  99.94
letter                  |    25 |  0.03 |    0.03 |  99.97
editorial               |    17 |  0.02 |    0.02 |  99.99
supplementary-materials |     7 |  0.01 |    0.01 |  99.99
reference-entry         |     6 |  0.01 |    0.01 | 100.00
<NA>                    |     0 |  0.00 |    <NA> |   <NA>
Lösung anzeigen
# Notiz(en)
# - Überwiegende Anzahl der heruntergeladenen Datenbankbeiträge sind `article.`
# - Die folgenden Auswertungen beziehen sich auf die Publikationen des Typs article, da uns besonders die praktische Anwendung/Umsetzung der Methode in verschiedenen Kontexten interessiert. Läge der Fokus auf (die Entwicklung) der Methode selbst, wäre vermutlich eher die Typen book oder book-chapter relevant.

📋 Exercise 3: Forschungsfeld der Publikationen

Ziel der Aufgabe
  • Identifizieren Sie die für die Untersuchung relevanten Artikel auf Basis des von OpenAlex dem Artikel zugeordnenten Foschungsfeldes (field))

  • Hintergrundinformation zur Variable field finden Sie in der API-Dokumentation von OpenAlex.

  • Basierend auf dem Datensatz review_works_correct
    • nutzen Sie die Funktion unnest() um die Variablen der topics-Liste zu extrahieren. Verwenden Sie dabei das Argument names_sep = "_". um doppelte Variablennamen durch Hinzufügen des Prefixes topics_ zu verhindern.
    • filtern Sie anschließen mit Hilfe der Funktion filter und der Variable bzw. dem Argument topics_name == "field" nur die Informationen zum Forschungsfeld, sowie mit der Variable bzw. dem Argument topics_i == "1" nur die erste Zuordnung.
    • Nutzen Sie die Funktion sjmisc::frq() und schauen Sie sich die Variablen topics_display_name an. Verwenden Sie das Argument sort.frq = "desc", um die Forschungsfelder in Abhängigkeit Ihrer Häufigkeit absteigend zu sortieren.
  • Notieren Sie sich die Ausprägungen der Variable topics_display_name, die aus Ihrer Sicht später bei 📋 Exercise 4: Erstellung Subsample als Filter genutzt werden soll.
Lösung anzeigen
review_works_correct %>% 
    unnest(topics, names_sep = "_") %>%
    filter(topics_name == "field") %>% 
    filter(topics_i == "1") %>% 
    sjmisc::frq("topics_display_name", sort.frq = "desc")
topics_display_name <character> 
# total N=93655 valid N=93655 mean=4.41 sd=1.62

Value                               |     N | Raw % | Valid % | Cum. %
----------------------------------------------------------------------
Social Sciences                     | 30580 | 32.65 |   32.65 |  32.65
Psychology                          | 29054 | 31.02 |   31.02 |  63.67
Business, Management and Accounting | 15558 | 16.61 |   16.61 |  80.29
Decision Sciences                   |  7261 |  7.75 |    7.75 |  88.04
Economics, Econometrics and Finance |  6796 |  7.26 |    7.26 |  95.30
Arts and Humanities                 |  4406 |  4.70 |    4.70 | 100.00
<NA>                                |     0 |  0.00 |    <NA> |   <NA>
Lösung anzeigen
# Notiz(en)
# - Focus auf "primäre" Forschungsfelder `Social Sciences` & `Psychology`

📋 Exercise 4: Erstellung Subsample

Ziel der Aufgabe
  • Erstellung sie den Datensatz review_subsample, in dem Sie mit Hilfe der Funktionen select() und/oder filter() das Datenmaterial weiter eingrenzen. Sie können sich sowohl auf die Variablen aus der Übung, als auch auf die aus der Sitzung (bzw. den Slides) beziehen.
  • Der Code dieses Chunks wird in der nächsten Sitzung benötigt bzw. besprochen, halten Sie diesen deshalb bitte bereit.
Lösung anzeigen
review_subsample <- review_works_correct %>% 
  filter(language == "en") %>% # nur englischsprachige Einträge
  filter(type == "article") %>% # nur Artikel
  # Datentranformation
  unnest(topics, names_sep = "_") %>%
  filter(topics_name == "field") %>% 
  filter(topics_i == "1") %>% 
  filter(
    topics_display_name == "Social Sciences"|
    topics_display_name == "Psychology"
    ) %>%
  glimpse()
Rows: 45,221
Columns: 45
$ id                          <chr> "https://openalex.org/W4293003987", "https…
$ title                       <chr> "The WHO-5 Well-Being Index: A Systematic …
$ display_name                <chr> "The WHO-5 Well-Being Index: A Systematic …
$ author                      <list> [<data.frame[4 x 12]>], [<data.frame[2 x …
$ ab                          <chr> "The 5-item World Health Organization Well…
$ publication_date            <chr> "2015-01-01", "2017-08-28", "2014-01-01", …
$ relevance_score             <dbl> 938.7603, 752.3500, 591.2553, 576.1210, 56…
$ so                          <chr> "Psychotherapy and psychosomatics", "Journ…
$ so_id                       <chr> "https://openalex.org/S184803288", "https:…
$ host_organization           <chr> "Karger Publishers", "SAGE Publishing", NA…
$ issn_l                      <chr> "0033-3190", "0739-456X", NA, "2214-7829",…
$ url                         <chr> "https://doi.org/10.1159/000376585", "http…
$ pdf_url                     <chr> "https://www.karger.com/Article/Pdf/376585…
$ license                     <chr> "cc-by-nc", NA, NA, "cc-by", NA, NA, "cc-b…
$ version                     <chr> "publishedVersion", NA, "publishedVersion"…
$ first_page                  <chr> "167", "93", NA, "89", "55", "2150", "e356…
$ last_page                   <chr> "176", "112", NA, "106", "64", "2159", "e3…
$ volume                      <chr> "84", "39", NA, "6", "277", "32", "2", "24…
$ issue                       <chr> "3", "1", NA, NA, NA, "19", "8", NA, "9", …
$ is_oa                       <lgl> TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE…
$ is_oa_anywhere              <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,…
$ oa_status                   <chr> "hybrid", "green", "bronze", "gold", "bron…
$ oa_url                      <chr> "https://www.karger.com/Article/Pdf/376585…
$ any_repository_has_fulltext <lgl> FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE…
$ language                    <chr> "en", "en", "en", "en", "en", "en", "en", …
$ grants                      <list> NA, NA, NA, <"https://openalex.org/F43203…
$ cited_by_count              <int> 2657, 1375, 2568, 803, 3664, 1553, 2895, 9…
$ counts_by_year              <list> [<data.frame[11 x 2]>], [<data.frame[7 x …
$ publication_year            <int> 2015, 2017, 2014, 2016, 2020, 2014, 2017, …
$ cited_by_api_url            <chr> "https://api.openalex.org/works?filter=cit…
$ ids                         <list> <"https://openalex.org/W4293003987", "htt…
$ doi                         <chr> "https://doi.org/10.1159/000376585", "http…
$ type                        <chr> "article", "article", "article", "article"…
$ referenced_works            <list> <"https://openalex.org/W1492518593", "htt…
$ related_works               <list> <"https://openalex.org/W3020194755", "htt…
$ is_paratext                 <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, …
$ is_retracted                <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, …
$ concepts                    <list> [<data.frame[7 x 5]>], [<data.frame[18 x …
$ topics_i                    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ topics_score                <dbl> 0.9926, 0.9050, 0.9995, 0.9987, 0.9999, 1.…
$ topics_name                 <chr> "field", "field", "field", "field", "field…
$ topics_id                   <chr> "https://openalex.org/fields/32", "https:/…
$ topics_display_name         <chr> "Psychology", "Social Sciences", "Psycholo…
$ publication_year_fct        <fct> 2015, 2017, 2014, 2016, 2020, 2014, 2017, …
$ type_fct                    <fct> article, article, article, article, articl…