作成したピボットテーブルを使った補完はじめに機械学習を行うためにはデータセットが必要不可欠です。場合によっては与えられたデータの中に一部欠損が場合もあります。そのため、その欠損値を補完する方法をまとめました。使用するデータについて実際に配布されているデータセットを用いて説明をしようとしたのですが、irisデータセットは欠損がなく、Kaggleのtitanicは登録しなければダウンロードできませんでした。そこで、今回は私が作成したこちらのCSVファイルをデータとして使用しました。データの表示まず、先ほどのCSVファイルを読み込んで表示します。「ドクター」の「MP」と「属性」にデータが入っていないことが確認できます。「遊び人」の「攻撃力」を補完していきます。欠損値の補完はPandasに搭載されている、fillna()を使用するのが一般的です。他のデータの攻撃力の平均値とします。df['攻撃力'].mean()#補完した値を表示df['攻撃力'].fillna(attackMean)さて、この状態でdfを表示すると次のようになります。「遊び人」の「攻撃力」が空のままです。なっているかというと、先ほどの状態ではdfの攻撃力の列をコピーしてから補完しているので、dfそのものは変更されていないからです。変更を元のdfに反映させるためには、引数のinPlaceをTrueにすればいいです(デフォルトではFalseになっている)。inplace=True)dfちなみに、元のdfを書き換えたくなければ、以下の様に一度コピーしてから、それを書き換えるようにすればいいです(結果は先ほどと同様なので省略)。次に「ドクター」のMPを補完しています。他のデータではMPが100未満なのに、魔法使いだけ400と以上に高いため、仮に平均値で補完すると、ドクターのMPは100程度と高い値になってしまいます。このような飛び抜けた価は外れ値と言います。そこで、今回は中央値を使って補完します。中央値での補完は外れ値がある場合に効果的です。最後に「ドクター」の「属性」を補完します。属性については、数値でないので今までのように平均値や中央値での補完ができません。そこで最も多く出ている属性で補完するため、最頻値を使います。使用するデータセットここでは、KaggleのTitanicのデータセットのtrain.csvを使用します。pd.read_csv('train.csv')train.head(3)性別(Sex)、Pclass(階級)など様々な項目があることが分かります。5のAgeがNaNと欠損していることが確認できます。欠損値の確認train.isnull().sum()Ageの欠損しているデータ数が多いのでこれの補完を考えます。全データの最頻値で補完するのもありですが、より正確に補完するためにはデータ群ごとに別の値で埋めるというのが有効です。今回は、性別(Sex)、Pclass(階級)の2つを使って補完を考えていきます。Sex=maleにおける平均値はxである」といったことを把握する必要があります。この時に便利なのがピボットテーブルです。ピボットテーブルの作成Pandas内にはピボットテーブルを作成するためにpivot_tableという関数が用意されています。この関数における引数を次の表に示します。第1引数データindex探索したい列名1columns探索したい列名2values表示したい列名aggFuncvaluesの何を表示するかを関数で指定。例では、平均値の表示のために「np.mean」としているが、最大値を表示したいなら「np.max」とする。aggfunc=np.mean)pt表示すると次のようなDataFrameが作成されたことが確認できます。男女ともにPclassの数値が小さいほど平均年齢は高いです。同じPclassなら女性より男性の方が平均年齢が高いことも確認できます。先ほどのピボットテーブルを使って補完していきます。for文の2重ループを使って、ptの値を取り出して代入しています。df.loc[~]に条件式を記述してDataFrameのどこに代入するかを決めています。maleなので、26.50759が代入されたことが分かります。4はてなブログをはじめよう!KiironoMidoriさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。