Analyze the disparity between secondary market value and statistical pull cost.
Loading analytics…
Fetching sets and building charts
Updating charts…
Every set is already in the comparison. Remove one from the chips above to add a different set.
Cards sorted by |Δlog₁₀y| vs the weighted LSRL. Above the line = pricier than fit; below = cheaper.
Large residuals often mean story, iconicity, or liquidity not yet encoded in a driver. Points with neutral X (e.g. POP series) may stack vertically, distorting logs.
Primary view: X is a weighted blend of validated drivers (e.g. pull cost, print volume, popularity, hype). Y is chart market price (median USD blend across list / Dex / Track / optional anchors) on a logarithmic axis.
The engine pools all selected points and screens for drivers with |Pearson r| ≥ 0.30 vs price. If none clear that bar, it fallbacks to the strongest with |r| ≥ 0.15. A greedy pass then fine-tunes the selection to maximize the composite correlation. *linear-r used for screening; log-price target used for headline stats.
X is chart market price (median USD blend). Y is the natural log of (that price ÷ estimated pull cost).
Y represents the secondary-market “premium” per dollar of pull difficulty. Higher Y means a card is pricier than its rarity cohort arithmetic would suggest. Pull cost is blended from card-specific odds and slot/rarity population.
X is print volume (character file); Y is chart market price ($). Species keys are normalized; Pokémon vs Trainer lines use two colors per set when both appear.
X is high-tier print volume from the character premium file (usually linear; when there are enough points and a mild quadratic improves correlation with log price, the axis uses v + v²/s with scale s from the sample). Card names map to base species for lookup (e.g. Mega Gengar ex → Gengar) so form variants share the same species print count. Points are split by Is_Human: Pokémon species lines vs Trainers (supporter / human subjects)—two colors per set when both appear. Y is market price ($).
X is ln(1 + artist chase median $) from artist_scores.json; Y is this card’s market price.
X is ln(1 + median market $) for that card’s artist across all chase-tier cards captured when the scraper built artist_scores.json (not per-set). Y is this card’s market price. Useful for “artists whose illustrated chases tend to clear high” vs. this listing—association only.
X is search/survey popularity plus graded signals: export-wide species slab share nudges the index, then each card’s log₁₀(1+graded) vs the set median stretches the axis when slab data exist. Y is chart market price ($). Composite still uses file-matched popularity only—this scatter may impute missing tokens (tooltips flag it).
X starts from Popularity_Index when present: a weighted blend of Google Trends (Trend_Index_Average) with survey signal from multi-poll adjusted ranks plus Sparklez 2025 vote totals (synthetic rank on the same ~45–100 scale), combined before mapping to the chart axis (see species_popularity_build_meta.json for source URLs). Averaged across base species tokens (same stripping as the character chart). Items and trainers with no species row keep Trends-only values. Names with no token match still plot using a small imputed baseline; tooltips flag imputed points. The composite uses matched-file popularity only (no imputation). The scatter then applies the graded nudges described in the regression footnotes. Y is chart market price ($).
X is a collector print-class ordinal from listed rarity; Y is market price ($). Separate from pull-math weights.
X is an ordinal collector print-class score from the card’s listed rarity (SIR, IR, UR, holo, etc.)—the same heuristic ladder used for LSRL point weights, shown here as a browsing axis separate from pull-math. Y is market price ($).
X is sqrt-capped set age from release_date (shared per set); Y is market price ($).
X is sqrt-scaled capped set age: sqrt(min(years since release_date, 28)) ÷ sqrt(28) so recent product gets more horizontal spread and 1990s–2000s vintage does not stretch the axis alone. Tooltips show raw years. Fixed reference date (UTC). Every card from the same set shares the same X—vintage / era context. Y is market price ($). Pooling many eras often yields a weak linear r; that is expected.
X is hobby-wide interest by set release calendar year (tcg_macro_interest_by_year.json); Y is market price ($). Not per-species Trends.
X is a hobby-wide interest index for the set’s calendar release year (from tcg_macro_interest_by_year.json) — e.g. annual Google Trends means for “pokemon tcg” / “pokemon cards,” not per-species Trends. Every card from the same set shares the same X. Y is market price ($). Use it to compare eras (e.g. Skyridge, 2003) against today’s prices; confounders include print runs, English share, grade supply, and this scrape’s top-card selection. Run python scrape/seed_tcg_macro_interest_years.py then replace null values in by_year with numbers from your Trends export.
X is log₁₀(1 + graded total) (Gemrate / sidecar). Y is chart market price ($). High counts often track liquidity; low counts vs modern-era pools (see hype×scarcity) can read as relative scarcity.
X is log₁₀(1 + total PSA-style graded count) from Gemrate Universal Pop (or sidecar totals from graded_population_merge.py). Y is chart market price ($). Trainer Gallery / shiny-vault style lists often share the main expansion slug in the merge—read tooltips for source and slug.
X is the same blended popularity as the Trends chart × a scarcity term: log₁₀(effective pull + 1) plus adjustments when this card’s graded count is low vs set peers and vs a modern-era slab median from the current selection (release year ≥ 2015 or ≤12y old). Y is chart market price ($).
This index combines interest (search + slab-informed popularity) with modeled pull difficulty and slab density. Fewer grades than a typical modern English chase in your sample reads as extra scarcity alongside a hard pull—use it as an exploratory “chase” axis, not a causal model.
X is the same slab-adjusted popularity as the Trends chart divided by ln(effective pull + 1). Y is chart market price ($).
This ratio measures blended interest per unit of pull difficulty (natural log of pull dollars + 1). It uses the same popularity numerator as the Trends scatter so graded population nudges the gap.
These charts are exploratory: LSRL and correlations describe association in the current sample, not causation. By default the sample is top-list English-centric listings with sub-$5 prices included (toggle under Data, filters & tools to require market price ≥ $5 only). Cards with no positive list / Dex / Track USD are always omitted from scatters. Mixed sets, rarity skew, possible reprints, and selection effects mean out-of-sample prices are not “predicted” here. Base Set (base1) Charizard is excluded from every scatter and from character-volume calibration — one legacy listing otherwise dominates log-price fits.
Pull costs blend card and slot odds with set rarity_counts; the popularity index (Google Trends plus multi-poll survey ranks in google_trends_momentum.json, rebuilt via scrape/build_species_popularity_index.py) and character volume use base species keys (Mega / regional forms stripped) to match your JSON files; the TCG-wide interest panel uses a separate tcg_macro_interest_by_year.json hobby index keyed by set release calendar year (macro Trends-style series you supply — not per-card species). The print-class chart maps listed rarity to a collector ordinal; set age uses a sqrt-capped transform of years from release_date; the illustrator chart uses global chase medians from artist_scores.json; the graded population chart plots log₁₀(1 + total graded) vs price (Gemrate analytics). After a scraper refresh, tooltips can show promo / subset-reprint heuristics, the Dex variant that set chart price, and regulation mark when present. Gemrate population (Universal Pop totals + PSD/BGS/CGC gem counts) is fetched via gemrate_scraper.py using the advanced REST endpoint routing. Hover tooltips name the set for each point and show how far it sits above or below the weighted LSRL on that chart’s axes (composite: log₁₀(price) vs X).
Full union of Sparklez 2025 votes (variants summed to base species), multi-poll adjusted ranks, and Google Trends where the species appears in google_trends_momentum.json.
Rows without a Trends row use the file’s median Trend only for this table’s sort score (not for card scatters). Rebuild: python scrape/build_species_popularity_index.py → species_popularity_list.json.
| # | Species | Pop. idx | Trends | Panel adj. | Sparklez votes | In TCG trends file |
|---|
The composite index is a dynamic regression engine that picks the best-performing price drivers for the currently selected sets. Drivers are z-scored and blended based on their individual Pearson correlation (r) to log₁₀(price).
Market prices are NM/EN medians from TCGTracking and PriceDex. Character volume and species popularity are derived from aggregated catalog search and global graded population files.
Listings under $5 are included by default (toggle in Data, filters & tools to require ≥ $5 only). The 1999 Base Set Charizard (extreme outlier) stays excluded from every scatter and character-volume calibration.