Pythonでダミーデータを自動生成してみた！

# はじめに
最近は数百万から数億行のデータの前処理やら加工やら集計やらをするのは当たり前となってきている。ただ、大きいデータを使ってのロジックがあっているかなどの確認は超めんどくさい。(単純にデータ多いし、見通し悪いし)

なので、スモールデータ(ダミーデータ)を使ってロジックがあっているかの確認をしたい！
<b>ChatGPT</b> 等を使ってもデータ生成はできますが、<b>PythonのFaker</b> ライブラリを使うことでもかなりカスタマイズされたダミーデータを作成することができます。特殊な値を入れたい場合に重宝するかもしれません。

# 使ってみた
まずは全体のコードをぺちゃっとします。

~~~python:FakeData.py

import pandas as pd
import random
from faker import Faker
from faker.providers import DynamicProvider

def main():

  fake = Faker("jp-JP") # Fakerのインスタンス、引数を変えることで言語の対応を変更できる
  # Faker(['it_IT', 'en_US', 'ja_JP']) とすると多国籍データにすることも可能！公式ドキュメントより
  
  create_provider(fake, "retire_flg", [0,1]) # オリジナルのダミー値を作成
  
  # ヘッダー
  header = ["ID", "名前", "誕生日", "住所", "勤続年数", "給与", "退職フラグ"]

  rows = []
  for i in range(10): # 10行のダミーデータを作成
    row = []
    row.append(str(fake.random_number(digits=10)).rjust(10, "0")) # ID
    row.append(fake.name()) # 名前
    row.append(fake.date_of_birth().strftime("%Y-%m-%d")) # 誕生日
    row.append(fake.address()) # 住所
    row.append(fake.random_number(digits=2)) # 勤続年数
    row.append(salary_with_outlier(fake, possibility=0.1)) # 給与
    row.append(fake.retire_flg()) # 退職フラグ
    
    rows.append(row)

  df = pd.DataFrame(rows)
  df.columns = header
  df.to_csv("employee_dummy_data.csv", index=False)
  
def salary_with_outlier(fake, possibility:int=0.01):
  if random.random() < possibility: # 指定の確率で外れ値を生成
    return fake.random_int(min=-100000, max=0)
  else:
    return fake.random_int(min=1000000, max=100000000)
  
def create_provider(fake, name:str, elements:list):
  provider = DynamicProvider(
    provider_name=name,
    elements=elements
  )
  fake.add_provider(provider)
  
  
if __name__ == "__main__":
  main()

~~~

ちなみにfakerはpip で取り込めます。
~~~
pip3 install faker
~~~

続いてコードのブロックごとに説明していきます！(Fakerと関係ない部分は割愛します。)

~~~python
fake = Faker("jp-JP") # Fakerのインスタンス、引数を変えることで言語の対応を変更できる
# Faker(['it_IT', 'en_US', 'ja_JP']) とすると多国籍データにすることも可能！公式ドキュメントより
~~~
まずはインスタンスの作成。初期値に "jp-JP" と入れることで日本語のデータが使えます。他の言語を使いたい場合はここを変更してください。
また、リストで複数の言語を入れることで多言語のデータになります。

~~~python
rows = []
for i in range(10): # 10行のダミーデータを作成
    row = []
    row.append(str(fake.random_number(digits=10)).rjust(10, "0")) # ID
    row.append(fake.name()) # 名前
    row.append(fake.date_of_birth().strftime("%Y-%m-%d")) # 誕生日
    row.append(fake.address()) # 住所
    row.append(fake.random_number(digits=2)) # 勤続年数
    row.append(salary_with_outlier(fake, possibility=0.1)) # 給与
    row.append(fake.retire_flg()) # 退職フラグ
    
    rows.append(row)
~~~

数値データ・名前・誕生日・住所・職種等をメソッドを使ってデータの生成を行うことができます。誕生日はフォーマットをカスタマイズすることが可能です。

給与は Faker と関数を組み合わせることで確率的に外れ値が出るようにしています。コードはこんな感じ。
~~~python
def salary_with_outlier(fake, possibility:int=0.01):
  if random.random() < possibility: # 指定の確率で外れ値を生成
    return fake.random_int(min=-100000, max=0)
  else:
    return fake.random_int(min=1000000, max=100000000)
~~~

また、退職フラグは自作したものになります。
~~~python
def create_provider(fake, name:str, elements:list):
  provider = DynamicProvider(
    provider_name=name,
    elements=elements
  )
  fake.add_provider(provider)
~~~

<b>DynamicProiver()</b>を使うことで、任意のメソッドの生成ができます。
今回はシンプルに0,1のものしかありませんが、リストであれば何でも入れることができます。

出力結果はこんな感じです。(結構住所が無茶苦茶で面白いですね笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674311/dccf62a8-ba84-e32e-ab44-5cacb5f8d55d.png)

# さいごに
Pythonでも簡単にダミーデータを作ることができました。工夫すれば DynamicProvider で自作したメソッドも使いまわせると思うので重宝できるかもですね。
ダミーデータにすることで集計や抽出したい条件に当てはまらないデータなどを意図的に作成できるので、コードの品質担保の一助になるかもしれませんね。