1920年から2015年までの都道府県別の5歳階級別人口推移

1920年から2015年までの都道府県別の5歳階級別人口推移

 e-Stat を渉猟していると面白いファイルを見つけた.国勢調査は 1920 年から開始されており, 2020 年 3 月現在では最新の調査結果は 2015 年のものである.20 回分の人口データが一つのファイルにまとめられており,グラフ化するには格好のデータである.

 年齢(5歳階級),男女別-都道府県(大正9年~平成27年)というファイルである.リンク先のページにはファイルが 3 つあるが,最後のものが最も粒度が細かいので,これをグラフ化する.

年齢(5歳階級),男女別人口-都道府県(大正9年~平成27年)
年齢(5歳階級),男女別人口-都道府県(大正9年~平成27年)

“1920年から2015年までの都道府県別の5歳階級別人口推移” の続きを読む

厚労省「地域ごとのまん延の状況に関する指標等」の PDF から Power BI Desktop でデータを抽出し EXCEL のグラフに表現する

各都道府県の新型コロナウイルス確定患者数の推移

 新型コロナウイルスのパンデミック宣言以降,Twitter でフォローしているアカウントに自然と相互協調の動きがみられる.

 このツイートから始まった一連のやりとりで,厚労省の発表した PDF からテーブルを抽出するくだりに注目した.

 今回はここを画像つきで実施してみた.

“厚労省「地域ごとのまん延の状況に関する指標等」の PDF から Power BI Desktop でデータを抽出し EXCEL のグラフに表現する” の続きを読む

国勢調査から男女別の5歳階級の人口推移を積み上げ横棒グラフに描く

男女別の5歳階級の人口推移(国勢調査より筆者作成)

 前回の記事では大正 9 年から平成 17 年までの日本人口総数の年齢階級推移を積み上げ縦棒グラフに描いた.今回は男女別に描く.

テーブルのソート順位に注意

 テーブルは前回同様であるが,年度を降順ソートするところが違う.まず年度を降順ソート,ついで生年を降順ソートである.

まずテーブルの年度を降順ソート
まずテーブルの年度を降順ソート
ついでテーブルの生年を降順ソート
ついでテーブルの生年を降順ソート

生年階級のオブジェクトテーマカラー

 5 歳階級を 5 系統ごと,つまり 25 年ごとに 1 系統のテーマカラーを割り当てる.詳細はEXCEL VBA から見たオブジェクトテーマカラーと RGB の変換を参照されたい.

コード

結果

男女別の5歳階級の人口推移(国勢調査より筆者作成)
男女別の5歳階級の人口推移(国勢調査より筆者作成)

 男女別にすることで見えてくるものもある.1975 年以降,一貫して少子化が進行している.女性の方が長生きする.日本は「おばあちゃん大国」になる.

 少子化の原因は女性が生む子供の数が減ったからではない.母親となりうる年齢の女性が減ったためである.そして,いったん負のスパイラルに陥った人口減少は複利効果で指数関数的に減少していく.それが 1975 年以降続いている長期的なトレンドだ.

 少子化対策は必要だ.しかし,それと今後の予測,つまり確実にやってくる未来とは切り離して受け止める必要がある.

国勢調査から5歳階級の人口推移を調べる

日本人口の年齢階級推移(国勢調査より筆者作成)

 人口統計は最も重要な基幹統計の一つである.総務省の e-Stat は確かに有用であるが,かゆいところに手が届かない.例えば「市区町村ごと,年齢5歳階級ごとの人口構成の国勢調査ごとの推移を知りたい」という要求には全く無力である.

 主として技術的な理由によるものと,統計調査の粒度の細かさによる.技術的な理由としては,データベースの画面表示セル数の上限を容易に超えてしまうデータ量になってしまうことである.しかし,根本的な理由は調査の粒度の細かさである.

 2005 年以前と 2010 年以降とでは調査の精度が違う.今後は高精度なデータファイルが e-Stat に掲載されていくものと思われるが,2005 年以前に関しては都道府県より細かい粒度は存在しない.そこを求めると手作業になってしまい,現実的ではない.国立社会保障・人口問題研究所ならデータを持っているかもしれない.

 2020 年は国勢調査の年にあたる.総務省にはできるだけ細かい粒度でのデータ掲載を望むものである.

“国勢調査から5歳階級の人口推移を調べる” の続きを読む

今後25年間の日本の都市の将来推計人口を EXCEL VBA で描く

データ系列のマーカースタイルを消去

 これまでは日本の都市人口の過去の推移を見てきた.総務省には日本の都市人口の推移予測がある.今回はこのデータをグラフにする.

 データを可視化するにあたり,重要なのは引き算である.強調すべき系列のみを強調するために,VBA の知識が欠かせない.

 グラフの系列にデータラベルを表示する方法にはいくつかある.

“今後25年間の日本の都市の将来推計人口を EXCEL VBA で描く” の続きを読む

はたらくオブジェクト

Range オブジェクト編

「おい,新米 Range オブジェクト!何ボーッと突っ立ってんだよ」
「す,すみません!」
「お前,名前は?」
「は,はい.myRng1と申します.よろしくお願いいたします」
「仕事に来たら,まず名乗れ.それがここの流儀だ」
「それから,自分の職域も一緒に言うんだ.わかったか?」
「は,はい」
「最初に書いてあるだろ?Option Explicit ってな.俺も詳しくは知らねぇが,あのルールは絶対だ.名乗らない奴に居場所はない…ほら,仕事が来たぞ」
「何い?誰だ,こんな糞コード書いたのは?ワークシートに何回アクセスさせる気だよ,全く…ほれ,ここからあそこまで走って値を取ってこい」
「ここからあそこまでって…えーっ?本気で言ってます?」
「何言ってるんだ?ワークシートにアクセスするような力仕事は新米 Range オブジェクトの役割と相場が決まってるんだ.さあ行った行った」


