話題の記事

「イオンモールの総賃貸面積ランキング」ダッシュボードをノンコーディングで作ってみた #tableau #alteryx

俺よりデカいイオンに会いに行く
2020.08.25

座右の銘は「大は小を兼ねる」、データアナリティクス事業本部ソリューション部・新納(にいの)です。

鉄板の会話ネタと言えば「今日の天気」が挙げられるかと思いますが、それと同じくらい頻繁に話題に上がるのが「イオンモールの大きさ」でしょう。登山をしたり海に出たりすると、自然の雄大さを前にして自分自身のちっぽけさを痛感し、悩みもなんだかどうでもよくなる…それと同じ感情をイオンモールに感じている方も多いのではないでしょうか。私もその一人です。

巨大なイオンモールに畏怖の念すら抱く我々にとって、「会話に困らないようにイオンモールの大きさランキングを知っておきたい」「でかいイオンモール(でっかイオン)に行きたい」という感情はごく自然に湧いてくるものです。 というわけで、AlteryxとTableauでイオンモールの大きさランキングをノンコーディングで可視化してみました。

前提条件

今回の検証で使用した環境は以下の通り。

  • Alteryx Designer 2020.2
  • Tableau Desktop 2020.3

完成形「大きなイオンに行きたいダッシュボード」

(※2020/8/25 19:00 2店舗分取得できていないレコードがあったので修正して更新しました。) 完成したダッシュボードはこちら。Tableau Publicに公開していますので推しイオンモールを探してみてください。

気になる巨大イオンをクリックすると地図上でどこにあるイオンなのか確認可能です。

なお、データ取得元は以下のURLを参照しております。

AlteryxでWebスクレイピング~データ整形

Alteryxで作成したワークフローの全体像はこちら。

このワークフローで実現している処理は大きく分けて以下の3つです。

  • Webスクレイピング
  • 取得したHTMLのデータ整形
  • 住所から緯度・経度を取得

Webスクレイピング

AlteryxでWebスクレイピングを実現する方法は非常に簡単で、URLをダウンロードツールで指定するだけです。今回作成したワークフローは連続アクセスするようなものではありませんが、ダウンロードツールを右クリック→「キャッシュして実行」を選択するか、一度実行して別ファイルに出力したものを使用することでサイト側への負荷をかけないようにします。

取得したHTMLのデータ整形

正規表現を使ってHTMLのデータ整形を地道に行います。一番時間がかかった部分でもあります。まずはブラウザからHTMLを眺めて、どの情報が必要で、どのような処理をすればデータが取得できそうか、方針を事前にざっくり考えておきましょう。特に実現したいダッシュボードとそれに必要な情報を予め固めておくと可視化の段階で格段に楽になります。そうでなければ、可視化の段になってから「住所の情報も欲しかったな…」などと、不足データ集めのためにデータ取得からやり直さなければならない事態に陥ることも…。(私がそうでした…)

項目名を取得

やり方はいろいろありますが、私の場合は自分自身の正規表現力やAlteryx力も考えて、項目名となる部分とデータになる部分を分けて取得し、あとから合体させることにしました。

項目名となるHTMLは以下のように記述されています。

