読者です 読者をやめる 読者になる 読者になる

pythonで母集団の分布を確認する

python python コード 前処理

前提として、2クラス分類。 データに含まれる特徴量は

data_train.columns.values

>> array(['feature1', 'feature2', 'feature3', 'feature4', 'feature5',
       'feature6', 'feature7', 'feature8', 'feature9', 'feature10',
       'feature11', 'feature12', 'feature13', 'feature14', 'feature15',
       'feature16', 'feature17', 'feature18', 'feature19', 'feature20',
       'feature21', 'target'], dtype=object)

となっていて targetを予測したい。

各特徴の分布を確認

箱ひげ図を使って母集団の大まかな分布を把握する

plt.title('BOX PLOT')
ax = sns.boxplot(data=data_train, orient="h", palette="Set2")

f:id:misos:20161019202559p:plain

特徴ごとに中央値が違うことがわかる。

目的値ごとに分布に違いがあるのかを確認する

plt.figure(figsize=(10, 10))
for i in range(20):
    plt.subplot(5, 4, i+1)
    sns.boxplot(y="feature"+str(i+1), x="target", data=data_train_times, palette="Set2")
plt.tight_layout()

f:id:misos:20161019202826p:plain

教師データの違いに対して分布の違いがないため、予測は困難そうとわかる。

2変数間の関係を見る

N = 2000 # プロットする点の数
pairplot_d = data_train.copy()

randomdata = np.random.randint(1, data_train.shape[0], N)
pairplot_d = pairplot_d.ix[randomdata, ('feature1', 'feature2', 'feature3', 'feature4', 'target')]
sns.pairplot(pairplot_d, hue="target", palette="Set2", markers='x')

f:id:misos:20161019203031p:plain

グラフが綺麗に分かれておらず、2変数の値を見ただけではクラス分類は難しそう。

等高線をプロットして分布を確認する

randomdata = np.random.randint(1, data_train.shape[0], N)

plt.figure(figsize=(16, 10))
for i in range(20):
    # focus clm
    print 'kde step:', i
    plt.subplot(3, 7, i+1)
    focusa, focusb = 'feature1', 'feature'+str(i+2)
    pairplot_d = data_train.copy().ix[randomdata, (focusa, focusb, 'target')]

    # div data
    pairplot_d0 = pairplot_d[pairplot_d['target']==0]
    pairplot_d1 = pairplot_d[pairplot_d['target']==1]

    # kde
    sns.kdeplot(pairplot_d0[focusa], pairplot_d0[focusb], \
                cmap="Reds", shade_lowest=False)

    sns.kdeplot(pairplot_d1[focusa], pairplot_d1[focusb], \
                cmap="Blues", shade_lowest=False)
    
plt.tight_layout()

f:id:misos:20161019203143p:plain

ほとんどの分布が重なっているが、分布の山の位置に違いがわずかにある。 これを強調するように前処理を重ねていく。