alteryxでクリスマスツリーを描く

内容は真面目です!
2022.12.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本記事はアライアンス統括部アドベントカレンダー2022の 12/23 の記事です。
本アドベントカレンダーの記事一覧は下記よりご確認いただけます。

アライアンス統括部アドベントカレンダー2022 の記事一覧 | DevelopersIO

はじめに

Alteryxは、セルフサービス分析のためのプラットフォームとして、データの収集から、加工、分析、結果の可視化までを「ツール」とよばれる各機能を持ったアイコンを、線で繋いでいくというGUIで行えるツールです。

一般的には、何か分析したいデータがすでにある状態から、その前処理のためのツールとしてAlteryxを使用する 場面が多いように感じますが、データ分析の場面においては、検証用のデータを自分で用意する場面もあるかと思います。
こういった場合の対応策の一部として、下記のような手段が考えられます。

・オープンデータや各種ツールにもとより埋め込まれたサンプルデータを使用する
・すでに使用しているデータの一部をサンプリングして使用する
・データを自作する

今回は3つ目のデータを自作する方法をGUIベースの Alteryx の機能でできないか、といった試みです。
検証の目標としては、ツール内で生成したデータを可視化(クリスマスツリーを描く)することとします。

モチベーション
ゴールを可視化とし、そのお題をクリスマスツリーにした理由は、時期的な理由もありますし、下記の記事で似たような機能が提供されていたためです。
イメージはこのような形で、下記のような図を、可視化に必要なデータからAlteryxで作成してみます。

Terraformでクリスマスツリーを作る | Developers IO

前提条件

下記の環境で検証しています。
・Alteryx Designer x64 バージョン: 2022.1.1

データ生成

ツリーの形

Terraform のツリーを参考に、ツリーの形や装飾には散布図を用いて可視化を目指します。
散布図でツリーを表現するにあたり、どの座標範囲にツリーを置くかは任意でよいと思いますが、それぞれのポイントの位置が、木の形を表すようなデータとする必要があります。

ここでは、下記の方法をとることとします。

例えばツリーの最上段の点の座標を(2.5,5)としたときに、この点から特定の間隔で、下段の左右のx座標を広げていきます。

こうすると、各段について、下記の情報が得られます。
・格段のy座標
・格段のポイントのx座標の最小・最大値

上記のままでは、色をつけても寂しいので、さらに各段のポイント間についても、特定の間隔で、点を埋めていくと下図のようになります。

あとは、この間隔を調整することで、ポイント間の距離を縮め、描画・色付けした際にツリーのように見える形とします。

ツリーの装飾

全体の形の他に、装飾も散布図で表現します。
ツリーの形を表現するポイントの一部をランダムに抽出し、そのポイントを描画する際に形や色を変えることで装飾を表現します。

木の幹の部分は、ある色で範囲を塗りつぶすことで表現できそうなので、面グラフを使用します。

上記の図を用いて、Alteryxで下記のような図をデータから生成してみます。

完成イメージ

Alteryx

今回作成したワークフローは、下記になります。

各工程を大まかに分類すると、下記のようになります。
①:ツリーのポイント作成
②:ポイントを分類し、分類ごとに処理
③:可視化用に整形

1.ツリーのポイント作成

この部分を拡大すると下記の通りです。

テキスト入力
テキスト入力には、下記をインプットとして与えました。ここが、ツリーのx座標の中心になります。

行生成ツール
行生成ツールは、入力を使用せずにスタンドアローンデータセットとして行を生成することができます。
ここでは、下記の設定とすることで、各ポイントのy座標(ツリーの段のy座標)を新たな列として生成しています。

初期化式:5
条件式:y>=1
ループ式:y-0.15

出力は下記のようになります。

フィールド付加ツール
下記の通り、データを入力します。
ターゲット:テキスト入力ツールの出力
ソース:行生成ツールの出力

複数行フォーミュラツール
複数行フォーミュラツールを使えば、前後の行の値を参照した計算を行えます。
こちらは下記の設定としています。

