見出し画像

【実習編】市町村別に人口密度を求めてコロプレスマップを描く

I. はじめに

過去のnoteで最低賃金のデータを使ったコロプレスマップの作成方法を紹介しました。

このときは、統計データをGISデータに結合し、その統計値をもとに階級区分を行いました。

今回作成する人口密度のマップでは、人口データの結合に加えて人口密度を計算する操作が加わります。また、人口密度を求める時に使用する面積情報はGISデータから呼び出します。

完成までのプロセスは増えますが、1つ1つの手順は難しくありません。しかし、気を付けて作成しないと思わぬ落とし穴にハマります。今回は、その落とし穴にあえてハマりつつ、人口密度マップを作成していきます。


II. データの準備

1. データの取得

人口に関するデータといえば国勢調査であり、国勢調査に関するGISデータを提供している場所といえば、e-Statです。e-Statから統計データと行政区域データを取得すれば準備できます。

しかし、今回は別のデータソース、愛媛県が公開している推計人口データを利用してみましょう。推計人口データは多くの自治体がウェブページ上で公開しています。国勢調査は5年おきに行われる調査で、2020年現在における最新版は2015年調査です。一方、推計人口データは多くの自治体が年単位や月単位で公表しています。推計値ではありますが、より最近の状況を反映したデータとなっています。

「愛媛県 人口」などのキーワードで検索してデータ公開ページにアクセスし、Excelファイルをダウンロードします。

画像1

行政区域データは、国土数値情報から入手します。愛媛県の最新データをダウンロードしましょう。

画像2

---   ---   ---   ---   ---   ---   ---   ---

2. Excelデータの前処理

愛媛県ウェブサイトからダウンロードした人口データは、QGISのテーブル結合によって行政区域データと結びつけたいですね。そのために、Excelのデータをテーブル結合できる形式に直します。

画像3

上図のように、テーブル結合に必要な情報は都市名と人口数です。都市名は結合キーとなります。Excelの元データから「値で貼り付け」、「フィルタ」などの機能を用いて下図の右のようなデータを作りましょう。「総数」列について、整形後ではヘッダー名を「Pop」(population:人口)に変更しています。

Excelファイルには、市区町村ごとのレコードの他に市計や郡単位の集計データのレコードもあります。一方、行政区域データには集計データに対応するレコードがありません。テーブル結合では結合先が無いレコードがあっても無視されるだけなので、整備データに集計データが残っていても問題ありません。しかし、不要と分かっている情報を残しておくことは良くないので、集計データのレコードは取り除いておきましょう。

画像4

前処理が終わったら、データをCSV形式で保存します(※1)。

※1 Excel形式のままQGISに読み込むことも出来ますが、QGIS 3.10以降のバージョンでは、読み込んだ属性テーブルが文字化けすることがよくあります。CSV形式で読み込む方が無難です。


III. 人口密度のマップ作成 不具合編

データが揃ったので、いよいよQGISで人口密度のマップを作成します。しかし、第1章でも述べたように、あることに注意して手順を進めないと、思わぬ落とし穴ににハマり、誤ったマップが作成されます。III章では、あえて誤ったマップを作成してみます。正しい手順はIV章で説明します。

1. 人口密度マップの作成

さて、人口密度のマップは次のような手順で作成します。各工程の具体的な操作方法はIV章で紹介することとし、ここでは結果だけ確認します。

画像5

最初に、行政区域のシェープファイルに第2章で作成した人口数のフィールドを持ったCSVファイルをテーブル結合します。属性テーブルの右端に人口数のフィールドが結合されました。

画像6

続いて、人口密度を求めるためには面積の値が必要です。面積はフィールド演算で求めることができます。面積が得られたら、再度フィールド演算を用いて人口密度を算出します。下図のように、属性テーブルの右端に面積フィールドと人口密度フィールドが追加されました。

画像7

そして、算出した人口密度の値を用いてコロプレスマップを作成しました。さて、冒頭で述べたように、このマップにはおかしなところがあります。それはどこでしょう?

画像8

図中の黄色で示された階級は、1平方kmあたり1万人以上の人口密度があることを示しています。1平方kmあたり1万人以上とは、人口密度全国トップ10の都市と肩を並べるくらいの過密ぶりです。この地図を見ると、小さな島々で黄色の階級に属するところが多くなっています。これらすべての島々が、大都市に匹敵するほど住宅地が密集しているのでしょうか?

---   ---   ---   ---   ---   ---   ---   ---

2. シングルパートポリゴンとマルチパートポリゴン

ここで、ポリゴンデータに関する2種類のデータタイプを説明します。

画像26

