特殊なデータ形式から特徴量を抽出する

はじめに

データ分析や機械学習では、csv ファイルのような表形式のデータで得られると何かと都合がよいです。リレーショナルデータベースのテーブルも表形式だから、そのまま使えそうです。

しかし、分析対象によっては、特殊なデータ形式を扱わなければならない場合があります。今回はその一例として、空間データを扱う PostgreSQL 拡張 PostGIS を紹介します。

空間データと、機械学習の例としてよく使われるアヤメのデータセットと比べてみましょう。

アヤメデータ
がく片の長さ がく片の幅 花弁の長さ 花弁の幅 品種
5.13.51.40.2Iris-setosa
4.93.01.40.2Iris-setosa
4.73.21.30.2Iris-setosa

対して、図形データは以下のようになります。

図形データの例
点ID図形
1 010100000000000000000000000000000000000000
2 0101000000000000000000F03F000000000000F03F
3 0101000000000000000000F03F0000000000000040

PostGIS のテーブルには、図形を表す geometry カラムがありますが、それは上記のようにそのままではあまりよくわかりません。

実際の図形の情報が格納されていて、そこから長さなどを計算することはできますが、そのままでは学習用データとしても扱いにくいです。そこで、よく知られた数値に値を繰り出してくる必要があるわけです。

今回は、図形を表す geometry からよく知られた数字に繰り出す例を見ていきます。

環境づくり

GIS データをどのように扱うかを見てみる前に、実際に手を動かせる環境を作りましょう。ここでは、PostgreSQL の PostGIS という拡張を使います。

OpenStreetMapのPostGIS/Installationを参考に、インストールしておきます。

交差点の道路のなす角を求める

具体的に特徴量をひねり出す例として、ノードとエッジのなす角を求めてみたいと思います。

ここで、ノードは平面上の点で、x, y の座標で定まる点とします。エッジは、辺と辺を結ぶ線分とします。

具体例として、ノードは交差点、エッジは道路ととらえることで、地図として応用できるでしょう。

テーブル定義とデータ

辺 Edge と、辺が交わる点 Node からなる地図を考えます。Node は、2 点をつなぐ LINESTRING (折れ線は考えない) とします。

角度を求める

それでは、ひとつの節に3つの辺が接続するようなときの、辺同士のなす角を求めるクエリを実際に組み立ててみましょう。

ほしいもののイメージ

まずは、どのような属性の組が欲しいかイメージを持ちましょう。最終的に欲しいテーブルはこのようなイメージとします。

node_id edge1_id edge2_id edge3_id angle1 angle2 angle3

使う道具

PostGIS で角度を求めるには、ST_Azimuthという関数があります。

第1引数を始点、第2引数を終点とするような線分と、y軸正方向の線分との時計回りのなす角を返す関数です。この関数を使って角度を求めていくことにします。

エッジの方向を求める

ST_Azimuth は2つの点で角度 (ラジアン) を求めるので、Edge の geom にある LINESTRING の始点と終点を取り出しましょう。

ST_DumpPoints を使うと、辺を構成する点が得られます。path には点の並び順が、geom には点の geometry の値が入っています。

次で、機械的に隣り合う点同士で、辺の方向を求めていきます。

エッジとエッジのなす角を求める

続けて、ノードと結合します。直前の azimuth の計算では、point1 (ep1.point) を始点として考えていたので、point1 を始点ととらえた場合は角度はそのままですが、point2 を始点ととらえた場合には、角度を180度ひっくり返します。

いよいよ隣り合う角の角度を計算します.

azimuth では、時計回りに角度が増加します。そこで、角度で順序を入れて、隣り合う角と JOIN して角度を計算します。

横持ち化

最後に、ほしい形に横持ち化します。

得られる結果は次のようになります:

クエリ結果イメージ
node_id edge1_id edge1_id edge3_id angle1 angle2 angle3
2 2 3 1 116.5650512 108.4349488 135

以上、今回は図形から特徴量を取り出す例を見てみました。

図形から特徴量を取り出す、ということを示す目的のため、単純化した想定でクエリが書かれており、場面によってはもう少し工夫が必要になるでしょう。

たとえば Edge が 2点からなる折れ曲がりのない LINESTRING である仮定や、ノードには高々3つのエッジのみが接続するという仮定のもとにクエリを書いていました。実際の地図などでは、4叉路、5叉路など、どういうものがあるのかあらかじめ調べてからクエリを組み立てていくことになるでしょう。

完成したクエリ

それでは、最後に完成したクエリを通してみてみましょう.

12/11(水)セミナーを開催いたします!



こんなお悩みや課題はありませんか?
✓データ活用するためには何を始めればよいかわからない
✓データマネジメントを行うために必要なことが知りたい
✓実績のある会社にAI構築をお願いしたいがなかなか見つからない

こんなお悩みをお持ちの方に向けて、12月11日(水)表参道にて、無料セミナーを開催いたします。
今回はSupership グループのSupership株式会社・DATUM STUDIO株式会社・ちゅらデータ株式会社の3社で開催します。

▼▼▼▼詳細は以下バナーをクリック!▼▼▼▼

このページをシェアする: