pandasで相関係数を求める
どの特徴量がターゲットを求めるのに重要なのかを知るための指標として、 相関係数を使うのは、データ解析の第一歩に良さそうです。
まずは以下の記事に相関係数についてわかりやすまとめてあるので見てみましょう。
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()
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
を使うと行と列を指定してデータを切り出す事ができます。
行・列番号または行・列ラベルで切る取る対象を指定可能です。
以下の記事が詳しかったです。
記事にある通り、loc
や iloc
で指定する方法もあります。
次に、pandas.DataFrame.values
を使うとデータフレームからラベルを除いたデータだけの配列を取得することができます。
つまり、X
は以下のようになります。
[['a' 'b'] ['a' 'b'] ['a' 'b']]
この調子でターゲットも切り出しましょう。
y = df['C'].values
以下のようになります。
['c' 'c' 'c']
ちなみに特徴量 X
が大文字なのは行列だから、 y
が小文字なのはベクトルだから、慣習的にこのように書くようです。
pandasでデータフレームに対しパラメータを追加・削除する
データフレームに列や行を追加したかったら concat()
、削除したかったら drop
を使います。
やってみましょう。
まず適当なデータフレームを作っておきます。
import pandas as pd import numpy as np df = pd.DataFrame(np.array([['a','b','c'], ['a','b','c'], ['a','b','c']]), columns = list("ABC"))
こんな感じになります。
A B C 0 a b c 1 a b c 2 a b c
追加するようのデータも作っておきましょう
df_concat = pd.DataFrame(np.array(['d','d','d']), columns = list("D"))
Dの列を作りました
D 0 d 1 d 2 d
さて、df
にDの列を追加してみましょう。
df = pd.concat((df, df_concat),axis=1)
axis=1
はこの場合列方向の削除を示します。
axis=0
だと行方向です。
期待通りDの列が追加されました。
A B C D 0 a b c d 1 a b c d 2 a b c d
Dを削除してみましょう。
df = df.drop('D', axis=1)
削除もできました。
A B C 0 a b c 1 a b c 2 a b c
pandasでワンホットエンコーディング
機械学習ではしばしばデータの解析を容易にするためにワンホットエンコーディングという手法を使います。
例えば「性別」というパラメータがあればその中には「男性」や「女性」が含まれますが、 この「性別」を分解して「男性」「女性」をそれぞれ一つのパラメータとしてしまい、値を0, 1で表現するのが ワンホットエンコーディングです。
これはpandasで以下のように簡単にできます。
print(df_train.Sex.value_counts()) sex_dummy = pd.get_dummies(df_train.Sex) sex_dummy.head()
1行目のprint()は Sex
にどんな値が含まれるかを確認するためにやっているだけなので、
処理としては不要です。
ただ、確認しておくことで man
や male
を一緒に扱う必要がある場合などに気づけます。
2行目がワンホットエンコーディングの処理です。
get_dummies()
を使うだけでよしなにやってくれます。
3行目は結果の出力です。処理としては不要です。
出力
pandasでデータの欠損を確認する
機械学習において収集したデータを使おうと思ったとき、ほとんどのケースでデータに欠損があります。 そんなときは、もっともらしい値で穴埋めをするなどの対処が必要ですが、 それより前にどのパラメータのデータがどれだけ欠損しているかを確認したいです。
pandasなら以下のようにしてパラメータごとのデータ欠損数を出力することができます。 (サンプルのデータにはkaggleのtitanic問題を使わせていただいてます)
Titanic: Machine Learning from Disaster | Kaggle
import pandas as pd df_train = pd.read_csv("train.csv") df_train.isnull().sum()
出力
PassengerId 0 Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
isnull()
で欠損確認をして sum()
で合計です。
pandasが思った以上に簡単にやりたいことを実現してくれるのでビビります。
pandasを使ってcsvの先頭を表形式でjupyterに出力する
kaggleの問題に取り組んでいるときなど、jupyter上でぱぱっとcsvの中身を見れると便利。
例えばタイタニックの生存予測のトレーニングデータcsvの中身を見たいとき
Titanic: Machine Learning from Disaster | Kaggle
以下のようなコードで表形式に表示できる
import pandas as pd df_train = pd.read_csv("train.csv") df_train.head()
出力結果
head()の引数に数字を与えてやればその分の行数が表示されます。
カンバンでプライベートタスク管理
先日友人がプライベートでカンバンアプリを使っているのを見て、面白そうだと思い 自分も便乗してみました。
使用しているアプリ
Trelloを使っています。
会社ではJootoというサービスを使っているのですが、プライベートでは違うものを と思いTrelloにしました。 どちらも使い勝手としては同じという印象です。
使い方
一般的なカンバンの使い方をしています。
ToDo, Doing, Done のリストを作成し、ToDoにタスクを追加していきます。 手をつけ始めたらDoing、終わったらDoneです。
ゴミ捨てとか洗濯とか、そういった家事タスクから、専門書をどこまで読む といったスキルアップタスクまでとにかくリストに追加します。
本を読む系のタスクだと章区切りでタスクにしてやると、短期間でDoneにタスクを 送れるので個人的にはやる気が出ます。
感想
プライベートでもタスクがはっきりとしている方がメリハリがつく気がします。 家事に対しても、タスクを放置せずに片付けようという気が起きたり起きなかったり。