Alteryxで飛行機の経路っぽいものを出力する

alteryx

こんにちは、小澤です。

今回は、飛行機の経路をAlteryxで出力する方法について解説します。

やることの解説

下記のサイトの一番上にあるような2点間の経路をアーチ上に描画します。

スクリーンショット 2017-04-21 16.30.21

サイト内では、OpenFlights Dataを利用して、この経路の生成にはAlteryxとなっています。 そのため、今回はAlteryxでの同じデータを読み込んでTableauから閲覧可能な形式で同様のデータを出力するまでが目的となります。

Workflowの解説

今回のWorkflowは以下のようになります。

スクリーンショット 2017-04-21 16.42.16

順を追って説明していきます。

データの整形

まずはデータの整形を行います。

スクリーンショット 2017-04-21 16.42.16 2

データの読み込み

ここでは「OpenFlights Data」にある2つのデータを利用しています。

  • routes.dat
  • airports.dat

airports.datには各空港に関する情報が含まれています。 このデータは空港の緯度経度を取得するのに利用します。

routes.datには、各フライトがどこの空港から出発して、どこの空港に到着するのかの情報が含まれています。 こちらには緯度経度などの情報は含まれないため、空港の情報と結合することで、フライトごとの出発・到着の緯度経度を取得します。

データにはヘッダ行が含まれないため、最初にSelect Toolで列名を入れています。 このプロセスは必須ではありませんが、後続の処理が便利になるとともに結合キー指定などのミスを減らすことができます。 列に関する情報はOpenFlights Dataのサイトにあるものをそのまま入れています。

また、緯度経度は後続の処理のために、浮動小数点型に変換しています。

  • routes.dat スクリーンショット 2017-04-21 16.48.54

  • airports.dat スクリーンショット 2017-04-21 16.50.02

データの結合

次に2つのデータを結合することで、フライトごとの出発・到着地点の緯度経度の情報を与えます。 結合のキーは出発地点と到着地点でそれぞれ以下のようになります。

位置情報 routes.datの結合キー airports.datの結合キー
出発地点 Source airport ID Airport ID
到着地点 Destination airport ID Airport ID

2つのJoinでそれぞれ結合して、出発地点と到着地点の緯度経度を持ったフライト情報を取得します。

スクリーンショット 2017-04-21 16.56.44

スクリーンショット 2017-04-21 16.56.59

出発地点の範囲絞り込み

このプロセスは必須ではありません。今回の場合はデータ量が多いため全てを出力すると可視化した際によくわからない状態になってしまます。 そのため、今回は最低限見やすい程度にデータ量を制限するプロセスを入れています。 その1つがこのでのFilter Toolの利用になります。

ここのでは出発地点の緯度経度の範囲をおおよそ日本の範囲になるように絞り込んでいます。

スクリーンショット 2017-04-21 17.31.11

出発地点・到着地点それぞれの緯度経度のみの情報を取得

データ整形の最後のプロセスになりまます。 この後のプロセスで出発地点と到着地点の間の区間の情報を計算するのですが、そのために、出発地点の緯度経度、到着地点の緯度経度の2つのデータを作成しておく必要があります。

ここではSelect Toolでそれぞれのデータを生成しています。

スクリーンショット 2017-04-21 17.34.20

スクリーンショット 2017-04-21 17.34.33

ここまでで以下のような2つのデータが生成されます。

  • 出発地点 スクリーンショット 2017-04-21 17.36.51
  • 到着地点 スクリーンショット 2017-04-21 17.37.07

アーチ状の経路の作成

次に今回のメインの処理となる間の経路の作成を行います。

スクリーンショット 2017-04-21 16.42.16 3

ここではR Toolを利用しています。 そのため、AlteryxのAnalytics Toolをインストールしていることが必須になります。

出力するデータ構造

この後の処理でTableauで読み込み可能なデータを生成するため、以下のような構造のデータを作る必要があります。

データ データ内の順番 緯度 経度
0 0 ... ...
0 1 ... ...
0 2 ... ...
0 3 ... ...
1 0 ... ...
1 1 ... ...
... ... ... ...

