プログラミング 自由研究

ランダムな日本人データを生成するツールをつくった

投稿日:

前置き

ダミーの名簿データが作りたい、という需要は稀にあるものです。
住所とか、年齢とか、職業とか、いい感じにランダムなデータが欲しいことがありますよね。
しかし、適当にデータを作ってしまうと、「東京都民と島根県民が同じ確率で出てくる」とか、「高齢化社会が反映されてない」とか、「海なし県なのに漁業従事者が多い」とか、そういう粗が出てしまいます。

なんとかしましょう、国勢調査で。

完成!

なんとかしました
JSON形式でデータを返します。GETパラメータで出力数(最大10000)や条件絞り込みができます。
これで例えば、島根県の模擬データ東京都中野区の模擬データを作ってみると、確かに年齢や職業の分布が違うぞ…ということを感じ取れます。

githubにも公開したので、よろしければどうぞ。

用いたデータについて

国勢調査は結果をある程度公開していて、一般利用者が無料で取得できます。また、加工なども自由です。
今回は、2020年度の調査結果のうち、「就業状態等基本集計」の、主に6-4表「男女,年齢(5歳階級),産業(大分類)別役員を含む雇用者数及び平均年齢(15歳以上雇用者(役員を含む))-全国,都道府県,市区町村」を使いました。
これには名前の通り、性別や年齢、職業の種類の分類で、市区町村ごとの人数が出ています。
これはたとえば、宮城県仙台市泉区の30~34歳女性で製造業に従事しているのは208人、というような粒度です。

これをひたすらこねくり回し、データベースに突っ込んでいます。

中で何をしているのか

基本的にはSQLite3のデータベースを使って、SQLに出来ることはSQLにやらせる、の精神でデータ加工しています。

基本アイデア

例を出しましょう。A村10人、B村20人、C村40人、という3つの村があり、ここから人口比に従ったランダムなデータを作りたいとします。
すると全部で70人ですから、A村は1/7、B村は2/7、C村は4/7の確率で出現する、出現してほしいわけです。

ここでデータベースにレコードを入れるときに、その村の人数だけではなく、累積確率もデータとして入れます。
つまり、(A村,10人,1/7), (B村,20人,3/7), (C村,40人,7/7)という形です。
データを出力する際、0~1の乱数を生成して、「”累積確率 >= 乱数”を満たす最小のレコード」を1行抜いてこれば、分布に従ったデータがランダムに取ってこれます。

これを、全国の住所・性別・年齢・職業ごとにわかれたレコードでも全く同じことをしてあげれば良い、というわけです。

累積確率の計算

累積確率の計算には「ウィンドウ関数」というSQLの機能を使っています。
ウィンドウ関数はちょっと面倒くさい機能なので、説明は省きますが、まさにデータベースのレコードについて、累積の統計情報を付与できる機能です。

高速化の工夫

日本全体のデータについては、既に累積確率を計算してレコードに記録しています。
また、累積確率の列にインデクスを定義しており、「”累積確率 >= 乱数”を満たす最小のレコード」を高速に取得できるようにしています。

条件を絞り込む際には、条件絞り込み後のデータについて累積確率を計算し直す必要があります。
これは副問合せを駆使すれば1SQLでも書けるんですが、今回は大量のデータを作る前提なので、一旦は「条件絞り込み+累積確率を計算した表」を一時表(TEMPORARY TABLE)として作り、さらにインデクスも定義して、その一時表を相手にデータ抽出させることで高速な取得を実現しています。

何度も実行する必要のない処理は1度だけの実行で済むようにする、というのが大事ですね。

おわりに

というわけで楽しいデータベース講座でした。
みなさんもオープンデータで楽しいツールを作ってみてください。

-プログラミング, 自由研究

執筆者:

関連記事

どうして私はC言語で仕事をしているのか

みなさんプログラミング言語は学んでますか?今から始めますか? 最初に学ぶべきプログラミング言語ってなんだと思いますか?そうです。C言語です。 C#でもC++でもObjective-Cでもなく、Pure …

中華製のCO2モニターを買ったらCO2センサーが入ってなかった話

CO2モニターを買ったんですよCO2モニターを。 在宅勤務で締め切った部屋で働いているので、ちょっと気になったんで。 ↓これ。 で、数日使ってみたんですけどどうも怪しい。怪しすぎる。 換気の悪い部屋に …

no image

“API”をなるべく分かりやすく説明してみる

“API”という言葉が一般にもよく使われ始めています。 しかし、非エンジニアにとっては馴染みのない言葉で、しかも謎の英略語なので、一部の人々からは「APIがなくなった」(=AP …

no image

GW自由研究 – なぜ日本の路面電車は廃れたのか

路面電車と言えば古き良き昭和の乗り物、というイメージですよね。 広島や函館など、一部ではまだ運行が続いている路線もあるものの、それらは「昭和の臭いが残っている」というような扱いです。 以前ブラタモリで …

no image

FIDOについてなるべく平易にまとめてみる

この記事は情報系の学生ぐらいの知識を想定しています。なるべく平易に書きますが、わからないことがあったら自分で調べながら読んでください。 話の枕 こないだ、Pixel 3aというGoogle製のスマホを …