Challenge #12: Creating an HR Hierarchy 〜組織の階層構造を作る〜 – Alteryx Weekly Challenge

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

こんにちは、小澤です。

BatchマクロやIterativeマクロは難しいんです。 そう、Weekly Challengeで使うなら難易度がAdvancedになるくらい。

というわけで難易度BeginnerやIntermediateには目もくれずAdvancedの問題ばかりをやっていますw 今回はChallenge #12です

難易度がAdvanced, カテゴリがMacrosとなっているのでこれはきっとマクロを使うのでしょう。 では、果敢にチャレンジしていきたいと思います。

問題の内容

さて、どのような問題なのでしょうか。 まずはデータを確認してみましょう。

入力データは以下のようになっています。

それに対して出力は以下のようになります。

これは以下のような組織の階層構造を表しています。

入力データでは各役職名、id, 直属の上司のidのみとなっています。 これを元に、Analystの直属の上司はManager, その上はDirector, その上は...と全ての役職で上司と何個上なのかを全て羅列するのが出力になります。

まずはマクロを使わずにやってみる

さて、まずはマクロを使わずにやってみましょう。 以下のようなワークフローになります。

クソ長えw 非常に長いワークフローですが、実はこれは同じようなことの繰り返しになっています。

1回目の処理

まずは1回目の処理を見てみましょう。

最初のFormulaツールは初回のみやっていることで、これは最終的な出力に合わせていくつか必要な列を作成しています。

結果は以下のようになります。

続いてのFitlerツールでは、以下のような式を入れます。

[Hierarchy] = 0

Hierarchyの値は先ほど作成したものなので、全データがの値が0です。 そのため、全てのデータがTrueとなり、無駄な処理のように見えます。 これは2回目以降と形式を整えるためのものになります。

下側のSelectツールでは、Manager以外の項目を選択しています。

その次にSortツールを使ってソートして、Uniqueツールで値を一意にしています。

このUniqueツールの結果も何も変わらないので、無駄なように見えるかもしれませんが2回目以降で効果を発揮します。

続いてこの2つのデータをJoinツールで結合したのち、LとJの出力をUnionツールで結合します。

これで直属の上司の役職名と上司の上司のidが取得できます。 Selectツールで必要な列のみに絞って以下のような形式にします。

Formulaツールを使ってHierarchy列を作り、直の上司なので値を1とすることで、1階層上までの情報で、最初と同じ構造のデータが得られます。

これを、上司の情報が入っていない初期状態のデータ(Hierarchyが0のもの)とUnionで結合して1回目の処理は終了です。

2回目以降の処理

さて、2回目以降も処理内容は1回目とほぼ同じです。

異なる点としては、まず最初のFilterツールでHierarchyが0ではなく1のものを取り出します。

[Hierarchy] = 1

下側の処理は1回目と同じですが、動きとしては以下のようになります。

  1. Sortツールでemployee、Hierarchyの順でソートされる
  2. Uniqueツールでman_id, Hierarchy以外の要素を指定することで各役職の初期状態(Hierarchyが0のデータ)のみを取得する

となっています。 man_idは1回目の処理後に直属の上司ではなく、2つ上の上司の値に置き換えているので、これで各役職の直属の上司のidが取得できます。

その後の処理は同じ流れで進みます。 Joinツールで上側のman_idと下側のidを結合するとことで、上司の上司の役職名とそのさらに1つ上の上司のidが取得できます。 Formulaツールでは2階層上の上司の情報なのでHierarchyを2に設定しています。

2回目の最終的な結果は以下のようになります。

最後の処理

さて、この調子で続けていくことで4回目で一番下の役職であるAnalystから一番上であるCEOまでたどり着きます。

このデータに対して、最終結果に持っていくための処理を行なっています。

まずは、いらないデータを削除します。 Filterツールを使って、Manager列がNull担っているものを取り除きます。

!IsNull([Manager])

結果は以下のようになります。

このデータからいらない列(id, man_id)を取り除いて、ソートすれば最終的な結果が得られます。

マクロを使って実現する

さて、このワークフローは同じ処理を何度も繰り返して、値を更新していました。 こういう時はIterativeマクロにしてしまいましょう。

繰り返しの部分は以下のようにそのままマクロにしてしまいます。

先ほどのワークフローと異なる点は、前後のFilterとFormulaで指定するHierarchyの値をマクロのループ数を使って指定するだけです。

Filterツール :

[Hierarchy] = [Engine.IterationNumber]

Formulaツール :

[Engine.IterationNumber] + 1

このIterativeマクロは最終的にIterative Outputが空になることがないので、適当なループ回数を設定して、回数に達したら正常終了するように設定しておきます。

最後に元のワークフローを前後の処理以外このマクロを使うようにすれば完成です。

全体として非常にスッキリしました。

おわりに

今回は、Alteryx Weekly Challenge #12に挑戦してみました。

さすがAdvancedを名乗るだけあってなかなかの強敵、と思われた方も多いでしょう。 このワークフローでは、データが線形リストのような形式のデータをAlteryxで扱いたい場合の例やIterativeマクロの使い方を理解する際になかなかいい感じの問題となっています。 コツとしては、Iterative InputとIterative Outputの形式をいかに統一するか、になります。

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

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

alteryx_960x400