プログラミング 自由研究

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

投稿日:

前置き

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

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

完成!

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

おわりに

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

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

執筆者:

関連記事

M5StickC PlusとSwitchBot温湿度計で家中の温度と湿度を管理するぞ

はじまり 結構長いあいだ在宅勤務を続けていると、自宅の情報をデータ化したくなるものです。 特に仕事スペースの快適さというのは気になるもので、以前から温湿度の表示がついた置き時計を置いてたんですが、以下 …

no image

NHKを従量課金にすると1時間いくらになるの?

もくじ はじめに ワンセグチューナー付きのケータイもNHK受信料の支払い義務があるとかなんとかニュースになってます。 そもそもNHK受信料って月額制の契約をやめて、従量課金にできないもんなんでしょうか …

no image

コラボカフェとコメントと私

こんにちは!バーチャルYoutuber大好きぎんしゃりさんです! きょう、以前書いたキズナアイコラボカフェの記事にコメントが来たのでご紹介して、それに関わるお話をしていきますね。 元記事の要約 前回の …

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

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

no image

3DF Zephyrでフォトグラメトリーする際のノウハウ

最近フォトグラメトリーにハマり、その成果として3DF Zephyrを使って神社まるごと3D化しました。 横浜熊野神社 by givemegohan on Sketchfab このときのノウハウを共有し …