---
name: bibliometric_analysis
description: Map a research field with bibliometrics: build a clean publication set from OpenAlex, Semantic Scholar, or Crossref, deduplicate it, disambiguate authors by ID, compute citation and co-authorship networks plus bibliographic coupling and co-citation, read h-index and journal concentration honestly, and screen for research fronts with citation and keyword bursts. Triggers on bibliometric analysis, science mapping, mapping a research field, co-authorship network, co-citation, bibliographic coupling, h-index questions, research front or emerging topic detection, and journal concentration in a field.
---

# Bibliometric Analysis

## Purpose

Turn a pile of publications into a field map a reader can trust: who works in the field, who works together, which works form its base, which journals carry it, and what has started moving recently. The method follows the four steps in Donthu et al. (2021), How to conduct a bibliometric analysis, Journal of Business Research 133, 285 to 296: define the aims and scope, choose the techniques, collect the data, then run the analysis and report it.

The hard part is not the arithmetic. It is keeping the set clean, keeping author identities straight, and refusing to read more into a metric than the metric holds. Every result this skill ships carries its limits in the same paragraph as its numbers, following the Leiden Manifesto (Hicks et al., Nature 520, 429 to 431, 2015): quantitative evidence supports expert judgement, it does not replace it, and field differences in citation practice come before any comparison.

Bundled tool: `bin/biblio.py`, standard library only. It fetches from OpenAlex, Semantic Scholar, and Crossref into one normalized CSV, then computes performance stats, Bradford zones, co-authorship, keyword co-occurrence, bibliographic coupling, co-citation, and a burst screen from that CSV.

## Workflow

1. **Write the scope before touching a database.** One sentence for the field, the year window, the document types in and out (articles, reviews, proceedings, preprints), the languages in and out, and the questions the map must answer. A set built before the scope exists will quietly answer a different question. If the user wants a person judged, a tenure case decided, or one paper ranked, stop: this skill maps fields, it does not grade people.

2. **Pick one primary source and say why.** OpenAlex is the default: free, broad, references included, author and institution IDs attached. Semantic Scholar is strong for computer science and for citation links between papers. Crossref is the fallback for DOI metadata and reference lists when the other two are unavailable or throttled. Scopus and Web of Science are valid when the user has access, and their exports drop into the same normalized CSV. Never mix citation counts from two sources in one table without labeling each count with its source. Counts differ because coverage differs, and a merged table hides that.

3. **Fetch with a recorded query.** Run one of:
   - `python3 bin/biblio.py fetch-openalex --search "QUERY" --year-from YYYY --year-to YYYY --limit N --out works.csv`
   - `python3 bin/biblio.py fetch-s2 --query "QUERY" --year-from YYYY --year-to YYYY --limit N --out works.csv`
   - `python3 bin/biblio.py fetch-crossref --query "QUERY" --year-from YYYY --year-to YYYY --limit N --out works.csv`
   Record the exact query string, source, filters, fetch date, and the count returned, in the output. Those five facts are what make the map reproducible. Note the known gaps per route: Semantic Scholar bulk search does not return reference lists, so coupling and co-citation come out empty on that route. Crossref citation counts are counts inside Crossref, not global counts, and Crossref subjects are sparse, so keyword results run thin.

4. **Clean the set, and log every cut.** Work through `references/cleaning-and-disambiguation.md`. Deduplicate on normalized DOI first (lowercase, no resolver prefix), then on normalized title plus year plus first author when DOI is missing. Drop retracted works, and list how many were dropped. Check the edges of the set by hand: read the titles of the 10 most cited and 10 most recent works and confirm they belong in the field. A search string always pulls in neighbours. Report the set size before and after cleaning.

5. **Disambiguate authors by ID, never by name string.** Key every author calculation on the source author ID (OpenAlex A id, Semantic Scholar authorId, ORCID). Name strings merge strangers and split one person across variants. Spot check the top 10 authors in the set: open two or three of their works each and confirm one person, one line of work. Watch for the failure modes in the cleaning reference, including null author records and merged profiles. If a top author fails the check, say so in the output and mark that author's numbers provisional.

6. **Run the analysis.** `python3 bin/biblio.py analyze works.csv --out analysis.json`. Read the results in this order: set shape first (works by year, uncited share, median citations), then sources, then authors, then networks, then bursts. The reading guide for each block is in `references/metrics-and-networks.md`. A full worked example on a real set, including how to report a slice whose flaws limit what it can claim, is in `references/worked-field-map.md`, with its data in `assets/`.

7. **Read journal concentration as distribution, not quality.** The tool ranks sources by output and splits them into Bradford zones, three groups each carrying roughly a third of the articles, plus the share held by the top 3 sources. A tight core means a field talks to itself in a few venues. A flat spread means it publishes everywhere. Neither says the core journals are better. Never rank an article by the journal it appeared in.

