こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。
2024年9月に公開されたPython3エンジニア認定データ分析実践試験では、時系列データ、テキストデータ、画像データ、グラフデータ、地理空間データという、5つのデータの形の取り扱いに関する問題が出題されます。人によっては、データ分析の世界に身を置いていたとしても、関わりがないものがあると思いますし、難しいと感じるものがあるかもしれませんが、どれも重要なものです。様々なデータの特徴を知り、扱えるようになっていれば、より実践的で、より良いデータ分析を行えるようになりますので、ぜひ身に着けて頂きたい項目です。
解説5回目となる今回は、10章の「地理空間データ」について取り上げます。
※Python 3 エンジニア認定データ分析実践試験
https://www.pythonic-exam.com/cpda
※前回までの解説コラムは以下よりご覧いただけます。
データ分析実践試験のヒント「時系列データ処理」(6章)
データ分析実践試験のヒント「テキストデータ処理」(7章)
データ分析実践試験のヒント「画像データ処理」(8章)
データ分析試験のヒント「グラフデータ処理」(9章)
データ分析実践試験における地理空間データ出題のねらい
今回取り上げる「地理空間データ処理」は、これまでに取り上げてきた他のデータとは少し毛色が異なり、どちらかというと専門職に近いところになるため、扱ったことが無い人も多いと思います。
それなのに試験問題に入れられているのがなぜかと言えば、Pythonやpandasを使うことで地理空間データの処理ができることを知っていただき、さらにはpandasでも実は扱いやすいものであることを知ってもらい、自分でも扱えるという感覚を掴んで欲しいという狙いがあります。
そういった背景があるので、試験では、ある一定のレベルで地理空間データの特徴や簡単な処理までができるようになっていることが目標となっており、複雑な処理ができるようになることについては重要視していません。
書籍には大体30ページほどがこの地理空間データ周りの解説に使われていますが、これだけでは地理空間データをすべて理解できるようなものにはなっていません。試験に向けての学習であれば、あくまでこの本で紹介されている内容を網羅的に理解しておいてもらえればと思います。
もしこの学習を通して地理空間データについて興味を持ったのなら、専門書籍などより詳しく説明がされているものや、公式ドキュメントを読み込むなどで調べて頂ければと思います。
地理空間データの処理で知っておきたいこと
書籍では5節に分けて地理空間データの解説をしています。
最初の節では、地理空間データの概要の解説がされていますが、触れたことが無い方にとっては初めて出てくる用語が多いため、理解のしにくさがあると思いますので、まずはじっくり読み解く事から始めてもらう必要があります。
地理空間データとは、地図上に、どのように都市などの地点がマップされているかをデータで表すものになります。例えば、県単位を表すためのデータ構造が何種類も存在しています。地理空間データは、都市計画といった土地の利用方法など様々な用途に使うことができます。
さて、書籍でも紹介されていますが、GIS(地理情報システム)とCRS(座標参照系)があり、そして地球を平面の位置で表現するためのルールが存在しています。
ご存じの通り、その場所を表すには、緯度と経度、高さが分かっていれば、地球上のどこにあるのかというのは絶対的に判ります。ですが、地球は実際には球体に近い楕円の形をしていますので、距離を計算したり、方向を考えたりしたいときには二次元で表現された方が人の目にはわかりやすくなります。実際、平面で計算される面積は人の目としてはわかりやすいものでしょう。
もし、二次元的に考える場合には、どのように平面に落とすのかのルールを決めておかないと計算がしにくくなりますので、実際には複数の考え方が存在します。
<地理空間データの形式>
地理空間データの形式には、ベクターデータとラスターデータというものがあります。
ベクターデータは、座標をポイント、ライン、ポリゴンで定義します。これはどんなに拡大・縮小しようとも劣化することはありません。ただ、これを計算してマップに乗せるとなればそれなりの計算量が必要になってきます。
例えば、真四角なものであれば、4つのポイントと4本のラインがあればその場所の面積を表すことができます。ですが、日本の土地で考えた場合、実際には県境はうねうねしていますし、飛び地を持っている県もありますので、データ量がとても多く、結構複雑な計算を必要とすることになります。
対してラスターデータは、物体が値をピクセルごとに持ち、そのモノ自体の大きさを固定して保存されているため、計算量がとても少なく済む、描画のために存在するデータ形式です。
<GISデータを取り扱うライブラリ>
GISデータを取り扱えるライブラリは複数あり、書籍で紹介しているのは5つです。
現状、地理空間データの世界においては、複数のライブラリを組み合わせなければ、目的を達成するのが難しいため、まずは最初にどのライブラリを利用するか、選定しなくてはなりません。
例えば、Pythonを使って機械学習をするのならscikit-learnというような、定番といえるようなものが地理空間データにはありません。書籍で紹介されているものは、ある程度、定番と言えるものではありますが、やり方もいろいろあれば、どのツールでもやりたいことはある程度できてしまうため、学習がしづらく、決め手となれるようなものがありません。そのため、やりたいことがあったときに、どのツールが適しているのかを調べるところから始める必要があります。
<地理空間データのファイルの読み込み>
2節ではファイル形式の読み込みを学習します。
地理空間データは、すでに様々なところでデータ化されたものが公開されています。それらのデータを利用するには、まずライブラリを使ってPythonのオブジェクトにして、何らかの計算ができるようにする必要がありますが、このPythonのオブジェクト化にする作業が重要です。
例えば、画像データであれば、PillowやNumPyなどを利用してデータ化し、Pythonのデータとして処理をするという流れをこれまで紹介してきました。地理空間データでも同様で、Pythonのオブジェクトに読み込むことが最初に必要な作業になります。
この2節では、地理空間データでよく使われるだろうと思われる3つのファイル形式を読み込む方法や、Pythonのオブジェクトへの変換の仕方を紹介しています。ライブラリの存在や読み込み方、特徴を最低限覚えておいて欲しいなと思います。
1.GeoJSON
標準化された規格として作られたもののため、よく利用される形式だと思います。
GeoJSONのデータ構造や読込作業の説明は教科書を参照してください。
ここではShapelyというライブラリを使ってGeoJSONを読み込む方法が紹介されています。途中でpandasのコードが使われています。これはGeoPandasというpandasで地理空間データを扱うためのライブラリで、pandasの世界に地理空間データを持ち込むことができます。書籍はデータ分析をなるべくpandasでやろうとしていますので、こうしたpandasに持ち込む方法が紹介されています。
2.シェープファイル(Shapefile)
シェープファイルというファイル形式がありますが、これもGeoPandasを使ってpandasの世界の持ってくることができます。
3.GeoTIFF
これはラスターデータのファイル形式になっており、画像データの形式に地理空間データを含んでいるファイル形式です。これはベクターではないため、拡大縮小にはそんなに強くありませんが、データとしては描画などをさせるのなら高速に描画させることができます。
Rasterioというライブラリを使って、Pythonのオブジェクトに変換する方法が紹介されています。実際には最後にPillowで画像を表示することになります。
<地理空間データの操作方法>
3節目では地理空間データの操作方法を学びますが、ここではベクターデータをShapelyで生成したオブジェクトを使って地理空間データを操作する方法を学びます。
まずは地理空間データがどういった形の情報になっているか、どういったデータが入っているかを知った上で、そのオブジェクトがどういった属性を持っているのかを知る必要があります。そうすると、表の緯度経度を取得することに繋がります。
次に距離の計算と算出の方法として、各地点の距離を測るにはdistance()メソッドを使った簡単に距離を算出できる方法が紹介されています。
地球は真円ではないため、本来なら拠点間の距離を計算するには少し工夫が必要ですが、このメソッドを使えば内部で処理を行ってくれます。
例えば、二つの拠点間の距離を調べる場合、2つ分のポイントの緯度経度の情報がありますので、ベクトル的には簡単に結果が出そうな気がしますが、実際には緯度経度では角度が示されていますので、角度の具合によっては距離が変わってしまうことがあります。ただ、角度だけでは距離は出ませんので、複雑な計算は内部で行う必要が出てきます。こういったことを行えるライブラリがありますので、使いこなすことができれば、比較的簡単に距離を求めることができます。
<GeoPandas>
4節はGeoPandasの解説です。GeoPandasとは、pandasのデータ型を拡張して、GeoDataFrameを定義しており、ここにはGeoSeries方の列が含まれるようになっています。
書籍では国土交通省のサイトから取得した滋賀県のデータをGeoPandasで直接読み込んで使っています。
国土交通省のサイトでは、こういった様々なデータをオープンデータとして公開しておりい、県の情報や地理情報を得ることができます。
GeoPandasには、CXインデクサーという座標に特化したインデクサーがあり、スライス記法を使えることができます。そのため、緯度経度で範囲指定すると、地理空間データに入っている行からデータを取得することが簡単にできるという特徴があります。
書籍ではポリゴンデータが含まれた滋賀県のデータを使用し、指定範囲内のどの行とマッチするのかを示すというようなことをしています。例えば、現在地の緯度経度が正確にわかる場合、現在地がpandasのどこの行に当てはまるのかを調べられますし、緯度経度で指定したエリアの範囲に入る地域をCXインデックスで調べるということができます。
また、GeoPandasでポリゴンデータを表示する方法も紹介されています。
ここでは、GeoPandasの概要として、こういった機能があるという事を押さえておいて欲しいと思います。
<地理空間データの可視化>
5節ではポイントデータの可視化について紹介されています。
ここでは内部でライブラリを使い、Foliumというツールを使って表現していますが、実際に地図などに位置をマッピングすることができます。また、pandasと上手く組み合わせることで、ヒートマップ的に地域の特徴をマーキングすることも可能です。
最期の方ではポリゴンの可視化を行っていますが、この辺りまで到達するとコード量が増え、新しいものを覚えていかなくてはならないため難易度が上がりますが、サンプルコードを試していただくと、Pythonだけで地図上にいろんなものが表示できるという地理空間の面白さを感じてもらえるのではと思います。
さいごに
さて、ここまでで地理空間データの概要をお話しましたが、最終的には自分の好きな地域のデータを持ってきてやってみることが大事なことだと思います。
書籍では、滋賀県をサンプルデータとして使っています。なぜ滋賀県を選んだかというと、滋賀県は海がなく、飛び地を持たないためです。他の多くの地域では、海や飛び地を持っている県が多く、特に飛び地を持っている場合は複雑になりやすいため、わかりやすく学習しやすいとして滋賀県をサンプルにご紹介しました。
GeoPandas含め、pandasを上手く使いこなすことで、データの表示の工夫など、徐々に使い方が分かってくると思います。
大変かもしれませんが、他の県でもぜひ試してみてください。pandasを使いこなすという意味でも勉強になるのではと思います。