Alteryxでカテゴリカル変数をダミー変数に変換する

alteryx

こんにちは、小澤です。

今回はコミュニティで行われている議論の紹介も兼ねた、Alteryxのテクニック紹介をしたいと思います。

Alteryxのコミュニティとは

Alteryxのコミュニティはワークフローを作成する上での様々なテクニックの紹介や、わからないことがあった際質問などに利用できるサイトになります。

コミュニティの利用法などについては以下の内容に詳しくまとまっています。

今回は、このコミュニティで実際に質問としてあがっているカテゴリカル変数をダミー変数化する方法の質問の内容を取り上げてみたいと思います。

カテゴリカル変数・ダミー変数とは

さて、実際に解決方法で記載さ入れているワークフローの内容の話をする前にまずはカテゴリカル変数とダミー変数とはどのようなものなのかを解説していきます。

変数の尺度水準

データ分析を行うにあたって、変数には様々な種類があります。 例えは、男女や都道府県のような複数の項目の中から選択するものや、満足度のような何段階かの数値で評価するもの、売上や利益のような数値 などがあげられます。

統計学などでよく利用される変数の分類方法として以下の4つの基準に基づくものがあります[1]

名称 定義
名義尺度 いくつかの値をとるものに便宜的に数値を割り振ったもの。数値そのものや大小に意味はない
順序尺度 項目間での大小関係は存在するが、数値そのものの差はには意味がない
間隔尺度 数値としての差が等しいが基準となる原点には意味がない
比例尺度 数値であり、原点なる数値にもの意味があるため比率の計算が可能

これらについて、例をあげながら解説すると、以下のようになります。

  • 名義尺度
    • 都道府県コード
    • 各都道府県には便宜的に数値が割り振られているが、その数値に対する演算はできない
    • 1 + 2 = 3 (北海道 + 青森 = 岩手)、や (1 + 3) / 2 = 2 ((北海道 + 岩手) / 青森 = 青森)とはならない
  • 順序尺度
    • 商品の星による5段階評価
    • 星3より星4の方がいい評価であるが、星を1段階上げる(下げる)のに明確な基準はない
    • 星3と星4の差 と 星2と星3 で差をつけるときに、どちらも同じ星1分の差があるとは限らない
  • 間隔尺度
    • 気温(セルシウス温度など)
    • 差を求めることはできるが倍は半分といった計算は成り立たない
    • 10℃と11℃の差と11℃と12℃の差はどちらも1℃で同じだが10℃と20℃では2倍気温が高いわけではない
  • 比例尺度
    • 絶対温度
    • 差の他に比率の計算もできる(0を原点としてたときにどれくらい離れているかの計算が成り立つ)

名義尺度に対する演算とダミー変数

さて、ここまでの内容から名義尺度で与えられた変数に対して四則演算などを行っても意味がないことがわかりました。 しかし、例えば以下のような場合を考えてみましょう。

ある商品の販売個数(変数名:y)を予測するのに以下の3つのデータが利用可能である。

  • その日の気温(変数名:x_1)
  • 休日か平日か(変数名:x_2)
  • 販売する都道府県(変数名:x_3)

この時の予測の仕方として、

y = w_0 + w_1 * x_1 + w_2 * x_2 + w_3 * x_3

のような計算を行うことにします。

w_0は他の各要素にかかわらず、売れる個数と考えてください。

w_1, w_2, w_3は各要素が販売個数に対してどのくらいの影響を及ぼしているのかになり、例えば w_1 = 1 であれば気温が1℃上がるごとに販売個数も1つ増え、w_1 = 2 であれば1℃ごとに2個増えていくことになります。 逆に w_1 = -1 のような値であれば、気温が上がるほど販売個数は減っていくことになります。

このようなw_0, w_1, w_2, w_3を求める

次に、"平日か休日か"に関しては数値ではありませんが、平日の場合0, 休日の場合1のようにしてしまえば、平日を基準としたとき(平日の場合w_2 * 0 = 0となる)の休日の場合の販売個数の変化として計算可能になります。 この値は平日を1, 休日を0と逆にしても問題ありません。

