합성 데이터: 실제 데이터 없이 AI 학습 데이터 만들기

Faker·SDV·GAN·Diffusion 모델까지 합성 데이터 생성 방법 전체를 정리하고, 품질 검증·프라이버시 보호·다운스트림 성능 평가까지 실무 관점에서 설명합니다.

· 9 min read · PALDYN Team

지난 글에서 기존 데이터를 변형해 양을 늘리는 증강(Augmentation)을 다뤘다. 증강이 ‘있는 것을 변형’하는 방법이라면, **합성 데이터(Synthetic Data)**는 실제 데이터를 아예 처음부터 생성하는 접근이다. 의료 기록처럼 수집 자체가 어렵거나, GDPR·개인정보보호법으로 원본 데이터를 공유하기 어려운 상황에서 합성 데이터는 실질적인 대안이 된다.

왜 합성 데이터인가

합성 데이터가 주목받는 이유는 크게 세 가지다.

첫째, 데이터 부족 해결. 의료·금융·자율주행 도메인에서는 레이블이 붙은 데이터 수집 자체가 수개월에서 수년이 걸리기도 한다. 합성 데이터는 이 병목을 제거한다.

둘째, 프라이버시 보호. 원본 데이터에서 통계적 특성만 학습해 새 데이터를 생성하면, 특정 개인을 재식별할 수 없게 만들 수 있다. 이 특성 덕분에 병원 EMR 데이터나 금융 거래 내역을 연구 목적으로 공유할 때 합성 버전을 활용하는 사례가 늘고 있다.

셋째, 엣지 케이스 확보. 실제 사고 데이터, 시스템 장애 로그, 금융 사기 거래는 본질적으로 희귀하다. 시뮬레이션이나 GAN으로 이런 희귀 케이스를 의도적으로 생성해 모델의 강건성을 높일 수 있다.

합성 데이터 생성 접근법

합성 데이터 생성 방법

규칙 기반 생성

가장 단순한 방법이다. 미리 정의된 규칙이나 포맷에 따라 데이터를 생성한다.

Faker 라이브러리는 이름, 주소, 전화번호, 이메일 등 현실적인 가짜 데이터를 빠르게 만든다. 한국어(ko_KR)를 포함한 수십 개 로케일을 지원한다.

from faker import Faker
import pandas as pd

fake = Faker('ko_KR')

records = []
for _ in range(5000):
    records.append({
        'name': fake.name(),
        'phone': fake.phone_number(),
        'email': fake.email(),
        'address': fake.address(),
        'birth': fake.date_of_birth(minimum_age=18, maximum_age=65).isoformat(),
    })

df = pd.DataFrame(records)
print(df.head())

규칙 기반 방식의 강점은 결정론적이라는 점이다. 시드를 고정하면 동일한 데이터가 재현된다. 단, 변수 간 실제 상관관계는 반영하지 않는다.

통계·수식 기반 생성

실제 데이터의 분포와 상관 구조를 학습해 새 샘플을 뽑는 방법이다. **SDV(Synthetic Data Vault)**가 대표적이다.

합성 데이터 코드 예시

from sdv.single_table import GaussianCopulaSynthesizer
from sdv.metadata import SingleTableMetadata

# 메타데이터 자동 감지
metadata = SingleTableMetadata()
metadata.detect_from_dataframe(real_df)

# Gaussian Copula로 변수 간 상관관계 보존
synthesizer = GaussianCopulaSynthesizer(metadata)
synthesizer.fit(real_df)

# 원본과 같은 수의 합성 데이터 생성
synthetic_df = synthesizer.sample(num_rows=len(real_df))

Gaussian Copula는 각 변수를 독립적으로 모델링한 뒤, Copula 함수로 변수 간 의존 구조를 별도로 모델링한다. 이렇게 하면 분포 형태와 상관관계를 동시에 보존할 수 있다.

클래스 불균형 해소에는 **SMOTE(Synthetic Minority Over-sampling Technique)**가 효과적이다. 소수 클래스 샘플의 k-최근접 이웃 사이를 보간해 새 샘플을 만든다.

from imblearn.over_sampling import SMOTE

X, y = df.drop('label', axis=1), df['label']
sm = SMOTE(random_state=42, k_neighbors=5)
X_res, y_res = sm.fit_resample(X, y)

