SQL分析データ準備と基礎統計#16:量的変数のカット、ヒストグラム
質的変数の場合は単純に件数カウントすれば分布を導き出せますが、量的変数の場合は範囲集約した上で、件数をカウントする必要があります。この各範囲のことを階級と呼びます。例えば1から100までの範囲をとる量的変数の場合、1から10刻みで集約し、それぞれの階級ごとに件数を取得します。ではどの程度で刻むと分布を理解できるのかということなのですが、これは毎回頭を悩ませるところです。基本的なところではスタージェスの公式という階級数を決定する公式があります。SQLで実装すると以下のようになります。
とは言え、この公式がうまく切ってくれないケースも多く、その場合は実際の値を見ながら、場合によっては等幅ではない階級を作り、分布が分かりやすいようにします。以下の例では桁数によって幅の刻みを変えています。以下の例では-0.1以下の場合は0.1刻みで、0以外の-0.1超、0.1未満はそれぞれ-0.01と0.01に、0.1以上1未満は0.1刻みで、1以上10未満は1刻みで10以上100未満は10刻みにしています。仮に100以上があった場合、そして0の場合は値をそのまま利用することにしています。
ちなみに上記値の前提はdecimalのような固定小数点のデータ型を前提とします。Teradata、ひいてはデータベースに限らず、コンピューターの世界では浮動小数点型に対して丸める処理をすると、おかしな値になる場合がありますので注意が必要です。例えば以下の3つのSQLで、前2つは0.5を返します。一度これに遭遇してパニックになりました。
select trunc(cast((0.6) as float),1);
select trunc(cast((0.6) as real),1);
select trunc(cast((0.6) as decimal(2,1)),1);
仕組みについてはあまり詳しくないため、詳細は以下などをご覧ください。
クロス表
なお、機械学習の変数などで利用する場合には質的変数の横持ちも縦持ちも、量的変数の元の値も階級化した値もテーブルとして両方保持しておくことをお勧めします。後々の集計や確認、結果との突合で楽なので。これらの活用における典型例として2つの変数の関係を理解するために、クロス表を作成することがあります。SQLとしては単純で、以下の通り質的変数(量的変数を階級化した質的変数も含む)同士であれば、2変数合わせて集計すればそれで済んでしまいます。
///