問題は"都道府県"ですが、こちらは都道府県コードで数値に変換したとしても名義尺度のため、数値演算をそのまま行うことができません。 ここで、先ほどの"平日か休日か"と同様の仕組みに落とし込むために、ダミー変数というものに変換します。

この変換は以下のようになります。

dummy1

計算式としては、

y = w_0 + w_1 * x_1 + w_2 * x_2 + w_3 * x_3 + ... + w_49 * x_49 (47都道府県と気温、平日休日で49個の変数)

となり、各都道府県に対応するw_nがその都道府県で販売した時の影響として計算できるようになります。

Alteryxでの実装

さて、先ほどのデータで実際にダミー変数化するワークフローを実装してみましょう。

スクリーンショット 2017-09-13 17.30.24

データは簡単なものなので、Text Inputツールで入力しています。

スクリーンショット 2017-09-13 17.31.22

前半の「平日か休日か」コンテナ内では、平日を0, 休日を1に変換しています。 これは、Formulaツールで以下の処理をしたのち、不要になった元の列をSelectツールで削除しているのみとなります。

スクリーンショット 2017-09-13 17.34.04

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

スクリーンショット 2017-09-13 17.35.07

次の「ダミー変数作成」が本題となります。

まず最初に利用しているのが、Record IDツールです。 このツールは、各行に連番を振ります。

image36

出力結果を確認すると連番が振られていることが確認できます。

スクリーンショット 2017-09-13 17.58.56

続いて、利用するのがTransposeツールです。

image57

このツールは横持ちデータを縦持ちに変換するものになります。

データの縦持ち・横持ちについて簡単に解説します。 以下のようなkey-value形式のデータがあるとします。

key value
A [1, 3, 5]
B [1, 2, 3, 4]
C [7]
D [2, 5]

このようなデータを扱うデータ構造として以下の2つのパターンが考えられます。 (なお、ここではvalueに配列を含めることはできず、データベースにおける正規化などの話は含めません)

  • 横持ち
key value1 value2 value3 value4
A 1 3 5
B 1 2 3 4
C 7
D 2 5
  • 縦持ち
key value
A 1
A 3
A 5
B 1
B 1
B 2
B 3
B 4
C 7
D 2
D 5

この時に、横持ちのデータを縦持ちに変換するのがTransposeツールとなります。 ツールの設定は、以下のようになっています。

スクリーンショット 2017-09-13 18.20.27

「Key Fields」では、縦持ちに変換した時、先ほどの例でいところのkeyに相当する列を指定します。 「Data Fields」では、valueに相当するフィールドとなります。

こちらも例を出すと、まず以下のようなデータがあったとします。

スクリーンショット 2017-09-13 18.25.41

このデータに対して、以下のような設定でTransposeツールを利用します。

スクリーンショット 2017-09-13 18.26.53

この時の出力結果は以下のように

  • keyで指定した列
  • valueで指定した列の元の列名
  • valueで指定した列の値

の3つのカラムが出力されます。

スクリーンショット 2017-09-13 18.29.28

これに対して、keyでkey1, key2の2つの列を指定すると、以下のように両方が出力されます。

スクリーンショット 2017-09-13 18.30.17

さらにvalueにvalue2も追加すると以下のようになります。

スクリーンショット 2017-09-13 18.31.20

このように、Name列で元がなんだったのかもわかるようになっています。

さて、話を戻して、先ほどのワークフローでTransposeを利用した時の出力結果は以下のようになります。

スクリーンショット 2017-09-13 18.33.05

このデータでは、もともと縦持ちだったため、特に変化はありませんが、複数の列でダミー変数化したいものがある場合は変換する必要があるため、ここではこのツールを挟んでいます。

続いて、Formulaツールでは2つの設定をしています。

  • どのデータのどの値だったかがわかる列の追加
  • ダミー変数で1を立てるための列

スクリーンショット 2017-09-13 18.40.56

