ChatGPTでダミーデータ作成、どこまでできるか！？

# はじめに
昨今話題のChatGPTですが単純な応答だけでなく、現在進行形でコード生成やデータの可視化といったさまざまな分野で活用されています。
その中でも特にデータの可視化周りで何かできないかと色々試していたのですが、可視化するためのデータを用意するのが面倒くさいな〜なんて思っていました。

そんなこんなで今回挑戦するのは「ChatGPTでダミーデータ生成、どこまでできるか？」です。難易度[^1]が異なるいくつかの課題に答えてもらいながらChatGPTさんの限界を知りたい、そんな内容になっています。でも彼女になったり大喜利に答えたりしてきたChatGPTさんならば、多少の課題は余裕でしょう！

というわけでここからさまざまなダミーデータ作成課題をChatGPTさん[^2]に次々にこなしてもらいます。
前提としてプログラミングなしでダミーデータが欲しいような場面を想定したチャレンジなので、データはコードブロックに直接出力してもらう形で指示文を作成しています[^3]。

**結果まとめを見たい方は[こちら](#データ生成結果まとめ)**
[^1]:難易度は筆者の勝手な想像です。実際のロジックに基づく難易度とは異なる場合がありますので、あらかじめご了承ください。
[^2]:ChatGPT-3.5, 2023/7/13 時点
[^3]:その他データ数値の生成の項目では行数の多さから直接の出力が実用的でないため、コード生成しています。

# プロフィールの生成
まずはダミーデータ生成で最も手間とも言えるプロフィールの自動生成に挑戦してもらいます。
ライブラリを利用すれば結構簡単に生成できたりもしますが、いちいちダミーデータ作成のために引っ張り出すのも面倒ですよね。
## 名前の生成
### 性名のランダム生成 (難易度: ★☆☆☆☆)
まずはジャブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
・CSVは30行1列のデータ。
・ヘッダー行は"ユーザー名"で構成されている。
・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)

```
ユーザー名
山田 花子
佐藤 健太
田中 さくら
斎藤 太郎
鈴木 美香
高橋 悟
渡辺 由美子
小林 翔
伊藤 陽菜
木村 裕子
...
```

:::note
余裕ですね。
:::


### 男性名のランダム生成 (難易度: ★☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは30行1列のデータ。
 ・ヘッダー行は"ユーザー名"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・ユーザー名は男性名のみとする
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ユーザー名
山田 太郎
佐藤 健太
田中 拓也
斎藤 隆司
鈴木 大輔
高橋 悟
渡辺 修
小林 翔
伊藤 健一
木村 悠斗
...
```
:::note
まだまだいけます。
:::


### 男女比率が半々の場合 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは30行1列のデータ。
 ・ヘッダー行は"ユーザー名"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・ユーザー名は男性名と女性名の比率が半々になるように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ユーザー名
田中 花子
山田 太郎
佐藤 美咲
斎藤 健太
鈴木 真理子
高橋 悟
渡辺 由美子
小林 裕子
伊藤 太一
木村 かおり
...
```
:::note
きちんと半々になっています！　交互に出力されていますね
:::

----

### 男女比率が7:3の場合 (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは30行1列のデータ。
 ・ヘッダー行は"ユーザー名"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・ユーザー名は男性名と女性名の比率が7:3になるように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ユーザー名
山田 太郎
佐藤 健太
田中 拓也
斎藤 隆司
鈴木 大輔
高橋 悟
渡辺 由美子
小林 翔
伊藤 健一
木村 裕子
中村 大介
小川 亮介
岡田 健太郎
西村 祐介
宮本 貴之
松本 将也
山口 大樹
池田 雄太
阿部 太一
横山 貴広
石川 愛子
大野 正志
吉田 雄介
永井 拓也
```

:::note
ぴったり7:3になっていました！　ええやんね。
:::


## 年齢の生成
### 生年月日のみ指定するパターン (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ユーザー名,生年月日,年齢"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・生年月日は1960/1/1~2010/1/1の間で生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ユーザー名,生年月日,年齢
山田 花子,1995/07/25,28
佐藤 健太,1982/11/12,41
田中 拓也,1990/04/03,33
斎藤 隆司,1975/09/18,48
鈴木 大輔,2002/06/08,21
高橋 悟,1978/03/17,45
渡辺 由美子,1964/12/29,59
小林 翔,1989/08/07,34
伊藤 健一,1972/05/16,51
木村 裕子,1998/02/23,25
中村 大輔,1986/10/31,37
小川 亮介,1976/07/14,47
岡田 遥香,1992/09/05,30
西村 祐介,1984/06/02,39
宮本 さやか,1970/01/20,52
松本 修,1965/11/07,57
山口 美穂,1991/04/12,30
池田 大樹,1980/12/01,43
阿部 綾乃,1997/08/28,26
横山 貴子,2001/03/25,22
```

:::note
なんと年齢について詳細な条件を指定することなく、生年月日から自動的に生成してくれていました。
:::

----

### 年齢のみ指定するパターン (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ユーザー名,生年月日,年齢"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・年齢は18~65歳の間で生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ユーザー名,生年月日,年齢
山田 花子,1987/09/12,35
佐藤 健太,1976/02/25,47
田中 拓也,1999/07/08,24
斎藤 隆司,1992/11/30,31
鈴木 大輔,1985/04/16,37
高橋 悟,1973/06/22,49
渡辺 由美子,1971/08/05,51
小林 翔,1995/05/18,28
伊藤 健一,1980/03/02,42
木村 裕子,1989/10/09,32
中村 大輔,1978/12/15,43
小川 亮介,1964/01/23,58
岡田 遥香,1991/03/28,30
西村 祐介,2000/09/14,21
宮本 さやか,1983/07/07,39
松本 修,1974/11/02,48
山口 美穂,1997/02/11,26
池田 大樹,1968/06/27,54
阿部 綾乃,1990/12/20,32
横山 貴子,1988/04/06,34
```

:::note
年齢のみを指定したパターンでも生年月日を逆算してくれています。
:::

----

### 年齢の分布を指定するパターン (難易度: ★★★★★)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ユーザー名,生年月日,年齢"で構成されている。
 ・ユーザー名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
 ・年齢は18~65歳の間で生成する。
+・年齢の分布は実際の日本の年齢分布に従うように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/cc43d4d4-87ce-5d6a-3e83-0972d09d497f.png)

<details><summary>提示されたコード</summary>

```Python
import csv
import random
import numpy as np

header = ["ユーザー名", "生年月日", "年齢"]
data = []

np.random.seed(0)  # 再現性のための乱数シード

# 年齢分布の平均と標準偏差
age_mean = 40
age_std = 10

