hogefugaせずにダミーデータを作る「Faker」
1. はじめに
ダミーデータは、アプリケーション開発、テストケース、シミュレーションなど、さまざまな場面で、実データの使用が困難な場合や、プライバシー保護が必要な状況での代替手段として使われています。一般的に、ダミーデータの作成は、手動入力や何かしらの関数や擬似乱数生成器からの出力などがあり、hoge,fuga,piyoなどはよく見かけますね。
ChatGPTなりの生成AIツールを使うと効率的かつ柔軟に生成できますが、ダミーを作りたいだけなのにやり直し含む生成の待ち時間やAPI叩く料金が発生しているのがアレだなと思ったので、pythonの「Faker」を使ってみました。
2. Fakerとは
Faker[1]は、多様なダミーデータを簡単に生成できるPythonライブラリです。名前、住所、電話番号、メールアドレスなど、さまざまな種類のデータを自動的に作成できます。
ライセンスはMITで、PyPI上は記事執筆(2/21)の最新版が2/14なので、そこそこ更新はされていそうです。
Fakerは標準でも名前や住所、IPアドレスなどが生成できますが、カスタムプロバイダーを作成することで、プロジェクト固有の要件に合わせたデータ生成が可能です。また、多言語対応機能を備えており、日本語を含むさまざまな言語でのダミーデータ生成にも対応しているので、多言語対応などのテストにも使えそうです。
3. Fakerを使ってみる
さっそく、Fakerを使用したデータ生成を見ていきましょう。
インポートして、日本語に対応するlocaleを変更します。
from faker import Faker
fake = Faker('ja_JP')
名前
for _ in range(3):
print(fake.name())
> 阿部 陽一
> 太田 加奈
> 森 七夏
住所
for _ in range(3):
print(fake.address())
> 京都府横浜市緑区六番町10丁目14番1号
> 和歌山県横浜市西区長間41丁目27番3号
> 岐阜県八王子市浅草橋18丁目10番15号 秋葉原パレス552
IPアドレス
print(fake.ipv4())
print(fake.ipv6())
> 100.45.0.107
> 69fa:2635:8b7:8a15:a628:10d3:b006:fa2d
ISBN
for _ in range(3):
print(fake.isbn13())
> 978-1-874992-26-4
> 978-1-103-11120-6
> 978-0-505-13579-7
クレジットカード情報
print(fake.credit_card_number())
print(fake.credit_card_expire())
print(fake.credit_card_security_code())
> 4710603697817326329
> 11/34
> 754
日付と時間
for _ in range(3):
print(fake.date_time_this_decade())
> 2024-10-02 06:54:25
> 2024-07-22 14:22:35
> 2022-09-11 04:57:32
標準で出力できるものだけでも、名前や住所だでなく、ISBNやクレジットカード情報などのダミーはECサイトのテストにも使えそうですし。
ほかにも、職業(.job())や会社名(.company())などもあり、ユーザ登録画面への入力に必要な情報はひととおり揃っているんじゃないかなと思います。
4. 多言語の出力
冒頭述べた通り多言語の出力も可能です。
英語 (en_US)
fake = Faker('en_US')
print(fake.name())
print(fake.address())
print(fake.company())
> Benjamin Novak
> 98140 Cody Mountain Suite 356
> Johnland, AK 01476
> Griffin Group
フランス語 (fr_FR)
fake = Faker('fr_FR')
print(fake.name())
print(fake.address())
print(fake.company())
> Jeanne Legrand
> avenue Chauvet
> 63465 Fleury
> Jacquot Bègue SA
ドイツ語 (de_DE)
fake = Faker('de_DE')
print(fake.name())
print(fake.address())
print(fake.company())
> Lissy Kambs
> Sofie-Käster-Ring 025
> 25747 Riesa
> Kobelt
5. ダミーデータのデータフレームを作ってみる
1000件くらいのダミーデータセットを作ってみました。処理時間的には0.8秒と非常に高速で、Reasoning系の生成AIなら出力を何10回か待てそうですね。
インタフェースも非常に直感的なので、実装もスッキリきれいです。
import polars as pl
from faker import Faker
fake = Faker('ja_JP')
# ダミーデータの生成
data = {
'name': [fake.name() for _ in range(1000)],
'age': [fake.random_int(min=18, max=80) for _ in range(1000)],
'email': [fake.email() for _ in range(1000)],
'salary': [fake.random_int(min=200000, max=10000000) for _ in range(1000)]
}
df = pl.DataFrame(data)
┌───────────┬─────┬───────────────────────────┬─────────┐
│ name ┆ age ┆ email ┆ salary │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str ┆ i64 │
╞═══════════╪═════╪═══════════════════════════╪═════════╡
│ 渡辺 舞 ┆ 36 ┆ takuma30@example.com ┆ 4855113 │
│ 佐藤 直人 ┆ 79 ┆ tanakamomoko@example.com ┆ 6039376 │
│ 藤原 舞 ┆ 57 ┆ kenichiendo@example.org ┆ 7722686 │
│ 石川 加奈 ┆ 23 ┆ yui26@example.org ┆ 4560762 │
│ 高橋 京助 ┆ 22 ┆ momokookamoto@example.net ┆ 4224035 │
└───────────┴─────┴───────────────────────────┴─────────┘
生成AIと比べて
Fakerを使用する主な理由は、速度的な効率性やAPIをたくさん叩く必要がないというコスト面の優位性に加えて、再現性が取れる点にもあります。
事前に定義されたルールに基づいてデータを生成するため高速であり、乱数seedを固定する事で再現性を確保することも可能です。ollamaなどでオフラインにLLMを買っている場合は除いてですが、オフライン動作するので外部サービスに依存しないのも、業務で扱う上では嬉しいですね。
6. おわりに
テストやデバッグのときの入力を、ささっと作れる便利なツール「Faker」の紹介でした。
最近は生成AIで作られがちですが、速度面のメリットや、思った出力が得られない時のプロンプトの工夫などが要らないのが嬉しいですね。
また、こういったツールを使うと不適切なテストデータを使う事によるトラブル回避も期待できます。
実装時に「hoge」や「fuga」を使用する習慣があるエンジニア界隈ですが、個人的な冗談や悪口、下品な文言や実際の個人情報をテストデータとして使ってしまい、それが本番環境に反映されてしまうということが、稀によくあることも事実です。
開発チームをリードする立場としては、そういったトラブルをツールを使って回避できるといいなとおもいます。
Discussion