こけこっこー

アウトプットが大事だって偉い人たちはみんな言ってる

matplotlibについて学ぶ

seabornがいいらしいとか書いておきながらですが、kaggleのkernelや世の中の機械学習の記事を 読んでいるとmatplotlibの使い方も知っておかないとなーと思いました。

以下がmatplotlibの公式サイトで、親切にチュートリアルや詳細なドキュメントが用意されています。

Matplotlib: Python plotting — Matplotlib 2.1.0.post440+gc280700 documentation

もちろん詳細な使い方が知りたくなった場合には公式サイトを見るべきですが、お手軽にはじめるには 以下の記事が入門として非常にまとまっていて参考になりました。

bicycle1885.hatenablog.com

seabornでヒートマップを表示してみる

ぱっと見ただけではよくわからないデータの表も、ヒートマップを使えば意味のあるものに見えてくるということもあるでしょう。 seabornにはヒートマップを描くための関数が用意されているので、それを使ってみたいと思います。

seabornには機械学習チュートリアルで良く用いられるデータセットが最初から含まれています。 今回はtitanicのデータセットを使います。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

titanic = sns.load_dataset("titanic") # titanicのデータセット読み込み

sns.heatmap(titanic.corr(),annot=True) # 相関係数のヒートマップを作成
plt.show() # 描画

sns.heatmap()annot=True でセルの中に値を表示することができます。

f:id:monisoi:20171023232201p:plain

とても簡単にヒートマップを表示することができました。

matplotlibのラッパー、seabornで美しくデータ可視化ができるっぽい

seabornというmatplotlibのラッパーライブラリを使用すると、matplotlibよりも簡単に美しいグラフ描画ができるみたいです。

seaborn: statistical data visualization — seaborn 0.8.1 documentation

import seaborn as sns

matplotlibと一緒にimportしてやると、matplotlibで描画したグラフもスタイルがきれいになります。

公式サイトにTutorialとGalleryがあり、順を追って使い方を学ぶことも、使いたいグラフスタイルを逆引きすることもできます。

pandasでグルーピングとカウント

グルーピングはデータの集計に使えます。 例えばtitanicのtraining dataのDataFrameをtrain_dfとして以下のように書くと

train_df.groupby('Sex').max()

こんな結果が得られます。

f:id:monisoi:20171019071859p:plain

train_dfに対してSexでグルーピングしてそれぞれの特徴量の最大値を取得したということです。 最大値が取得できないような特徴量は表示されません。

ただ、全ての特徴量の最大値を取得しても特に意味はないので、 実際に使うときは、どの特徴量を見るのかも指定することでしょう。

train_df.groupby('Sex').max().Age

これで男女それぞれの年齢の最大値だけ取り出せます。

Sex
female    63.0
male      80.0
Name: Age, dtype: float64

また、複数の項目でグルーピングして、かつ、グルーピングに使った項目でカウントしたりもできます。

train_df.groupby(['Sex','Survived'])['Survived'].count()

出力

Sex     Survived
female  0            81
        1           233
male    0           468
        1           109
Name: Survived, dtype: int64

これで男女の生存数の内訳がわかりますね。

titanic生存予測のkernelがすごい

kaggleのtitanic生存予測のkernelのトップにあった。 まとめ方が見やすく、とにかく執念を感じる!

EDA To Prediction(DieTanic) | Kaggle

それぞれの特徴量のタイプ分けから、どうやって解析すべきか、から どのアルゴリズムを使って予測するのが良さそうかまで丁寧に取り扱ってます。

pandasで相関係数を求める

どの特徴量がターゲットを求めるのに重要なのかを知るための指標として、 相関係数を使うのは、データ解析の第一歩に良さそうです。

まずは以下の記事に相関係数についてわかりやすまとめてあるので見てみましょう。

blog.apar.jp

x軸とy軸にそれぞれ異なる特徴量を設定して、値をプロットしていったときに 全体に右肩上がりの直線を引けそうなら相関係数は1に近づき、逆に右肩下がりの直線を引けそうなら相関係数は−1に近づきます。 直線が全く引けそうにない散らばった状態なら相関係数は0に近い状態です。

実際にpandasで相関係数を求めたければ pandas.DataFrame.corr を使うだけです。 上記の記事にあったような大変な計算をする必要はなく、用意された関数に任せればよいので楽ちんです。

pandas.DataFrame.corr — pandas 0.20.3 documentation

さて、やってみましょう。 まず、サンプルデータとして最初に詳解した相関係数の解説記事から 各取引先への商品Aと商品Bの販売個数データを使わせていただきました。 以下のように手打ちで作ります。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[12,28], [38,35], [28,55], [50, 87], [76, 93]]), columns = ['A商店','B商店'])
print(df)

こんな感じ

   商品A  商品B
0   12   28
1   38   35
2   28   55
3   50   87
4   76   93

このデータをもとに商品Aと商品Bの相関を求めます。 相関係数が1に近ければ正の相関なのでAが売れるときBも売れる可能性が高いということになります。 逆に−1に近ければ負の相関なのでAが売れる相手にはBは売れないです。 0に近ければ、特に相関はないのでAが売れてもBが売れるかはわからないです。

さて結果は

df.corr()

f:id:monisoi:20171016074242p:plain

0.865と出ましたので、どうやらAが売れるところにはBも売れそうです。

こんな感じでターゲットと特徴量との相関係数を求めて、絶対値の大きい特徴量に特に注目してデータ解析を行うと 学習をさせたときに良い結果が出せそうです。

pandasでデータフレームから特徴量とターゲットの配列を切り出す

機械学習アルゴリズムにデータを入れていざ学習させよう、というときには当たり前ですが データフレームの形式のままでは無理です。 データフレームから特徴量とターゲット(正解)を配列として切り出してやる必要があります。

まずpandas.DataFrame で作られたデータフレーム df があるとします。 A, Bが特徴量でCがターゲットとしましょう。

   A  B  C
0  a  b  c
1  a  b  c
2  a  b  c

特徴量を切り出すには以下のようにします。

features = df.ix[:, 'A':'B']
X = features.values

pandas.DataFrame.ix を使うと行と列を指定してデータを切り出す事ができます。 行・列番号または行・列ラベルで切る取る対象を指定可能です。

以下の記事が詳しかったです。 記事にある通り、lociloc で指定する方法もあります。

ailaby.com

次に、pandas.DataFrame.values を使うとデータフレームからラベルを除いたデータだけの配列を取得することができます。 つまり、X は以下のようになります。

[['a' 'b']
 ['a' 'b']
 ['a' 'b']]

この調子でターゲットも切り出しましょう。

y = df['C'].values

以下のようになります。

['c' 'c' 'c']

ちなみに特徴量 X が大文字なのは行列だから、 y が小文字なのはベクトルだから、慣習的にこのように書くようです。