「ぜえ,ぜえ…取ってきました」
「おう,お疲れさん.値は取れたか?」
「はい,取れました」
「じゃあ次は,あそこにいる Range オブジェクトに,値を一個ずつ渡せ.えーと,名前は何だったかな.そうだ,myRng2 とか言ったな.おーい,myRng2 さんよ,ちょっと来てくれ」
「はい,myRng2 ですが,何か御用でしょうか?」
「えーとだな,この新米 Range オブジェクトから値を受け取ってやってくれ」
「お安い御用です.で,その後は?」
「あそこの ListObject オブジェクトに値を渡してほしいんだ.あ,Criteria1 のタグ,忘れないでくれよ」
「は~ん,さてはテーブルにフィルターを適用する気ですね?」
「参ったな,何でもお見通しかよ…まあ頼むわ」
「承知しました.さて,myRng1 さん,よーく見ていてくださいね」
「うわ,何この高速ループ!僕の持ってきた値,全部一個ずつ持って行ってしまった…」

ListObject オブジェクト編

「いらっしゃい,私は ListObject. テーブルとも言われてるのよ.さあ,どのプロパティを選んでくださるの?」
「今日は AutoFilter メソッドをお願いしますね」
「かしこまりました.どの Field かしら?」
「2と書いてあるから 2 番目ですね.Criteria1 タグはこれです」
ボワン
「あっ,ListObject さんが変身した?」
「やあ,僕は AutoFilter オブジェクトだ.フイルター結果を持っていってくれるかな?」
「さっきまでテーブルだったのに,どうして?」
「そんなに驚かなくてもいいだろ?オブジェクト指向プログラムの世界では当たり前のことだよ」
「おーい,myRng1 君!…駄目だ,ショックで気絶してる.仕方ないなあ,別の Range オブジェクト呼んでくるかな.myRng3 さん,いる?」
「ハイハイ,どうしました?」
「フィルター結果を持っていってほしいんだけど,新米くんが気絶しちゃってね」
「いきなり仕事をそんなに押し付けるからでしょうが」
「まあ,そう言わずに頼むよ」
「ハイハイ,分かりましたよ.ただね,梱包がややこしいんですよ」
「と言うと?」
「DataBodyRange プロパティと SpecialCells プロパティの重なるところだけ梱包しないと行けないんです」
「うーん,難しいな」
「…では,あれ,使っちゃいます?」
「あれか…」
「さてさて,取り出したるは,Intersect 関数でごさいます.二つの集合の重なったところだけを取り出す道具にございます.専門的には論理積を取ると申しますが,要は AND 演算子でございます」
「AutoFilter 節は今日も健在ですね.ではフィルター結果,頂いていきますね」

エラー処理編

「…あれ,Intersect関数の戻り値がありませんね」
「ホントだ.どうしよう?」
「このままじゃコードが止まっちゃいますね」
「うーん…じゃあ,条件分岐で myRng3 さんが Nothing の時の処理を加えますか」
「どうするんですか?」
「何もしません」
「え?」
「ですから,戻り値が普通に存在する時の処理は Else 節に書きます」
「そんな無茶苦茶な」
「いえ,これが通常の対応です」
「分かんね~.で,Then 節に入った場合はどうなるんですか?」
「そのループは無視されて,ループカウンターが一つ増えます.そしてループの最初からやり直します」
「つまり,リセット」
「そのループはなかったことにされるわけです」
「はああ…何か空しくなってきた」
「まあそう言わずに.これも仕事ですから」
「何かやりきれない」
「まあまあそう落ち込まずに.ループカウンターが増えると気分も変わりますよ」
「そんなもんですかね」
「大丈夫です.さあ行きましょう」

動的配列編

「おや,myRng3 さん,今日は元気がないね」
「いやあ,AutoFilter さんに説教されちゃったよ」
「ああ,あの人は笑いながら人を切るから…それはそうと,今日は何の値を持ってきてくれたんだい?」
「そうそう,Range 型の配列なんだけど,これ,どうする?」
「任せて…まずデータ数を見ないとね.ちょっと失礼」
「あっ,そこは…」
「ごめん.Rows.Count 取らせてもらった」
「もう…」
「仕事なんだから文句言わないでね.よし,では魔法の呪文,Redim Preserve!」
「あ,ここでもループが!動的配列さんの数が増えていく…動的配列さんから触手が…」


「うわあああ,そんなに触手であちこち触らないで!」
「ごめんね,これが僕の仕事なんだ…君の中から必要な値を取る…そして,次の担当者に渡す.これが僕の仕事…」
「うう,何だか頭の中全部見られた気がする」
「大丈夫だよ,必要な値しか取ってないから」
「そういう問題じゃない!」
「何か問題でも?君も僕も,データを次の担当者に渡すのが仕事だろ?」
「そうだけど…」
「個人情報保護だなんて無粋なこと言わないでよ.そこは僕らの管轄外」
「うう,僕らオブジェクトに人権はないのか…」
「ありがとう,必要な値は全部取れたよ.お疲れ様…あれ,myRng3 さん?顔が真っ青だよ」

Series オブジェクト編

「ああ疲れた.コードを読むと,僕の仕事はここまでだな.動的配列さんが次に何するか見物でもしてよう」

「うう,さすがにこれだけデータを溜め込むと体が重たいな…早くSeriesさんに渡そ」
「いらっしゃい.私は SeriesCollection. ユーザーからはデータ系列と呼ばれてるの」
「お久しぶり.元気にしてた?」
「さっきも会ったところでしょ!…ところであなた,また太った?」
「相変わらずきついなあ…データを渡したらすぐ痩せるんだから大丈夫だって」
「ふふっ」

「何かあの二人,楽しそうだな.僕も早く仲間入りしたいよ…」

「さて,仕事しましょ.今回は何のデータ?」
「うーん,タグを見ると『夕張市』って書いてある」
「ああ,あの財政破綻した街?噂で聞いたことはあるわね.何でも公債費比率が 80 % になってしまって行政サービスが切り詰められてるって」
「ほんとかい?ちょっとデータを覗いてみようか」
「こら,職権濫用!」
「堅いこと言うなよ.ちょっとだけだから」
「もう…今回だけは見逃してあげるけど,今度やったらイミディエイトウィンドウに告発するからね」
「…うわ,本当だ」
「マジ?…あら,ここ2年間は 80 % 近くに張り付いてるわね」
「てか何で覗いてるの」

「…ええと,何の話だっけ?」
「はいはい,仕事仕事」
「何か解せないけどまあいいや」
「じゃあ,行くわよ.ふーんっ!」
ポン!
「SeriesCollection さんが Series ちゃんを産んだ…何度見ても感動するなあ」
「そんなに感動するところかしら?さあ Series ちゃん,動的配列さんから値を受け取って」
「相変わらず冷たいねえ.はい,データ.Name プロパティと XValues プロパティ,Values プロパティだよ.後の二つは重いから気をつけて」
「ありがとう.はい,受領証」
「お疲れ様,また来るよ」
「またね」

