プログラミング 自由研究

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

投稿日:

前置き

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

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

完成!

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

MagicaVoxelでUnity用の人間モデルを作ろう(東北ずん子配布もあるよ)

もくじ 概要 目標 MagicaVoxelで人間っぽいデータを作って、なんとかかんとかしてUnityのHumanoidとして読み込ませます。 つまり、これを、 こうするってことです。 こういう時にお役 …

no image

UnityのCompute Shaderに線分と三角形の衝突判定をさせる

はじめてCompute Shader使ってみた。でもあまり性能は出ないのでただの失敗の記録です。 まず元のアルゴリズムはコレ。 線分と三角形の当たり判定 – 富士見研究所 で、これをまず三角形の表裏問 …

no image

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

もくじ 読まなくても良い前書き 3月16日は岩本町芸能社に所属する栗原桜子ちゃんのお誕生日でした。 お誕生日おめでとう!ということでオリジナルフィギュアをプレゼントしましたので、 その制作過程とかを紹 …

no image

Google Apps Script (GAS)でBlueskyのbotを作る

Blueskyで何かやりたくなったので、PRTimesのプレスリリースを自動投稿するbotを作ってみました。 Google Apps Scriptを使うと、無料でbotが作れるので便利です。 せっかく …

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

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