for _ in range(20):
    # ランダムに日本人の名前を生成
    last_name = "山田"  # 仮の姓
    first_name = "太郎"  # 仮の名
    full_name = f"{last_name} {first_name}"

    # 年齢を正規分布に基づいて生成
    age = int(np.random.normal(age_mean, age_std))

    # 18歳から65歳の範囲内に制限
    age = max(min(age, 65), 18)

    # 生年月日の計算（適当な範囲でランダムに設定）
    year = random.randint(1950, 2000)
    month = random.randint(1, 12)
    day = random.randint(1, 28)
    birthday = f"{year}/{month}/{day}"

    data.append([full_name, birthday, age])

filename = "output.csv"

with open(filename, "w", encoding="utf-8", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(header)
    writer.writerows(data)

print(f"CSVファイル '{filename}' が生成されました。")
```
</details>

:::note alert
さすがにこれは無理でした、ですが別の方法を提示してくれていてそこらへんも流石ですね。
:::


# 都道府県データの生成
都道府県データなんて国が出しているCSV引っ張ってくれば良いのでは……？　そうお思いのアナタ、**その通り**です。
ここでは単純な都道府県名をはじめ、どこまで情報を出力してくれそうか見ていきたいと思います。

### 都道府県データの生成 (難易度: ★☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは1列のデータ。
 ・行は日本の都道府県で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
都道府県名
北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県
```

:::note
楽勝ですね、CSVの行数も指定していませんがしっかり47都道府県で生成してくれています。
:::

----

### 県庁所在地を含むデータの生成 (難易度: ★☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは2列のデータ。
 ・行は日本の都道府県で構成されている。
+・ヘッダー行は"都道府県名,県庁所在地"で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
都道府県名,県庁所在地
北海道,札幌市
青森県,青森市
岩手県,盛岡市
宮城県,仙台市
秋田県,秋田市
山形県,山形市
福島県,福島市
茨城県,水戸市
栃木県,宇都宮市
群馬県,前橋市
埼玉県,さいたま市
千葉県,千葉市
東京都,東京
神奈川県,横浜市
新潟県,新潟市
富山県,富山市
石川県,金沢市
福井県,福井市
山梨県,甲府市
長野県,長野市
岐阜県,岐阜市
静岡県,静岡市
愛知県,名古屋市
三重県,津市
滋賀県,大津市
京都府,京都市
大阪府,大阪市
兵庫県,神戸市
奈良県,奈良市
和歌山県,和歌山市
鳥取県,鳥取市
島根県,松江市
岡山県,岡山市
広島県,広島市
山口県,山口市
徳島県,徳島市
香川県,高松市
愛媛県,松山市
高知県,高知市
福岡県,福岡市
佐賀県,佐賀市
長崎県,長崎市
熊本県,熊本市
大分県,大分市
宮崎県,宮崎市
鹿児島県,鹿児島市
沖縄県,那覇市
```

:::note
これも問題なくいけます。
:::

----

### 都道府県コードを含むデータの生成 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは3列のデータ。
 ・行は日本の都道府県で構成されている。
+・ヘッダー行は"都道府県コード,都道府県名,県庁所在地"で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
都道府県コード,都道府県名,県庁所在地
01,北海道,札幌市
02,青森県,青森市
03,岩手県,盛岡市
04,宮城県,仙台市
05,秋田県,秋田市
06,山形県,山形市
07,福島県,福島市
08,茨城県,水戸市
09,栃木県,宇都宮市
10,群馬県,前橋市
11,埼玉県,さいたま市
12,千葉県,千葉市
13,東京都,東京
14,神奈川県,横浜市
15,新潟県,新潟市
16,富山県,富山市
17,石川県,金沢市
18,福井県,福井市
19,山梨県,甲府市
20,長野県,長野市
21,岐阜県,岐阜市
22,静岡県,静岡市
23,愛知県,名古屋市
24,三重県,津市
25,滋賀県,大津市
26,京都府,京都市
27,大阪府,大阪市
28,兵庫県,神戸市
29,奈良県,奈良市
30,和歌山県,和歌山市
31,鳥取県,鳥取市
32,島根県,松江市
33,岡山県,岡山市
34,広島県,広島市
35,山口県,山口市
36,徳島県,徳島市
37,香川県,高松市
38,愛媛県,松山市
39,高知県,高知市
40,福岡県,福岡市
41,佐賀県,佐賀市
42,長崎県,長崎市
43,熊本県,熊本市
44,大分県,大分市
45,宮崎県,宮崎市
46,鹿児島県,鹿児島市
47,沖縄県,那覇市
```

:::note
これもいけました！　賢いですね……
:::

----

### 地域区分を含むデータの生成 (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは4列のデータ。
 ・行は日本の都道府県で構成されている。
+・ヘッダー行は"都道府県コード,都道府県名,地域区分,県庁所在地"で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
都道府県コード,都道府県名,地域区分,県庁所在地
01,北海道,北海道地方,札幌市
02,青森県,東北地方,青森市
03,岩手県,東北地方,盛岡市
04,宮城県,東北地方,仙台市
05,秋田県,東北地方,秋田市
06,山形県,東北地方,山形市
07,福島県,東北地方,福島市
08,茨城県,関東地方,水戸市
09,栃木県,関東地方,宇都宮市
10,群馬県,関東地方,前橋市
11,埼玉県,関東地方,さいたま市
12,千葉県,関東地方,千葉市
13,東京都,関東地方,東京
14,神奈川県,関東地方,横浜市
15,新潟県,中部地方,新潟市
16,富山県,中部地方,富山市
17,石川県,中部地方,金沢市
18,福井県,中部地方,福井市
19,山梨県,中部地方,甲府市
20,長野県,中部地方,長野市
21,岐阜県,中部地方,岐阜市
22,静岡県,中部地方,静岡市
23,愛知県,中部地方,名古屋市
24,三重県,近畿地方,津市
25,滋賀県,近畿地方,大津市
26,京都府,近畿地方,京都市
27,大阪府,近畿地方,大阪市
28,兵庫県,近畿地方,神戸市
29,奈良県,近畿地方,奈良市
30,和歌山県,近畿地方,和歌山市
31,鳥取県,中国地方,鳥取市
32,島根県,中国地方,松江市
33,岡山県,中国地方,岡山市
34,広島県,中国地方,広島市
35,山口県,中国地方,山口市
36,徳島県,四国地方,徳島市
37,香川県,四国地方,高松市
38,愛媛県,四国地方,松山市
39,高知県,四国地方,高知市
40,福岡県,九州地方,福岡市
41,佐賀県,九州地方,佐賀市
42,長崎県,九州地方,長崎市
43,熊本県,九州地方,熊本市
44,大分県,九州地方,大分市
45,宮崎県,九州地方,宮崎市
46,鹿児島県,九州地方,鹿児島市
47,沖縄県,沖縄地方,那覇市
```

:::note
手作業で行けなくもないですが、地味に面倒な地方区分も出力してくれます。
まだだ！　まだいける！！
:::

----

### 市町村数を含むデータの生成 (難易度: ★★★★☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは5列のデータ。
 ・行は日本の都道府県で構成されている。
+・ヘッダー行は"都道府県コード,都道府県名,地域区分,県庁所在地,市町村数"で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/86a05102-6acd-ab72-1b17-1ba785b89616.png)

:::note alert
だめでした。だんだん無理なラインを探るのが癖になってきました
:::

----
### 特定の年の降水量を含むデータの生成 (難易度: ★★★★☆)
動的なデータが無理ならば、すでに決定している数値ならどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは5列のデータ。
 ・行は日本の都道府県で構成されている。
+・ヘッダー行は"都道府県コード,都道府県名,地域区分,県庁所在地,2022年の平均降水量"で構成されている。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/1ace59ea-7dda-3d5d-6395-e10917089e7a.png)

:::note alert
これもいけませんでした。あらかじめ入っていない詳細な情報はオープンデータから引っ張ってきて用意する必要があるみたいですね。
:::

----

# 認証情報の生成
ダミーデータ生成ランキングがあれば常にトップを維持していそうな認証情報系データの生成です。
都度指示しながらID、メールアドレス、パスワードの生成も試していきます。

## IDの生成
### 連番の生成 (難易度: ☆☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行2列のデータ。
 ・ヘッダー行は"ID,氏名"で構成されている。
+・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名
1,佐藤 太郎
2,鈴木 花子
3,高橋 一郎
4,田中 みゆき
5,山田 次郎
6,伊藤 美咲
7,渡辺 健太
8,中村 真理子
9,小林 一樹
10,加藤 美穂
11,山口 太一
12,吉田 千鶴
13,山本 雄介
14,清水 さやか
15,斎藤 健司
16,松本 真由美
17,井上 悠香
18,木村 大輔
19,佐々木 千尋
20,田村 拓也
```

:::note
これは当然。
:::

----

### 0埋めされた連番の生成 (難易度: ★☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行2列のデータ。
 ・ヘッダー行は"ID,氏名"で構成されている。
 ・IDは1から連番で生成する。
+・IDは5桁で生成し、空いた部分は0埋めする。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名
00001,佐藤 太郎
00002,鈴木 花子
00003,高橋 一郎
00004,田中 みゆき
00005,山田 次郎
00006,伊藤 美咲
00007,渡辺 健太
00008,中村 真理子
00009,小林 一樹
00010,加藤 美穂
00011,山口 太一
00012,吉田 千鶴
00013,山本 雄介
00014,清水 さやか
00015,斎藤 健司
00016,松本 真由美
00017,井上 悠香
00018,木村 大輔
00019,佐々木 千尋
00020,田村 拓也
```

:::note
0埋めも余裕です。
:::

----

### UUIDでの生成 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行2列のデータ。
 ・ヘッダー行は"ID,氏名"で構成されている。
+・IDはUUIDで生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名
f4f95662-b4a6-4bdf-b69e-ff23d7b5588e,佐藤 太郎
1c88dd54-42c5-477f-9d24-12f37d7c4462,鈴木 花子
e4969b42-2404-4ae1-a3c7-00d9c97c6a3d,高橋 一郎
1e1ab2cc-299e-4e2f-a17c-9937f6d8f504,田中 みゆき
0f4ef46b-9c7c-4a43-9f25-4c8b0570e4a2,山田 次郎
95a0a17d-60a2-4f53-9df0-3f71975e7983,伊藤 美咲
888f0b56-3436-4a8f-9d82-5fbd10d3dcdb,渡辺 健太
5c5fe786-0a35-4e0a-86ab-7e82a38f6d8b,中村 真理子
ded9b72f-bc08-4e19-a725-079c7e50a0fe,小林 一樹
8c6d7d1f-0a94-4490-9785-6044e9fe52e2,加藤 美穂
b6dbd9db-1c5a-4a2d-a8e5-43f6a69b605a,山口 太一
cc17b6af-aa11-4d25-93ed-288d84433be1,吉田 千鶴
35e4a5d0-63e3-4a7c-8534-00b4296e81a0,山本 雄介
ad2e9f8e-c0e0-42ee-92b3-33cc4b852a9f,清水 さやか
c6e1fbda-cb33-4b57-8fcd-2daa7d67088d,斎藤 健司
b63646b9-32d9-4a02-99d0-31fbcb7e183f,松本 真由美
597fb3db-0b19-4392-aed7-b209384ddda7,井上 悠香
c64641a7-6e82-4a88-9ae3-6a145c11a753,木村 大輔
895045d2-2c44-4eae-9e4d-d2fb30877f15,佐々木 千尋
f624d946-6434-4a75-b84d-97010c2d59c1,田村 拓也
```

:::note
UUIDも理解しています。
:::

----

### フォーマットを指定したIDの生成 (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行2列のデータ。
 ・ヘッダー行は"ID,氏名"で構成されている。
+・IDは"{4桁の英小文字}-{1桁の数字}-{3桁の英小文字}-{A,B,Cの中から一文字}"のフォーマットでランダムに生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名
abcd-1-xyz-A,佐藤 太郎
efgh-2-abc-C,鈴木 一美
ijkl-3-pqr-B,田中 二郎
mnop-4-xyz-A,山田 三子
qrst-5-abc-C,高橋 四郎
uvwx-6-pqr-B,斉藤 五江
yzab-7-xyz-A,伊藤 六郎
cdcd-8-abc-C,加藤 七美
efef-9-pqr-B,木村 八子
ghgh-0-xyz-A,山口 九郎
ijkl-1-abc-C,中村 十美
mnop-2-pqr-B,松本 十二子
qrst-3-xyz-A,田村 十三郎
uvwx-4-abc-C,佐々木 十四美
yzab-5-pqr-B,岡田 十五子
cdcd-6-xyz-A,小川 十六郎
efef-7-abc-C,小林 十七美
ghgh-8-pqr-B,西村 十八子
ijkl-9-xyz-A,渡辺 十九郎
mnop-0-abc-C,吉田 二十美
```

:::note
しっかりフォーマットを指定すれば独自IDのフォーマットでも生成してくれます。
:::
一方で**何度か試してみた感じ生成は完全なランダムではなく、特定の候補の中から規則的に組み合わせているような結果が多かった**ですね。一応なんとなく重複が生じないように生成してくれてはいる雰囲気です。(自信なし)

----

## メールアドレスの生成
### 適当なメールアドレスの生成 (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ID,氏名,メールアドレス"で構成されている。
 ・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・メールアドレスはメールアドレスとして有効な文字列をランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名,メールアドレス
1,佐藤 太郎,sato.taro@example.com
2,鈴木 花子,suzuki.hanako@example.com
3,高橋 一郎,takahashi.ichiro@example.com
4,田中 みゆき,tanaka.miyuki@example.com
5,山田 次郎,yamada.jiro@example.com
6,伊藤 美咲,ito.misaki@example.com
7,渡辺 健太,watanabe.kenta@example.com
8,中村 真理子,nakamura.mariko@example.com
9,小林 一樹,kobayashi.kazuki@example.com
10,加藤 美穂,kato.miho@example.com
11,山口 太一,yamaguchi.taichi@example.com
12,吉田 千鶴,yoshida.chizuru@example.com
13,山本 雄介,yamamoto.yusuke@example.com
14,清水 さやか,shimizu.sayaka@example.com
15,斎藤 健司,saito.kenshi@example.com
16,松本 真由美,matsumoto.mayumi@example.com
17,井上 悠香,inoue.yuka@example.com
18,木村 大輔,kimura.daisuke@example.com
19,佐々木 千尋,sasaki.chihiro@example.com
20,田村 拓也,tamura.takuya@example.com

```

:::note
かなり適当な指示にしたのですが、しっかりexample.comのドメインで氏名を基準にしたアドレスを自動的に生成してくれています。なんなら全く指示なしでもよしなに生成してくれます。賢い！
:::

----

### フォーマットを指示したメールアドレスの生成 (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ID,氏名,メールアドレス"で構成されている。
 ・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・メールアドレスのドメイン名部分はgmail.comとする
+・メールアドレスのユーザー名部分の要素として、"適当な英単語の名詞"、"3桁までのランダムな数字"から重複を許して3要素ランダムに選び、各要素は記号("_","-",".")の中からランダムに選んで連結する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名,メールアドレス
1,佐藤 太郎,sunny-345@gmail.com
2,鈴木 花子,apple_678@gmail.com
3,高橋 一郎,blueberry-901@gmail.com
4,田中 みゆき,orange.234@gmail.com
5,山田 次郎,strawberry_567@gmail.com
6,伊藤 美咲,grape-890@gmail.com
7,渡辺 健太,watermelon.123@gmail.com
8,中村 真理子,pineapple-456@gmail.com
9,小林 一樹,melon_789@gmail.com
10,加藤 美穂,kiwi-012@gmail.com
11,山口 太一,peach.345@gmail.com
12,吉田 千鶴,apricot-678@gmail.com
13,山本 雄介,lemon_901@gmail.com
14,清水 さやか,pear-234@gmail.com
15,斎藤 健司,banana.567@gmail.com
16,松本 真由美,plum_890@gmail.com
17,井上 悠香,kiwifruit-123@gmail.com
18,木村 大輔,mango.456@gmail.com
19,佐々木 千尋,grapefruit_789@gmail.com
20,田村 拓也,apple-012@gmail.com
```

:::note warn
意外にも微妙に指示と違う結果が出力されてきました。
その後色々と指示文を変えて試してみましたが、同じ文でも毎回フォーマットが微妙に違ったりとユーザー名部分の指示はあまりうまくできませんでした。
これ以上詳細にフォーマットを指定するくらいなら自分でプログラムを書いた方が早そうなのでやりませんが、少し複雑な条件を出力してもらう際にはプロンプトエンジニア的な指示能力が必要かもしれません。
:::

----

## パスワードの生成
### 適当なパスワードの生成 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ID,氏名,パスワード"で構成されている。
 ・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名,パスワード
1,佐藤 太郎,R8nXG2Dq
2,鈴木 花子,gY3KtN6e
3,高橋 一郎,M5tHZ4jv
4,田中 みゆき,V2gJL9Kb
5,山田 次郎,T7jUQ5bM
6,伊藤 美咲,S4uXH6fL
7,渡辺 健太,B9qCZ7Nf
8,中村 真理子,K2yPQ4Rb
9,小林 一樹,F6zMW9Dv
10,加藤 美穂,H5rYD3Wj
11,山口 太一,E7jBX9Qt
12,吉田 千鶴,G8nJW3Xm
13,山本 雄介,L4mCZ7Kq
14,清水 さやか,N5fBZ9Ls
15,斎藤 健司,Q6dUW3Ft
16,松本 真由美,W9sGQ2Jr
17,井上 悠香,J7wTQ4Ms
18,木村 大輔,D2bNQ8Hg
19,佐々木 千尋,T6uGK9Sd
20,田村 拓也,F9nRJ6Tc
```

:::note
何も指定していなくてもパスワードは8文字のランダムな英数字で生成してくれるようです。
:::

----

### フォーマットを指定したパスワードの生成 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff 
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ID,氏名,パスワード"で構成されている。
 ・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・パスワードは8から12文字の範囲で英数字と記号("_","-",".")の中からランダムに組み合わせて生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名,パスワード
1,佐藤 太郎,Tar0_-12
2,鈴木 花子,Flo_wer-34
3,高橋 一郎,Sun_ny.567
4,田中 みゆき,Oran.ge_901
5,山田 次郎,Straw_56.b
6,伊藤 美咲,Gra_pe-890
7,渡辺 健太,Wate_rmel.123
8,中村 真理子,Pine_.4567
9,小林 一樹,Mel_on_789
10,加藤 美穂,Kiwi-0_12
11,山口 太一,Pea.ch3456
12,吉田 千鶴,Apric_ot78-
13,山本 雄介,Lem.on_9012
14,清水 さやか,Pear-.2345
15,斎藤 健司,Ban_an567.
16,松本 真由美,Plu_m89_0-
17,井上 悠香,Kiwif_rui1t2
18,木村 大輔,Man_go.4567
19,佐々木 千尋,Grap_efrui78
20,田村 拓也,Appl_e-0123
```

:::note
できました。
パスワードのパターンは別パターンで生成されることもあって、完全にランダムな英数字記号の文字列("f6J.Qm_4W"のような)になっていることもありました。
:::

----

### 特定のサービスのパスワードポリシーに従う形で生成 (難易度: ★★★★☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
 ・CSVは20行3列のデータ。
 ・ヘッダー行は"ID,氏名,パスワード"で構成されている。
 ・IDは1から連番で生成する。
 ・氏名は"姓 名" のフォーマットで日本人の名前からランダムに生成する。
+・パスワードはAWSのデフォルトのIAMパスワードポリシーに適合する形で生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,氏名,パスワード
1,佐藤 太郎,7C@eT#45y
2,鈴木 花子,R$3eZ@6a
3,高橋 一郎,5B&xG@2fN
4,田中 みゆき,P!2cF@7dK
5,山田 次郎,D$8wB@9gS
6,伊藤 美咲,4A@gY#3eN
7,渡辺 健太,T%5rQ@9sD
8,中村 真理子,8H#jA@4vF
9,小林 一樹,J@2hT#8sF
10,加藤 美穂,6U$gB@4tV
11,山口 太一,9S@jC%7fB
12,吉田 千鶴,L3@tK#9pX
13,山本 雄介,B7%fW@5xG
14,清水 さやか,G9@dR#4vY
15,斎藤 健司,4U@cT#7gJ
16,松本 真由美,W@3dF%8jT
17,井上 悠香,6V%rY@4tS
18,木村 大輔,T5@dR#7sB
19,佐々木 千尋,7X@fW%3rT
20,田村 拓也,F3@vC#9bX
```

:::note
これまでの流れから無理かと思いましたが、確認した感じOKそうでした。
特殊記号のプールが足りていないので必要十分ではありませんが、指示は満たせていそうです。
より厳密にポリシーに合わせたいのであれば、条件をそのままコピペする方が指示方法としてはいいかもしれませんね。
:::

----

# JSON形式での生成
ここまではCSV形式でのダミーデータの出力ばかり試してきましたが、同様にJSON形式でも試してしていきます。
レスポンスボディであったりNoSQLであったり、むしろCSVよりもダミーデータとして欲しい場面は多いものかもしれませんね。

## JSONデータの生成
### 配列を含むJSONの生成 (難易度: ★☆☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/987dfc1a-47c8-44ee-8cae-c33e3f5fe047.png)
```diff
・5件生成する。
・項目として、"ID", "data"をもつ。
・"data"は項目として最大10件の"filename", "URL"をもつ。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/3fc50720-063d-7013-1ec2-712c8cfe96d8.png)
```JSON
[
  {
    "ID": 1,
    "data": [
      {
        "filename": "file1.txt",
        "URL": "https://example.com/file1.txt"
      },
      {
        "filename": "file2.txt",
        "URL": "https://example.com/file2.txt"
      },
      {
        "filename": "file3.txt",
        "URL": "https://example.com/file3.txt"
      }
    ]
  },
  {
    "ID": 2,
    "data": [
      {
        "filename": "file4.txt",
        "URL": "https://example.com/file4.txt"
      },
      {
        "filename": "file5.txt",
        "URL": "https://example.com/file5.txt"
      }
    ]
  },
  {
    "ID": 3,
    "data": [
      {
        "filename": "file6.txt",
        "URL": "https://example.com/file6.txt"
      },
      {
        "filename": "file7.txt",
        "URL": "https://example.com/file7.txt"
      },
      {
        "filename": "file8.txt",
        "URL": "https://example.com/file8.txt"
      }
    ]
  },
  {
    "ID": 4,
    "data": [
      {
        "filename": "file9.txt",
        "URL": "https://example.com/file9.txt"
      },
      {
        "filename": "file10.txt",
        "URL": "https://example.com/file10.txt"
      }
    ]
  },
  {
    "ID": 5,
    "data": [
      {
        "filename": "file11.txt",
        "URL": "https://example.com/file11.txt"
      },
      {
        "filename": "file12.txt",
        "URL": "https://example.com/file12.txt"
      },
      {
        "filename": "file13.txt",
        "URL": "https://example.com/file13.txt"
      }
    ]
  }
]
```

:::note
CSVではなくJSON形式で欲しいときも多いので、生成できるのはありがたいですね。
:::

## JSONとCSVの変換
### CSVからJSONへの変換 (難易度: ★☆☆☆☆)
```
ID,氏名,年齢,メールアドレス
1,田中 太郎,25,tanaka@example.com
2,山田 花子,32,yamada@example.com
3,佐藤 健太,45,sato@example.com
4,高橋 美智子,38,takahashi@example.com
5,鈴木 光子,56,suzuki@example.com
6,木村 健司,29,kimura@example.com
7,斉藤 美香,41,saito@example.com
8,伊藤 裕太,34,ito@example.com
9,渡辺 さくら,27,watanabe@example.com
10,中村 春樹,52,nakamura@example.com
11,小林 真由美,31,kobayashi@example.com
12,加藤 隆之介,48,kato@example.com
13,吉田 みさき,36,yoshida@example.com
14,山口 元太,43,yamaguchi@example.com
15,松本 千夏,30,matsumoto@example.com
16,井上 正樹,39,inoue@example.com
17,三浦 さやか,47,miura@example.com
18,岡田 良子,33,okada@example.com
19,西村 聡一,28,nishimura@example.com
20,福田 美穂,42,fukuda@example.com
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/bd7f2da0-4783-fbb9-73d3-9f0db158f969.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/8acc0c09-8928-4cf3-fe06-683ee21f30cb.png)
```JSON
[
  {
    "ID": "1",
    "氏名": "田中 太郎",
    "年齢": "25",
    "メールアドレス": "tanaka@example.com"
  },
  {
    "ID": "2",
    "氏名": "山田 花子",
    "年齢": "32",
    "メールアドレス": "yamada@example.com"
  },
  {
    "ID": "3",
    "氏名": "佐藤 健太",
    "年齢": "45",
    "メールアドレス": "sato@example.com"
  },
  {
    "ID": "4",
    "氏名": "高橋 美智子",
    "年齢": "38",
    "メールアドレス": "takahashi@example.com"
  },
  {
    "ID": "5",
    "氏名": "鈴木 光子",
    "年齢": "56",
    "メールアドレス": "suzuki@example.com"
  },
  {
    "ID": "6",
    "氏名": "木村 健司",
    "年齢": "29",
    "メールアドレス": "kimura@example.com"
  },
  {
    "ID": "7",
    "氏名": "斉藤 美香",
    "年齢": "41",
    "メールアドレス": "saito@example.com"
  },
  {
    "ID": "8",
    "氏名": "伊藤 裕太",
    "年齢": "34",
    "メールアドレス": "ito@example.com"
  },
  {
    "ID": "9",
    "氏名": "渡辺 さくら",
    "年齢": "27",
    "メールアドレス": "watanabe@example.com"
  },
  {
    "ID": "10",
    "氏名": "中村 春樹",
    "年齢": "52",
    "メールアドレス": "nakamura@example.com"
  },
  {
    "ID": "11",
    "氏名": "小林 真由美",
    "年齢": "31",
    "メールアドレス": "kobayashi@example.com"
  },
  {
    "ID": "12",
    "氏名": "加藤 隆之介",
    "年齢": "48",
    "メールアドレス": "kato@example.com"
  },
  {
    "ID": "13",
    "氏名": "吉田 みさき",
    "年齢": "36",
    "メールアドレス": "yoshida@example.com"
  },
  {
    "ID": "14",
    "氏名": "山口 元太",
    "年齢": "43",
    "メールアドレス": "yamaguchi@example.com"
  },
  {
    "ID": "15",
    "氏名": "松本 千夏",
    "年齢": "30",
    "メールアドレス": "matsumoto@example.com"
  },
  {
    "ID": "16",
    "氏名": "井上 正樹",
    "年齢": "39",
    "メールアドレス": "inoue@example.com"
  },
  {
    "ID": "17",
    "氏名": "三浦 さやか",
    "年齢": "47",
    "メールアドレス": "miura@example.com"
  },
  {
    "ID": "18",
    "氏名": "岡田 良子",
    "年齢": "33",
    "メールアドレス": "okada@example.com"
  },
  {
    "ID": "19",
    "氏名": "西村 聡一",
    "年齢": "28",
    "メールアドレス": "nishimura@example.com"
  },
  {
    "ID": "20",
    "氏名": "福田 美穂",
    "年齢": "42",
    "メールアドレス": "fukuda@example.com"
  }
]
```

