プログラミング 自由研究

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

投稿日:

前置き

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

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

完成!

なんとかしました
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度だけの実行で済むようにする、というのが大事ですね。

おわりに

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

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

執筆者:

関連記事

no image

最近学んだ3D関連の用語のまとめ

趣味でフォトグラメトリーを始めて約2ヶ月。学んだ用語を個人的にまとめたいと思います。 本格的に知りたい人は各自ググってください。 もくじ1 フォトグラメトリ2 SfM3 点群4 メッシュ5 レーザース …

no image

ロリポップサーバーで独自ドメイン+SSL対応したらちょお楽だった

三連休になにかやろうかな、と思ったので、とりあえず独自ドメイン+SSL対応しました。 元々ロリポップのサーバーだったので系列のサービスを使いました。 ちょお楽だったので作業をまとめておきます。 もくじ …

no image

BlueskyのAPI制限が厳しくなったぞ

以前、Blueskyのbotを作る記事を書いたんですが、そのbotがいつの間にかひどくエラーを吐くようになっていました。 で、調べたところ、API制限が厳しくなっていると。 詳しく言うと、Rate L …

no image

MagicaVoxelとDMM.makeでオリジナルフィギュアを作ろう

もくじ1 読まなくても良い前書き2 概要3 MagicaVoxel3.1 フィギュアの自立の有無3.1.1 基本的に自立しません3.1.2 どうしても自立させたいなら3.2 折れる可能性を考慮する3. …

no image

Google Apps Script(GAS)で自宅サーバーの死活監視をする

もくじ1 前置き2 概要3 できあがり3.1 GAS側3.2 自宅サーバー側4 解説5 蛇足1 ログを取る6 蛇足2 サーバーをタイマ起動させて監視 前置き 自宅サーバー使ってますか? 最近もう流行ら …