先ほどの例を見ていただくとわかるのですが、横持ちの場合は値のない列がnullになるのに対して、縦持ちの場合はそのデータ自体が含まれません。 そのため、ここで全ての行に1を設定することによって横持ちに変換した時にデータのある列のみに1が入ったデータが出来上がります。

出力結果は以下のようになっており、dummy_name列にName列とValue列の内容を結合したもの、bit列に1が設定されているのが確認できます。

スクリーンショット 2017-09-14 9.25.35

続いてのCross Tabツールでこのデータを横持ちに変換しています。

image55

設定は以下のようになっています。

スクリーンショット 2017-09-13 18.43.19

横持ちに変換した際に同一の行として扱う単位を「Group Data by these Valuse」で設定します。 縦持ち・横持ちの例で最初に出したkey-valueの例だと、keyの値が同一のもの単位で横持ちの時に同じ行になっていますがそれに相当するものを指定します。

「New Column Headers」では、変換後の各列の列名にするカラムを選択します。

「Values for New Columns」では、値として利用するカラムを選択します。

最後の「Method for Aggregating Values」で集約の仕方を指定しています。 縦持ちのデータの場合、「Group Data by these Valuse」と「New Column Headers」の値が同一のものを複数含むことが可能です。 横持ちに変換した際に、そういったものの値をどうするかの指定を行うのがこの部分です。

dummy2

今回のような一連の処理の場合、重複したものが含まれることはないので、Firstを選択して最初の1つだけを取り出しています。

この処理によって以下のようなデータが出力されます。

スクリーンショット 2017-09-14 9.40.46

もともと値が含まれていた部分のみが1になっているのが確認できます。 あとは、nullになっている部分を0にすれば、ダミー変数化ができます。

その処理をFormulaツールで行ってもいいのですが、元の変数の種類が多い場合、1つ1つやっていくの大変です。 都道府県なんかだと横持ちの場合47個の列ができるので、47個もFormulaツールをつなぐ必要があります。 そういった複数の列に対して同じFormula式を適用した複数の結果を出力したい場合に便利なのが、Mutil-Field Formulaツールです。

image33

このツールの設定は以下のようになっています。

スクリーンショット 2017-09-14 9.46.11

上部で対象となる列を複数選択します。

Formula式で指定している変数 CurrentField は通常のFormulaツールにはなかったものです。 Multi-Field Formulaツールの場合、複数の列に対して同じ処理を実行するため、現在どの列に対して処理を行っているのか判断しなければならない場合があります。 その"現在処理を行っている列"を表す変数がこの CurrentField になります。

たとえば、列1, 列2, 列3の3つに対して、現在の値に1を足すという処理を実行したい場合、

[_CurrentField_] + 1

としておけば、処理を行う際にそれぞれ

[列1] + 1
[列2] + 1
[列3] + 1

のような感じの処理が行われているようなイメージとなります。

ここでは、すでに値が入っている場合はそのまま、nullの場合は0を出力するようにすることで、結果は以下のようになっています。

スクリーンショット 2017-09-14 10.01.35

最後に他の情報(気温と平日か休日か)を同一のRecordIdを持つものをkeyとしてJoinツールで結合することで最終的に欲しかった結果を得ることができます。

スクリーンショット 2017-09-14 10.03.40

おわりに

今回は、カテゴリカル変数をダミー変数化するワークフローの解説を行いました。

いくつかのツールを複合的に組み合わせているため、全体としてデータがどのように変わっていくのかイメージしづらかった方もいるかもしれません。 Alteryxではこのように単一のツールとしての機能は提供していないものであっても、複数のツールの組み合わせで実現できることが多くあります。

また、どうしてもやり方が思いつかないといった場合にはコミュニティで質問してみるのもいいかと思います。

参考資料

  1. On the Theory of Scales of Measurement

Alteryxに興味をお持ちいただいた方はこちらからお問い合わせください。

alteryx_960x400

AWS Cloud Roadshow 2017 福岡