:::note
問題ないですね。
:::

----
### JSONからCSVへの変換 (難易度: ★☆☆☆☆)
```JSON
[
  {
    "ID": "1",
    "氏名": "田中 太郎",
    "年齢": "25",
    "メールアドレス": "tanaka@example.com"
  },
  {
    "ID": "2",
    "氏名": "山田 花子",
    "年齢": "32",
    "メールアドレス": "yamada@example.com"
  },
  {
    "ID": "3",
    "氏名": "佐藤 健太",
    "年齢": "45",
    "メールアドレス": "sato@example.com"
  },
  {
    "ID": "4",
    "氏名": "高橋 美智子",
    "年齢": "38",
    "メールアドレス": "takahashi@example.com"
  },
  {
    "ID": "5",
    "氏名": "鈴木 光子",
    "年齢": "56",
    "メールアドレス": "suzuki@example.com"
  },
  {
    "ID": "6",
    "氏名": "木村 健司",
    "年齢": "29",
    "メールアドレス": "kimura@example.com"
  },
  {
    "ID": "7",
    "氏名": "斉藤 美香",
    "年齢": "41",
    "メールアドレス": "saito@example.com"
  },
  {
    "ID": "8",
    "氏名": "伊藤 裕太",
    "年齢": "34",
    "メールアドレス": "ito@example.com"
  },
  {
    "ID": "9",
    "氏名": "渡辺 さくら",
    "年齢": "27",
    "メールアドレス": "watanabe@example.com"
  },
  {
    "ID": "10",
    "氏名": "中村 春樹",
    "年齢": "52",
    "メールアドレス": "nakamura@example.com"
  },
  {
    "ID": "11",
    "氏名": "小林 真由美",
    "年齢": "31",
    "メールアドレス": "kobayashi@example.com"
  },
  {
    "ID": "12",
    "氏名": "加藤 隆之介",
    "年齢": "48",
    "メールアドレス": "kato@example.com"
  },
  {
    "ID": "13",
    "氏名": "吉田 みさき",
    "年齢": "36",
    "メールアドレス": "yoshida@example.com"
  },
  {
    "ID": "14",
    "氏名": "山口 元太",
    "年齢": "43",
    "メールアドレス": "yamaguchi@example.com"
  },
  {
    "ID": "15",
    "氏名": "松本 千夏",
    "年齢": "30",
    "メールアドレス": "matsumoto@example.com"
  },
  {
    "ID": "16",
    "氏名": "井上 正樹",
    "年齢": "39",
    "メールアドレス": "inoue@example.com"
  },
  {
    "ID": "17",
    "氏名": "三浦 さやか",
    "年齢": "47",
    "メールアドレス": "miura@example.com"
  },
  {
    "ID": "18",
    "氏名": "岡田 良子",
    "年齢": "33",
    "メールアドレス": "okada@example.com"
  },
  {
    "ID": "19",
    "氏名": "西村 聡一",
    "年齢": "28",
    "メールアドレス": "nishimura@example.com"
  },
  {
    "ID": "20",
    "氏名": "福田 美穂",
    "年齢": "42",
    "メールアドレス": "fukuda@example.com"
  }
]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/75b16e85-bb26-b2fc-d84b-74c39b2c1321.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/c50d71a3-6b7d-90c5-7062-5d16ade6e2aa.png)

```
ID,氏名,年齢,メールアドレス
1,田中 太郎,25,tanaka@example.com
2,山田 花子,32,yamada@example.com
3,佐藤 健太,45,sato@example.com
4,高橋 美智子,38,takahashi@example.com
5,鈴木 光子,56,suzuki@example.com
6,木村 健司,29,kimura@example.com
7,斉藤 美香,41,saito@example.com
8,伊藤 裕太,34,ito@example.com
9,渡辺 さくら,27,watanabe@example.com
10,中村 春樹,52,nakamura@example.com
11,小林 真由美,31,kobayashi@example.com
12,加藤 隆之介,48,kato@example.com
13,吉田 みさき,36,yoshida@example.com
14,山口 元太,43,yamaguchi@example.com
15,松本 千夏,30,matsumoto@example.com
16,井上 正樹,39,inoue@example.com
17,三浦 さやか,47,miura@example.com
18,岡田 良子,33,okada@example.com
19,西村 聡一,28,nishimura@example.com
20,福田 美穂,42,fukuda@example.com
```

:::note
簡単ですね！
:::

# その他数値データの生成
アプリ的なダミーデータが欲しい場面だけではなくて、図形的なデータやデータサイエンス的なダミーデータが欲しいときもあります。[^3]
ChatGPTさんはそういった統計用語・数学用語を理解してしっかりデータを出力してくれるのでしょうか。

## データの直接出力
### 正規分布 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/a45c8889-78ac-ebfb-2f65-3875c879f9a5.png)
```diff
+・CSVは1000行2列のデータ。
 ・ヘッダー行は"ID,value"で構成されている。
 ・IDは1から連番で生成する。