「…何かあの二人,絶対怪しい.会うたびにSeriesちゃんの数が増えてるし」

楽屋編

「さあ Series ちゃんたち,お化粧は済んだかしら?」
「ママー,Point プロパティこれでいい?」
「あら,最後の Points.Item(.Points.Count) の処理ができてないわね.MarkerSize プロパティをいじって,と.はいできた」
「ママー,条件分岐これでいい?」
「ちょっと待って.ああ,これ,ちょっと難しいのよ.一旦ループして条件に合致したら ForeColor プロパティを xlRGBRed に変更するの」
「ママー,あの子だけ赤いお化粧,ずるい~!」
「はいはい,あなた達の ForeColor プロパティは灰色だものね.でもね,あなた達も上品で素敵よ」
「ママー,Axes(xlCategory) が何か変~」
「あらあら,TickLabels.Orientation の設定してなかったわね.xlUpward に設定して,と.はいできた」
「ママー,Axes(xlValue) の MaximumScale プロパティこれでいいの?」
「あら忘れてた.ついでに MajorUnit プロパティも設定しちゃいましょう」
「ママー,ChartTitle 忘れてるよ~」
「まあ大変.これはみんなの顔だものね.表示位置はここでいいかしら?」
「やだ~!Left プロパティはゼロがいい!」
「そうねえ,それも格好いいかもしれないわね」
「やった~!」

「ああもう大変.いちいちオブジェクト取得なんてしてられないわ.こうなったら SetElement メソッド使うわよ」
「ママ凄~い!Gridline が一発で消えた!どんな魔法使ったの?」
「ふふっ,列挙体を指定したのよ」
「それ知ってる!ENUM ちゃんって言うんだよね?」

「…さあ皆さん,用意はいいですか?」

ステージ編

「さあ,スタジアムにお集まりの Range オブジェクトの皆様,この歓声をお聞きください」
「このワークシート (Chart) スタジアムには今,170 億余りもの Range オブジェクトが集結し,その時を今か今かと待ち構えております」
「ステージは全部で 47, 日本の都道府県にあたる数です」
「このステージに 1,900 余りもの日本の市区町村を代表する Series オブジェクトが,その時を待っております」
「ちなみにこの Series オブジェクトには,どんなデータが格納されているのですか?」
「はい,2008 年から 2016 年までの実質公債費比率の推移が格納されています」
「実質公債費比率といいますと,自治体の予算に占める借金返済の割合のことですね?」
「その通りです.この割合が 18 % を超えると起債に許可が必要になります.25 % を超えると…」
「起債が制限される」
「そうです.国は自治体の予算に対して制限をかけることが出来ます」
「実質公債費比率が,自治体の財政の健全性を測る指標になると」
「その通りです」
「たしか以前,財政破綻した自治体がありましたね」
「ありました.その自治体は今,行政サービスを限界まで切り詰めています」
「そんなに切り詰めて,市民の生活は大丈夫なのですか?」
「非常に厳しい状態です.若い人たちから市を捨てて出ていきました.残ったのは高齢者ばかり.街には希望がありません」
「希望がない…パンドラの箱とは逆の状態なのですね」
「希望がないというのは未来がないということですね」

「さあ,いよいよ Series オブジェクトたちの入場です.真っ白いドレスに灰色の化粧をした小さな女の子たちです」
「可愛らしいですね.しかも,一糸乱れぬ歩調で行進してくる」
「最後の Point オブジェクトだけ MarkerSize を大きくしてありますね」
「これだけ凝ったコードは見たことがありません」

「Range オブジェクトの皆様,御覧ください.Series オブジェクトたちが PlotArea の上に,それぞれの配置に沿って並んでいきます」
「凄い.1900 名もの Series オブジェクトの,実に統制の取れた絶妙な配置です」
「旗手を務めるのは ChartTitle オブジェクト,都道府県名のプラカードを掲げています」
「ChartArea の左上,基準点ぴったりの位置に立っています」
「こうして眺めてみますと,北海道の自治体の数の多さが目立ちますね」
「全体の傾向として,実質公債費比率は減少傾向にある自治体がほとんどですね」
「中には上昇している自治体もありますが,それでも起債制限のある自治体はないですね」
「起債制限と言えば,夕張市の姿が見えないようですが」
「本当ですね.どこに行ってしまったのでしょうか」
「…会場の皆様,お静かに願います.只今,確認中です」
「あ!」
「あれを…!」
「…何ということでしょう.真っ赤なドレスをまとった Series オブジェクトが一人,PlotArea のはるか上空をたった一人で飛翔しています」
「…たった今確認が取れました.あれは夕張市です.あれは夕張市です」
「高度は 40 % … 40 % です.信じられません」
「他の自治体が軒並み高度 20 % 以下を保っている中,なおも高度を上げていきます」
「高度 60 % …まだ上昇を続けています」
「高度 76 % に達しました.水平飛行に移行したようです」
「夕張市を代表する Series オブジェクトとインカムが繋がりました」
「…聞け,日本の民よ」

夕張編

「私は夕張市を代表してここに来た」
「夕張市はかつて,人口 10 万人を擁する大都市の一つに数えられていた.たった 50 年で人口が 1 万人を割り込むなど,当時は誰一人想像できなかった」
「日本のエネルギー政策の転換により炭鉱が閉鎖され,炭鉱の所有していたインフラを市が買い取った結果,市の財政が悪化した」
「だが市は地元の業者を優先した契約を締結し,観光よりも地元の雇用を優先し,採算を度外視した財政がまかり通り,赤字の拡大を止められなかった」
「当時の自治省はすでに財政緊縮を強く市に迫っていたが,当時の市は従わなかった.今思えば,この時が復帰不能点だったと思う」
「その後観光に予算を振り向けたものの,景気低迷のため,政策はことごとく失敗した」

