戦コンからDSへの転身なるか?

Dev, DS的な勉強と実践の継続の記録

Kaggle / Titanic - Machine Learning from Disaster / 写経 / Gold Medalistから学ぶ Day4, 5

環境

Jupyter Notebook / Local

やったこと

Day4は東京から車で早朝に蓼科の山荘に戻ったこともあって疲れていたので日記を残すことができませんでしが、それでも手は動かしてみました。東京出張でリモート会議の合間にカフェで手を動かすことも含めて、やる気スイッチとか以前に、行動へのハードルを下げることで習慣化を狙っています。

さて、Day4, 5と進めてみて、ようやくデータクレンジングと特徴量の生成については一通り写経することができました。写経しているのでたまに本当に無心にただ写し書いていることがありますが、それだけだと身につかない気がするので、この過程で行ったことについて少し抽象化、一般化してみようと思います。

データクレンジングと特徴量生成で良く使うコード

pandasの.info()関数によるDataFrameの中身概観

train_df.info()
print('_'*40) # 区切り線の挿入
test_df.info()

基本ですよね。合計レコード数と変数ごとのnon-null数が分かるので差分がnull値。

pandasの.describe()関数による基本統計量概観

train_df.describe() # デフォルトで数値型カラムについての基本統計量取得
train_df.describe(include='O') # 'O'で文字列取得
train_df.describe(include='all') # 'all'で文字列も数値型も全て取得

※ これはinculude='O'の場合 count, unique, top, freqなどを吐き出してくれるのでざっと状況確認ができる。

pandasの.groupby()関数によるグループ化

train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)

グループ化してその平均値(等)をとってくれる。この場合は'Pclass'でグループ化して.mean()で平均値を取得して、.sort_values()関数で'Survived'(の平均値)順に並び替えてくれる。もう何度も使う。

seabornのFacetGridによるグリットパネル作成で可視化しながら比較

grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', hue='Survived', height=2.2, aspect=1.6)
grid.map(plt.hist, 'Age', alpha=.5, bins=20)
grid.add_legend();

seabornでインスタンスsnsをつくり、.FacetGrid()関数でマトリクス(縦・横)のグリッドパネルを作成できる。この場合は横軸((column)に'Survived', 縦軸(row)に'Pclass'を配置し'grid'とする。gridで.map()関数の中でmatplotlib.pyplotのヒストグラムを構成し、数値を'Age'とする。pltインスタンスで.histとすればヒストグラム、.barplotとすれば棒グラフ、.pointplotとすれば折れ線グラフになる。

pandasの.map()関数によるマッピングデータによるデータ置換

title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}

for dataset in combine:
    dataset['TitleId'] = dataset['Title'].map(title_mapping)
    dataset['TitleId'] = dataset['TitleId'].fillna(0)

.map()の中身にあらかじめ準備していた置換するデータがマッピングされた辞書{}を入れることでpandasのDataFrameの中身を置換する。文字列データを数値型にしたり、幅のあるデータを数値型で括ったりする時に使用する。

pandasの.loc()関数による配列・行列の位置取得

for dataset in combine:    
    dataset.loc[ dataset['Age'] <= 16, 'Age'] = 0
    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1
    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2
    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3
    dataset.loc[ dataset['Age'] > 64, 'Age']

.loc()の中で行・列を指定して位置を取得する。行・列の中で条件指定しても良い。

所感

写経した後、ある程度まとまってきたところでこうやってまとめると自分の中で再現性が高まる気がします。いつか見返すというよりは、この行為自体で身につけることの意味の方が大きい的な。続けていきたいです。