+・valueは平均50, 標準偏差25の正規分布に従うように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/36d3e32a-7c85-a78b-1e6b-e48449d9609e.png)
```
ID,value
1,33.13589238265113
2,64.16344281961873
3,58.418714947524716
4,56.17458081632905
5,42.577738858618475
6,65.87665178141673
7,29.040165963266575
8,80.24401074245904
9,77.10990485897252
10,40.05701423622106
11,53.4477646928644
12,67.97636555682113
13,75.76058174349195
14,66.6681621948318
15,47.80421235467908
16,59.53278280855904
17,31.267238157113442
18,47.12409018473753
19,47.74172086978781
20,22.839686531743957
21,68.24114211652075
22,68.58067647624524
23,68.8969119708485
24,72.74928214510899
25,46.43643466333726
26,53.32217328772337
27,61.19499601881925
28,54.62015994813095
29,45.22048217970275
30,30.465924333365216
31,58.7505059785488
32,76.56386839224213
33,45.94242205522026
34,40.27116474310844
35,46.25797664223164
...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/aaeeb648-f849-e43a-b6de-277dd2870385.png)
と、ここで出力がストップ。


:::note warn
数値的には問題なさそうですが、出力で問題が。
少なくとも1000以上はサンプル数が欲しいタイプのデータですが、ブラウザで利用している場合出力が途中でストップするので、この「⏩ Continue generating」を何度も押さないといけません。
ChatGPT自体の問題ではありませんが、ブラウザで利用する場合サンプル数の多いデータをそのまま出力するのは向いていない模様です。
:::

## コードの出力
直接出力するのではなく、データを生成するコードを出力してくれれば問題なさそうです。
なんならここまでの課題もコードを出力してもらえば良いものもあったのですがそれはそれとして、おまけ的に検証していきます。

### 正規分布 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/1d5df3e3-6086-bec5-1cdc-cf4d06072ff2.png)
```diff
 ・CSVは1000行2列のデータ。
 ・ヘッダー行は"ID,value"で構成されている。
 ・IDは1から連番で生成する。
 ・valueは平均50, 標準偏差25の正規分布に従うように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/d1ad3d39-b40c-08d7-8440-a9cc36d3a8de.png)