シングルパートポリゴンとは、境界によって区切られた1つ1つのポリゴンと属性情報が1対1で対応しているようなポリゴンデータのことです。
上図の左は、シングルパートポリゴンを示したものです。地図には大小さまざまな6つの島(ポリゴン)が描かれており、それぞれ対応する属性情報を持っています。国や行政が公開するGISデータは、その多くがシングルパートで整備されています。

マルチパートポリゴンは、1つの属性情報に対し複数のポリゴンが対応しているようなポリゴンデータのことです(※2)。これを示したのが上図の右側です。1つの属性情報に対し、すべての島が対応付けられています。島の一つ一つを選択することはできず、全体で1つのポリゴンフィーチャです。

※2 同様に、ポイントやラインでもシングルパートとマルチパートがあります。ジオメトリのタイプにこだわらない場合はシングルパートフィーチャ、マルチパートフィーチャとも呼ばれます。

シングルパートからマルチパートへの変換するための代表的な機能は「ディゾルブ」です。ディゾルブは、同じ属性値をもつポリゴンフィーチャを結合する機能です。ディゾルブを使うと、ポリゴン同士が接している場合は境界が除かれ1つのポリゴンに結合されます。また、島のように互いに離れている場合はマルチパートポリゴンとして結合されます。
隣接したポリゴン同士であっても境界線を維持したままマルチパート化させたい時は、「シングルパートをマルチパートに集約」機能を使います。

一方、マルチパートからシングルパートへの変換には「マルチパートからシングルパートに変換」機能を使います(※3)。

※3 各機能はそれぞれ、メニューバーの「ベクタ」→「空間演算ツール」→「融合(dissolve)」、「ベクタ」→「ジオメトリツール」→「シングルパートをマルチパートに集約」、「ベクタ」→「ジオメトリツール」→「マルチパートからシングルパートに変換」にあります。

画像10

---   ---   ---   ---   ---   ---   ---   ---

3. 島の人口密度が高い原因

さて、島の人口密度が高く示された原因を確認してみましょう。国土数値情報から入手した行政区域データは、シングルパートポリゴンです。これは属性テーブルを見れば確認できます。N03_004フィールドを見ると、1つの市町村に対して複数のレコードが存在し、それぞれ1つの島や飛び地などに対応しています。

画像11

この行政区域データに対しCSVの人口数情報を市町村名をキーとしてテーブル結合すると、各レコードにその行政区域内の総人口が結合されます。下図の例でいえば、島の1つ1つが70612人(宇和島市の総人口)の人口を持つことになってしまっています。

画像12

そして、この人口数に対して島の面積を使って人口密度を計算すれば、市全体の人口を島の面積で割るという計算を行うことになるため、異常に高い値となってしまいます。

画像13

統計データをGISデータにテーブル結合するときは、互いのデータの細かさ(精度)が同じであることを確認し、異なる場合は精度が一致するようにどちらかを修正しなければなりません。


IV. 人口密度のマップ作成方法

それでは、正しい手順で人口密度マップを作成しましょう。

1. ディゾルブによるマルチパートポリゴン化

III章で確認したように、国土数値情報から入手した行政界データはシングルパートポリゴンになっています。これを同じ市町村名のフィーチャを1つに結合する機能がディゾルブです。

ディゾルブは、メニューバーの「ベクタ」から「空間演算ツール」→「融合(dissolve)」と選択して設定ウィンドウを呼び出します。「入力レイヤ」では行政界データを指定、「基準となる属性」では市町村名が入ったフィールド(今回は「N03_004」)をディゾルブフィールドとして指定します。

画像14

ディゾルブ前と後で描かれる地図に変化はありませんが、属性テーブルを開くと全体のレコード数が減っており、市町村名で集約されたことを確認できます。

---   ---   ---   ---   ---   ---   ---   ---

2. CSVをテーブル結合

次に、ディゾルブしたデータに対して人口数の情報を結合するテーブル結合を行います。まず、CSVファイルを読み込みましょう。[ Ctrl ] + [ Shift ] + [ T ] でCSVテキストの読み込みウィンドウを開き、読み込むCSVファイルを指定します。今回はテーブルデータとして読み込むため、ジオメトリ定義で「ジオメトリなし」をチェックします。

画像15

CSVの結合先となるレイヤ、すなわち行政界レイヤを右クリックしてプロパティを開きます。ウィンドウ左の [ 結合を編集 ] ボタンをクリックし、ウィンドウ下の [ + ] ボタンからテーブル結合の設定ウィンドウを開きます。
「結合レイヤ」にはCSVファイル、「結合基準の属性」はマッチングのキーとなるCSV側のフィールド名(市町村名)、「ターゲット属性」にはマッチングのキーとなる行政界レイヤ側のフィールド名を指定します。
最後に [ OK ] ボタンをクリックしてテーブル結合を実行します。

画像16

---   ---   ---   ---   ---   ---   ---   ---

