Skip to content
大相撲 SumoFans
夏場所 Natsu (Summer)
methodology · data shape · last build June 3, 2026 at 1:52 PM

形式 Data shape

What's in derived.json — the single artifact every component reads — and what we compute on top of it. Schema first, then the formulas behind each metric.

00 / Coverage

Dataset at a glance

What's actually in the cache. The dashboard reads from the six-basho window; the longitudinal viz reaches back to the start of the modern (six-basho-a-year) era in 1958.

  • 67 years covered Nov 1958 - May 2026
  • 406 honbasho every Makuuchi tournament since 1958
  • 113,157 bouts Makuuchi bout records, day-by-day
  • 608 active rikishi across all six divisions today
  • 42 sekitori current Makuuchi top-division roster
  • 82 kimarite official winning techniques
01 / Schema

What's in derived.json

Tournaments

currentBasho: Basho interface Basho { id: string; // YYYYMM startDate: string; endDate: string; status: "completed" | "live" | "upcoming"; liveDay?: number; yusho?: { division: string; rikishiId: number; shikonaEn: string }[]; }

The most recently started or upcoming basho. Drives the live banner, the status chip in the basho list, and the yusho race strip.

Example value
{
  "id": "202605",
  "startDate": "2026-05-10T00:00:00Z",
  "endDate": "2026-05-24T00:00:00Z",
  "status": "completed",
  "yusho": [
    {
      "division": "Makuuchi",
      "rikishiId": 12,
      "shikonaEn": "Wakatakakage"
    },
    {
      "division": "Juryo",
      "rikishiId": 8865,
      "shikonaEn": "Kazuma"
    },
    {
      "division": "Makushita",
      "rikishiId": 8951,
      "shikonaEn": "Ikarigata"
    },
    {
      "division": "Sandanme",
      "rikishiId": 9103,
      "shikonaEn": "Asahifuji"
    },
    {
      "division": "Jonidan",
      "rikishiId": 9109,
      "shikonaEn": "Shosei"
    },
    {
      "division": "Jonokuchi",
      "rikishiId": 9121,
      "shikonaEn": "Hakugetsuro"
    }
  ],
  "sansho": [
    {
      "type": "Kanto-sho",
      "rikishiId": 8857,
      "shikonaEn": "Yoshinofuji",
      "shikonaJp": "義ノ富士 直哉"
    },
    {
      "type": "Kanto-sho",
      "rikishiId": 3,
      "shikonaEn": "Hakunofuji",
      "shikonaJp": "伯乃富士 哲也"
    },
    {
      "type": "Gino-sho",
      "rikishiId": 12,
      "shikonaEn": "Wakatakakage",
      "shikonaJp": "若隆景 渥"
    }
  ]
}
recentBashos: Basho[] // same Basho interface

The last 6 honbasho (Jan/Mar/May/Jul/Sep/Nov) in reverse chronological order. Powers the "Last 6 bashos" summary grid and coverage windows.

Example value
[
  {
    "id": "202605",
    "startDate": "2026-05-10T00:00:00Z",
    "endDate": "2026-05-24T00:00:00Z",
    "status": "completed",
    "yusho": [
      {
        "division": "Makuuchi",
        "rikishiId": 12,
        "shikonaEn": "Wakatakakage"
      },
      {
        "division": "Juryo",
        "rikishiId": 8865,
        "shikonaEn": "Kazuma"
      },
      {
        "division": "Makushita",
        "rikishiId": 8951,
        "shikonaEn": "Ikarigata"
      },
      {
        "division": "Sandanme",
        "rikishiId": 9103,
        "shikonaEn": "Asahifuji"
      },
      {
        "division": "Jonidan",
        "rikishiId": 9109,
        "shikonaEn": "Shosei"
      },
      {
        "division": "Jonokuchi",
        "rikishiId": 9121,
        "shikonaEn": "Hakugetsuro"
      }
    ],
    "sansho": [
      {
        "type": "Kanto-sho",
        "rikishiId": 8857,
        "shikonaEn": "Yoshinofuji",
        "shikonaJp": "義ノ富士 直哉"
      },
      {
        "type": "Kanto-sho",
        "rikishiId": 3,
        "shikonaEn": "Hakunofuji",
        "shikonaJp": "伯乃富士 哲也"
      },
      {
        "type": "Gino-sho",
        "rikishiId": 12,
        "shikonaEn": "Wakatakakage",
        "shikonaJp": "若隆景 渥"
      }
    ]
  }
  // ... 5 more
]
banzuke: { bashoId: string; division: Division; // always "Makuuchi" in practice entries: BanzukeEntry[]; }[] interface BanzukeEntry { rikishiId: number; shikonaEn: string; shikonaJp: string; rank: string; rankFamily: RankFamily; rankNumber: number; side: "East" | "West"; rankValue: number; record: BoutResult[]; wins: number; losses: number; absences: number; } interface BoutResult { day: number; result: "win" | "loss" | "absent" | "fusen-win" | "fusen-loss" | ""; opponentId: number; opponentEn: string; kimarite: string; }

One entry per basho in the window (up to 6). Each entry holds every Makuuchi rikishi's full 15-day record with opponent and kimarite per day. Drives the basho board, sankey, yusho race, and kimarite analyses.

Example value
{
  "bashoId": "202507",
  "division": "Makuuchi",
  "entries": [
    {
      "rikishiId": 19,
      "shikonaEn": "Hoshoryu",
      "shikonaJp": "豊昇龍 智勝",
      "rank": "Yokozuna 1 East",
      "rankFamily": "Yokozuna",
      "rankNumber": 1,
      "side": "East",
      "rankValue": 101,
      "record": [
        {
          "day": 1,
          "result": "win",
          "opponentId": 44,
          "opponentEn": "Takayasu",
          "kimarite": "sotogake",
          "opponentJp": "高安"
        },
        {
          "day": 2,
          "result": "loss",
          "opponentId": 13,
          "opponentEn": "Wakamotoharu",
          "kimarite": "yorikiri",
          "opponentJp": "若元春"
        },
        {
          "day": 3,
          "result": "loss",
          "opponentId": 8854,
          "opponentEn": "Aonishiki",
          "kimarite": "watashikomi",
          "opponentJp": "安青錦"
        }
        // ... 12 more days
      ],
      "wins": 1,
      "losses": 3,
      "absences": 10
    }
  ]
}

People

sekitori: Rikishi[] // 42 Makuuchi sekitori interface Rikishi { id: number; shikonaEn: string; shikonaJp: string; currentRank: string; rankFamily?: RankFamily; rankNumber?: number; side?: "East" | "West"; heya: string; birthDate?: string; shusshin?: string; shusshinRegion?: string; shusshinCountry?: string; height?: number; // cm weight?: number; // kg debut?: string; // YYYYMM ageYears?: number; yearsActive?: number; photo?: { thumbnail?: string; original?: string; pageUrl?: string; credit?: string; }; }

Current Makuuchi roster (42 rikishi), enriched with computed age, years active, and merged photo data (Wikipedia or JSA). Powers the athletes section, origin map, and body distribution. (The full photo cache covers a much wider corpus — 1,095 active + historical Makuuchi rikishi — but it's read directly by per-rikishi profile pages and the directory; only the current-Makuuchi slice flows into derived.json.)

Example value
[
  {
    "id": 19,
    "shikonaEn": "Hoshoryu",
    "shikonaJp": "豊昇龍 智勝",
    "currentRank": "Yokozuna 1 East",
    "rankFamily": "Yokozuna",
    "rankNumber": 1,
    "side": "East",
    "heya": "Tatsunami",
    "birthDate": "1999-05-22T00:00:00Z",
    "shusshin": "Mongolia, Ulaanbaatar",
    "shusshinRegion": "Mongolia",
    "shusshinCountry": "Mongolia",
    "height": 188,
    "weight": 148,
    "debut": "201711",
    "ageYears": 27,
    "yearsActive": 8.583333333333334,
    "photo": {
      "thumbnail": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/...",
      "original": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/...",
      "pageUrl": "https://en.wikipedia.org/wiki/H%C5%8Dsh%C5%8Dry%C5%AB_Tomokatsu",
      "credit": "Wikipedia / CC BY-SA"
    },
    "careerContext": {
      "yushoAllTimeRank": 13,
      "yushoAllTimeRankSuffix": "13th",
      "winPctRankPercentile": 0.407,
      "winPctRankPercentileBucket": "bottom-half",
      "isYoungestYokozunaInYears": 18
    }
  }
  // ... 41 more
]
stats: Record<number, RikishiStats> // keyed by rikishiId interface RikishiStats { totalMatches: number; totalWins: number; totalLosses: number; yusho: number; basho: number; sansho?: { Gino_sho?: number; Kanto_sho?: number; Shukun_sho?: number; }; }

Career statistics per sekitori keyed by numeric id. Reaches back to each wrestler's professional debut - not bounded by our 6-basho window. Drives the leaders leaderboard and career win % calculation.

Example value
{
  "8854": {
    "totalMatches": 177,
    "totalWins": 135,
    "totalLosses": 42,
    "yusho": 4,
    "basho": 16,
    "sansho": {
      "Gino_sho": 3,
      "Kanto_sho": 2,
      "Shukun_sho": 1
    }
  }
}
heyas: { name: string; sekitoriCount: number; // Makuuchi count (legacy field) activeTotal: number; // all divisions makuuchi: number; sanyaku: number; careerYushoSum: number; // sum across active Makuuchi roster lastBashoWins: number; lastBashoLosses: number; topRank?: string; }[]

Per stable with at least one active Makuuchi member. Aggregated from the full 621-rikishi roster. Powers the stables bar chart (section 13).

Example value
[
  {
    "name": "Isegahama",
    "sekitoriCount": 4,
    "activeTotal": 32,
    "makuuchi": 4,
    "sanyaku": 1,
    "careerYushoSum": 10,
    "lastBashoWins": 35,
    "lastBashoLosses": 24,
    "topRank": "Sekiwake 1 East",
    "careerContext": {
      "allTimeYushoCount": 21,
      "allTimeYushoRank": 7
    }
  }
  // ... 26 more
]

Places

origins: { region: string; country: string; count: number }[]

Hometown region counts across the Makuuchi roster. Japanese prefectures are stripped of -ken/-fu/-to/-do suffixes; non-Japan entries use the country name as region. Powers the origins map (section 14).

Example value
[
  {
    "region": "Mongolia",
    "country": "Mongolia",
    "count": 7
  },
  {
    "region": "Chiba",
    "country": "Japan",
    "count": 4
  },
  {
    "region": "Saitama",
    "country": "Japan",
    "count": 3
  }
  // ... 20 more
]

Cohorts

divisions: { name: Division; count: number; isFocus: boolean; }[] type Division = | "Makuuchi" | "Juryo" | "Makushita" | "Sandanme" | "Jonidan" | "Jonokuchi"

All 6 divisions with current active rikishi count. Computed across the full 621-rikishi roster. Powers the division overview in section 11.

Example value
[
  {
    "name": "Makuuchi",
    "count": 42,
    "isFocus": true
  },
  {
    "name": "Juryo",
    "count": 28,
    "isFocus": false
  },
  {
    "name": "Makushita",
    "count": 119,
    "isFocus": false
  },
  {
    "name": "Sandanme",
    "count": 160,
    "isFocus": false
  },
  {
    "name": "Jonidan",
    "count": 204,
    "isFocus": false
  },
  {
    "name": "Jonokuchi",
    "count": 55,
    "isFocus": false
  }
]
weightDist: { division: Division; count: number; min: number; max: number; median: number; mean: number; p25: number; p75: number; points: { id: number; shikonaEn: string; shikonaJp: string; weight: number; height: number }[]; heaviest: { id: number; shikonaEn: string; weight: number }; lightest: { id: number; shikonaEn: string; weight: number }; }[]

Per-division weight distribution summary + individual scatter points. Quartiles are computed via linear interpolation. Powers the body distribution scatter (section 15).

Example value
{
  "division": "Makuuchi",
  "count": 42,
  "min": 121,
  "max": 197,
  "median": 160,
  "mean": 157.35714285714286,
  "p25": 141.75,
  "p75": 170.75,
  "points": [
    {
      "id": 2,
      "shikonaEn": "Asanoyama",
      "shikonaJp": "朝乃山 広暉",
      "weight": 170,
      "height": 188
    },
    {
      "id": 3,
      "shikonaEn": "Hakunofuji",
      "shikonaJp": "伯乃富士 哲也",
      "weight": 161,
      "height": 181
    }
    // ... 40 more
  ],
  "heaviest": {
    "id": 74,
    "shikonaEn": "Atamifuji",
    "weight": 197
  },
  "lightest": {
    "id": 615,
    "shikonaEn": "Fujinokawa",
    "weight": 121
  }
}

Outcomes

kimariteCounts: { kimarite: string; count: number }[]

Total frequency of each winning technique across all bouts in the 6-basho window, sorted descending. Powers the kimarite frequency bar in section 17.

Example value
[
  {
    "kimarite": "yorikiri",
    "count": 438
  },
  {
    "kimarite": "oshidashi",
    "count": 431
  },
  {
    "kimarite": "hatakikomi",
    "count": 168
  }
  // ... 42 more
]
kimariteByTier: { tier: RankFamily; totalWins: number; distinctKimarite: number; kimarite: { name: string; count: number; pct: number; family: string }[]; familyTotals: { family: string; count: number; pct: number }[]; }[]

Kimarite breakdown grouped by the winner's rank tier (Yokozuna through Maegashira), with family rollups (force/push/throw/thrust/leg). Powers the sunburst (section 18) and moves-by-rank chart (section 19).

Example value
[
  {
    "tier": "Yokozuna",
    "totalWins": 90,
    "distinctKimarite": 21,
    "kimarite": [
      {
        "name": "yorikiri",
        "count": 24,
        "family": "force",
        "pct": 26.666666666666668
      },
      {
        "name": "oshidashi",
        "count": 16,
        "family": "push",
        "pct": 17.77777777777778
      },
      {
        "name": "yoritaoshi",
        "count": 9,
        "family": "force",
        "pct": 10
      }
      // ... 18 more
    ],
    "familyTotals": [
      {
        "family": "force",
        "count": 33,
        "pct": 36.666666666666664
      },
      {
        "family": "push",
        "count": 23,
        "pct": 25.555555555555554
      },
      {
        "family": "thrust",
        "count": 15,
        "pct": 16.666666666666664
      },
      {
        "family": "throw",
        "count": 14,
        "pct": 15.555555555555555
      },
      {
        "family": "leg",
        "count": 4,
        "pct": 4.444444444444445
      },
      {
        "family": "other",
        "count": 1,
        "pct": 1.1111111111111112
      }
    ]
  }
  // ... 4 more tiers
]
leaders: { yusho: { id: number; shikonaEn: string; count: number }[]; wins: { id: number; shikonaEn: string; wins: number }[]; winPct: { id: number; shikonaEn: string; pct: number; matches: number }[]; }

Top 12 active Makuuchi sekitori by yusho count, career wins, and career win percentage (gated to ≥100 matches to avoid small-sample noise). Powers the leaders section (section 16).

Example value
{
  "yusho": [
    {
      "id": 22,
      "shikonaEn": "Abi",
      "count": 8
    },
    {
      "id": 15,
      "shikonaEn": "Ryuden",
      "count": 7
    }
    // ... 10 more
  ],
  "wins": [
    {
      "id": 14,
      "shikonaEn": "Tamawashi",
      "wins": 897
    },
    {
      "id": 44,
      "shikonaEn": "Takayasu",
      "wins": 819
    }
    // ... 10 more
  ],
  "winPct": [
    {
      "id": 8854,
      "shikonaEn": "Aonishiki",
      "pct": 76.27118644067797,
      "matches": 177
    },
    {
      "id": 8850,
      "shikonaEn": "Onosato",
      "pct": 74.07407407407408,
      "matches": 243
    }
    // ... 10 more
  ]
}
01b / Dataset

What's in the dataset

sumo-api.com exposes more endpoints than we currently pull from. Here's where things stand.

Endpoint We use What it covers
/api/rikishis Yes Full 621-rikishi roster across all six divisions
/api/rikishi/<id>/stats Yes Career W/L, yusho count, sansho counts per rikishi
/api/basho/<YYYYMM> Partial Tournament metadata + yusho winners. Special-prize (sansho) winners are in the raw data but not surfaced yet.
/api/basho/<YYYYMM>/banzuke/<Division> Partial Full 15-day per-bout records. Opponent IDs are cached but not exposed in derived data.
/api/rikishi/<id>/matches No Paginated career bout history with opponent, rank, and kimarite per match
/api/rikishi/<id1>/matches/<id2> No Head-to-head record between any two rikishi, with kimarite breakdown
/api/basho/<YYYYMM>/torikumi/<Division>/<day> No Day-of matchup cards for any tournament day, including live-day scheduling
/api/kimarite/<technique> No All historical bouts decided by a given technique (back to 1958, up to 175K records for yorikiri)

What we could add without new API access

  • Head-to-head matrices - career W/L between any two rikishi. The opponent IDs are already in the raw cache for all 406 bashos; the h2h endpoint provides win-technique breakdowns on top.
  • Sansho (special prize) winners per basho - outstanding performance, fighting spirit, and technique prizes are cached in every basho file but not shown on the site.
  • Live-day matchup board - today's scheduled bouts during a basho, sourced from the torikumi endpoint.
  • Per-technique historical drilldowns - how often each kimarite has been used per decade and which rank tiers favor it, drawing on 67 years of bout records.
  • Opponent-quality-adjusted leaderboards - win rate weighted by the rank of opponents faced, enabled once opponentID is lifted into derived data.
01c / Kabu

Toshiyori-kabu data

Toshiyori-kabu records come solely from Japanese Wikipedia (年寄名跡 as the seed list + per-kabu institution articles for lineage). sumo-api has no kabu data; English Wikipedia mostly doesn't either.

Holders in lineage tables (in kanji) are matched against our roster - currently-active oyakata via ja-wiki furigana → Hepburn romanization → bio.shikonaEn, historical holders via direct kanji → bio.shikonaJp match. The kanji path mostly fails for pre-1958 holders (they're not in our roster); the romaji path resolves 99 of the 1554 matchable entries (6%).

Of 1554 match attempts: 6% exact, 0% via manual override in data/kabu-overrides.json, 94% unmatched (rendered as plain kanji on the lineage timeline). Unmatched is the expected steady state for any holder who retired before 1958 - they're outside our roster.

Each current holder also gets a third-stage enrichment: a separate fetch of the holder's own ja-wiki article pulls their JSA role (Chairman, Director, Auditor, Committee Member, Chief; 88/104 resolved) and stable-master status (the heya they run as shisho; 20/104 confirmed). These are surfaced on the per-kabu page and bidirectionally on /rikishi and /heya entries.

KabuProfile { slug, kanji, romaji, furigana, ichimon, status, currentHolderName?, currentHolderFurigana?, currentHolderRomaji?, currentHolderRikishiId?, currentHolderRoleKanji?, currentHolderRole?, // JSA role currentHolderStableMaster?, currentHolderStableMasterEn?, etymology?, sourceUrl?, fetchedAt?, holders: KabuHolder[], // sorted G1 → newest decadeSpan, distinctHeyaCount, lineageDepth?, lineageYears?, // mirror what /kabu directory shows } KabuHolder { generation, nameKanji, peakRank?, startYear?, endYear?, heyaAtHolding?, notes?, rikishiId?, matchSource?, }

One profile per kabu slug, built at deploy time from data/raw/kabu/list.json (seed rows + holder enrichment) + data/raw/kabu/<slug>.json (per-kabu lineage scraped from ja-Wikipedia). matchSource is "exact", "override", or absent (unmatched). decadeSpan is { firstYear, lastYear } across all dated holders; null when no year data is available. lineageDepth + lineageYears drive the /kabu directory's depth heatmap and per-card metrics.

02 / Calculations

What we compute, and how

Tournament outcomes

Wins / losses / absences per basho
Walk each rikishi's record[] array (15 entries). win + fusen-win count as wins; loss + fusen-loss as losses; absent as absences. Empty results (future days in a live basho) are ignored.
Banzuke outcome buckets (Sankey, section 09)
For each Makuuchi entry in the most recently completed basho:
  • Yusho - the per-division winner (single entry)
  • Strong kachi-koshi - 10+ wins, 0 absences
  • Kachi-koshi - 8-9 wins, 0 absences
  • Make-koshi - 5-7 wins, 0 absences
  • Bad make-koshi - ≤4 wins, 0 absences
  • Kyūjō - any absences
Banzuke pyramid - rank slot view (03)
Group the current Makuuchi banzuke by (rankFamily, rankNumber). Each slot has up to one East and one West holder. Empty East/West slots show as "vacant" - useful for explaining why "Yokozuna 2" doesn't exist when there are only 2 yokozuna.

Career math

Career win %
totalWins / totalMatches from sumo-api stats. Gates the leaderboard to wrestlers with ≥100 matches to avoid misleading small-sample noise.

Kimarite classification

Family classification (kimarite)
Each of the 82 official kimarite is mapped to one of: force · push · thrust · throw · leg · lose · other. Mapping is in scripts/build-data.ts and mirrored in three components (Kimarite.astro, Moves.astro, KimariteSunburst.astro). Rare/novel kimarite default to other until added.
Belt-game vs striking (Moves by rank, section 19)
"Belt-game" = force + throw family share. "Striking" = push + thrust family share. The implication: belt-game requires a clinch at the mawashi; striking happens at distance.

Aggregations

Origin parsing
The first comma-separated part of shusshin is stripped of -ken / -fu / -to / -do (the four Japanese administrative suffixes for prefectures). Result is checked against the 47-prefecture allowlist. Match → Japan; otherwise → foreign country (uses the field as-is).
Stable aggregations (13 / Stables)
Across the full 621-rikishi roster: count active wrestlers per heya, count Makuuchi members, count sanyaku-rank holders, sum career yusho across the active Makuuchi roster, and sum the most recently completed basho's W/L for each stable's Makuuchi cohort.
Weight distribution (15 / Bodies)
Quartiles (p25/p50/p75) computed via linear interpolation. Mean is plain arithmetic. All 619 active rikishi (619/621 = 99.7% have weight data; 2 missing weight excluded). Heaviest/lightest annotations are picked per division.