A Single Variable: Shape and Distribution CAPTURE TWO : Kousuke Takeuchi
A Single Variable:Shape and Distribution
CAPTURE TWO : Kousuke Takeuchi
Capter Two - Outline
Jitter Plot
Histogram and KDE (Kernel Density Estimates)
CDF (Cumulative Distribution Function)
Rank Order Plots and Lift Charts
Numpy - Vector & Tensor
Jitter Plot
Single Variable
単一変数のデータ分布を観察する際には、どのようなことについて考えるだろうか?
早速2つの例をもとに考えてみよう!
Ex.1 大統領の任期
まずは大統領がホワイトハウスに出勤した期間のデータを視覚的に表現してみる
3列目のデータが、実際に大統領が出勤した月数のデータ
x軸上にデータ点をプロットしてみる
欠点:重複する点がすべて同じ点で表現されてしまうため、クラスターとなっている部分が視覚的に確認しづらい
Jitter Plot
Jitter Plot の作成の仕方:先ほど x 軸上にすべての点をプロットしていたが、 Jitter Plot は少しずらしてプロットする。(今回はランダムな距離で垂直方向にずらしていく)
Jitter Plot の 3 つのポイント
データの散布に影響を与えないように、垂直方向にずらすときはランダムに行うようにする。
"jitter" する場合は必ずデータ点を水平線方向には動かさないようにしよう
今回はデータ点に空洞の円を採用した。どの点を打つ場合でも円の半径は同じだ。これによって、データ点が重なった場合でもある程度見えやすくなる。
Histogram & KDE
Histogram
データを一定の範囲ごとに分けて「瓶詰め」にし、「瓶」に入ったデータの総数から「瓶」の高さを決定してグラフに表記する
本の説明はわかりにくいので、とりあえず例を元にヒストグラムを見てみる
Ex.2 サーバーのレスポンス時間
サーバーがデータベースアクセスのリクエストを受け取った後のレスポンス時間をログファイルに書き込んだものをヒストグラムに表示する。
このファイルに含まれるレスポンス時間のデータは膨大なもので、 1,000 ものデータが含まれている。
Histogram - Response Time
「瓶」についての注意点
どのくらいの横幅にすればよいか、決定的な法則はない
ただしガウス分布に関しては、 Scott’s rule を適応するのがよい
w = 3.5σ / n^(1/3) (σ: Standard Deviation, n: Number of points)
「瓶」ついてさらに ...
データを瓶に詰め込む際に、データの区切る範囲に気をつけないといけない場合がある
特にデータの数や範囲が小さい場合に注意する
Histogram の 3 つのポイント
標準化されたヒストグラムでは、ある瓶が全体のうちどのくらいの割合を占めているのかが視覚的にわかる (* 標準化 : ある瓶の総量を全瓶の総量で割ってから Histogram を表記する )
瓶内の数値のクラスターレベルに応じて瓶の幅を変えて表記すると、より細かなクラスターの情報を視覚的に見ることができる
一つのデータ集合を観察するのにはとてもよい。ただし、 2 つ以上のデータ集合を観察する際には不向きである
KDE (Kernel Density Estimates)KDE で標準化 ( ? ) した後にヒストグラムを作成することによって、データをより正確に観察できる
KDE 関数
KDE をデータ集合に合わせる
Gaussian Kernel を使用する際、データの幅や中央値に合わせて Kernel 関数を変更しないといけない
KDE についての注意点
Box, Epanechnikov Kernel は、範囲外のデータを引数にとると、すべて0の値をとってしまう
Gaussian Kernel は飛値を代入しても、必ず 0 以外の数値をとる。 ( ほぼ 0 に近い数値 )
Cumulative Distribution Function - CDF
CDF: Cumulative Distribution Function
cdf: 累積分布関数
ある x における cdf(x) は、それまでのデータをすべて加算したもの
先ほどのレスポンス時間をCDF で表示してみる
CDF の 5 つのポイント
CDF は必ず x に沿って広義単調増加する
CDF はヒストグラムや KDE ほど増減が激しくないが、表示しているデータはすべて同じものである
ヒストグラムのように「データの瓶」が含まれていない、データの情報が欠落している
x が 0 または -∞ に限りなく近づくと、 CDF は 0 になる
CDF はデータから一意に決まる
3 つの分布図を比較する
Rank-Order Plots: ROP
& Lift Charts: LC
Scenario - Mailing List
会社でメーリングリストを用いてマーケティングする際に、受信者の職業に合わせて文章を作成したい
全部で 16000 もの仕事が登録されているため、すべての職業向けに文章を作成するのは困難
さて、どうやって解決する??
データを昇順に
ROP & LC (1)
ROP: Rank-Order Plots ⇒ 先ほど昇順にした表のデータをグラフにしたもの
LC: Lift Charts ⇒ 累積分布。今回は加算によって累積計算を行ったので CDF と同じ
ROP & LC (2)
Workshop : Numpy
import numpy as np
vec1 = np.array( [ 0., 1., 2., 3., 4. ] )vec2 = np.arange( 0, 5, 1, dtype=float )vec3 = np.linspace( 0, 4, 5 )
vec4 = np.zeros( 5 )for i in range( 5 ):vec4[i] = ivec5 = np.loadtxt( "data" )
Numpy の基本 (1) - ベクトルの作成
v1 = vec1 + vec2
v2 = np.zeros( 5 )( 同じ方法だが真似しない方がいい )↓for i in range( 5 ):v2[i] = vec1[i] + vec2[i]vec1 += vec2
Numpy の基本 (2) - ベクトル演算
v3 = 2*vec3
v4 = vec4 + 3
v5 = np.sin(vec5)
lst = v5.tolist()
NumPy の特徴“ Broadcasting” & ”ufunc”
“BroadCasting”: より大きなデータ構造に合わせて (Broad) 、 一方のデータ構造を変更する (Casting)
“ufunc”: スカラー値は NumPy のオブジェクトに変換される
Numpy を用いた KDE の計算プログラム
from numpy import *# z: position, w: bandwidth, xv: vector of points
def kde( z, w, xv ): return sum( exp(-0.5*((z-xv)/w)**2)/sqrt(2*pi*w**2) )
d = loadtxt( "presidents", usecols=(2,) ) w = 2.5
for x in linspace( min(d)-w, max(d)+w, 1000 ) print x, kde( x, w, d )
Numpy の応用 - 行列
テキストのプログラムを参考に、 Numpy での行列の扱い方を確認していく
最後に ...
今回のまとめ:単一変数のデータは、 Jitter Plotと Histogram 、 CDF で表すことができる
Histogram を見やすくするために KDE 、 CDF を見やすくするために ROP と LC の技術を用いた
Option や Summary の部分は今回は省略した (統計学の授業で何度もやった内容なので、自分で読んでください)