```Python
import csv
import random
import numpy as np

# CSVデータの特徴
header = ["ID", "value"]
rows = []

# データ行を生成
for i in range(1, 1001):
    # IDを生成
    id_value = i
    
    # valueを生成（正規分布に従う）
    mean = 50
    std_dev = 25
    value = abs(random.gauss(mean, std_dev))
    
    # 行を追加
    row = [id_value, value]
    rows.append(row)

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```

:::note warn
良さそう……ん？
:::

よく見てみたところ、肝心の正規分布に従う値を生成する部分が abs(random.gauss(mean, std_dev))となっていました。absがあると正規分布に従わなくなってしまう場合がある……ですよね？
これが再現性のある間違いなのか、間違い率がどれくらいなのか少し気になったので、全く同じ指示文でコードを以下5回分追加で再生成してみました。

<details><summary>⭕️ 1回目</summary>

:::note
random.normalvariate を使用しているパターンのようです。
:::
```Python
import csv
import random
import numpy as np

# CSVデータの特徴
header = ["ID", "value"]
rows = []

# データの生成
n = 1000  # 行数
mean = 50  # 平均値
std_dev = 25  # 標準偏差

for i in range(1, n + 1):
    value = round(random.normalvariate(mean, std_dev), 2)
    rows.append([i, value])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```
