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

# お題
　[第1回の内容はこちら](https://qiita.com/WdknWdkn/items/a7f5e4a2cc492676e12a)
　有名なお題であるkaggleの「House Price」問題にみんなでチャレンジしていくことになったハンズオンの内容をメモしていく企画の第２回。解説というよりはメモのまとめだったりもしますが、どこかの誰かのためになれば幸いです。

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

# 本日の作業

## 欠損値の確認（補完までいけなかった）

結論、結構欠損値はあるらしい。
### 学習データの欠損状況（欠損値）
```
train.isnull().sum()[train.isnull().sum()>0].sort_values(ascending=False)
```

#### 欠損値
* そもそも「欠損値」とは：https://www.weblio.jp/content/%E6%AC%A0%E6%90%8D%E5%80%A4

>データファイルを準備する場合には，データが欠落している場合でもなんらかの数値を入力しておかなければならない。ただし，入力される数値は実際にはデータがなかったことを表しているので，分析対象からはずす必要がある。そのため，他の有効なデータと明らかに区別できる値(欠損値)を入力する。

#### .isnull()
* .isnull()：要素ごとにtrue, falseで値が入っているかどうかを確認してくれるわけだ。
* 参考：https://note.nkmk.me/python-pandas-nan-judge-count/
* train.isnull()だけで結果を出力した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/62768dea-f1ad-33e5-7338-64f43dcd7cb1.png)

#### .sum()
* .sum()：おなじみ足し算をしてくれる。引数の指定で縦方向にも横方向にも足し算してくれる。
* 参考：https://deepage.net/features/pandas-sum.html
* train.isnull().sum()だけで結果を出力した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/2a0e40c3-72a8-861d-39b4-13486450e769.png)

* [train.isnull().sum()>0]：欠損している項目がある列だけをキーに指定して並べる感じ。
* train.isnull().sum()[train.isnull().sum()>0]だけで結果を出力した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/70d7524d-018a-7d58-d5d8-c369addc32d3.png)

#### .sort_values()
* .sort_values(ascending=False)：データソート。ここでは降順にする引数しか指定してないけど、ソートする項目を選んだりとか、アルゴリズム変えたりとかできるらしい。便利。
* 参考：https://deepage.net/features/pandas-sort-values.html
* train.isnull().sum()[train.isnull().sum()>0].sort_values(ascending=False)だけで表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/fd69f916-b0a1-2296-8c78-8f8a5b3e8439.png)

### テストデータの欠損状況
解説は学習データと同じなので割愛します。

```
test.isnull().sum()[test.isnull().sum()>0].sort_values(ascending=False)
```

### 学習データの欠損状況（データ型）

#### .index.tolist()
```
# 欠損を含むカラムのデータ型を確認
na_col_list = alldata.isnull().sum()[alldata.isnull().sum()>0].index.tolist() # 欠損を含むカラムをリスト化
alldata[na_col_list].dtypes.sort_values() #データ型
```

* `alldata.isnull().sum()[alldata.isnull().sum()>0]`までの内容は、欠損値を並べるところまででやったので割愛。
* .index：あれこれ`index()`とちがうん？って思ったけど、違うらしい。
* .tolist()：カラムだけリストにするのに再度これを使っていた。（ちょっと理解があいまい）
* 参考：https://note.nkmk.me/python-pandas-list/
* `na_col_list = alldata.isnull().sum()[alldata.isnull().sum()>0].index.tolist()`の出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/c716021e-a081-4e62-b43d-66053ac640a4.png)

#### .dtypes
* .dtypes：配列にこれを当てると、それぞれのデータ型を調べてくれる。便利。あと類似のdtypeもある。
* 参考：https://www.sejuku.net/blog/62023
* `alldata[na_col_list].dtypes`の出力結果（※sort_values()の内容は割愛、昇順ですね）

<img width="187" alt="スクリーンショット 2020-05-25 12.21.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/972a6ba8-bbd4-5548-2a69-2f169a2ac25a.png">

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

統計的にデータをどう取り扱うかの意見についての記載です。ここは普通に読んで理解することを推奨します。プログラミング的な理解とは別のお話。

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

# おしまい。
うーむ。データ眺めるだけで終わってしまった。