この形式にすることで、「データ」の項目が同じものが1つの線(または領域)で、「データ内の順番」の緯度経度を1つの点としてその順番で結んでいったものが1つの経路の情報ということを表現できます。

上記の場合ですと、「データ0」の0から3までの緯度経度を順に結んでいったものがデータ0の経路のような形式となっています。

Rの処理

Rの処理は以下のようになります。

library(geosphere)

orig <- read.Alteryx("#1")
dest <- read.Alteryx("#2")

inter <- gcIntermediate(orig, dest, n=100)

df <- do.call(rbind, 
  lapply(seq_along(inter), function(i) {
    data.frame(id=i-1,
               poly_num=0:(nrow(inter[[i]])-1),
               lon=sapply(inter[[i]][, 1], function(x) { x }), 
               lat=sapply(inter[[i]][, 2], function(x) { x }))
  })
)

write.Alteryx(df, 1)

この内容について順を追って説明していきます。

ライブラリの読み込み

1行目で今回利用するライブラリを読み込んでいます。 今回利用する{geosphere}パッケージはAlteryxの標準ではインストールされていないものなので、入れる必要があります。

<Alteryxのインストールフォルダ>\R-x.y.z\bin\R.ext (x.y.zはRのバージョン)

を起動して、処理を実行します。

install.packages("geosphere")

パッケージのダウンロード先などを選択してインストールが完了します。

データの読み込み

3, 4行目はデータの読み込みになります。 R Toolに出発地点は#1、到着地点は#2で接続しているのでそれぞれを指定してデータを読み込んでいます。

アーチ状の区間の計算

この計算を行っているのは6行目のみとなっています。 先ほど読み込んだgeosphereにある、gcIntermediate関数で実現しています。 3つ目の引数のnは間に何点置くかを指定しています。

この結果は、以下のようなlistの形式になります。

[[1]]
           lon      lat
 [1,] 40.10011 43.69442
 [2,] 40.24479 43.93877
 [3,] 40.39067 44.18292
 [4,] 40.53776 44.42690
 [5,] 40.68608 44.67068
 [6,] 40.83565 44.91426
 [7,] 40.98650 45.15765
...
...
 [99,] 48.81202 55.14566
 [100,] 49.04400 55.37615

[[2]]
           lon      lat
 [1,] 48.02685 46.46622
 [2,] 48.04754 46.64913
 [3,] 48.06837 46.83205
 [4,] 48.08934 47.01495
...
...

必要な形式への変換

最後にこのデータを必要な形式に変換します。 これは、8-15行目で行っています。

内側から順に見ていくと、9行目でlapplyでlistの全てのデータに対しての処理をしています。 seq_alongでアクセス可能なインデックスを取得し、10-14行目でそれらすべてに対しての処理をしています。 内部のデータをdata frame形式にしたものを一番外側(9行目)で結合して1つのdata frameにしています。

最後に17行目でAlteryxの次のToolに渡すための出力を行っています。 これで、下記のようなデータが生成されます。

スクリーンショット 2017-04-21 19.24.57

スクリーンショット 2017-04-21 19.25.10

データの確認

これで目的のデータが生成されましたので後はこのデータをファイルとして出力すればTableauから読み込むことができます。

最後にAlteryx上でも確認してみましょう。

スクリーンショット 2017-04-21 16.42.16 4

緯度経度をSpatial Objectに変換しポリゴンへの変換をします。

スクリーンショット 2017-04-21 19.29.48

スクリーンショット 2017-04-21 19.30.02

出力は以下のようになります(※ ここでは見やすさのため、15件程度に絞って表示しています)

スクリーンショット 2017-04-21 19.32.17

終わりに

今回はAlteryx上でアーチ状の軌跡を描く方法を解説しました。 Rのコードを記載するため、やや難易度は高くなりますが、工夫次第でいろいろなことができる可能性があることがわかっていただけたかと思います。

AWS Cloud Roadshow 2017 福岡