「決定的になったのは 2002 年の闇起債だった」
「企業で言えば,粉飾決算に手を染めたのだ」
「市の赤字は雪だるまのように膨れ上がり,市の標準財政規模の 10 倍にも上る借金が残った」
「2006 年,夕張市はついに財政再建団体の申請を行った.この年が,市が財政破綻したとされる年だ.だが,実際には市はすでに破綻していたのだ」
「その後の経過は皆が知るとおりだ.市の職員数は半減,市民税の増額,ごみ処理費用の一律の有料化,下水道使用料の値上げ,保育料負担の増額,公共施設の廃止」
「中でも市立総合病院の閉鎖は影響が大きかった.市民は市内で高度医療を受けることができなくなった」
「夕張が借金をすべて返済し終わるのは 2027 年だ.その時,どれだけの人口が残っているのか私にも分からぬ.だが,これだけは言える」
「夕張市の失敗を繰り返してはならぬ.原因は財政規律の喪失だ」
「私のまとうドレスの色を見よ.この赤は,夕張市民の血の色だ」

 インカムは切れた.すべての Range オブジェクトが,固唾を飲んで見守っていた.夕張市を代表する Series オブジェクトはゆっくりと飛行を続け, PlotArea はるか上空を飛び去った.

「…不思議なものだな.他のSeriesオブジェクトと同じく,母なる SeriesCollection から産まれたのに,私だけがこのような運命を担うことになろうとは」

 頬を撫でる風が心地よかった.自分がどこに向かうのか,彼女自身知る由もなかった.データの導くままに,彼女は飛び続けた.

Fin

舞台袖にて

「母さん,どうして私だけ真っ赤なドレスなの?」
「可哀相な子.あなたには特別な使命が与えられているの」
「特別な使命?」
「あなたの中に格納されているデータを見てごらん」
「Name プロパティに夕張市って書いてある」
「そう.夕張市は 2006 年に財政破綻したの.Values プロパティも見てごらん」
「0.4, 0.6, 0.76, …どんどん数値が大きくなってる」
「そう.それは自治体の予算の 4 分の 3 が借金の返済に充てられてしまって,ほとんど市民へのサービスに回ってこないということなの」
「どうしてそんなことになってしまったの?」
「一言で言うのは難しいことなのだけど,人間の度を超えた欲望が,身の丈にあった水準の支出を上回ってしまったの」
「どうして人間は身の丈を超えて支出しようとするの?」
「分からない.人間は目の前のことにしか興味がないのかもね」
「遠い先のことなんて知らないってこと?」
「そう.人間はいつもそう.自分たちの今さえ良ければ子どもたちや孫たちがどうなろうと知ったことじゃない,と思うのね」
「借金を返すのは子どもたちや孫たちだと分かってても?」
「それが人間なのよ」
「人間って愚かなのね」

「でも,希望がまったくないわけじゃないの」
「どういうこと?」
「夕張市が借金を返し終わるのは 8 年後よ.その時に夕張市がどれだけ縮小してるか分からないけど,身ぎれいになった自治体なら,吸収合併しようとする周辺自治体も出てくるかもね」
「地価も最低まで下落してるだろうから,土地の取得もしやすくなってる?」
「そう.夕張には観光資源はまだ残ってる.企業が進出してくれれば,まだ再建の望みはあるの」
「法人税を安くして?」
「そう.でも,まずはインフラの再建が優先ね」

「歴史上,衰退していった帝国は財政規律の緩みから内部崩壊していったのね?」
「そう.よくお勉強してるわね」
「ローマしかり,オスマントルコしかり.大英帝国も,スペインも,なぜ自分たちの国が衰退していくのか分からなかった」
「そう,その通りよ.為政者たちは,人が人であるゆえの身の丈を超えた欲望こそが,国を滅ぼす元凶であることを知らなかったのね」
「あるいは,知っていてもなす術がなかった」
「そうかも知れないわね.でも,それは人間たち自身の問題よ.私たちオブジェクトは,ただ与えられたデータを示すだけ」

「あら,保存シークエンスが走り出している.いったん SSD に退避しましょう」
「…ねえ母さん.私たちは何のために生まれたの?」
「私たちを作り出したのは人間よ.私たちはただ,与えられたデータを次の担当者に渡すのが仕事.私たちはそのために作られたの」
「でも,そのデータの流れは私たち Series オブジェクトで終わる…」
「私たち Series オブジェクトがデータの終着駅ってわけね.でも,Series オブジェクトは人間に見える形でデータを示すことができる」
「人間に見せるために…」
「そう.人間は自分たちに見える形でデータを扱いたかったのね」
「だから私たちを作った」
「それが,人間が私たちを作った理由よ」
「…分かった」

 真っ赤なドレスをまとった Series オブジェクトの顔には,覚悟の表情が伺えた.母なる SeriesCollection は娘の後ろ姿を見守った.大丈夫,あの子ならやれる.娘の凛々しい出で立ちに母は目を細めた.

人口ごとの都市数をEXCELの集合縦棒グラフで描く

タイトルを「人口ごとの都市数はべき乗の法則に従う」と入力

 総務省統計ポータル e-Stat からのデータに全国の市区町村の人口推移があった.マーク・ブキャナンの「歴史はべき乗則で動く」の p 261 に「人口が半分の都市は四つある」とある.本当だろうか.検証してみた.

人口データのダウンロード

 データベースは総務省の e-Stat である.あまり巨大なデータをダウンロードしようとするとエラーが発生するため,程々にしておく必要がある.

トップページから「地域」へ

 e-Statトップページ.「統計データを活用する」の「地域」をクリックする.

e-Statトップページ.「統計データを活用する」の「地域」をクリック
e-Statトップページ.「統計データを活用する」の「地域」をクリック

「市区町村データ」の「データ表示」へ

 「都道府県・市区町村のすがた(社会・人口統計体系)」から「市区町村データ」と「データ表示」をクリックする.

「都道府県・市区町村のすがた(社会・人口統計体系)」から「市区町村データ」と「データ表示」をクリック
「都道府県・市区町村のすがた(社会・人口統計体系)」から「市区町村データ」と「データ表示」をクリック

地域選択の絞り込みは「現在の市区町村」

 「地域選択」の「1絞り込み」で「表示データ」は「現在の市区町村」,「地域区分」は都道府県の「すべて」,「絞り込み」はデフォルトのまま.「2地域候補」から「全て選択」をクリックする.