もう一つの複数行フォーミュラツールでは、上記の設定から、生成するフィールド名をxmaxとし、式も一部変更しています。

if isnull([Row-1:xmax])
then
[xstart]
else
[Row-1:xmax]+0.025
endif

フィールド付加ツールの出力時点で、データの行数はツリーの段数となっているので、各段のポイントのx座標の最大/最小値を生成することができます。

この時点でのデータの一部は、下図の通りです。

次に、各段のポイントを特定の間隔で、埋めていくための準備として、段ごとの間隔を算出します。
また、ここでは、各段の段数*2のポイントを作成することとします。

レコードIDツール
現状のデータの行数は段数に一致します。段の情報を取得したいので、レコードIDツールで連番を振ります。先頭段はポイントを埋める必要がないため、開始値を 0 とします。

フォーミュラツール
横方向の連番を生成するための間隔を各段について計算し、byという新しいフィールドとして作成しています。

([xmax] - [xmin])/([step]*2 - 1)

この時点のデータの一部は下図の通りです。

各フィールドの詳細は下記の通りです。

フィールド名 概要
step ツリーの段番号を表します
xstart ツリーのx座標の中心です。後に星のx座標となります。
y 各段のy座標です
xmin 各段のポイントのうち、x座標の最小値です
(最も左側のポイントのx座標)
xmax 各段のポイントのうち、x座標の最大値です
(最も右側のポイントのx座標)
by 各段のポイントをこのstep間隔で生成します

2.ポイントを分類し、分類ごとに処理

この部分のワークフローは、下記になります。
データを特定の段で分類し、1段目以降については、各段のポイント間を埋める処理を作成します。また、散布図での可視化にあたり、ツリーの装飾を表現したいので、一部のポイントを抽出し異なる処理を行います。

はじめのフィルタツールでは、ツリーの先頭段とそれ以外のデータにフィルタしています。
後ほど、各ポイントに分類を付与するためと、1段目以降の横向きのポイントを生成するためです。

行生成ツール
フィルタツールの F出力である、1段目以降データをインプットとして与えます。
行生成ツールでは、インプットデータを与えた際に、他のフィールドの値を参照することで、可変数の行を生成できます。

ここでは、設定を下記の通りとすることで、格段についてxを計算していった際に、xmax以下の条件を満たす間はbyを足し続けるという処理を行ってくれます。

出力の一部は下記の通りとなります。

x フィールドが行生成ツールの出力となっています。条件を満たす間は、その行の値が複製されるので、生成された各ポイントのx座標とy座標も同時に生成できることになります。
これにより、下記のようなポイントを描画するための座標が得られたことになります。

分類フラグの付与
先のフィルタツールの出力ごとに異なるフラグを付与していきます。
T出力はゼロ段目なので、ツリーの星とします。フォーミュラツールでは、下記の設定としています。

1段目以降の各ポイントは、xという名称でx座標を生成したので、ゼロ段目のデータについても、xというフィールドをツリーの中心のx座標として追加しています。
また、startという値で、文字列のtype列を追加し、このポイントの分類を付与しています。

F出力は、ツリーの1段目なので、葉として描画される部分となります。フォーミュラツールで、T出力と同じ列名でtreeという値でを追加します。

サンプル作成ツール
現状では、ポイント種類が「星」「葉」の2種類なので、装飾用にいくつかのポイントを抽出し、別の分類を付与します。
サンプル作成ツールは、乱数を使用することで、入力データを「推定サンプル」と「検証サンプル」に指定の割合で分割することができます。下記の設定としました。

サンプル作成ツールのE出力(推定サンプル)は、再度フォーミュラツールに接続し、tree列の値をornamentsという文字列で更新をしています。
ここで抽出されたポイントが、描画時に装飾となります。

データの統合
ここまでで、分類ごとの処理が完了したので、以降ではもとのデータに戻す作業を行っています。

