このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-086: 085で作成した緯度経度つき顧客データに対し、会員申込店舗コード(application_store_cd)をキーに店舗データ(store.csv)と結合せよ。そして申込み店舗の緯度(latitude)・経度情報(longitude)と顧客住所(address)の緯度・経度を用いて申込み店舗と顧客住所の距離(単位:km)を求め、顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに表示せよ。計算式は以下の簡易式で良いものとするが、その他精度の高い方式を利用したライブラリを利用してもかまわない。結果は10件表示せよ。
緯度(ラジアン):ϕ
経度(ラジアン):λ
距離L=6371∗arccos(sinϕ1∗sinϕ2+cosϕ1∗cosϕ2∗cos(λ1−λ2))
※結果はcustomer_idの昇順に並べて出力すること
※距離を計算した結果のフィールド名は「distance」とすること
解答ワークフローは以下のようになります。
85問目の続きの問題となります。85問目は顧客データに登録店舗の位置情報を結合して終わりましたが、今回はそこからの計算になります。
今回は、ライブラリ(Alteryxでは空間カテゴリのツールがそれに該当します)を使うか、提示されている簡易計算式で行うか、選ぶことができますが、両方解説していきたいと思います。
まず、今回新登場の2つのツールを紹介していきます。
ポイント作成ツール
Alteryxで空間処理を行うには、基本的に空間オブジェクトにする必要があります。これは、ポイント、ライン(ポリライン)、ポリゴンなどのデータとなります。空間オブジェクトがある場合は、セレクトツールではデータ型が「SpatialObj」となっています。
このポイント作成ツールは、緯度経度情報から空間オブジェクトのポイントデータを作成するツールです。設定は簡単で、Xフィールドに経度データが入っているフィールド、Yフィールドに緯度データが入っているフィールドを指定します。フィールドの値は、139.123といったような小数点の10進数である必要があります。60進数のデータ(東経136度15分20秒のようなデータ)は10進数に変換する必要があります。古いデータは60進数のデータが多かったように思いますが、最近はほぼ10進数で記録されるケースが多いかと思います。
その他、浮動小数点を使わずに整数だけで表現したもの(10進数である必要があります)、指定した投影座標系用の数値データにも対応しています。
これにより、緯度経度を空間オブジェクト化することで、地図上に表示することが可能になります。閲覧ツールで空間オブジェクトを含むデータを見ると、マップタブで地図を確認することができます。
距離ツール
距離ツールは2つの空間オブジェクト間の距離を測定するツールです。
距離を出力するだけではなく、基本方位(ざっくりと東西南北含めて8方位程度を示してくれます)や方向を度単位で出力することも可能です。有償のデータセットがあれば、車で運転した時の時間なども出すことができるのですが、残念ながら日本では販売されているデータがありません。
空間ツールを使ったワークフローを作る
それではワークフローを作っていきましょう。まずは、Alteryxの空間ツールを使った方法で進めてみましょう。
85問目の解答からポイント作成ツールで空間オブジェクトをまず作ります。Avg_longitudeをXフィールド、Avg_latitudeをYフィールドにセットします。
次に、store.csvのデータ準備を行っていきます。まずセレクトツールで不要な項目を削除します。
次に、ポイント作成ツールを使って空間オブジェクトを作ります。logitude、latitudeという名称のフィールドが存在していれば自動的に設定されるようになっています。
ここで85問目の結果とstore.csvのデータを結合していきます。85問目の結果の会員申込店舗コード(application_store_cd)とstore.csvのstore_cdを紐づけます。ついでに不要な項目を削除しておくのと、addressはcustomer_address、店舗のaddressはstore_addressとしておきましょう。
ここからが本番です。距離ツールを接続し距離を計測します。今回はどちらもポイントデータなので、指定するオブジェクトフィールドは特にどちらがどっちでも構いません。その他のオプションは、「距離を出力」にチェック、単位は「キロメートル」であれば問題ありません。
数アイコンちょこちょこ設定するだけで距離計算ができてしまいました。
これであとは、customer_idの昇順で並び替え、先頭から10レコード抽出すれば完了です。最終的なワークフローとしては以下の通りとなります。
簡易計算式を使ったワークフローを作成する
次に、簡易計算式で計算してみましょう。
まず計算するためにstore.csvのデータ型の変更を行います。セレクトツールでlongitudeとlatitudeをいずれも数値型(Double)にしましょう。
次に、データを結合していきます。85問目の結果とstore.csvのデータを結合していきます。85問目の結果の会員申込店舗コード(application_store_cd)とstore.csvのstore_cdを紐づけます。ついでに不要な項目を削除しておくのと、addressはcustomer_address、店舗のaddressはstore_addressとしておきましょう。
さて、計算式を見ると、緯度、経度はラジアン単位にしなければなりません。改めて計算式記載します。
緯度(ラジアン):ϕ
経度(ラジアン):λ
距離L=6371∗arccos(sinϕ1∗sinϕ2+cosϕ1∗cosϕ2∗cos(λ1−λ2))
度をラジアンにするのは、「度 × 円周率 ÷ 180」という計算式となります。円周率は、PI()という関数が使えます。
計算式はそれほど難しくないですが、正直4つのフィールドを変換しないといけないのは結構面倒です。このような時に使えるのが複数フィールドフォーミュラツールです。
今回Avg_longitude、Avg_latitude、longitude、lataitudeの4つのフィールドにチェックを入れましょう。そして、今回は元のフィールドも残しておきたいと思うので、「出力フィールドをコピーして追加」にチェックを入れ、値を「_rad」として接尾辞を選んでおきます。これにより、上の4つのフィールドの後ろに_radという文字列が入るので、「Avg_longitude」を計算したものは「Avg_longitude_rad」という名称のフィールドに格納されます。
計算式は以下のとおりです。
[_CurrentField_]*PI()/180
あとは、定義された計算式通りの計算をフォーミュラツールで行いましょう。フィールド名は「distance」、データ型が「Double」にしましょう。
6371*ACOS(SIN([Avg_latitude_rad])*SIN([latitude_rad])+COS([Avg_latitude_rad])*COS([latitude_rad])*cos([Avg_longitude_rad]-[longitude_rad]))
これであとは、customer_idの昇順で並び替え、先頭から10レコード抽出すれば完了です。最終的なワークフローとしては以下の通りとなります。
まとめ
85問目の続きの問題ですが、ようやく空間処理を行う問題が出てきました。とはいっても、距離計算という非常にベーシックな内容でしたので、簡単にできたかと思います。Alteryxだと本当に何も考えずにアイコンおいてつなぐレベルですが、空間ツールを使わずに計算しようとするとなかなか面倒です。
コメント