3. フィールド演算による面積、人口密度の計算

面積と人口密度の算出は、どちらもフィールド演算から行います。まず、行政界レイヤを右クリックし属性テーブルを開きましょう。属性テーブルウィンドウの [ フィールド計算機を開く ] ボタンをクリックし(または [ Ctrl ] + [ I ] )、フィールド計算機ウィンドウを表示します。

フィールド計算機ウィンドウの左上では、面積を格納するフィールドのプロパティを設定します。フィールド名を指定し、フィールド型は「小数点付き数値(real)」に変更します。フィールド長は保存できる桁数、精度は小数点以下何位まで表示するかを示しており、小数点以下1~2桁あれば十分です。

続いて面積を求める計算式を記述します。面積を求めるには「$area関数」を利用します(※4)。ただし、$area関数は単位を平方メートルで返します。県単位の面積を扱うのに単位が平方メートルでは数値が大きく扱いにくいので、100万で割り算して単位を平方キロメートルにしています。

※4 面積を計算する時には座標参照系を投影座標系に変更しておかなければならない、地理座標系のまま計算すると単位が角度となるため訳の分からない数値が算出される、というのが教科書的な記述です。しかし、実際には地理座標系のままでもQGIS側でうまく処理してくれるので、ここでは座標系を気にせず面積計算を行っています。

画像17

面積が求まったら、次は人口密度を計算します。もう一度フィールド計算機を開き、今度は「人口/面積」の数式を記述して計算を実行します。

画像18

計算が終了すると、属性テーブルに人口密度のフィールドが追加されます。

ここまでCSVをテーブル結合とフィールド演算を行ってきましたが、この結果はまだQGIS上で仮想的に実行されたものであり、ファイルとして保存されていません。結果を保存するには、レイヤを右クリックして「エクスポート」→「地物の保存」を実行します。

画像19

---   ---   ---   ---   ---   ---   ---   ---

4. 人口密度のマップを描く

最後に、算出した人口密度の値を使ってコロプレスマップを作成しましょう。

まず、プロジェクトの座標参照系を地理座標系(EPSG:6668)から平面直角座標系第IV系(愛媛県の場合)に変更し、地図を適切な形状で描画させましょう。

画像20

続いて、レイヤプロパティのシンボロジを開き、塗り分け方法を「連続値による定義(graduated)」に切り替えます(※5)。「値」では人口密度のフィールドを選択しましょう。分類方法について、下図では自然分類をベースとして境界値をキリの良い数字に手動修正しています。「1平方kmあたり何人住んでいるか」を表す値なので、分かりやすい数字にしておくのが無難だと思います。

※5 QGIS 3.8の頃は「段階に分けられた(graduated)」となっていました。他にも「カラム」→「値」、「凡例の形式」→「フォーマット形式」のように、いつの間にか訳が修正されています。

画像22

ちなみに、「値」の右にある [ ε ] ボタンから式ダイアログを開き、先ほどフィールド演算で人口密度を求めた時と同じように数式を設定して値を設定すると、その場で人口密度を計算して地図に反映させることができます。これを使えば、属性テーブルに人口密度のフィールドを用意する必要はありません。

画像21

最後に、レイアウト設定で凡例や方位記号、縮尺などを加えて、地図を完成させましょう。

画像23

レイアウトウィンドウで、メニューバーの「アイテムの追加」から「属性テーブルを追加」を選択すると属性テーブルをキャンバス上に追加できます。追加されたテーブルには属性テーブルの全てが表示されています。この中には不要な情報も含まれています。そこで、アイテムプロパティの [ 属性 ] ボタンをクリックし、テーブルの表示内容を整理します。

画像24

属性の選択ウィンドウでは、不要なフィールドの非表示化、ヘッダー名の変更、ソートなどを指定できます。

アイテムプロパティの「グリッドの表示」では、罫線の有無や線幅、色などを変更できます。表タイトルは「アイテムの追加」から「属性テーブルを追加」を選択し、テキストを編集して表示させています。

画像25


V. おわりに

海に面する島のある地域ではディゾルブによってマルチポリゴン化の処理をしなければならないが、内陸県であればディゾルブしなくても大丈夫だろう。

と思うかもしれません。しかし、内陸県であっても飛び地がある場合があるので1つの市町村が複数のポリゴンに分かれている可能性があります。池や湖に島があったり、河川の中州がポリゴンで表示されているかもしれません。

テーブル結合を行うときは、GISデータの精度とCSVの統計データの精度を揃えることが基本となります。精度が異なる場合は、今回のようにGISデータの精度を修正するか、CSVのデータ精度を整える前処理が必要になります。

記事の内容でもそれ以外でも、地理やGISに関して疑問な点があれば、可能な限りお答えしたいと思います。