<tr class="tr-pcOnly">
 <th class="width24"></th>
 <th class="width09">開店年</th>
 <th class="width30">住所</th>
 <th class="width14">電話番号</th>
 <th class="width13">総賃貸面積(m&#178;)</th>
 <th class="width10">駐車台数(台)</th>
</tr>

正規表現ツール(RegEX tool)を使用し、トークン化で抜き出した部分を行に分割するように記述します。

データ部分の取得

次にデータ部分を取得します。一例ですが、データ部分のHTMLは以下のように記述されています。

<tr>
    <td class="width24 mall-name">
        <a href="/mall/detail/109">イオンモール高の原</a>            </td>
    <td class="width09" data-label="開店年">2007年</td>
    <td class="width30" data-label="住所"><span>京都府木津川市相楽台1-1-1</span></td>
    <td class="width14" data-label="電話番号">0774-75-2500</td>
    <td class="width13" data-label="総賃貸面積(m&#178;)">約44,000㎡</td>
    <td class="width10" data-label="駐車台数(台)">約2,100台</td>
</tr>

この塊を1レコードで抜き取るため、正規表現ツールで以下の通り指定し、行に分割します。

<tr>(.*?)</tr>

レコードIDツールで店舗ごとに連番のIDを割り振り、後から加工しやすいようにデータクレンジングツールで改行や空白を削除します。ここでの処理のポイントとして、割り振っておいた店舗ごとのIDが後から活躍します。

店舗名とそれ以外の項目でHTMLタグの使われ方が異なるので、データ取得の処理も思い切って分けてしまいました。まずは店舗情報を取得するため、以下の通り正規表現ツールを設定します。

店舗名以外のデータ取得は以下の通り。店舗名とは異なり、spanタグやbrタグが使われているため、適宜正規表現で空文字に置換しておきます。ユニオンツールで店舗名とそれ以外のデータを結合できるようになりました。

項目名とデータ部分を合体させる

事前に取得しておいた項目名とデータ部分を合流させるため、複数行フォーミュラツール(Multi-field formula tool)で店舗ごとに割り振っておいたIDごとの連番を振ります。新たなフィールドとしてdummyを作成し、式には以下を入力します。

if [Row-1:RecordID]=[RecordID]
then [Row-1:dummy]+1
Else [Row-1:dummy]
Endif

dummyで割り振られた番号をダミーの項目名にしてデータを横持ちに変換させます。クロスタブツールで店舗ごとのIDでグループ化し、ヘッダーにdummy、新しい列の値にデータ部分を指定します。ようやくそれらしい見た目になりました。

動的リネームツール(Dynamic Rename tool)でRアンカーに最初に取得した項目のデータストリームを、Lアンカーにはデータ部分を繋げ、「右入力(R)データの行からフィールド名を取得」を選ぶと、ダミーで設定していた項目名が置き換わりました。動的リネームで項目名を設定するにあたって、Rアンカーから入力されるレコード数がLアンカーから入力されるデータストリームの項目数と一致している必要があります。dummyで店舗ごとに割り振っておいたIDごとの連番を振っておいたことで、クロスタブ時に必要な数だけ項目を生成することができたというわけです。

不必要なNULLレコードを除外し、項目名をセレクトツールで調整して次に進みます。

住所から緯度・経度を取得

今回はGoogle Cloudが提供するGeocoding APIを使用して住所から緯度・経度を取得しました。利用にあたってはGoogleアカウントとクレジットカードの登録が必要となります。Geocoding APIの場合、1000件のリクエストごとに$5の料金が発生しますが、毎月$200分までは無料であり、90日の無料トライアル期間であれば$300分のクレジットが利用可能です。

なお、MapFan APIの利用者であれば、Alteryx Public Galleryで公開されている「MapFan Geocoder」を使うことで簡単に緯度・経度の取得が可能です。詳細は以下をご参照ください。

Alteryx側での処理は以下の通り。

まずはGeocoding APIを利用するためのAPIキーをGoogle Maps Platformで取得しておきます。

Geocoding APIを利用するには以下のURLを実行する必要があります。Alteryxを使ってこのURLを作成します。

https://maps.googleapis.com/maps/api/geocode/json?address=<住所>&language=Ja&key=<APIキー>

テキスト入力ツールにAPIを入力したURLをhttps://maps.googleapis.com/maps/api/geocode/json?address=&language=Ja&key=<APIキー>の2つに分けて入力します。

フィールド付加ツール(Append tool)で整形した店舗情報のデータとテキスト入力ツールで入力したURLを結合させます。フォーミュラツールで新しい項目を作成し、address=の後ろに住所を、住所の後ろには&language=Ja&key=<APIキー>が配置されるように結合するように設定します。

フォーミュラツールで生成されたURLをHTML取得時と同じようにダウンロードツールで実行し、取得結果から緯度経度のみを抜き出せば完成です。

出力

今回はTableau Onlineにhyper形式で出力しました。出力前に総賃貸面積についている単位を削除したり、データ型を数値に設定してからTableau Serverに公開ツール(Publish to Tableau Server tool)で出力します。ツール自体の使い方は以下をご参照ください。

Tableauでダッシュボード作成

長い長い前処理編が終了したところで、お次はTableauでの可視化です。以下の情報が分かるようなダッシュボードを作成します。

  • 総賃貸面積の大きさランキング上位20店舗
  • イオンモールの場所がわかる地図
  • 全店舗の大きさランキング

総賃貸面積の大きさランキング上位20店舗

表示形式でツリーマップを選択し、直感的に大きさがわかるようにしました。

全店舗で一番大きいのはイオンモール幕張新都心で総賃貸面積は何と128000㎡。私の自宅のおよそ5120倍です。関西で非常に有名な遊園地・ひらかたパーク(159,048㎡)にも迫る勢いで、バチカン市国(440,000㎡)の約30%を占める…といえば大きさのイメージがつくでしょうか。

総賃貸面積が大きい順番に上位20件を表示させるため、店舗名からセットを作成し、フィルターに配置しています。

ラベルとして総賃貸面積を指定し、書式設定からサフィックスに「㎡」を設定することで単位が表示されるようにしました。

イオンモールの場所がわかる地図

記号マップを使い、総賃貸面積の大きさに比例して記号も大きく、色も濃くなるように設定しました。私の推しイオンモールであるイオンモール高の原は、どうやら関西圏の中ではほどほどの大きさであるようです。

全店舗の大きさランキング

イオンモール全店舗の大きさランキングは表示形式をテキスト表記に設定し、俯瞰して順位を見られるように設定しました。一番小さいイオン(ちっちゃイオン)は心斎橋オーパきれい館で2400㎡のようです。

総賃貸面積ランキングを出すために計算フィールドを作成しています。同一の値には同一の順位をつけるため、RANK_DENSEを使用しました。

参考

さいごに

Webスクレイピングからデータ可視化までノンコーディングで実施できました。今回の可視化では後から実現したいことが増えてしまい、データ取得段階まで手戻りしてしまったため、事前にどんなダッシュボードを作りたいかバッチリ決めておけば楽に可視化できたのに…と反省しました。

そんな反省もありつつできあがったダッシュボードを使って、ぜひ巨大なイオンモールに思いを馳せてみてください。

参考情報

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。 alteryx_960x400