RとPythonによるデータマイニング

企業でデータ分析などやっています。主にRやPythonによるデータマイニング・機械学習関連の話題と日々の日記やその他備忘録について書いてます。

[R]SQLのCASE WHEN 表現をRで書く

検定やモデル作成、ヒストグラムを書くといった場合に連続データをカテゴリデータに変換したい場合があります。
このときSQLでデータを変換する場合、例えば以下のようなクエリを書きます。

SELECT
     CASE WHEN revenue < 1000 THEN '1000未満'
          WHEN revenue < 5000 THEN '1000以上5000未満'
          WHEN revenue < 10000 THEN '5000以上10000未満'
          ELSE '10000以上'
     END AS revenue_category
     ,COUNT(*) AS CNT
FROM test_data
GROUP BY
     CASE WHEN revenue < 1000 THEN '1000未満'
          WHEN revenue < 5000 THEN '1000以上5000未満'
          WHEN revenue < 10000 THEN '5000以上10000未満'
          ELSE '10000以上'
     END

このような集計をRで実行しようとした場合、CASE WHENに対応するものとしてifelse関数を用います。
例えば上記と同様の処理をRで実行しようとした場合、以下のようになります。

revenue_category <- ifelse(revenue < 1000, "1000未満",
					ifelse(revenue < 5000, "1000以上5000未満",
					ifelse(revenue < 10000, "5000以上10000未満","10000以上")))
table(revenue_category)

単純にデータの傾向を見たい場合は代表値である平均や分散を見れば良いですが、
外れ値がある場合や分布が正規分布ではない場合、カテゴリ化して集計した方が安全です。
特にマーケティングにおいては、一部の人の売上が全体の80%を占めるという「ジップの法則」があるため、
平均や分散で評価が難しいことが多いです。
例えば、2つのキャンペーンを比べる際、外れ値が2,3個あるだけで全体傾向はほぼ同じであるのに、
平均値で評価すると効果が大きく異なっている、と判断しかねません。
(上記のような場合は中央値を見れば改善されますが、正規性を仮定できないデータではやはり分布を見た方が安全です。)

カテゴリ集計によって得られる結果は、基本的に「XXという行動をする人は(YYする人に比べて)ZZ円以上の割合が多い」
といったものになります。
必要があれば別軸での分解を行いながらこれらの結果を積み上げて、仮説を立案・検証していくわけです。

Rでカテゴリ分類ができれば、プログラムを組んでクロス集計やカテゴリ別検定といった作業を自動化でき、
作業効率改善に繋がるわけです。
全カラムのクロス集計とかカイ2乗検定とかカラムが少なければエクセルのピボットテーブルなどで可能ですが、
流石に1000カラムを超えるようなデータでは現実的に無理ですからね。