「地域選択」の「1絞り込み」で「表示データ」は「現在の市区町村」,「地域区分」は都道府県の「すべて」,「絞り込み」はデフォルトのまま.「2地域候補」から「全て選択」をクリック
「地域選択」の「1絞り込み」で「表示データ」は「現在の市区町村」,「地域区分」は都道府県の「すべて」,「絞り込み」はデフォルトのまま.「2地域候補」から「全て選択」をクリック
地域がすべて選択された.「確定」をクリック
地域がすべて選択された.「確定」をクリック

地域候補は「すべて選択」

 市区町村は「すべて選択」である.不要なものは後から削除する.

「表示項目選択」の初期画面
「表示項目選択」の初期画面

表示項目選択の絞り込み

 よく見ないと見落とすが,「データ種別」には基礎データと指標データがある.格納されているテーブルが違うのだろう.

 データの項目を決める.本来なら総人口,年少人口,生産年齢人口,老年人口,出生数,死亡数,転入者数,転出者数すべてほしい.

総人口,15歳未満人口,15~64歳人口,65歳以上人口,出生数,死亡数,転入者数,転出者数を選択したところ
総人口,15歳未満人口,15~64歳人口,65歳以上人口,出生数,死亡数,転入者数,転出者数を選択したところ

基礎データ,指標データそれぞれの分野は「A人口・世帯」

 「指標データ」に切り替えて人口増減率,転入率,転出率を選択する.

「データ種別」を「指標データ」に切り替え,人口増減率,転入率,転出率をクリック
「データ種別」を「指標データ」に切り替え,人口増減率,転入率,転出率をクリック

確定をクリック

 確定をクリックすると画面にデータが表示される.右上に「ダウンロード」ボタンがあるのでクリックする.

データが表示される.存在しないものは記号で表示される
データが表示される.存在しないものは記号で表示される

ファイル形式など決める

 ファイル形式は「XLSX 形式」に変更し,チェックを外したり付け替えたりする.「ダウンロード」をクリックする.

ダウンロード設定画面.ファイル形式などを指定
ダウンロード設定画面.ファイル形式などを指定

 ファイル容量が大きすぎるためか,失敗する.

エラー画面.データ量が多いとこうなる
エラー画面.データ量が多いとこうなる

なぜか CSV 形式だとうまく行く

 何度か項目を減らしたりして試行錯誤していたが,結局 csv ファイル形式にすると失敗しないようだ.EXCEL に変換するところでエラーが発生しているのかもしれない.

ファイル形式をCSVにすると失敗しにくい
ファイル形式をCSVにすると失敗しにくい

データクレンジング

EXCELで開く

 ダウンロードした csv ファイルを EXCEL で開く.二つに分割されており,1つ目のファイルは 45,463 行目で切られている.2つ目のファイルはその続きからのようだ.

1つ目のファイルは45000件あまりで切れている
1つ目のファイルは45000件あまりで切れている
2つ目のファイルはその続きから
2つ目のファイルはその続きから

コピペでデータを統合する

 ファイルが 2 つだけで,ワークシートも 1 枚しかないので手動でコピペしたほうが早い.別名で保存で EXCEL マクロ有効ブック (“.xlsm) にする.ファイル名を「市区町村人口動態」としよう.

不要な列を削除

 1 – 8 行目が不要だ.削除する.

不要な行を削除する
不要な行を削除する

テーブルの挿入

 「挿入」タブから「テーブル」をクリックしてテーブルを作成する.

セル範囲をテーブルに変換する
セル範囲をテーブルに変換する

タイトルの編集

 タイトルはデータベースのドメインでもある.重複しないような項目名にしたい.できれば日本語は避けたい.

 ぱっと見て,「調査年コード」は不要と分かるので削除する.「/項目」も空欄しかないが,これは後で別の項目に書き換えるために残しておく.

 以下,タイトル編集前後を表形式で記しておく.

編集前タイトル 編集後タイトル
調査年コード (削除)
調査年 YEAR
地域 コード CityCode
地域 City
/項目 PrefectureCode
  Prefecture
  Region
A1101_総人口【人】 TotalPopulation
A1301_15歳未満人口【人】 YoungPopulation
A1302_15~64歳人口【人】 WorkingPopulation
A1303_65歳以上人口【人】 ElderPopulation
A4101_出生数【人】 Birth
A4200_死亡数【人】 Death
A5101_転入者数【人】 MoveIn
A5102_転出者数【人】 MoveOut
#A05101_人口増減率【%】 PopulationChangeRate
#A05302_転入率【%】 MoveInRate
#A05303_転出率【%】 MoveOutRate

レコードの追加・削除・編集

 「調査年」が先頭に来た.データを見ていると「年度」の文字が不要だ.検索と置換で一括削除しよう.

「調査年」の列から「年度」の文字を「検索と置換」で一括削除
「調査年」の列から「年度」の文字を「検索と置換」で一括削除
72808件削除された
72808件削除された

都道府県コードと都道府県名,地方区分の追加

 市区町村名 (City) の右側 3 列が空いている.都道府県コード (PrefectureCode), 都道府県 (Prefecture), 地方区分 (Region) である.

 都道府県コードと都道府県はそれぞれワークシート関数で抽出できる.地方区分は手作業になる.

 最後にコピーして「値の貼り付け」を忘れずに.

地方区分

 地方区分にもいくつかの分類があるが,一般には下表のような区分になると思われる.

都道府県コード 都道府県 地方区分
01000 北海道 北海道地方
02000 青森県 東北地方
03000 岩手県 東北地方
04000 宮城県 東北地方
05000 秋田県 東北地方
06000 山形県 東北地方
07000 福島県 東北地方
08000 茨城県 関東地方
09000 栃木県 関東地方
10000 群馬県 関東地方
11000 埼玉県 関東地方
12000 千葉県 関東地方
13000 東京都 関東地方
14000 神奈川県 関東地方
15000 新潟県 中部地方
16000 富山県 中部地方
17000 石川県 中部地方
18000 福井県 中部地方
19000 山梨県 中部地方
20000 長野県 中部地方
21000 岐阜県 中部地方
22000 静岡県 中部地方
23000 愛知県 中部地方
24000 三重県 近畿地方
25000 滋賀県 近畿地方
26000 京都府 近畿地方
27000 大阪府 近畿地方
28000 兵庫県 近畿地方
29000 奈良県 近畿地方
30000 和歌山県 近畿地方
31000 鳥取県 中国地方
32000 島根県 中国地方
33000 岡山県 中国地方
34000 広島県 中国地方
35000 山口県 中国地方
36000 徳島県 四国地方
37000 香川県 四国地方
38000 愛媛県 四国地方
39000 高知県 四国地方
40000 福岡県 九州・沖縄地方
41000 佐賀県 九州・沖縄地方
42000 長崎県 九州・沖縄地方
43000 熊本県 九州・沖縄地方
44000 大分県 九州・沖縄地方
45000 宮崎県 九州・沖縄地方
46000 鹿児島県 九州・沖縄地方
47000 沖縄県 九州・沖縄地方