print(f"Before: {dict(pd.Series(y).value_counts())}")
print(f"After:  {dict(pd.Series(y_res).value_counts())}")

딥러닝 기반 생성

가장 현실적인 합성 데이터를 만들 수 있지만, 학습 비용이 높다.

**CTGAN(Conditional Tabular GAN)**은 표 형식 데이터에 특화된 GAN이다. 생성자(Generator)와 판별자(Discriminator)가 경쟁하며 실제 데이터와 구분하기 어려운 합성 데이터를 학습한다.

from sdv.single_table import CTGANSynthesizer

synthesizer = CTGANSynthesizer(
    metadata,
    epochs=300,
    batch_size=500,
    verbose=True
)
synthesizer.fit(real_df)
synthetic_df = synthesizer.sample(num_rows=10000)

텍스트 데이터에는 LLM 기반 생성이 강력하다. GPT-4나 Claude에게 시스템 프롬프트로 도메인 규칙을 명시하고, 다양한 예시 데이터를 생성하도록 요청할 수 있다. 특히 Instruction Tuning용 질문-답변 쌍 생성에 많이 활용된다.

합성 데이터 품질 검증

합성 데이터는 만든 후 반드시 품질을 검증해야 한다.

sdmetrics로 자동 검증

from sdmetrics.reports.single_table import QualityReport

report = QualityReport()
report.generate(
    real_data=real_df,
    synthetic_data=synthetic_df,
    metadata=metadata.to_dict()
)

# Column Shapes: 각 컬럼의 분포 유사도
# Column Pair Trends: 컬럼 쌍 간 상관관계 보존도
report.get_details(property_name='Column Shapes')
검증 항목설명도구
통계적 유사성분포·평균·분산·상관계수 비교sdmetrics, scipy
프라이버시 위험재식별 위험도, 멤버십 추론 공격sdmetrics, AIPrivacy
다운스트림 성능합성 데이터로 학습한 모델의 실제 데이터 성능scikit-learn
현실성 점수GAN 판별자 또는 외부 분류기로 실제/합성 구분 가능 여부직접 구현

Train on Synthetic, Test on Real (TSTR)

가장 신뢰할 수 있는 품질 측정 방법이다.

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import f1_score

# 합성 데이터로 학습
clf = GradientBoostingClassifier()
clf.fit(synthetic_df[features], synthetic_df[target])

# 실제 데이터로 평가
y_pred = clf.predict(real_test_df[features])
f1 = f1_score(real_test_df[target], y_pred, average='weighted')
print(f"TSTR F1: {f1:.4f}")

TSTR F1 점수가 실제 데이터(TRTR)와 크게 다르지 않으면 합성 데이터의 품질이 충분하다고 판단할 수 있다.

프라이버시 리스크 관리

합성 데이터가 프라이버시를 보장한다고 착각하기 쉽지만, 학습 데이터에 과적합된 합성 데이터는 원본 레코드를 노출할 수 있다.

주요 공격 유형과 방어 방법:

공격 유형위협대응
멤버십 추론특정 레코드가 학습 데이터에 있었는지Differential Privacy 적용
속성 추론알려진 속성으로 나머지 속성 추론SDV anonymization 옵션
재구성 공격합성 데이터로 원본 재현에포크 수 제한, 과적합 모니터링

SDV는 anonymize 파라미터로 기본적인 프라이버시 보호를 제공하며, Differential Privacy를 통합한 PATE-GAN 같은 프레임워크도 있다.

실무 적용 가이드

언제 합성 데이터를 써야 하나?

  • 원본 데이터 수집·레이블링 비용이 매우 높을 때
  • 소수 클래스나 엣지 케이스 데이터가 부족할 때
  • 개인정보 규제로 외부 공유가 어려울 때
  • 개발·테스트 환경에 프로덕션 데이터를 쓰기 어려울 때

쓰면 안 되는 경우

  • 합성 데이터만으로 최종 모델을 평가할 때 (항상 실제 데이터로 최종 검증)
  • 실제 분포를 아직 모르는 단계 (학습 데이터 자체가 없을 때)

지난 글: 데이터 증강: 적은 데이터로 더 강한 모델 만들기

다음 글: 데이터 품질 관리: 쓰레기 in, 쓰레기 out을 막는 법


읽어주셔서 감사합니다. 😊