2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python で Faker をカスタムして独自のダミーデータを生成する方法

Posted at

はじめに

テストやデモ、学習用にダミーデータを大量に生成したいときは、Python の Faker が便利です。Faker は名前・住所・電話番号といった基本的なデータから、クレジットカード情報、バーコードなど多彩なダミーデータを自動生成してくれます。

さらに Faker には「カスタムプロバイダ」という仕組みがあり、自分のプロジェクトに特化したデータを独自に生成することも可能です。

本記事では、Faker を使ったダミーデータ生成の入門から、カスタムプロバイダによる独自データ生成までを紹介します。

image.png


目次

  1. Faker とは
  2. インストール
  3. 基本的な使い方
  4. カスタムプロバイダを作る
    1. カスタムプロバイダクラスの定義
    2. カスタムプロバイダの利用
  5. 活用例
  6. まとめ

Faker とは

  • Python 製のダミーデータ生成ライブラリ
  • 名前・住所・電話番号・文章・金融情報など幅広いデータタイプをサポート
  • 多言語対応(日本語ロケール ja_JP を指定可能)
  • 簡単に利用できるうえ、カスタマイズの柔軟性が高い

image.png


インストール

pip install faker

基本的な使い方

Faker は、まず Faker クラスのインスタンスを作成し、そこから各メソッドを呼び出す仕組みです。

from faker import Faker

# 日本語ロケールを指定
fake = Faker('ja_JP')

print(fake.name())         # 例: 山田 太郎
print(fake.address())      # 例: 〒150-0001 東京都渋谷区...
print(fake.email())        # 例: taro.yamada@example.com
print(fake.phone_number()) # 例: 090-1234-5678

カスタムプロバイダを作る

image.png

カスタムプロバイダクラスの定義

Faker には、faker.providers.BaseProvider を継承した カスタムプロバイダ を作る仕組みがあります。
これにより、自分のドメインに合わせたデータを自由自在に生成可能です。

以下では例として、「ラーメン情報を生成するプロバイダ」 を定義します。

from faker.providers import BaseProvider

class RamenProvider(BaseProvider):
    RAMEN_SHOPS = [
        'ラーメン花月',
        'ラーメン二郎',
        '一風堂',
        '天下一品',
        '蒙古タンメン中本',
    ]
    
    NOODLE_TYPES = [
        '太麺',
        '中太麺',
        '細麺',
        'ちぢれ麺',
    ]
    
    SOUPS = [
        '醤油',
        '',
        '味噌',
        '豚骨',
        '魚介豚骨',
    ]

    def ramen_shop(self):
        return self.random_element(self.RAMEN_SHOPS)
    
    def noodle_type(self):
        return self.random_element(self.NOODLE_TYPES)
    
    def soup(self):
        return self.random_element(self.SOUPS)
    
    def ramen_menu(self):
        return f"{self.soup()} {self.noodle_type()}"

カスタムプロバイダの利用

カスタムプロバイダを利用する手順は以下のとおりです。

  1. Faker オブジェクトを生成
  2. fake.add_provider() を使ってプロバイダを追加
  3. 好きなメソッドを呼び出す
fake = Faker('ja_JP')
fake.add_provider(RamenProvider)

print(fake.ramen_shop())   # 例: ラーメン二郎
print(fake.noodle_type())  # 例: 中太麺
print(fake.soup())         # 例: 魚介豚骨
print(fake.ramen_menu())   # 例: 味噌 ちぢれ麺

活用例

  • テストデータの自動生成
    大量のテストデータを作る際に便利です。
  • デモ用のプレースホルダデータ作成
    クライアントへデモを行うとき、実在データを使わずに類似の情報を生成できます。
  • モックサーバでの負荷テスト
    ランダムかつ大量のダミーデータで、API の負荷テストが可能です。
  • 教育・学習用途
    勉強会やサンプルコード作成時に役立ちます。

まとめ

  • Faker を使うと、名前・住所などの標準的なダミーデータを簡単に生成できる
  • カスタムプロバイダを作ることで、プロジェクト独自のドメインデータを柔軟に生成できる

これで、Faker をカスタムして独自のデータを生成する方法の説明は完了です。ぜひプロジェクトに取り入れてみてください!

image.png

実装例: ノートブック

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Faker ライブラリのカスタムプロバイダ動作確認\n",
    "\n",
    "このノートブックでは、Faker ライブラリを使用して独自のカスタムプロバイダを作成し、その動作を確認します。\n",
    "\n",
    "- Faker のインストール\n",
    "- 基本的な使用方法\n",
    "- カスタムプロバイダの動作確認\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Faker のインストール\n",
    "!pip install faker"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Faker の基本的な使用例\n",
    "from faker import Faker\n",
    "\n",
    "# Faker インスタンスの作成 (日本語ロケール)\n",
    "fake = Faker('ja_JP')\n",
    "\n",
    "# ダミーデータの生成例\n",
    "print('名前:', fake.name())\n",
    "print('住所:', fake.address())\n",
    "print('メール:', fake.email())\n",
    "print('会社:', fake.company())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# カスタムプロバイダの定義と使用例\n",
    "from faker.providers import BaseProvider\n",
    "\n",
    "class RamenProvider(BaseProvider):\n",
    "    RAMEN_SHOPS = [\n",
    "        'ラーメン花月',\n",
    "        'ラーメン二郎',\n",
    "        '一風堂',\n",
    "        '天下一品',\n",
    "        '蒙古タンメン中本',\n",
    "    ]\n",
    "\n",
    "    NOODLE_TYPES = [\n",
    "        '太麺',\n",
    "        '中太麺',\n",
    "        '細麺',\n",
    "        'ちぢれ麺',\n",
    "    ]\n",
    "\n",
    "    SOUPS = [\n",
    "        '醤油',\n",
    "        '塩',\n",
    "        '味噌',\n",
    "        '豚骨',\n",
    "        '魚介豚骨',\n",
    "    ]\n",
    "\n",
    "    def ramen_shop(self):\n",
    "        return self.random_element(self.RAMEN_SHOPS)\n",
    "\n",
    "    def noodle_type(self):\n",
    "        return self.random_element(self.NOODLE_TYPES)\n",
    "\n",
    "    def soup(self):\n",
    "        return self.random_element(self.SOUPS)\n",
    "\n",
    "    def ramen_menu(self):\n",
    "        return f\"{self.soup()} {self.noodle_type()}\"\n",
    "\n",
    "# カスタムプロバイダの追加\n",
    "fake.add_provider(RamenProvider)\n",
    "\n",
    "# カスタムプロバイダを使用したデータ生成\n",
    "print('ラーメン店:', fake.ramen_shop())\n",
    "print('麺の種類:', fake.noodle_type())\n",
    "print('スープ:', fake.soup())\n",
    "print('メニュー:', fake.ramen_menu())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?