サンプル作成ツール設定のレコードの割り合てオプションの合計が100 %なので、E出力・V出力合わせたものが、ツリーの1段目以降のデータです。
これらのデータと、フィルタツールのT出力をユニオンし、新たに各ポイントのx座標と分類が付与された状態で元のデータ量に戻します。
セレクトツールで不要列を削除後の、データは下記のようになります。

3.可視化用に整形

これまでの処理で、描画用のデータ生成は完了しています。以降は、Alteryxで可視化を行うための前処理となります。 以降の処理で、行を一意に識別したいので、レコードIDツールで連番を付与しておきます。

整形の方針
描画には、インタラクティブチャートツールを使用します。
また、散布図でツリーを描画する際は、各ポイントを星・葉・装飾に分類しているので、それぞれの分類ごとに異なる色や形で表現したいです。
インタラクティブチャートツールでこのような「種類ごとにわけてプロット」を行う場合、レイヤーという層にわけてそれぞれの図を描画し、重ねることで一つの図として見せることになります。

各レイヤーでは、図の形式ごとに、フィールドを指定することで図を描画できます。
散布図の場合は、XとYという2つのフィールドを指定することになり、今回の場合、それぞれツリーの各ポイントのx座標・y座標に対応します。

現状のデータは、すべてのポイントのxy座標が、それぞれ同じフィールドにあるので、このままではレイヤーをわけても、同じ図が描画されることとなります。そこで、付与した分類ごとの、座標情報を持つフィールドを新たに作成することとします。

この部分のワークフローは下図の通りです。

転置ツール
転置ツールは、下記の設定です。

データを一意に識別するRecordID列とポイントの種類をあらわすtype列をキーに指定することで、ポイントの種類ごとにx・y座標を縦持ちしています。
出力は下記のようになります。

フォーミュラツール
次のフォーミュラツールでは、type列とName列を連結することで、分類ごとの座標をあらわす文字列を作成します。(図のfactor列を追加)

クロスタブツール
ツールの設定は、下記の通りです。

RecordID列でグループ化することで、出力は全ポイント数となります。列ヘッダに先のフォーミュラツールで作成した列を指定することで、ポイントの分類ごとに異なるフィールドでx・y座標を持つように変換できます。

以上で、インタラクティブチャートツールで散布図を描画するための準備も完了です。

ワークフローの最後の結合・ユニオンでは、ツリーの幹の部分を作成しています。
下記のようにテキストインプットを作成し、ツリーのポイントデータとレコードポジションで結合しています。

ユニオンツールに、結合ツールのJ出力とL出力を入力することで、左側外部結合のような形とし、すべてのツリーデータを拾っています。

上記の処理後のデータは、下記のようになっています。

可視化

インタラクティブチャートツールでは、下記の順に4レイヤーを作成します。いずれの型(グラフの種類)も X・Y の2つのフィールドを指定します。

No レイヤー X Y
1 stem 面(面グラフ) area_x area_y
2 leaf 散布図 tree_x tree_y
3 star 散布図 star_x star_y
4 ornament 散布図 ornaments_x ornaments_y

この状態では、下記のような出力となっていました。

インタラクティブチャートツールでは、レイヤーごとに、GUIでグラフをカスタマイズできます。
散布図の場合、ポイントの色、形、大きさ等を変更できます。グラフ全体では、描画範囲や背景色、凡例の有無、軸ラベル等の設定も可能です。

色や背景色を変更すると、少しはツリーっぽくできます。

他にも、ポイントの分類を増やせば装飾の種類を増やしたり、背景に雪を降らすなんてこともできそうです。

さいごに

この記事では、外部からのインプット無しに、Alteryx内でデータを自作し、可視化までを実施してみました。「特定の間隔で数値を生成したい」といった要件に、行生成ツールや複数行フォーミュラツールが強力だったのが印象的でした。

Alteryxは、データ加工のためのツールが特に強力ですが、サンプリングツールなどの分析に必要な機能も提供されているので、分析寄りの観点でも今後見ていければと思いました。

今回は以上です。こちらの記事が何かの参考になれば幸いです。