(1).やったこと
④.データの加工・前処理
(a).なぜデータ前処理をするのか。
今のままのデータだと機械学習モデルのデータに使うことができない。
欠損値があるから。
ちなみに、機械学習モデルの精度を上げるために新しいカラムを作ることを
「特徴量エンジニアリング」という(今回はやらない)
(b).今回使う特徴量
Pclass、Sex、Age、Embarkedの4つのカラムを特徴量として使用する。
なので、それ以外のカラムは削除する必要がある。
(c).データフレームから特定のカラムを削除『df.dorop()』
引数に削除したいカラムをリストで指定してあげるだけ
コードを書いた後、プログラムを実行すると実際に削除される。
削除されたかはheadメソッドで確認する。
(colabで実際にやってるからそっちも参照)
(d).データの補完
・欠損値の確認
AgeとEmbarkedには欠損値が存在する。
#なんでだっけ? テストデータにはないからだっけ?
→ageはテストデータには確かにない。Embarkedにはある。
あれ、なんでだ? まぁいいや先に進もう
.isnull().sum()で欠損値があるかを確認。
欠損値は消すこともあるが、今回はデータが1300ちょっとしかないので、
データを補完する。(データの数は普通は数万とか)
※任意のカラムの欠損値の数のみをカウントするには
df2["カウントしたいカラム"].isnull().sum()
※欠損値のカウント以外にもPandasで特定のカラムを対象に何らかの操作
をしたい時は
df["特定のカラム"].XXXX()
・欠損値の補完をどのようにするか考える。
Embarkedの欠損値は1309中2つだけなので、今回は乗客の多い港で保管し
てあげる。
・乗客の多い港がどこかを確認する。
seabornを使えば、Embarkedのデータの可視化ができる。
→各港の数がわかる。つまり、一番多い港もわかる。
コードは下記
――――
plt.figure(figsize=(6, 4))
sns.countplot(data=df2, x="Embarked")
plt.show()
――――
これで、Sが一番多いことがわかる。
・欠損値を補完する前にコピーを取った上で補完する。
.copy()を使って、元のデータをコピーしてから補完する。
元のデータを用意しておいた方が安全に分析をできる。
(バックアップがあるとなんかあったときに安心)
補完自体は.filla()で、()内に補完したいデータを入力
コードは下記
――――
#コピーを取った後、Embarkedの欠損値にSを補完してあげる。
df3 = df2.copy()
df3["Embarked"] = df3["Embarked"].fillna("S")
――――
・欠損値が保管されたかを確認。
欠損値の数を再度確認する。
コードは下記
――――
#Ageの欠損値の数を調べる
print("欠損値の数:", df3["Age"].isnull().sum())
――――
・Ageの欠損値を補完を考える。
欠損値の数を見てみると(やってる作業は省略。実際はcolabで
手を動かしてる)、Embarkedと違って、数が非常に多い。
なので、補完する前に乗客の年齢がどのような分布になってい
るかを確認する。
1変数のデータの分布をみるときはヒストグラムを見るとわかり
やすい。
seabornで見れる。
・乗客の年齢の最小値と最大値を確認する。
ヒストグラムの階層をいくつに分けるかを決めるために、最小値
と最大値を確認する。
最小値は.min()、最大値は.max()で確認できる。
コードは下記
――――
print("最小値:", df3["Age"].min())
print("最大値:", df3["Age"].max())
――――
・ヒストグラムを確認する。
sns.histplot(使うデータ[使うカラム], kde=False, bins=階級の
数)でseabornによるヒストグラムを作成できる。
コードは下記。
――――
plt.figure(figsize=(6, 4))
sns.histplot(df3["Age"], kde=False, bins=8)
plt.show()
――――
これで見ると、一番多いのは20台、2番目が30台、3番目が10台。
このことから家族連れが多いのではないかという仮説が立てられる。
そうすると、SibSp(同乗している兄弟/配偶者の数)やparch(同乗し
ている親/子供の数)を使って特徴量を作ったら、精度が上がるかもし
れない、というところまで予測できる。
本来は、こうやってデータをみて、探索したり仮説を立てて特徴量を
作っていく。
・平均値と中央値を計算する。
コードは下記
――――
print("平均値:", df3["Age"].mean())
print("中央値:", df3["Age"].median())
――――
すると、平均値約29が中央値約28より大きいことがわかる。
(つまり、全体的に乗ってる年齢の人は30台以上が多い)
欠損しているデータがすべて29より低いことはあり得ないが、今回は
中央値28で補完する。
・欠損値の補完。
.fillna()を使って補完していく。
コードは下記
――――
#Ageの欠損値をコピーを取った後で中央値で補完する。
df4 = df3.copy()
age_median = df4["Age"].median()
print(age_median)
#直接28と打ち込むのではなく、きちんと中央値を計算させる変数で
補完することで、仮にデータが変わっても対応できるようにしてい
る。
――――
df4["Age"] = df4["Age"].fillna("age_median")
――――
・欠損値が保管されているかを確認する。
散々やってるため省略
・注意事項
今回はデータサイエンス入門なので、簡単な紹介にとどめておくが、
本来欠損値の扱いはもっと慎重に扱うべき
欠損値に入れたデータで、精度が変わってしまうため。
だから、欠損値を補完する時はしっかり仮説を立てて、正しくアプロ
ーチできているかを検討すること。
(2).気づいたこと・学んだこと・疑問
・データサイエンスでより困難なのは、今やっているプログラムではなく、
仮説や推論など「問いを立てていく力」な気がする。(気づき)
・google colabは中断すると、マウントや定義した関数、設定した変数など
を再度走らせる必要あり(学び)
・毎回書くのは大変なので、よく使うコードは辞書登録など、すぐ呼び出せ
る工夫が必要(学び)