【Python】Python SDV 〜 入門編 〜

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/12/19/233012

で「SDV (Synthetic Data Vault)」っていうのを知ったので
調べてみた

目次

【1】SDV (Synthetic Data Vault)
 1)合成データ(Synthetic Data)とは?
 2)主要モデル
【2】インストール
【3】サンプル
 1)Hello world
 2)CSVデータから読み取って、CSV出力する

【1】SDV (Synthetic Data Vault)

* 実データからパターンをさまざまな機械学習アルゴリズムを使用し、
 合成データ(Synthetic Data) を生成するためのPythonライブラリ

https://docs.sdv.dev/sdv
https://github.com/sdv-dev/SDV

1)合成データ(Synthetic Data)とは?

https://aws.amazon.com/jp/what-is/synthetic-data/

より抜粋
~~~~~~~~
合成データは、現実世界のデータを模倣した、
人間が作成したデータではありません。
生成型人工知能技術に基づく計算アルゴリズムと
シミュレーションによって作成されます。
~~~~~~~~

2)主要モデル

モデル名 カテゴリ 手法 対象データの特徴 強み・メリット
Gaussian Copula(ガウスコピュラ) 単一テーブル(単一で完結するデータ) 統計モデル 相関が比較的単純なデータ|爆速。 計算負荷が低く、数値を綺麗に再現する。
CTGAN / TVAE 単一テーブル(単一で完結するデータ) 深層学習 複雑な分布やカテゴリ変数|精度重視。非線形な関係や偏ったデータに強い。
HMA 複数テーブル 階層的統計 データベース(親子関係)|整合性。 ID連携やテーブル間の統計量を維持する。
PAR 時系列・連続 深層学習 履歴、センサー、行動ログ|順序性。 「過去の状態が次に影響する」流れを再現

https://docs.sdv.dev/sdv/tutorials

【2】インストール

pip install sdv

# pip install sdv pandas numpy

【3】サンプル

1)Hello world

import pandas as pd
from sdv.datasets.demo import download_demo
from sdv.metadata import SingleTableMetadata
from sdv.single_table import GaussianCopulaSynthesizer

# 1. 元となるデータの準備(単一テーブル)
# ここでは「顧客情報」のようなシンプルなデータを作成します
data = pd.DataFrame({
    'user_id': [1, 2, 3, 4, 5],
    'age': [25, 34, 45, 23, 56],
    'plan': ['Basic', 'Premium', 'Premium', 'Basic', 'Free'], # カテゴリ変数
    'satisfaction': [0.8, 0.9, 0.7, 0.2, 0.5]  # 数値(0~1)
})

# 2. メタデータの作成
# データの型(どの列がIDか、数値かなど)を自動検出します
metadata = SingleTableMetadata()
metadata.detect_from_dataframe(data)

# 3. 合成モデル(Synthesizer)の選択と学習
# 最も高速な GaussianCopula を使用します
synthesizer = GaussianCopulaSynthesizer(metadata)
synthesizer.fit(data)

# 4. 合成データの生成(サンプリング)
# 10件の新しい「本物そっくりのデータ」を生成します
synthetic_data = synthesizer.sample(num_rows=10)

# 結果の表示
print("--- 元のデータ ---")
print(data.head())
print("\n--- 生成された合成データ ---")
print(synthetic_data.head(10))

出力結果(警告が出るので、コードは感じを掴む形で、、、)

/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/sdv/single_table/base.py:168: FutureWarning: The 'SingleTableMetadata' is deprecated. Please use the new 'Metadata' class for synthesizers.
  warnings.warn(DEPRECATION_MSG, FutureWarning)
/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/sdv/single_table/base.py:134: UserWarning: We strongly recommend saving the metadata using 'save_to_json' for replicability in future SDV versions.
  warnings.warn(
--- 元のデータ ---
   user_id  age     plan  satisfaction
0        1   25    Basic           0.8
1        2   34  Premium           0.9
2        3   45  Premium           0.7
3        4   23    Basic           0.2
4        5   56     Free           0.5

--- 生成された合成データ ---
    user_id  age     plan  satisfaction
0   6138286   48  Premium           0.9
1   9216891   37  Premium           0.5
2  15482477   30  Premium           0.8
3   6685114   29  Premium           0.6
4   6689746   49  Premium           0.8
5  11818073   33  Premium           0.5
6   4498502   42  Premium           0.7
7    153594   30  Premium           0.9
8   4933337   56     Free           0.9
9  11440469   27    Basic           0.5

2)CSVデータから読み取って、CSV出力する

import pandas as pd
from sdv.metadata import SingleTableMetadata
from sdv.single_table import GaussianCopulaSynthesizer

df = pd.read_csv('sample.csv')

metadata = SingleTableMetadata()
metadata.detect_from_dataframe(df)

metadata.update_column(column_name='id', sdtype='id')
metadata.update_column(column_name='name', sdtype='categorical')
metadata.update_column(column_name='gender', sdtype='categorical')
metadata.update_column(column_name='birth_day', sdtype='datetime')
metadata.update_column(column_name='address', sdtype='categorical')
metadata.update_column(column_name='phone_number', sdtype='categorical')
metadata.update_column(column_name='email', sdtype='categorical')

synthesizer = GaussianCopulaSynthesizer(
    metadata,
    enforce_min_max_values=True
)
synthesizer.fit(df)

synthetic_data = synthesizer.sample(num_rows=5000)
synthetic_data.to_csv('synthetic_data.csv', index=False)

print("Done!")

参考文献

https://zenn.dev/enostech/articles/4dc11e93be2ae8
https://yolo-kiyoshi.com/2020/11/19/post-2384/
https://yolo-kiyoshi.com/2020/11/27/post-2410/
https://tech.ledge.co.jp/entry/sdv

関連記事

Python SDV 〜 HMASynthesizer 〜
https://dk521123.hatenablog.com/entry/2025/12/26/001812
AWS上に合成データ生成システムを構築する 〜 構想編 〜
https://dk521123.hatenablog.com/entry/2025/12/19/233012
Python 〜 Faker 〜
https://dk521123.hatenablog.com/entry/2025/12/20/001758
AWS Glue ~ Wheelファイル作成 ~
https://dk521123.hatenablog.com/entry/2026/01/13/191945