8. **Read author metrics inside the set only.** The h-index values the tool returns are within-set values on a snapshot: h computed from the works in this set and their citations today. The definition is Hirsch (2005): a researcher has index h if h of their papers have at least h citations each and the rest have h or fewer. Within-set h is useful for finding the central figures of this field slice. It is not a career h-index, it is not comparable across fields, and it grows with career length. Full cautions in `references/metrics-and-networks.md`.

9. **Separate the base from the front.** Co-citation looks backward: pairs of works cited together by later works mark the shared base of the field. Bibliographic coupling looks forward: recent works that share long reference lists are probably working the same problem now. Build the candidate research front from coupling among works in the last 2 to 3 years of the window, then check the burst screen. The burst screen flags keywords whose yearly count sits at least 2 standard deviations above their own mean in this set, with at least 3 occurrences that year. It is a screen, not Kleinberg burst detection. Kleinberg (2002) models a stream with a state automaton and transition costs, which this tool does not implement. Label screened bursts as candidates, every time.

10. **Validate every candidate front by reading.** Pull the titles and abstracts of the works behind each candidate cluster or burst. If a human reader cannot state the shared problem in one sentence, it is not a front, it is a counting artefact. Drop it or demote it to an observation.

11. **Cross-check one claim by hand.** Pick the single most load-bearing number in the report, usually the top work or top author, and verify it against the source website record. If the database record and the tool output disagree, the tool loses and the report says what was found.

12. **Report with the limits attached.** Follow the Output Contract. Methods, set counts, and caveats ship with the map, not in a separate file the reader may never open.

## Output Contract

Deliver all of the following:

- **Provenance block**: source database, exact query, filters, fetch date, records returned, records after cleaning, and every cut made with its count (duplicates, retracted, out of scope).
- **Set shape**: works by year, year range, median citations, uncited share, and total citations labelled as a snapshot on the fetch date.
- **Field map narrative**: the base (top co-cited pairs and most cited works), the social structure (top co-authorship pairs and central authors), the venues (Bradford zones and top 3 source share), and candidate fronts (coupling clusters and burst-screen keywords), each with the works that support it.
- **Author table**: top authors keyed by ID, with works in set, within-set h and g, and citations to set works, headed by the words within-set and snapshot. No cross-field ranking, no career claims.
- **Limits section**: database coverage limits for this field, disambiguation spot-check results, citation window bias (older works have had longer to collect citations), and which techniques came out empty on the fetch route used and why.
- **Files**: the normalized CSV and the analysis JSON, named for the field and fetch date, so the whole map can be rerun.

## Operating Rules

1. **One source per table, labelled.** Citation counts from OpenAlex, Semantic Scholar, and Crossref are three different measurements. Never average them, merge them, or place them side by side as if they were one scale.
2. **Citations measure attention inside a literature, not quality.** A citation can be a correction, a rebuttal, or a ritual reference. Say impact on the field's conversation when that is what the number shows, and do not shorten it to quality or importance without reading the citing works.
3. **Compare citations only inside a year cohort or with time stated.** A 2015 paper has had a decade more exposure than a 2024 paper. Any most-cited list that spans years must carry that warning in the same paragraph.
4. **h-index never travels.** Not across fields, not across career stages, not from a set slice to a career. Hirsch stated the field and career limits in the original 2005 paper. If a user asks for a cross-field h comparison, give the within-field picture and explain why the direct comparison misleads.
5. **Self-citation stays visible.** If the source data lets you estimate it, report author self-citation share for top authors. If it does not, name it as an unmeasured factor instead of assuming it away. Its effect on h is smaller than on total citations, per Hirsch, but it is not zero.
6. **Thresholds are choices, state them.** Network maps built after dropping authors under 3 works or keywords under 5 occurrences look cleaner and answer a narrower question. Report every threshold the tool or a visualisation step applied, and what share of the set it removed.
7. **A burst is a candidate until read.** Automated burst and coupling signals nominate. Only reading the underlying works confirms a research front. No front ships on counts alone.
8. **Respect rate limits as a stop, not a nuisance.** A 429 from a source ends work on that source for the run. Switch source, disclose the switch and its coverage effect, and continue. Never hammer a throttled API or route around the limit.
9. **Retracted works are out, and counted.** Exclude them from every metric, and report the number excluded. A highly cited retracted work is a finding about the field's citation hygiene, worth one line in the limits section, not a silent deletion.
10. **If the set is small, say what the method cannot do.** Under roughly 100 works, network clusters and Bradford zones are unstable and burst screening is noise. Report the descriptive stats, read the works directly, and label the map exploratory.