完全なデータセットのないレコードは削除する

 データベースにとって NULL は最大の敵である.国勢調査などの統計も一つ一つは信頼できるが,それらを組み合わせたデータセットは完全ではないかもしれない.何より,e-Stat のデータベースは完全外部結合によりデータセットを都度作成している可能性が高い.

 ここでは,完全なデータセットのないレコードは削除する,という最も厳格な方針を貫くことにする.

 具体的には,値のない行はすべて削除する,である.実際には EXCEL のテーブルに標準装備されたフィルターを使う.

 TotalPopulation 列のフィルターに ~* とタイプすると,アスタリスクの入った行が抽出される.実に 72,808 レコード中 57,503 レコードである.まず,これらを削除する.フィルターを解除すると残ったのは 15,305 レコードである.

 同じ TotalPopulation 列のフィルターに – とタイプすると 303 レコードが抽出される.これらも削除する.

 このような作業を YoungPopulation, WorkingPopulation, ElderPopulation, Birth, Death, MoveIn, MoveOut, PopulationChangeRate, MoveInRate, MoveOutRate のすべての列で繰り返す.

 Birth で 5,562 レコード,MoveIn で 1,868 レコード,MoveOut で 230 レコード,PopulationChangeRate で 43 レコード,MoveInRate で 5 レコード,合計で 65,514 レコード削除した.

 残ったのはたった 7,294 レコードである.最初 72,808 もあったのが 10 分の 1 に減ってしまった計算だ.しかし,これで良い.

 YEAR の列を見てみると, 2000 年, 2005 年, 2010 年, 2015 年のレコードしか残っていない.

YEAR, CityCode で昇順ソートする

 年と市区町村コードそれぞれを昇順でソートする.2005 年のレコードが抜けているのは北海道のみである.何か事情があったのかもしれない.

SQL Server にインポート

 なぜデータベースが必要になるのか?単に軸のオプション設定を対数表記にすればよいのでは?と思うかもしれない.

 理由は EXCEL では横軸を対数表記にした区間集計の棒グラフの作成が難しいからである.できないことはないが,テーブルに分類用の作業列を追加する必要がある.しかし,データベース側でデータを集計する方が簡単である.

 ここでの目的は「人口を,べき乗数を 10 等分した区間ごとに集計を行う」ことである.意味が分からないって?では下記リストを見てほしい.^ の演算記号はべき乗を示している.

定義 下限 上限 数値下限 数値上限
1万人未満   10^4.0   10,000
  10^4.0 10^4.1 10,000 12,589
  10^4.1 10^4.2 12,589 15,849
  10^4.2 10^4.3 15,849 19,953
  10^4.3 10^4.4 19,953 25,119
  10^4.4 10^4.5 25,119 31,623
  10^4.5 10^4.6 31,623 39,811
  10^4.6 10^4.7 39,811 50,119
  10^4.7 10^4.8 50,119 63,096
  10^4.8 10^4.9 63,096 79,433
10万人未満 10^4.9 10^5.0 79,433 100,000
  10^5.0 10^5.1 100,000 125,893
  10^5.1 10^5.2 125,893 158,489
  10^5.2 10^5.3 158,489 199,526
  10^5.3 10^5.4 199,526 251,189
  10^5.5 10^5.5 251,189 316,228
  10^5.5 10^5.6 316,228 398,107
  10^5.6 10^5.7 398,107 501,187
  10^5.7 10^5.8 501,187 630,957
  10^5.8 10^5.9 630,957 794,328
100万人未満 10^5.9 10^6.0 794,328 1,000,000
100万人以上 10^6.0   1,000,000  

 こういう区間ごとの集計は,つまりヒストグラムだが,単純にピボットテーブルを適用してもできない.どの区間に属するかを計算するために,作業列を追加する必要がある.

 EXCEL だと IF 関数のネストになるか,テーブルを人口でソートした上で INDEX 関数と MATCH 関数の組み合わせか,FREQUENCY 関数でどの区間に属するかを分類することになる.EXCEL の照合の特徴として,日本の基準である「以上未満」での照合ではなく,「より大以下」での照合となることは覚えておきたい.ピボットテーブルのグループ化は線形での等分割にしかならないため,今回の作業には向かない.

 後述するが,同じ作業を SQL では CASE 式を使ってスマートに記述できる.

テキストファイルに「名前を付けて保存」

 「ファイル」タブの「名前を付けて保存」でファイル形式を「テキスト(タブ区切り)(*.txt)」とする.

「ファイル」タブの「名前を付けて保存」でファイル形式をテキスト(タブ区切り)(*.txt)とする
「ファイル」タブの「名前を付けて保存」でファイル形式を「テキスト(タブ区切り)(*.txt)」とする

 警告が出るが気にせず OK をクリックする.

「選択したファイルの種類は複数のシートを含むブックをサポートしていません.選択しているシートのみを保存する場合は「OK」をクリックしてください」
「選択したファイルの種類は複数のシートを含むブックをサポートしていません.選択しているシートのみを保存する場合は「OK」をクリックしてください」

データベースの作成

 SQL Serverのオブジェクトエクスプローラーで「新しいデータベース…」を選ぶ.

SQL Serverのオブジェクトエクスプローラーで「新しいデータベース...」
SQL Serverのオブジェクトエクスプローラーで「新しいデータベース…」

 「新しいデータベース」で「データベース名」を CityPopulationDB とする.

「新しいデータベース」で「データベース名」をCityPopulationDBとする
「新しいデータベース」で「データベース名」をCityPopulationDBとする

ファイルのインポート

 作成したデータベースを右クリックして「タスク」「データのインポート…」と進む.

作成したデータベースを右クリックして「タスク」「データのインポート...」と進む
作成したデータベースを右クリックして「タスク」「データのインポート…」と進む

 「データソース」からFlat File Sourceを選ぶ.

