導入:
データ駆動型アプリケーションには包括的なテストが不可欠ですが、多くの場合、常に適切なデータセットが利用できるとは限りません。 Web アプリケーション、機械学習モデル、バックエンド システムのいずれを開発している場合でも、適切な検証と堅牢なパフォーマンスの確保には、現実的で構造化されたデータが不可欠です。現実世界のデータの取得は、プライバシー上の懸念、ライセンス制限、または単に関連データが利用できないことにより制限される場合があります。ここで合成データが価値を持ちます。
このブログでは、Python を使用して次のようなさまざまなシナリオの合成データを生成する方法を検討します。
faker ライブラリと pandas ライブラリを活用して、これらのユースケース向けの現実的なデータセットを作成します。
例 1: 顧客と注文の合成データの作成 (1 対多の関係)
多くのアプリケーションでは、データは外部キー関係を持つ複数のテーブルに保存されます。顧客とその注文の合成データを生成してみましょう。顧客は 1 対多の関係を表す複数の注文を行うことができます。
顧客テーブルの生成
Customers テーブルには、CustomerID、名前、電子メール アドレスなどの基本情報が含まれています。
import pandas as pd from faker import Faker import random fake = Faker() def generate_customers(num_customers): customers = [] for _ in range(num_customers): customer_id = fake.uuid4() name = fake.name() email = fake.email() customers.append({'CustomerID': customer_id, 'CustomerName': name, 'Email': email}) return pd.DataFrame(customers) customers_df = generate_customers(10)
このコードは、Faker を使用して現実的な名前と電子メール アドレスを作成する 10 人のランダムな顧客を生成します。
注文テーブルの生成
ここで、各注文が CustomerID を通じて顧客に関連付けられる Orders テーブルを生成します。
def generate_orders(customers_df, num_orders): orders = [] for _ in range(num_orders): order_id = fake.uuid4() customer_id = random.choice(customers_df['CustomerID'].tolist()) product = fake.random_element(elements=('Laptop', 'Phone', 'Tablet', 'Headphones')) price = round(random.uniform(100, 2000), 2) orders.append({'OrderID': order_id, 'CustomerID': customer_id, 'Product': product, 'Price': price}) return pd.DataFrame(orders) orders_df = generate_orders(customers_df, 30)
この場合、Orders テーブルは、CustomerID を使用して各注文を顧客にリンクします。各顧客は複数の注文を出し、1 対多の関係を形成できます。
例 2: 部門と従業員の階層データの生成
階層データは、部門に複数の従業員がいる組織環境でよく使用されます。各部門に複数の従業員がいる組織をシミュレートしてみましょう。
部門テーブルの生成
Departments テーブルには、各部門の一意のDepartmentID、名前、およびマネージャーが含まれています。
def generate_departments(num_departments): departments = [] for _ in range(num_departments): department_id = fake.uuid4() department_name = fake.company_suffix() manager = fake.name() departments.append({'DepartmentID': department_id, 'DepartmentName': department_name, 'Manager': manager}) return pd.DataFrame(departments) departments_df = generate_departments(10)
従業員テーブルの生成
次に、Employees テーブルを生成します。ここで、各従業員は、DepartmentID を介して部門に関連付けられます。
def generate_employees(departments_df, num_employees): employees = [] for _ in range(num_employees): employee_id = fake.uuid4() employee_name = fake.name() email = fake.email() department_id = random.choice(departments_df['DepartmentID'].tolist()) salary = round(random.uniform(40000, 120000), 2) employees.append({ 'EmployeeID': employee_id, 'EmployeeName': employee_name, 'Email': email, 'DepartmentID': department_id, 'Salary': salary }) return pd.DataFrame(employees) employees_df = generate_employees(departments_df, 100)
この階層構造は、DepartmentID を通じて各従業員を部門にリンクし、親子関係を形成します。
例 3: コース登録のための多対多の関係のシミュレーション
特定のシナリオでは、1 つのエンティティが他の多数のエンティティに関連する多対多の関係が存在します。各コースに複数の学生がいる複数のコースに登録する学生でこれをシミュレーションしてみましょう。
コース テーブルの生成
def generate_courses(num_courses): courses = [] for _ in range(num_courses): course_id = fake.uuid4() course_name = fake.bs().title() instructor = fake.name() courses.append({'CourseID': course_id, 'CourseName': course_name, 'Instructor': instructor}) return pd.DataFrame(courses) courses_df = generate_courses(20)
生徒テーブルの生成
def generate_students(num_students): students = [] for _ in range(num_students): student_id = fake.uuid4() student_name = fake.name() email = fake.email() students.append({'StudentID': student_id, 'StudentName': student_name, 'Email': email}) return pd.DataFrame(students) students_df = generate_students(50) print(students_df)
コース登録テーブルの生成
CourseEnrollments テーブルは、学生とコース間の多対多の関係をキャプチャします。
def generate_course_enrollments(students_df, courses_df, num_enrollments): enrollments = [] for _ in range(num_enrollments): enrollment_id = fake.uuid4() student_id = random.choice(students_df['StudentID'].tolist()) course_id = random.choice(courses_df['CourseID'].tolist()) enrollment_date = fake.date_this_year() enrollments.append({ 'EnrollmentID': enrollment_id, 'StudentID': student_id, 'CourseID': course_id, 'EnrollmentDate': enrollment_date }) return pd.DataFrame(enrollments) enrollments_df = generate_course_enrollments(students_df, courses_df, 200)
この例では、学生とコース間の多対多の関係を表すリンク テーブルを作成します。
結論:
Python と Faker や Pandas などのライブラリを使用すると、さまざまなテストのニーズを満たす現実的で多様な合成データセットを生成できます。このブログでは次のことを取り上げました:
これらの例は、ニーズに合わせた合成データを生成するための基礎を築きます。より複雑な関係の作成、特定のデータベースのデータのカスタマイズ、パフォーマンス テスト用のデータセットのスケーリングなどのさらなる機能強化により、合成データの生成を次のレベルに引き上げることができます。
これらの例は、合成データを生成するための強固な基盤を提供します。ただし、次のようなさらなる機能強化を行って、複雑さと具体性を高めることができます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3