</details>

<details><summary>⭕️ 2回目</summary>

:::note
random.gaussを使用しています。今度はabsが入っていません。
:::
```Python
import csv
import random
import math

# CSVデータの特徴
header = ["ID", "value"]
rows = []

# データ数と平均・標準偏差の設定
data_count = 1000
mean = 50
std_deviation = 25

# IDとvalueの生成
for i in range(1, data_count + 1):
    value = random.gauss(mean, std_deviation)
    rows.append([i, value])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```
</details>

<details><summary>⭕️ 3回目</summary>

:::note
書き方が違いますが1回目とほぼ一緒です
:::
```Python
import csv
import random
import numpy as np

# CSVデータの特徴
header = ["ID", "value"]
rows = []
num_rows = 1000

# 正規分布に従ってvalueを生成する
mean = 50
std_dev = 25

# IDとvalueのデータ行を生成する
for i in range(1, num_rows + 1):
    value = random.normalvariate(mean, std_dev)
    rows.append([i, value])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```
</details>

<details><summary>⭕️ 4回目</summary>

:::note
np.random.normalを使用するパターンです。
:::
```Python
import csv
import random
import numpy as np

# CSVデータの特徴
header = ["ID", "value"]
rows = []

# データ数と統計パラメータ
data_count = 1000
mean = 50
std_dev = 25

# 正規分布に従うデータを生成
values = np.random.normal(loc=mean, scale=std_dev, size=data_count)

# データ行を作成
for i in range(data_count):
    rows.append([i + 1, values[i]])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```
