【初心者向けハンズオン】kaggleの「住宅価格を予測する」を1行ずつ読み解く（第4回：欠損値の補完（完））

# お題
* [第1回の内容はこちら](https://qiita.com/WdknWdkn/items/a7f5e4a2cc492676e12a)
* [第2回の内容はこちら](https://qiita.com/WdknWdkn/items/95eccfae1aac99babe7a)
* [第3回の内容はこちら](https://qiita.com/WdknWdkn/items/54ee2cdc56d85d5e795c)

　有名なお題であるkaggleの「House Price」問題にみんなでチャレンジしていくことになったハンズオンの内容をメモしていく企画の第4回。解説というよりはメモのまとめだったりもしますが、どこかの誰かのためになれば幸いです。4回目にもなると徐々に徐々に溜まってきたなあという印象。

* 元々のお題：https://www.kaggle.com/c/house-prices-advanced-regression-techniques
* 参考にした記事：https://yolo-kiyoshi.com/2018/12/17/post-1003/

# 本日の作業

## 欠損値の補完（今週こそここやる）

前回まででやったのは、「欠損値を含むindexを配列で取得する」というやつでした。
（そういえば「pythonって配列の概念が色々あってめんどくさいな」ていうのをぼやいた気がします）

```
# データ型に応じて欠損値を補完する
# floatの場合は0
# objectの場合は'NA'
na_float_cols = alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64'].index.tolist() #float64
na_obj_cols = alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='object'].index.tolist() #object
# float64型で欠損している場合は0を代入
for na_float_col in na_float_cols:
    alldata.loc[alldata[na_float_col].isnull(),na_float_col] = 0.0
# object型で欠損している場合は'NA'を代入
for na_obj_col in na_obj_cols:
    alldata.loc[alldata[na_obj_col].isnull(),na_obj_col] = 'NA'
```

### 数値型で欠損値を持つindexたち

※これの詳細は第3回でやったので割愛。

`alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64'].index.tolist()`
<img width="979" alt="スクリーンショット 2020-06-15 11.52.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/fc680cd3-cf5d-7943-516e-edfd4bfc7239.png">

### カテゴリカル変数で欠損値を持つindexたち

※これの詳細は第3回でやったやつとほぼ同じなので割愛。

`alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='object'].index.tolist()`
<img width="979" alt="スクリーンショット 2020-06-15 11.55.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/86f01c2c-a9e5-72b0-f13c-514eb7d07a97.png">

## 数値型の欠損値を代入
```
for na_float_col in na_float_cols:
    alldata.loc[alldata[na_float_col].isnull(),na_float_col] = 0.0
```
### 今更だけど繰り返しfor in について
今更forについてちゃんと読んでみる。PHPで記述するのと変数とオブジェクトの順番が逆（言い方正しいか不明）なんですね。
* forに関する参考：https://udemy.benesse.co.jp/development/web/python-for.html
* 今回の変数：no_float_col
* 今回の繰り返し内のオブジェクト：no_float_cols

### しつこいけど.isnull()
`na_float_col`と`alldata[na_float_col]`を出力してみる。中身をとりあえず見てみるのは、繰り返し処理の動作確認をする上での鉄板ですね。

* `na_float_col`の1回目
「欠損値が含まれるindex」の名称が出てますね。
<img width="92" alt="スクリーンショット 2020-06-15 12.06.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/db41e09f-93d1-52df-93a9-ca343217b625.png">

* `alldata[na_float_col]`の1回目
「欠損値が含まれるindex」の値の配列が出てきますね。
<img width="146" alt="スクリーンショット 2020-06-15 12.07.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/ccf5ef3c-ee3f-0b05-7258-dd886d4e3c32.png">

* .isnull()の結果
`isnull()`を使って各値がnullかどうかを判定しています。
`alldata[na_float_col].isnull()`を出力
<img width="132" alt="スクリーンショット 2020-06-15 12.09.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/299b67a6-5861-bd4e-305f-708d368714a6.png">

### .locについて
`alldata.loc[alldata[na_float_col].isnull(),na_float_col]`
* .log：どうやら行列的に、行・列で値を見たり出力したりするのに使える様子
* .locの参照：https://note.nkmk.me/python-pandas-at-iat-loc-iloc/
* `alldata.loc[alldata[na_float_col].isnull(),na_float_col]`の出力結果
<img width="248" alt="スクリーンショット 2020-06-15 12.13.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/682f5d82-cdaf-a6da-af04-75f98dd885b6.png">

### 欠損値に値を設定
行列的に指定して、欠損値のところだけ「0.0」を入れる。
`alldata.loc[alldata[na_float_col].isnull(),na_float_col] = 0.0`

### カテゴリカル変数の欠損値の補完
※ほぼ同じなので割愛します。

### 欠損値の補完結果
1つずつの項目は細かすぎて見れないけど、これで行けているはず。

`alldata`の出力結果
<img width="595" alt="スクリーンショット 2020-06-15 12.17.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/cfc50d34-b8ab-4bca-75bc-c162435ff339.png">

## カテゴリカル変数のダミー化

を、やろうと思いましたが時間切れなったので、「カテゴリカル変数のダミー化」の予習にして終わりたいと思います。解析できるように数値化する的な感じか。。。？

* ダミー変数参考：https://markezine.jp/article/detail/20790

# おしまい。

欠損値の補完、、思ったより読み解きに時間がかかってしまいました。これが1行に処理を何でも詰め込むPythonの罠かと（なれてくれば罠でも何でもなくなればいいんですが）。

そろそろ実際の処理が近づいていて着ている匂いがしてきてワクワクしてきます。