Understand synthetic data from scratch.

What synthetic data is, how we make it, and how it's validated — in plain language. The whole project turns on three verbs: generate, validate, learn.

The idea in one paragraph

Some valuable data can't be shared — it contains personal or banking information. Synthetic data is invented by a program to statistically resemble the real thing while describing no real person. For fraud, we go further: no real data is used at all. A rule-based generator produces plausible, already-synthetic starter data, which a model then learns to imitate. Nothing real ever enters the pipeline.

Essential vocabulary

TermIn plain words
datasetA table. Each row is one example (a transaction); each column is one characteristic.
tabularTable-shaped (rows × columns), like a spreadsheet.
featureA column used to predict — e.g. amount, country, hour.
label / targetThe column you want to predict. Here: is_fraud.
marginalThe distribution of one column on its own.
correlationA statistical link between two columns.
copulaThe "engine" that imitates a table by separating two things: the shape of each column (marginals) and how columns move together (correlations).
class imbalanceWhen a category is rare — fraud is ~0.5% of transactions.
typologyA family of fraud with its own signature (card-testing, account takeover…), labelled in fraud_type.
non-stationarityPatterns drift over time — yesterday's fraud isn't tomorrow's. No frozen dataset is ever "current".

1 · Generate

We produce realistic transactions at two levels. Between classes, fraud shifts the marginals: higher or odder amounts, night hours, card-not-present, foreign geographies, burst velocity. Within a class, columns are correlated, not independent — a large amount goes with certain merchants; an in-person purchase happens near home. Those inter-feature links are what a fraud model actually learns.

A Gaussian copula learns this structure and reproduces it. We fit one copula per typology and recombine them at an exact target rate, so the minority fraud signal isn't averaged away and each typology keeps its distinct fingerprint.

2 · Validate

A synthetic dataset is only worth something if it passes three tests. We automate them as quality gates — fail one and nothing is published.

  • Fidelity — does the synthetic data match the starter statistics (both marginals and correlations)? Aggregated into a quality_score (≈0.85; gate ≥0.72).
  • Privacy — does it avoid copying starter rows? privacy_score = 1.00 (no copies).
  • Usefulness — can a model actually learn from it? The most honest test.

3 · Learn

This is the buyer's view: train a detector, then measure it. Because fraud is rare, "percent correct" is useless (always predicting "not fraud" scores 99.5%). We use ROC-AUC and PR-AUC instead — threshold-independent, imbalance-robust.

Every dataset ships a reproducible baseline (LogReg + gradient boosting). The headline: a strong global AUC, but markedly lower AUC on the hard typologies — measurable proof the dataset carries genuine boundary cases.

0.945
ROC-AUC · global
0.72
counterfeit_present
0.66
friendly_fraud

The datasheet, anatomy of trust

Every dataset ships the same fixed datasheet template (after the "datasheets for datasets" discipline). Consistency is the point — a buyer recognises a Plexoria dataset by its datasheet.

SectionWhat it holds
Scope — read firstWhat the dataset is / isn't, with the scope warning.
MethodSeed, per-typology copula synthesis, rate/mix by construction.
ProvenanceRNG generator, no real data, reproducibility pins.
Data dictionaryColumn-by-column, incl. is_fraud and fraud_type.
Fraud typologiesKind (overt / hard), share, count, description.
Realism & non-stationarityStatistical fingerprints, adversarial domain, regeneratable.
Quality & privacy scoresThe measured QC numbers.
Baseline benchmarkGlobal + per-typology AUC.
IntegritySHA-256 manifest + Ed25519 signature, and how to verify.