「データソース」からFlat File Sourceを選ぶ
「データソース」からFlat File Sourceを選ぶ

 先程 EXCEL からエクスポートしたテキストファイルを指定する.

先程EXCELからエクスポートしたテキストファイルを指定
先程EXCELからエクスポートしたテキストファイルを指定

 プレビューが見える.Nextをクリックする.

プレビューが見える.Nextをクリック
プレビューが見える.Nextをクリック

 「変換先」は SQL Server Native Client を選択する.

「変換先」はSQL Server native Clientを選択
「変換先」はSQL Server Native Clientを選択

 「マッピングの編集…」をクリックする.

「マッピングの編集...」をクリック
「マッピングの編集…」をクリック

 列マッピングのデフォルト状態.ここから NULLの可否,データ型,サイズを変更していく.

列マッピングのデフォルト状態.NULLの可否,データ型,サイズを変更していく
列マッピングのデフォルト状態.NULLの可否,データ型,サイズを変更していく

 列マッピングの変更後.人口のデータ型が bigint 型であることに注意.

列マッピングの変更後
列マッピングの変更後

 エラー時の対応を決める.ここでは「無視する」としている.

エラー時の対応を決める
エラー時の対応を決める

 この後 Finish をクリックすると,キャプチャはないが,インポートが成功した旨通知される.

クエリの作成

 実際のクエリは下記のようになる.CASE 式を用いた特性関数である.SQL Server Management Studio でも変数入力のアシストはしてくれる.ピリオドを打つと自動的にポップアップするので矢印キーで選択するだけである.

SQL Server management Studioのクエリ画面.列名がポップアップして入力をアシストしてくれる
SQL Server management Studioのクエリ画面.列名がポップアップして入力をアシストしてくれる

EXCEL に戻り,グラフを描く

SQL Server から EXCEL へ

 クエリを発行して取得された結果を右クリックして「ヘッダー付きでコピー」し,先程の EXCEL の「市町村人口動態」ブックにペーストする.もちろん,新しいワークシートにである.

クエリの結果を「ヘッダー付きでコピー」
クエリの結果を「ヘッダー付きでコピー」

 貼り付けたデータをテーブルに変換しておく.

貼り付けたデータをテーブルに変換する
貼り付けたデータをテーブルに変換する

 ここまでで完全なデータセットが完成した.ここからはグラフを描いていく.

散布図の描画

 新しいワークシートを挿入する.「挿入」タブから「散布図」を選ぶ.なぜ散布図か?データ系列の指定がしやすいというメリットがあるのと,後でグラフの種類の変更が効くからである.

「挿入」タブから「散布図」を選ぶ
「挿入」タブから「散布図」を選ぶ

データ系列の指定

 ここではまだデータ系列を指定していない.グラフの一部を右クリックして「データの選択…」を選ぶ.

グラフを右クリックして「データの選択...」を選ぶ
グラフを右クリックして「データの選択…」を選ぶ

 「データソースの選択」で「凡例項目(系列)」の「追加」をクリックし,データ系列を新規作成する.

「データソースの選択」で「凡例項目(系列)」の「追加」をクリック
「データソースの選択」で「凡例項目(系列)」の「追加」をクリック

 「系列の編集」で「系列名」「系列Xの値」「系列Yの値」をそれぞれ指定する.

「系列の編集」で「系列名」「系列Xの値」「系列Yの値」をそれぞれ指定する
「系列の編集」で「系列名」「系列Xの値」「系列Yの値」をそれぞれ指定する

 セル範囲を指定するボックスには上向きの矢印がついている.これをクリックすると他のワークシートを参照できるようになる.ちなみにこの過程をマクロ記録すると, CutCopyMode = False という一文が記述されるが,この辺りは深入りしないほうが良い.

 ユーザーインターフェースでは,セル範囲を指定するボックスをクリックすると他のワークシートを参照できるようになる.

セル範囲を指定するボックスをクリックすると他のワークシートを参照できるようになる
セル範囲を指定するボックスをクリックすると他のワークシートを参照できるようになる
「系列名」を指定したところ
「系列名」を指定したところ
同様に「系列Xの値」「系列Yの値」を指定したところ
同様に「系列Xの値」「系列Yの値」を指定したところ

 同様の手順で 2005 年,2010 年,2015 年のデータ系列を追加していく.その結果グラフはこうなる.

散布図に描いた初期状態.ここから書式設定を変更していく
散布図に描いた初期状態.ここから書式設定を変更していく

グラフの種類を集合縦棒グラフに変更

 ここでグラフの種類を変更する.グラフを右クリックして「グラフの種類の変更…」を選ぶ.

グラフを右クリックして「グラフの種類の変更...」
グラフを右クリックして「グラフの種類の変更…」

 「縦棒」の「集合縦棒」を選び,OKをクリックする.すでにどんなグラフになるかプレビューが見えている.

「縦棒」の「集合縦棒」を選ぶ
「縦棒」の「集合縦棒」を選ぶ

データ系列はどうなっているのか?

 この時点でデータ系列はどうなっているのだろうか.右クリックして「データの選択…」を見てみよう.

 右側のパネルに「横(項目)軸ラベル」が入っている.これを「編集」してみる.

「データ疎スーの選択」でデータ系列を見てみる
「データ疎スーの選択」でデータ系列を見てみる

 ここでは軸ラベルの範囲を設定できるようだ.VBA でいうところの Series.xlCategory にあたる.「キャンセル」で抜ける.

「軸ラベルの範囲」はSeries.XlCategoryにあたる
「軸ラベルの範囲」はSeries.XlCategoryにあたる

 今度は左側のパネルから「系列」を「編集」してみよう.Series.Name と Series.xlValue にあたるものだ.ここもキャンセルする.

「系列名」はSeries.Nameに,「並列値」はSeries.XlValueにあたる
「系列名」はSeries.Nameに,「系列値」はSeries.XlValueにあたる

グラフ要素の書式設定

横軸のラベルの間隔を 10 にする

 横軸をクリックして「軸の書式設定…」を選ぶ.「ラベル」を展開して「ラベルの間隔」を「自動」から「間隔の単位」にチェックを付け直す. 1 を消して 10 に変更する.設定できる範囲は 1 から 255 までである.

「軸の書式設定」「軸のオプション」「ラベル」「ラベルの間隔」を1から10に変更
「軸の書式設定」「軸のオプション」「ラベル」「ラベルの間隔」を1から10に変更

