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

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

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

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

# 本日の作業

## 欠損値の補完（の準備で終わってしまった）

結論、結構欠損値があった。けどよくよく見てみたら、欠損していないというわけではなく、「値がない」というのにそもそも意味がある内容でした。

### 欠損状況のへの理解と対応

参考記事からの抜粋。

> Kaggleからデータをダウンロードすると、「data_description.txt」というファイルも含まれていることに気がつきます。このファイルには、変数にどんなデータが格納されているのかが詳しく説明されています。すると、大多数の欠損は情報がないことを意味するのではなく、欠損そのものが情報であることがわかります。
 たとえば、最も欠損が多い、PoolQC(プールのクオリティ)をみてみましょう。
この変数の欠損はプールが住宅に存在しないことを意味しており、データの欠損そのものが情報となっています。そのほかの変数(カテゴリカル変数)についても、欠損はその施設や設備が存在しないことを意味しているだけなのです。
 また、数値型の変数についても、欠損は占有面積がゼロであることを意味しているだけであって、情報がないわけではありません。
したがって、カテゴリカル変数、数値型変数の欠損には以下の補完を行います。
* カテゴリカル変数の欠損：欠損を示す文字列’NA’を補完
* 数値型変数の欠損：0.0を補完

### カテゴリカル変数
どうやらDBの値でいうところのコードで意味を表す系の項目のことらしい。
例）1:男性、2:女性　とか。
https://www1.doshisha.ac.jp/~mjin/R/Chap_45/45.html

### 数値型変数
ということは、シンプルにカテゴリカル変数の逆で量的な値を表すデータな様子。

## カテゴリカル変数の欠損値を補完
まず保管するにあたって、データ型ごとにindexの値をとりだします（一応何言ってるかわかんなくても進めて終わってみたら意味がわかるように構成してみています）。

```
na_float_cols = alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64'].index.tolist() 
``` 
### 数値型の補完準備
*  `alldata[na_col_list]`：欠損値が入っているデータ配列。
<img width="609" alt="スクリーンショット 2020-06-08 12.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/34f1959f-658f-6356-0167-ccd5a87af868.png">

* `alldata[na_col_list].dtypes=='float64'`
配列の各データ型を確認。.dtypesで配列のデータ型を一括で確認する。以下は`alldata[na_col_list].dtypes`のみの結果。
https://note.nkmk.me/python-numpy-dtype-astype/
<img width="266" alt="スクリーンショット 2020-06-08 12.06.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/2e477398-7f94-33f7-217a-c47749854b01.png">

* `alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64']`
数値型変数だけの項目を取得。以下は`alldata[na_col_list].dtypes`のみの結果。これがfloat64担っているのかどうかを選別するらしい。
<img width="185" alt="スクリーンショット 2020-06-08 12.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/88155aa0-dd76-d48d-bb12-46e430d99565.png">

* .index
.indexの役割が想定と違ったのでこれもメモ。これまでみていたのは「indexをセットする」だったけど、今回は「indexをとってくる」用途で使っている模様。
参考：https://www.mathpython.com/ja/python-list-index/
以下は`alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64'].index`の出力結果。なるほどindexだけとってきてる。
<img width="570" alt="スクリーンショット 2020-06-08 12.16.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/e7faa224-e871-3f59-93e7-85b4a1c703d4.png">

* .tolist()
取得したindexをリスト型に変換する。というかそもそもPythonて配列もどきみたいなやつの種類がいっぱいあるのか。。。というところで詰まりそうになったのでそれもメモしておく。
参考：https://note.nkmk.me/python-numpy-list/
参考：https://algorithm.joho.info/programming/python/list-tuple-dict-chigai/
以下は例によって、`alldata[na_col_list].dtypes[alldata[na_col_list].dtypes=='float64'].index.tolist()`の出力結果。おお、これでようやく数値型のカラムがlist型で取得できたわけですね。
<img width="977" alt="スクリーンショット 2020-06-08 12.23.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/50ae6bd3-8ed7-8dfa-9ba0-e6678bef52b6.png">


# おしまい。

2週間ほど空いてしまいましたが、また頑張って更新したいと思います。
（そろそろ、Pythonを基礎からインプットして整理整頓し直したい気持ちも…、pythonて1行の中でなんでもかんでもやりすぎなような…）