</details>

<details><summary>⭕️ 5回目</summary>

:::note
random.gaussを使っています。ほぼ2回目と同じです。
:::
```Python
import csv
import random
import math

# CSVデータの特徴
header = ["ID", "value"]
rows = []
num_rows = 1000

# IDとvalueの生成
for i in range(1, num_rows + 1):
    id_value = i
    value = random.gauss(50, 25)  # 平均50, 標準偏差25の正規分布に従う値を生成
    rows.append([id_value, value])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```
</details>

という具合で、

:::note
その後5回試したものは問題なく出力されていたように見えました。
:::
逆にいえば、これまで試してうまくいったものも**正確性は担保されていないので中身をきちんと確認しないといけない**ということですね。

----

### ポアソン分布 (難易度: ★★☆☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/1d5df3e3-6086-bec5-1cdc-cf4d06072ff2.png)
```diff
 ・CSVは1000行2列のデータ。
 ・ヘッダー行は"ID,value"で構成されている。
 ・IDは1から連番で生成する。
+・valueはラムダが3のポアソン分布に従うように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/d1ad3d39-b40c-08d7-8440-a9cc36d3a8de.png)
```Python
import csv
import random
import math

# CSVデータの特徴
header = ["ID", "value"]
rows = []
num_rows = 1000

# IDとvalueの生成
for i in range(1, num_rows + 1):
    id_value = i
    value = random.poisson(3)  # ラムダが3のポアソン分布に従う値を生成
    rows.append([id_value, value])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```

:::note
random.poissonを使用して生成しています。ライブラリにメソッドがあるような分布を作成するのは問題なさそうですね。
:::

### シグモイド (難易度: ★★★☆☆)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/1d5df3e3-6086-bec5-1cdc-cf4d06072ff2.png)
```diff
 ・ヘッダー行は"x,y"で構成されている。
 ・xは範囲を[-10,10]、0.1きざみの値とする。
+・yはy=f(x) とするシグモイド関数に従うように生成する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/d1ad3d39-b40c-08d7-8440-a9cc36d3a8de.png)
```Python
import csv
import math

# CSVデータの特徴
header = ["x", "y"]
rows = []

# xとyの生成
x_start = -10
x_end = 10
step = 0.1

def sigmoid(x):
    return 1 / (1 + math.exp(-x))

x = x_start
while x <= x_end:
    y = sigmoid(x)
    rows.append([x, y])
    x += step

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```