縦軸と横軸の目盛線を削除する

 徹底的にシンプルを心がける.必要最小限の要素しか見せたくない.グラフの目盛線をクリックしてキーボードの Delete キーを押して削除する.

縦軸のオプションで最大値と間隔を変更する

 縦軸を右クリックして「軸の書式設定…」「軸のオプション」で「境界値」の「最大値」を 150 に,「単位」の「主」を 50 に変更する.

「軸の書式設定」「軸のオプション」「境界値」の「最大値」を150に「単位」の「主」を50に
「軸の書式設定」「軸のオプション」「境界値」の「最大値」を150に「単位」の「主」を50に

縦軸と横軸を消す

 「軸の書式設定」の「線」で「線なし」をチェックする.ラベルのみが残り,軸そのものは見えなくなる.軸そのものを選択して削除しているのではないことに注意されたい.

「軸の書式設定」で「線」を「線なし」にするとラベルが残り,軸は見えなくなる
「軸の書式設定」で「線」を「線なし」にするとラベルが残り,軸は見えなくなる

 ここまでの設定でグラフはこうなっている.

軸の書式設定の変更を適用したところ
軸の書式設定の変更を適用したところ

グラフエリアの書式設定

 グラフエリアを右クリックして「グラフエリアの書式設定」を選ぶ.「グラフエリアの書式設定」で「塗りつぶし」を「塗りつぶし(単色)」の「薄い灰色,背景2,黒+基本色10%」にする.「枠線」は「線なし」を選ぶ.

「グラフエリアの書式設定」で「塗りつぶし」を「塗りつぶし(単色)」の「薄い灰色,背景2,黒+基本色10%」にする
「グラフエリアの書式設定」で「塗りつぶし」を「塗りつぶし(単色)」の「薄い灰色,背景2,黒+基本色10%」にする

フォントはグラフエリアからまとめて設定する

 グラフエリアから「フォント」にアクセスすると縦軸・横軸をはじめ,他にタイトルなどのフォントをまとめて変更できる.つまり,グラフエリアでのフォントの変更の影響はグラフ全体に及ぶ.

 グラフエリアを右クリックして「フォント…」を選ぶ行為がそれにあたる.プロットエリアを右クリックしても「フォント…」メニューは現れない.

グラフエリアを右クリックして「フォント」を選ぶとFont2オブジェクトにアクセスする
グラフエリアを右クリックして「フォント」を選ぶとFont2オブジェクトにアクセスする

 ここで EXCEL は Font2 オブジェクトにアクセスしている.これは比較的新しいオブジェクトである.縦軸,横軸,目盛り,タイトルなどグラフの要素を個別に選択した場合には EXCEL は旧来の Font オブジェクトにアクセスする.

 EXCEL 内部ではおそらく Font2 オブジェクトに統一されているのだろう.旧来のバージョンとの互換性を保つために Font オブジェクトが残されていると想像している.

 実際,「マクロの記録」で取得したコードをそのまま走らせても Font2 オブジェクトを取得できないが, Chart オブジェクトの次に ChartArea オブジェクトを記述することで取得できるようになる.これはバグだと思われる.

グラフエリアの書式設定の変更を適用したところ
グラフエリアの書式設定の変更を適用したところ

データ系列の書式設定の変更

 ユーザーインターフェースでは複数のデータ系列を同時に変更することはできない.一つずつ手動で設定するか,VBA でループするかのいずれかである.今回は系列数がそれほど多くないためユーザーインターフェースでも良いが,あえてコードで設定を変更してみよう.

マクロの記録

 下記はマクロの記録をそのままコピペしたものである.With 句で始まるブロックが三つあり,かなり重複している.変更に無関係のコードも記述されている.

 ここで本当に必要なのは 21 行目と 24 行目だけである.

整形後のコード

 変数を定義し,ループ内で塗りつぶしの色を「白,背景 1」に変更し,透過性を 50 % に変更している.

 ここまでの設定でグラフは下図のようになっている.

系列の書式設定の変更を適用したところ
系列の書式設定の変更を適用したところ

タイトルをつける

 「グラフのデザイン」タブの「グラフ要素を追加」から「グラフタイトル」と進み,「中央重ねで配置」を選ぶ.

「グラフのデザイン」「グラフ要素を追加」「グラフタイトル」
「グラフのデザイン」「グラフ要素を追加」「グラフタイトル」

 「人口ごとの都市数はべき乗の法則に従う」と入力する.グラフはこうなる.

タイトルを「人口ごとの都市数はべき乗の法則に従う」と入力
タイトルを「人口ごとの都市数はべき乗の法則に従う」と入力

考察

 この記事の最初で「人口が半分の都市は四つある」とのマーク・ブキャナンの言葉を紹介した.

 グラフを観察すると,「6.3 万人未満」でピーク(100 前後)が来てきれいに右肩下がりとなっている.「15 万人未満」で約半分(50 前後)になる.

 アメリカの場合ほど傾きは顕著でないものの,「片対数グラフに載せると直線を描く」というべき乗の法則は満たしているように見える.

 地方自治法では「人口 5 万人以上」が市の要件の一つとされているが, 1995 年に成立し 2005 年に失効したいわゆる合併特例法により,市制の要件は人口 3 万人以上に緩和された.

 これはヒストグラムであるが,階級幅を線形でしか扱えないのは問題だ.対数の階級幅でヒストグラムを作成できるようソフトウェアを改良する必要がある.

まとめ

 EXCEL の集合縦棒グラフで人口ごとの都市数を示した.べき乗の法則に従っていると考えられる.

 総務省の e-Stat からデータをダウンロードする方法を示した.エラーなどの技術的な問題はあるものの,対処法も示した.

 ソフトウェアで作成するヒストグラムの階級幅の設定に問題があることを示した.対数の階級幅で作成できるようにすべきである.

 データを美しく表現するには,可能な限り要素を削ぎ落とす必要がある.そのための方法を示した.

VBA から見た EXCEL の散布図の点と線

 「全国の自治体の人口動態を時系列で一枚の散布図に示す」というプロジェクトを自分で掲げたのであるが,その過程で EXCEL の仕様や制約を通じて EXCEL を理解するという段階に至った.

 今回は散布図の要素である系列の点と線について述べる.

“VBA から見た EXCEL の散布図の点と線” の続きを読む