Testování enterprise aplikací s produkčními daty je v roce 2026 nejen riskantní, ale v mnoha případech přímo nelegální. GDPR, NIS2 a rostoucí regulace nutí české firmy hledat alternativy. Syntetická data — uměle vygenerované datasety, které statisticky odpovídají produkčním datům bez jakýchkoliv osobních údajů — jsou odpovědí. V tomto průvodci projdeme vše od teorie přes nástroje až po konkrétní implementační vzory.
Proč produkční data v testovacím prostředí nejsou řešení¶
Stále překvapivé množství firem kopíruje produkční databáze do testovacích prostředí. Problémů je celá řada:
- GDPR porušení: Osobní údaje zákazníků v testovacím prostředí znamenají rozšíření účelu zpracování bez právního základu. Pokuty dosahují 4 % obrotu.
- NIS2 regulace: Od roku 2025 platí NIS2 i pro dodavatele ICT služeb. Nedostatečná ochrana testovacích dat je audit finding kategorie “high”.
- Datové úniky: Testovací prostředí mají typicky slabší zabezpečení — širší přístupy, méně monitoringu, slabší šifrování. 67 % datových úniků v roce 2025 pocházelo z non-production prostředí.
- Maskování nestačí: Anonymizace a pseudonymizace produkčních dat je křehká. Re-identifikace je možná kombinací kvazi-identifikátorů (věk + PSČ + pohlaví = 87 % populace unikátně identifikovatelných).
- Provozní náklady: Kopírování terabajtových databází, správa přístupů, audit logování — to vše stojí čas a peníze.
Syntetická data tyto problémy řeší fundamentálně: neexistuje žádný reálný člověk, kterého by bylo možné identifikovat, protože data nikdy reálného člověka nereprezentovala.
Co jsou syntetická data a jak fungují¶
Syntetická data jsou umělé datasety generované algoritmy tak, aby zachovávaly statistické vlastnosti, distribuce a korelace původních dat — bez jakékoliv vazby na konkrétní osoby nebo záznamy.
Klíčové vlastnosti kvalitních syntetických dat¶
Statistická věrnost (fidelity): Distribuce hodnot, průměry, rozptyly a korelace mezi sloupci odpovídají originálu. Pokud v produkci mají zákazníci z Prahy průměrný věk 34 let a z Brna 38 let, syntetická data tuto distribuci zachovají.
Privátnostní záruky: Žádný syntetický záznam nesmí být příliš podobný reálnému záznamu. Měří se metrikami jako Distance to Closest Record (DCR) nebo membership inference resistance.
Užitečnost (utility): ML modely trénované na syntetických datech dosahují srovnatelné přesnosti jako na originálních datech. Benchmarkuje se poklesem metriky (accuracy drop, F1 drop).
Konzistence: Referenční integrita mezi tabulkami je zachována. Objednávka odkazuje na existujícího zákazníka, který má validní adresu ve správném formátu.
Generativní přístupy¶
V praxi se používají tři hlavní kategorie generátorů:
1. Statistické modely (rule-based) Nejjednodušší přístup. Definujete distribuce pro každý sloupec a generátor produkuje data podle pravidel. Vhodné pro jednoduché datasety bez komplexních závislostí.
# Příklad: Faker + vlastní distribuce
from faker import Faker
import numpy as np
fake = Faker('cs_CZ')
def generate_customer():
age = int(np.random.normal(38, 12)) # normální distribuce
age = max(18, min(99, age))
return {
'name': fake.name(),
'email': fake.email(),
'age': age,
'city': np.random.choice(
['Praha', 'Brno', 'Ostrava', 'Plzeň'],
p=[0.45, 0.20, 0.15, 0.20]
),
'monthly_spend': max(0, np.random.lognormal(7.5, 1.2))
}
Výhody: rychlé, deterministické, snadno vysvětlitelné. Nevýhody: nepostihují komplexní korelace mezi sloupci.
2. GAN-based generátory (CTGAN, TableGAN) Generativní adversariální sítě natrénované na tabulkových datech. Generator produkuje syntetické záznamy, discriminator se učí rozlišovat reálná od syntetických. Po konvergenci generator produkuje statisticky věrná data.
from sdv.single_table import CTGANSynthesizer
from sdv.metadata import SingleTableMetadata
metadata = SingleTableMetadata()
metadata.detect_from_dataframe(real_data)
synthesizer = CTGANSynthesizer(metadata, epochs=500)
synthesizer.fit(real_data)
synthetic_data = synthesizer.sample(num_rows=100_000)
Výhody: automaticky zachycují komplexní korelace. Nevýhody: vyžadují dostatek trénovacích dat (tisíce záznamů), trénink trvá hodiny.
3. LLM-based generátory Nejnovější přístup — využití velkých jazykových modelů pro generování kontextově bohatých syntetických dat. Zvláště efektivní pro nestrukturovaná a semi-strukturovaná data (texty objednávek, lékařské zprávy, zákaznická komunikace).
# Příklad s Claude API pro generování realistických zákaznických ticketů
import anthropic
client = anthropic.Anthropic()
prompt = """Vygeneruj 5 realistických zákaznických ticketů
pro český e-shop s elektronikou. Každý ticket musí obsahovat:
- předmět, popis problému, kategorii, prioritu, sentiment
Formát: JSON array. Tickety mají být rozmanité — reklamace,
dotazy, stížnosti, pochvaly."""
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2000,
messages=[{"role": "user", "content": prompt}]
)
Výhody: generují kontextově bohatá data s realistickými vztahy, nepotřebují trénovací dataset. Nevýhody: nákladnější pro velké objemy, horší reprodukovatelnost.
Architektura systému syntetických dat v enterprise¶
V enterprise prostředí nepotřebujete jen generátor — potřebujete celý pipeline. Zde je referenční architektura, kterou nasazujeme u klientů:
1. Metadata Layer — porozumění datům¶
Než cokoliv vygenerujete, potřebujete porozumět schématu, distribucím a vztahům:
# schema-profile.yaml
tables:
customers:
columns:
- name: customer_id
type: integer
role: primary_key
generator: sequential
- name: email
type: string
role: pii
pattern: "{first_name}.{last_name}@{domain}"
- name: birth_date
type: date
distribution: normal
mean: "1988-06-15"
std_days: 4380 # ~12 let
- name: segment
type: categorical
values: [premium, standard, basic]
weights: [0.15, 0.55, 0.30]
constraints:
- type: unique
columns: [email]
- type: range
column: birth_date
min: "1940-01-01"
max: "2008-12-31"
orders:
columns:
- name: order_id
type: integer
role: primary_key
- name: customer_id
type: integer
role: foreign_key
references: customers.customer_id
- name: total_amount
type: decimal
distribution: lognormal
mean: 1250.0
std: 2800.0
relationships:
- type: one_to_many
parent: customers
child: orders
distribution: poisson
mean: 4.2 # průměrný počet objednávek na zákazníka
2. Generation Engine — tvorba dat¶
Orchestrátor, který: - Respektuje referenční integritu (generuje rodiče před dětmi) - Aplikuje constrainty (unique, range, null rates) - Zachovává temporální konzistenci (objednávka po registraci) - Podporuje inkrementální generování (nové záznamy k existujícím)
3. Validation Layer — ověření kvality¶
Každý vygenerovaný dataset prochází automatickou validací:
from sdmetrics.reports.single_table import QualityReport
from sdmetrics.single_table import NewRowSynthesis
# Statistická kvalita
report = QualityReport()
report.generate(real_data, synthetic_data, metadata)
print(f"Overall quality score: {report.get_score()}")
# Cíl: > 0.85
# Privátnostní validace
privacy_score = NewRowSynthesis.compute(
real_data, synthetic_data, metadata
)
print(f"New row synthesis: {privacy_score}")
# Cíl: > 0.95 (95%+ záznamů je unikátních)
4. Distribution Layer — doručení dat¶
Syntetická data musí být snadno dostupná vývojářům a CI/CD pipeline:
- Self-service portál: Vývojář si vybere schéma, počet záznamů, seed → generuje on-demand
- CI/CD integrace: Každý build automaticky generuje fresh dataset
- Snapshot management: Verzované datasety pro reprodukovatelné testy
- Format flexibility: SQL dump, CSV, Parquet, API endpoint
Praktické vzory pro české enterprise¶
Vzor 1: Bankovní transakce¶
České banky musí testovat AML (Anti-Money Laundering) systémy s realistickými transakcemi. Syntetická data musí obsahovat:
- Normální transakční vzory (výplata → nájem → nákupy)
- Anomálie pro detekci (structuring, layering, round-tripping)
- České specifika (formáty účtů, IBAN CZ, variabilní symboly)
def generate_czech_transaction():
"""Generuje českou bankovní transakci s realistickými vzory."""
tx_type = np.random.choice(
['incoming', 'outgoing', 'internal'],
p=[0.35, 0.55, 0.10]
)
# České specifické formáty
iban = f"CZ{np.random.randint(10,99)}" + \
f"{np.random.randint(1000,9999):04d}" + \
f"{np.random.randint(10**15, 10**16):016d}"
vs = f"{np.random.randint(1, 9999999999):010d}" # variabilní symbol
# Realistické částky podle typu
if tx_type == 'incoming' and np.random.random() < 0.3:
# Výplata — normální distribuce kolem mediánu
amount = max(15000, np.random.normal(42000, 15000))
else:
amount = np.random.lognormal(7.5, 1.8)
return {
'iban': iban,
'amount': round(amount, 2),
'currency': 'CZK',
'variable_symbol': vs,
'type': tx_type,
'timestamp': fake.date_time_between(
start_date='-90d', end_date='now'
)
}
Vzor 2: E-commerce objednávky¶
Pro testování logistických systémů potřebujete konzistentní objednávky:
- Zákazník → košík → objednávka → platba → expedice → doručení
- Každý krok má realistické časové rozestupy
- České adresy (PSČ odpovídá městu, ulice existují)
- Sezónní vzory (Vánoce, Black Friday, léto)
class CzechOrderGenerator:
"""Generátor českých e-commerce objednávek se sezónními vzory."""
SEASONAL_MULTIPLIERS = {
1: 0.7, 2: 0.65, 3: 0.8, 4: 0.85,
5: 0.9, 6: 0.85, 7: 0.75, 8: 0.8,
9: 0.95, 10: 1.0, 11: 1.4, 12: 1.8
}
PSC_CITY_MAP = {
'110 00': 'Praha 1', '120 00': 'Praha 2',
'602 00': 'Brno', '301 00': 'Plzeň',
'702 00': 'Ostrava', '500 02': 'Hradec Králové',
'370 01': 'České Budějovice', '460 01': 'Liberec',
}
def generate_order(self, date: datetime) -> dict:
month = date.month
base_items = np.random.poisson(2.3)
items = max(1, int(base_items * self.SEASONAL_MULTIPLIERS[month]))
psc = np.random.choice(list(self.PSC_CITY_MAP.keys()))
return {
'order_date': date,
'items_count': items,
'shipping_address': {
'city': self.PSC_CITY_MAP[psc],
'psc': psc,
'street': fake.street_name(),
},
'payment_method': np.random.choice(
['card', 'bank_transfer', 'cod', 'gopay'],
p=[0.45, 0.25, 0.15, 0.15]
),
'delivery_method': np.random.choice(
['zasilkovna', 'dpd', 'ppl', 'ceska_posta', 'personal'],
p=[0.35, 0.20, 0.20, 0.15, 0.10]
)
}
Vzor 3: Zdravotnická data¶
Nemocnice a pojišťovny potřebují testovat systémy s pacientskými daty, kde je GDPR obzvlášť přísné:
- Diagnózy odpovídající MKN-10 (česká klasifikace)
- Realistické hospitalizační vzory
- Demografické korelace (věk ↔ diagnóza)
- Žádné reálné rodné číslo — generované s platným formátem ale neexistující
def generate_czech_birth_number(birth_date, gender):
"""Generuje syntetické rodné číslo ve validním formátu."""
year = birth_date.year % 100
month = birth_date.month
if gender == 'F':
month += 50 # Ženy mají měsíc + 50
day = birth_date.day
# Poslední 4 cifry — zajistíme dělitelnost 11
base = f"{year:02d}{month:02d}{day:02d}"
for _ in range(1000):
suffix = f"{np.random.randint(0, 9999):04d}"
full = base + suffix
if int(full) % 11 == 0:
return f"{base}/{suffix}"
return f"{base}/0000" # fallback
Nástroje pro generování syntetických dat v roce 2026¶
Open-source nástroje¶
| Nástroj | Přístup | Vhodné pro | Licence |
|---|---|---|---|
| SDV (Synthetic Data Vault) | GAN/statistické | Tabulková data, multi-table | MIT |
| Faker | Rule-based | PII nahrazení, jednoduché datasety | MIT |
| Gretel.ai SDK | GAN + LLM | Komplexní enterprise data | Freemium |
| DataSynthesizer | Bayesian network | Akademické / jednodušší use cases | MIT |
| Synthcity | GAN/VAE/diffusion | Healthcare data | Apache 2.0 |
| Mimesis | Rule-based | Vysoký výkon, multi-locale | MIT |
Enterprise platformy¶
Mostly AI: Lídr v Gartner Magic Quadrant pro syntetická data. Silná podpora tabulkových dat, automatická privátnostní validace, self-hosted i cloud. Cena: od €50K/rok.
Tonic.ai: Zaměřený na databázové subsetting + syntetizaci. Přímá integrace s PostgreSQL, MySQL, Oracle. Silný v CI/CD pipeline. Cena: od $30K/rok.
Hazy: Britský startup s fokusem na finanční sektor. Diferenciální privátnost jako default. Cena: na vyžádání.
Gretel.ai: Cloud-native platforma s nejlepší LLM integrací. Generuje i nestrukturovaná data (texty, JSON, logy). Free tier pro menší objemy.
Naše doporučení pro české firmy¶
Pro většinu českých enterprise klientů doporučujeme kombinovaný přístup:
- Faker + vlastní pravidla pro jednoduché referenční datasety (číselníky, konfigurace)
- SDV/CTGAN pro komplexní transakční data s korelacemi
- LLM generování pro textová data (tickety, dokumenty, komunikace)
- Vlastní validační framework pro české specifika (rodná čísla, IČO, DIČ, IBAN)
GDPR a právní aspekty¶
Jsou syntetická data osobním údajem?¶
Klíčová otázka. Odpověď závisí na metodě generování:
Plně syntetická data (de novo): Generovaná čistě ze statistických distribucí bez přímého mapování na konkrétní osoby. Podle stanoviska EDPB (European Data Protection Board) z roku 2025 se nejedná o osobní údaje, pokud: - Nelze žádný záznam zpětně přiřadit konkrétní osobě - Generátor neprovádí 1:1 transformaci - Distance to Closest Record (DCR) je nad bezpečným prahem
Pseudonymizovaná data: Transformace produkčních dat (maskování, hashing). Stále jsou osobní údaje podle GDPR — pseudonymizace není anonymizace.
Diferenciálně privátní data: Přidání kalibovaného šumu, který matematicky garantuje, že přítomnost/nepřítomnost jednoho záznamu neovlivní výstup. Nejsilnější právní pozice — prokazatelná anonymizace.
Praktická doporučení¶
- Dokumentujte metodu generování — auditor musí vidět, že syntetická data nelze zpětně propojit
- Provádějte re-identifikační testy — pravidelně ověřujte, že syntetické záznamy nelze linkovat na reálné osoby
- Uchovávejte metadata — jaký model, jaká konfigurace, jaký seed generoval data
- Oddělte prostředí — generátor, který má přístup k produkčním datům, běží v chráněném prostředí
Implementace v CI/CD pipeline¶
Syntetická data mají největší hodnotu, když jsou automatizovaná v CI/CD:
# .github/workflows/integration-tests.yml
name: Integration Tests with Synthetic Data
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_DB: testdb
POSTGRES_PASSWORD: test
ports: ['5432:5432']
steps:
- uses: actions/checkout@v4
- name: Generate synthetic data
run: |
pip install sdv faker
python scripts/generate_test_data.py \
--schema config/data-schema.yaml \
--rows 50000 \
--seed ${{ github.run_number }} \
--output /tmp/synthetic_data/
- name: Load data into test DB
run: |
psql -h localhost -U postgres -d testdb \
-f /tmp/synthetic_data/load.sql
env:
PGPASSWORD: test
- name: Run integration tests
run: pytest tests/integration/ -v --tb=short
- name: Validate data quality
run: |
python scripts/validate_synthetic_data.py \
--data /tmp/synthetic_data/ \
--min-quality 0.85 \
--min-privacy 0.95
Deterministické vs. stochastické generování¶
Pro CI/CD je kritický reprodukovatelný výstup:
class DeterministicGenerator:
"""Seed-based generátor pro reprodukovatelné CI/CD testy."""
def __init__(self, seed: int = 42):
self.rng = np.random.RandomState(seed)
self.fake = Faker('cs_CZ')
Faker.seed(seed)
def generate_dataset(self, n_rows: int) -> pd.DataFrame:
"""Stejný seed = stejná data pokaždé."""
records = [self._generate_record() for _ in range(n_rows)]
return pd.DataFrame(records)
def _generate_record(self) -> dict:
return {
'id': self.fake.uuid4(),
'name': self.fake.name(),
'email': self.fake.email(),
'amount': round(self.rng.lognormal(7, 1.5), 2),
'created_at': self.fake.date_time_this_year()
}
Měření kvality syntetických dat¶
Nestačí generovat — musíte měřit. Klíčové metriky:
Fidelity metriky¶
- Column Shape: Distribuce každého sloupce vs. originál (KS test, chi-squared)
- Column Pair Trends: Korelace mezi páry sloupců
- Parent-Child Relationships: Referenční integrita a distribuční konzistence
Privacy metriky¶
- DCR (Distance to Closest Record): Minimální vzdálenost syntetického záznamu od nejbližšího reálného. Medián by měl být > 5. percentil reálných dat.
- Membership Inference: Dokáže ML model rozhodnout, zda byl konkrétní záznam v trénovacím datasetu? Cíl: accuracy ≤ 52 % (blízko náhody).
- Attribute Inference: Dokáže útočník odvodit citlivý atribut ze syntetických dat lépe než z veřejných statistik? Cíl: minimální advantage.
Utility metriky¶
- ML Efficacy: Trénujte stejný model na reálných a syntetických datech, porovnejte výkon na reálném test setu
- Query Accuracy: Analytické dotazy (agregace, filtry) na syntetických datech by měly dávat výsledky ±5 % od reálných
- Statistical Tests: Kolmogorov-Smirnov test pro spojité proměnné, chi-squared pro kategorické
from sdmetrics.reports.single_table import QualityReport, DiagnosticReport
# Kvalita
quality = QualityReport()
quality.generate(real_data, synthetic_data, metadata)
print("Column Shapes:", quality.get_details('Column Shapes'))
print("Column Pair Trends:", quality.get_details('Column Pair Trends'))
# Diagnostika
diag = DiagnosticReport()
diag.generate(real_data, synthetic_data, metadata)
print("Coverage:", diag.get_details('Coverage'))
print("Boundaries:", diag.get_details('Boundary'))
Časté chyby a jak se jim vyhnout¶
1. Generování bez profilování¶
Generujete data, aniž byste pochopili distribuce originálu. Výsledek: syntetická data s uniformními distribucemi, která neodpovídají realitě.
Řešení: Vždy začněte data profilingem — YData Profiling, pandas-profiling, nebo vlastní analýza.
2. Ignorování temporálních závislostí¶
Objednávky s datem před registrací zákazníka. Platby před vystavením faktury. Absurdní, ale běžná chyba.
Řešení: Definujte explicitní temporální constrainty v konfiguraci generátoru.
3. Příliš uniformní data¶
Syntetická data bez outlierů a edge cases. Testy pak prochází, ale produkce padá na neočekávaných hodnotách.
Řešení: Záměrně injektujte edge cases — null hodnoty, extremní částky, unicode znaky v jménech, adresy se speciálními znaky.
4. Jednorázová generace¶
Vygenerujete dataset jednou a používáte ho měsíce. Data zastarávají, nové features nemají testovací data.
Řešení: Automatizujte generování v CI/CD, aktualizujte schéma s každou migrací.
5. Chybějící validace privátnosti¶
Generujete data a předpokládáte, že jsou bezpečná. Bez měření nemůžete vědět.
Řešení: Automatická privátnostní validace v každém generovacím runu. Fail build při překročení prahu.
Case study: Implementace pro českého retailera¶
Jeden z našich klientů — český retailer s 2M+ zákazníky a 50M+ transakcemi ročně — potřeboval testovací prostředí pro nový loajalitní systém.
Výchozí stav¶
- Kopie produkční DB (PostgreSQL 14, 800 GB) v testovacím prostředí
- Maskování přes vlastní SQL skripty (nespolehlivé, 3 auditní nálezy)
- Refresh jednou měsíčně (manuální, 6h downtime testu)
- 12 vývojářů s přístupem k produkčním datům
Řešení¶
- SDV + Faker pro tabulková data s českými specifiky
- Vlastní generátor pro věrnostní body a kampaně
- CI/CD integrace — fresh data na každý PR
- Validační pipeline — automatické ověření kvality a privátnosti
Výsledky po 3 měsících¶
- 0 vývojářů s přístupem k produkčním datům (z 12)
- Audit compliance: Všechny GDPR nálezy uzavřeny
- Generování: 50M syntetických transakcí za 45 minut (vs. 6h kopírování)
- Bug detection: +23 % více bugů nalezeno díky edge case injekci
- Náklady: -40 % na testovací infrastrukturu (menší DB, žádné security overlays)
Budoucnost: kam směřují syntetická data v roce 2026¶
Trend 1: Foundation Models pro tabulková data¶
Modely jako TabPFN a TabDDPM umožňují zero-shot generování — natrénujte jednou na tisících datasetů, pak generujte pro nová schémata bez přetrénování.
Trend 2: Federated Synthetic Data¶
Organizace sdílejí syntetické reprezentace dat bez sdílení dat samotných. Umožňuje kolaborativní analýzu v healthcare, finance a supply chain.
Trend 3: Regulatorní standardy¶
EU AI Act kategorizuje syntetická data jako klíčový nástroj pro AI compliance. Očekávejte formální certifikační rámce v průběhu 2026–2027.
Trend 4: Real-time syntetická data¶
Streamové generování syntetických dat pro testování real-time systémů — Kafka, event sourcing, CDC pipeline.
Závěr¶
Syntetická data nejsou luxus — jsou nutnost. České firmy, které stále kopírují produkční databáze do testovacích prostředí, riskují GDPR pokuty, datové úniky a audit findings. Technologie v roce 2026 jsou dostatečně zralé pro enterprise nasazení.
Začněte jednoduše: Faker pro referenční data, SDV pro komplexní datasety, automatická validace v CI/CD. Klíč je v systematickém přístupu — ne jednorázový skript, ale integrovaný pipeline s měřitelnou kvalitou a privátností.
CORE SYSTEMS pomáhá českým firmám implementovat kompletní platformy syntetických dat — od analýzy datového modelu přes nasazení generátorů až po CI/CD integraci a GDPR compliance dokumentaci. Ozvěte se nám, pokud potřebujete zbavit testovací prostředí produkčních dat.
Potřebujete pomoc s implementací?
Naši experti vám pomohou s návrhem, implementací i provozem. Od architektury po produkci.
Kontaktujte nás