商圏分析(二点間の距離の算出)

Tableauの[[コミュニティ(Groups Japan)>http://community.tableausoftware.com/message/289820]]で回答したTipsですが、非常に有益なのでここでも取り上げます。

緯度経度情報を使えば二点間の距離はTableauの関数で計算可能です。

二点間の距離はヒュベニ公式、定数となる地球の長半径と短半径はGPSと同じものを用いました。
(算出方法や定数は諸説あるようですが、商圏分析に用いるならばどれを用いても実務上影響は無いと思います。)

サンプルアウトプットは以下の通りです。

var divElement = document.getElementById(‘viz1534728774167’);
var vizElement = divElement.getElementsByTagName(‘object’)[0];
vizElement.style.width=’100%’;vizElement.style.height=(divElement.offsetWidth*0.75)+’px’;
var scriptElement = document.createElement(‘script’);
scriptElement.src = ‘https://public.tableau.com/javascripts/api/viz_v1.js’;
vizElement.parentNode.insertBefore(scriptElement, vizElement);

顧客住所と店舗住所の距離で色分けしています。(色の境界:5000m)

顧客住所データ(ここでは23区内の全郵便番号の緯度経度データを使用)と
店舗住所データ(各区につき1件の緯度経度データ)をそれぞれ用意し、
各顧客に対して全店舗をぶつけるようにブレンドしました。

今回は、両データに結合コードという列を用意し、全て1を入力しました。
顧客データ1件(結合コード = 1)に対し、店舗データ全23件(結合コード = 1)がヒットします。
(この場合、結合は『内部』でも『左』でも同じ結果です。)

店舗データを単一値のフィルタで指定し、指定店舗からの距離を計算させます。

距離の計算式は以下の通り。

“長半径” = 定数(パラメータで設定)
“短半径” = 定数(パラメータで設定)

“第一離心率” = sqrt(([長半径]^2-[短半径]^2)/[長半径]^2)
“緯度差” = radians([緯度 (店舗住所)])-radians([緯度 (顧客住所)])
“緯度平均” = (radians([緯度 (店舗住所)])+radians([緯度 (顧客住所)]))/2
“経度差” = radians([経度 (店舗住所)])-radians([経度 (顧客住所)])

“子午線曲率半径” = [長半径](1-[第一離心率]^2)/(sqrt(1-[第一離心率]^2(sin([緯度平均])^2)))^3
“卯酉線曲率半径” = [長半径]/sqrt(1-[第一離心率]^2(sin([緯度平均])^2))
“ヒュベニの距離” = sqrt(([緯度差]
[子午線曲率半径])^2+([経度差][卯酉線曲率半径]cos([緯度平均]))^2)

なおPublicに掲載したアウトプットの単位はメートルで統一しています。

また、この方法では顧客数×店舗数分のデータが生成されます。
データ数が膨大になる可能性がありますのでご注意下さい。