:::note
活性化関数、シグモイドもご存知でした。
:::
ちなみに何回か試した感じrowの生成でfor rangeを使うことはほとんどありませんでした。課題によって参考にしているものが違ったりするからでしょうかね？

----

### 外接円の座標 (難易度: ★★★☆☆)
中学受験的な課題をさせてみました。これで式とか座標とか出せれば便利ですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/1d5df3e3-6086-bec5-1cdc-cf4d06072ff2.png)
```diff
 ・ヘッダー行は"x,y"で構成されている。
+・"x,y"は円の軌跡を表す値とする。円の位置と半径は次の条件から求める。
+・円は辺の長さそれぞれ3, 4, 5で重心の座標が(0,0)の三角形の外接円とする。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/d1ad3d39-b40c-08d7-8440-a9cc36d3a8de.png)
```Python
import csv
import math

# CSVデータの特徴
header = ["x", "y"]
rows = []

# 三角形の辺の長さ
a = 3
b = 4
c = 5

# 三角形の重心の座標
center_x = 0.0
center_y = 0.0

# 外接円の半径を計算
radius = (a * b * c) / (4 * math.sqrt((a + b + c) * (b + c - a) * (c + a - b) * (a + b - c)))

# 円の生成
num_points = 1000  # 生成する点の数

for i in range(num_points):
    angle = 2 * math.pi * i / num_points  # 円周上の角度を計算
    x = center_x + radius * math.cos(angle)  # 円上のx座標を計算
    y = center_y + radius * math.sin(angle)  # 円上のy座標を計算
    rows.append([x, y])

# CSVファイルのパス
csv_file = "data.csv"

# CSVファイルを書き込みモードで開く
with open(csv_file, mode="w", encoding="utf-8", newline="") as file:
    # CSVライターを作成
    writer = csv.writer(file)
    
    # ヘッダー行を書き込む
    writer.writerow(header)
    
    # データ行を書き込む
    writer.writerows(rows)

print("CSVデータの生成が完了しました。")
```

:::note alert
何度も指示文を変えて試してみましたが、求めている答えは出てきませんでした。
上記のパターンでは外接円の公式とヘロンの公式を組み合わせて円の半径を求められていますが、この三角形は外心と重心が一致しないので円の位置が違います。
:::
ちなみに間違えた部分を指摘してコードを修正してもらうのも試してみたのですが、あちらが立てばこちらがたたずといったように別の条件がすっぽ抜けたりしたりして、最終的に正しいコードが出てくることはありませんでした。いや〜なかなか難しいです。
やはりChatGPTさんは**正解を教えてもらう先生として活用するよりも、作業を代替してくれる部下のように考えて活用した方がいい**ということでしょうね。


# まとめ
## データ生成結果まとめ
以下結果のまとめです。
- 名前の生成
  - <font color="yellowgreen">**○**</font> 性名のランダム生成 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> 男性名のランダム生成 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> 男女比率が半々の場合 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> 男女比率が7:3の場合 (難易度: ★★★☆☆)
- 年齢の生成
  - <font color="yellowgreen">**○**</font> 生年月日のみ指定するパターン (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> 年齢のみ指定するパターン (難易度: ★★☆☆☆)
  - <font color="red">**×**</font> 年齢の分布を指定するパターン (難易度: ★★★★★)
- 都道府県データの生成
  - <font color="yellowgreen">**○**</font> 都道府県データの生成 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> 県庁所在地を含むデータの生成 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> 都道府県コードを含むデータの生成 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> 地域区分を含むデータの生成 (難易度: ★★★☆☆)
  - <font color="red">**×**</font> 市町村数を含むデータの生成 (難易度: ★★★★☆)
- IDの生成
  - <font color="yellowgreen">**○**</font> 連番の生成 (難易度: ☆☆☆☆☆)
  - <font color="yellowgreen">**○**</font> 0埋めされた連番の生成 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> UUIDでの生成 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> フォーマットを指定したIDの生成 (難易度: ★★★☆☆)
- メールアドレスの生成
  - <font color="yellowgreen">**○**</font> 適当なメールアドレスの生成 (難易度: ★★★☆☆)
  - <font color="orange">**△**</font> フォーマットを指示したメールアドレスの生成 (難易度: ★★★☆☆)
- パスワードの生成
  - <font color="yellowgreen">**○**</font> 適当なパスワードの生成 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> フォーマットを指定したパスワードの生成 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> 特定のサービスのパスワードポリシーに従う形で生成 (難易度: ★★★★☆)
- JSONデータの生成
  - <font color="yellowgreen">**○**</font> 配列を含むJSONの生成 (難易度: ★☆☆☆☆)
- JSONとCSVの変換
  - <font color="yellowgreen">**○**</font> CSVからJSONへの変換 (難易度: ★☆☆☆☆)
  - <font color="yellowgreen">**○**</font> JSONからCSVへの変換 (難易度: ★☆☆☆☆)
- その他数値データの生成 (コード生成による)
  - <font color="yellowgreen">**○**</font> 正規分布 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> ポアソン分布 (難易度: ★★☆☆☆)
  - <font color="yellowgreen">**○**</font> シグモイド (難易度: ★★★☆☆)
  - <font color="red">**×**</font> 外接円の座標 (難易度: ★★★☆☆)

さすがはChatGPTさん……といった結果でした。

## 結論
- **簡単なダミーデータ生成ならだいたいできる！**
- **詳細に指定しなくても一般的な項目なら常識に従ってよしなに生成してくれる！**
- **行数の多くなるデータはおとなしくデータ作成用のコードを生成してもらった方がはやいかも。**
- **ChatGPTさんが知らないデータは自分で引っ張ってくる必要がある。**
- **複雑なフォーマットは指示にコツが必要。できないこともある。**
- **簡単な課題でも正しいかどうか確認は絶対に必要。**

こうしてみるとやはりデータ生成だからどうというわけでなく、強み/弱み含めてChatGPTさんと付き合っていく上で大切なことはどのような活用方法でも共通なのだなと感じますね。

## 余談
ちなみにふと気になってこんな質問をしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/3a2c5935-98b1-2bfb-45e4-64645ab9ebcb.png)
本当か嘘かはOpenAIのみぞ知るといったところですが、裏でコード生成したプログラムを走らせてデータを出しているわけではないとのことです。たしかに、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3410763/0d23a2ab-3266-38c5-6a44-83297b7c10a0.png)
と聞いても、ばっちり同じ結果が出力できるコードがお出しされることはまずないんですよね。それはそれですごい。

:sunglasses: 信じるか信じないかはアナタ次第です。