WeeklyAlteryxTips#53 Rankingの付け方のすべて

Alteryx

トップNをつける際に、様々な付け方があります。単純に上から1位、2位、3位とつける方法。次に同順位を認める場合で1位、2位、2位、3位、3位という方法。最後に、同順位があれば人数分飛ばすという場合で、1位、2位、2位、4位、4位という方法です。つまり、以下のようなものです。

今回はこれらをやってみましょう。

入力データ

これに様々な方法で順位をつけていきます。さて、このような場合に使えるのはどのツールなのでしょうか?もちろんまず最初にスコア順に並び替える必要があります。次に、番号をつけていく必要がありますが、行方向に処理を行うようなツールを使っていく必要があります。いくつか思い浮かべることができたでしょうか?

様々なランキング方法

ノーマルなランキング

ここでは以下のようなランキングの付け方を取り扱います。

普通にランキングを付ける場合は、レコードIDツールで簡単にランキングを決めることができます。今回のケースでは、Scoreの降順(大きい順)に並び替えたあとにレコードIDツールで上から行IDを振っていきます。

グループごとにランキングをつける

次に、州ごとにランキングをつけてみたいと思います。この場合はレコードIDツールはグループ化に対応していないので、別の手段を取る必要があります。今回は複数行フォーミュラを使います。

Scoreの降順(大きい順)に事前に並び替えるのは先程と同様です。この時、State(州)でも先に並び替えておきましょう。

複数行フォーミュラのオプションは以下のとおりです。

グループ化のところに「State」を指定します。式は以下の通り、Rankの前の行に単純に1を足すだけです。

[Row-1:Rank]+1

順位に同順位を認める場合

ここでは以下のような順位の付け方を取り扱います。

こちらは、点数が同じ場合に同じ順位にする方法です。この場合はレコードIDツールが使えないです。この場合、複数行フォーミュラもしくはタイルツールを使います。まず複数行フォーミュラを使った方法です。

複数行フォーミュラツールを使った方法

グループごとにランキングをつける方法のところで複数行フォーミュラを使いましたが、この数式が少し複雑になるイメージです。

スコアが前の行と同じであれば、前の行の順位をそのまま持ってくる、そうでなければ順位を+1する、という意味の数式です。

IF [Row-1:Score]=[Score] THEN [Row-1:Rank] 
ELSE [Row-1:Rank]+1 ENDIF

タイルツールを使った方法

実はタイルツールは非常に手軽にこの同位順位を再現できます。

計算式は不要で、設定のみです。

タイル方法は、「固有値」、固有列は「Score」を選択します。また、「未ソートのままにする」オプションにチェックを入れます。「未ソートのままにする」にチェックを入れないと勝手に固有列に指定した項目の昇順に並べ替えが行われて意図した結果になりません。これにより、Tile_Numが順位として出力されます。Tile_SequenceNumは今回は使わないので、セレクトツールで削除しましょう。

次に、グループごとに順位を決定していきましょう。

複数行フォーミュラツールを使ってグループごとにランキングを付ける

グループごとの順位付けはすでに解説した通り、グループ化オプションを使うだけです。

つまり、以下のようにグループ化の部分で今回であれば「State」にチェックをいれるだけです。

タイルツールを使ってグループごとにランキングを付ける

タイルツールの場合も、複数行フォーミュラツールを使う場合と同様グループ化オプションを有効にするだけです。

順位に同順位を認めるが、人数分順位をスキップする場合

ここでは以下のように、同位順位を認めるが、同じ順位の数量分順位をスキップしてつける方法を取り扱います。例えば、以下の例であれば1位が2人いるのでその次は3位から順位をつける、といった方法です。

これは結構難易度が高い内容となります。

タイルツールを使った方法

まずタイルツールを使った方法をご紹介します。ワークフローとしては以下の通りとなりますが、最初にスコアで並び替えたあとにレコードIDツールで行IDを振ります。その後、タイルツールでタイル化し、フォーミュラツールで行IDからTile_SequenceNumを引き算します(単なる引き算ではなく+1します)。これで欲しいものが得られます。

これは、行IDでつけられた番号のうち同位のところに対してTile_SequenceNumで引き算をすることで(Tile_SequenceNumは、同じ値の中でさらに行IDを振っています)、同じ順位に対して引き算されるため異なる順位になるまで同じ順位を保持する、といった結果となります。

設定は以下のようになります。

タイルツールはシンプルに固有値にセットし、固有列は「Score」で「未ソートのままにする」です。

ポイントはこちらのフォーミュラツールの計算です。

[Rank]-[Tile_SequenceNum]+1

単純な計算ですが、非常に効果的に機能します。

複数行フォーミュラツールを使った方法

複数行フォーミュラツールでもこの順位付けは可能です。こちらも若干数式が複雑になります。複数行フォーミュラでタイルツールがやっていることを再現するような方式もありますが、ここでは別の方法を考えてみましょう。

この方法は、同位順位がどこで起きているかを計算し、同位順位であれば行IDをそのまま継続する、という二段階の方式で実現しています。 値が切り替わるところで順位が切り替わるので、そのポイントでRank(行ID)から引っ張って来るようにしておき、それ以外は一つ上の順位を引き継ぐということで実現可能です(シンプルな方法があったので修正しました)。

並べ替えとレコードIDツールによる行ID付与まではスキップし、次の複数行フォーミュラを見てみましょう。

これは、値が前の行と同じであれば前の行のTieRankingを持ってくる、異なるのであればRankから値を引っ張る、という計算式です。この「Rank」から引っ張ってくるのがポイントです。

IF [Row-1:Score]=[Score] THEN [Row-1:TieRanking]
ELSE [Rank] ENDIF

この方法は最初にRankで単純な順位をつけておくのがポイントです。最終的な順位はそこから引っ張って来ている、というところです。

グループごとにランキングをつける

グループ化はそれぞれグループ化でStateを指定する形になりますが、レコードIDツールが使えないので複数行フォーミュラツールを使いレコードIDツールの代わりにすることがポイントです。

複数行フォーミュラツールを使う方法では2連続で使っている形となっています。

まとめ

同位順位は集計ツールを使った方法もあります(今回の説明していませんが、サンプルワークフローには含まれています。いずれにしても、同位順位などはロジックを考える必要があり、若干頭を捻る必要があるので、ぜひ覚えておいてください。

とはいえ、正直毎回作るの面倒なので、もうマクロにしてしまいたい、というのも一つの正解かもしれませんね・・・。

サンプルワークフローダウンロード

次回

今回はちょっと長くなってしまいました・・・。次回は、未定です。

コメント

タイトルとURLをコピーしました