シンプルなPythonで100万レコードのサンプルデータをcsvとして出力する

# 概要
データ分析やシステムテストにおいて、大量のサンプルデータを生成することが求められることがあります。この記事では、Pythonを用いて100万レコードのサンプルデータを瞬時に、CSVファイルとして出力する方法を紹介します。


## CSVのカラムとルール設定

今回、生成するCSVファイルはサイト利用者との通話データを想定しています。
以下の3つのカラムが含まれ、それぞれのルールに基づいて生成されます。

1. **サイトCV日時**
   - 顧客がWebサイトでコンバージョン（購入や問い合わせなど）した日時。
   - **ルール**: 
     - 2024年9月1日〜9月30日のランダムな日時を設定。
     - 例: `2024-09-10 12:34:56`

2. **初回通話日時**
   - 顧客に対して初めて通話した日時。
   - **ルール**: 
     - 50%の確率で値が設定され、残りの50%は`null`。
     - サイトCV日時より後で、10時〜20時の間にランダムに設定。
     - 例: `2024-09-10 15:00:00` または `null`

3. **顧客成果判定**
   - 顧客とのやり取りの成果。
   - **ルール**: 
     - 初回通話日時がない場合は「失注」。
     - 初回通話日時がある場合、`null`、「失注」、「受注」のいずれかがランダムに設定。
     - 例: `失注`, `受注`, `null`

---

### サンプル

| サイトCV日時         | 初回通話日時       | 顧客成果判定 |
|----------------------|--------------------|--------------|
| 2024-09-01 14:25:47  | 2024-09-01 15:30:00 | 受注         |
| 2024-09-05 09:10:12  |                    | 失注         |
| 2024-09-12 11:45:00  | 2024-09-12 18:00:00 | 失注         |
| 2024-09-15 16:30:20  | 2024-09-15 19:00:00 | 受注         |
| 2024-09-28 20:15:35  |                    | 失注         |

## Pythonスクリプト

以下は、サンプルデータを生成し、CSVに保存するPythonスクリプトです。

```python:generateSampleData.py
import pandas as pd
import random
import datetime

def generate_csv(num_rows=1000000):
    # 日付範囲（2024年9月1日から9月30日まで）
    start_date = datetime.datetime(2024, 9, 1)
    end_date = datetime.datetime(2024, 9, 30)

    # データフレームの作成
    data = {'サイトCV日時': [], '初回通話日時': [], '顧客成果判定': []}

    for _ in range(num_rows):
        # サイトCV日時を生成
        cv_datetime = pd.Timestamp(start_date) + pd.Timedelta(seconds=random.randint(0, (end_date - start_date).total_seconds()))
        data['サイトCV日時'].append(cv_datetime)

        # 初回通話日時（50%の確率で生成、存在する場合はCV日時より後の10時〜20時に設定）
        if random.random() < 0.5:
            call_datetime = cv_datetime + pd.Timedelta(hours=random.randint(1, 10))
            call_datetime = call_datetime.replace(hour=random.randint(10, 20), minute=0, second=0)
            data['初回通話日時'].append(call_datetime)
            
            # 顧客成果判定をランダムに設定（null、失注、受注）
            result = random.choice([None, '失注', '受注'])
        else:
            data['初回通話日時'].append(None)
            result = '失注'

        data['顧客成果判定'].append(result)

    # DataFrameに変換し、デスクトップにCSVを保存
    df = pd.DataFrame(data)
    df.to_csv('~/Desktop/sampleCustomerData.csv', index=False) # 生成されるCSVの名称

# レコード数を指定してCSVを生成
generate_csv(1000000)
```

## スクリプトの実行方法

1. **`generateSampleData.py`** という名前でファイルを保存します。
2. ターミナル（もしくはコマンドプロンプト）を開き、ファイルが保存されているディレクトリに移動します。
   - 例: デスクトップにスクリプトを保存している場合は、以下のコマンドを実行します。
     ```bash
     cd ~/Desktop
     ```
3. 次に、以下のコマンドを実行してスクリプトを動かします。
    実行時間は今回の場合だと10秒以下でした（M2 Macbook）。
   ```bash
   python generateSampleData.py
   ```
   pythonのバージョンによっては以下の場合もあります。
    ```bash
   python3 generateSampleData.py
   ```
4. スクリプトが実行されると、デスクトップ（もしくはpythonファイルと同じディレクトリ）に `sampleCustomerData.csv` が生成されます。
    
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/0a6da15b-6dc8-2419-1d7e-fa56e6bee7a7.png" alt="image.png" width="300px">

5. csvを開き、ルールに沿って生成されていることを確認。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/bcded04a-928d-a6b3-6fa0-857664589778.png" alt="image.png" width="400px">

## まとめ
このスクリプトを使えば、簡単に大量のサンプルデータを生成し、CSVファイルを生成できます。
生成データは、データベースの負荷テストや、機械学習モデルのトレーニング用として活用できます。

また、カラムの数や生成するデータの内容を変更することで、様々なシナリオに対応したサンプルデータを作成することも可能です。
例えば、カラムを追加してユーザー属性（年齢や地域など）を含めたり、異なる日付範囲でデータを生成することで、特定のマーケティングに沿ったデータを模倣して作成できます。

データ分析やシステムテストの効率化にぜひ活用してみてください！