プログラミング 自由研究

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

投稿日:

前置き

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

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

完成!

なんとかしました
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

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

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

no image

「遠赤外線で温かい」とは何か調べてみた

皆さん、遠赤外線好きですか? コタツとか、サウナとか、電気ヒーターとかから出てるらしいです。 焼き芋とか焼き鳥とか、土鍋とかも、遠赤外線で美味しくなるらしいです。 どういうことなんでしょう。私はよくわ …

no image

プログラミングとアルゴリズムのはなし

みんなー!小学校でプログラミングの授業がはじまるよー!! プログラミングってなんだろう? プログラミングって、コンピューターに「○○をしなさい」って命令して、なにかの問題を解いたり、ゲームをつくったり …

no image

謎のアパレルブランド「電子女子」について

電子女子 ここに謎の新アパレルブランド「電子女子」がある。 今わかっているのはtwitterアカウントのみ。 2019/11/1現在、ツイート数は3つ。全部引用する。 Coming soon #電子女 …

YouTube Data APIをGoogle Apps Script(GAS)から使おう

YouTubeってAPIから色々な情報を取ることができるんですよ。 APIの情報はリファレンスにまとまってるんですが、APIキーだのOAuth2.0だの、使い始めるまでがまぁまぁ面倒なんですね。 で、 …