[Kaggle]Santander Customer Transaction Prediction（その１）

#Santander Customer Transaction Prediction に挑戦してみた。（その１）
[Santander Customer Transaction Prediction](https://www.kaggle.com/c/santander-customer-transaction-prediction/overview) に挑戦をしてみました。（提出期限は過ぎており、３つのチュートリアルを経て、４回目の挑戦）
このコンペは、２０万人のデータ（１人につき２００個のデータがあるが、何のデータかは不明）を分析し、その顧客は「サービスを購入するか？」、「ローンを払えるか？」を決めるものです。（多分・・・）
何のデータかも明かされておらず、目的も定かではいようでしたが、要するに、２０万人を「０」「１」に振り分ける二値分類の問題です。ですが、提出するデータは０〜１の確率で示したものなのでご注意ください。（１回目の提出は０、１に変換して出してしまいました・・・）

- [Santander Customer Transaction Prediction に挑戦してみた。（その２)](https://qiita.com/pappapa/items/df42b7af5e4779745354)
- [Santander Customer Transaction Prediction に挑戦してみた。（その３)](https://qiita.com/pappapa/items/683ed1cc648267a3da69)

##参考文献
https://book.mynavi.jp/ec/products/detail/id=90124
https://www.manning.com/books/deep-learning-with-python
![90124_ext_06_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/bdea04b0-5fe6-93b3-c931-32997ef929c2.jpeg)

##この記事について
- Kerasを用いて分析
- プログラミングを初めて１ヶ月の初心者が書いています。（もちろん、機械学習も初めて）
- コピペで提出まで完了しますが、モデルや前処理が良いものとは限りません。

##開発環境
- python 3.7.3
- jupyter 1.0.0
- Keras 2.2.4
- matplotlib 3.1.0 
- numpy 1.16.4
- pandas 0.24.2
- tensorflow 1.13.1
- scikit-learn 0.21.2
- scipy 1.3.0
- seaborn 0.9.0

```python:0-1
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.preprocessing import StandardScaler

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras import optimizers
```

##（１）訓練データとテストデータ
###使用するデータをダウンロード
データはこちらからダウンロードできます。（https://www.kaggle.com/c/santander-customer-transaction-prediction/data）

###データの読み込み

```python:1-1
#ファイルの場所を指定します
train = pd.read_csv("/Users/*****/Desktop/Kggale/santander-customer-transaction-prediction/train.csv")
test = pd.read_csv("/Users/*****/Desktop/Kggale/santander-customer-transaction-prediction/test.csv")
```

###データの中身を確認する
####訓練データ
訓練データは「200000行202列」で構成されており、２０万人１人１人に「ID_code」と「target(ラベル)」と「２００個のデータ」が与えられています。

```python:1-2
print(train.shape)
train.head()
```

####テストデータ
こちらも訓練データと同じ構成をしていますが、「target」が記されていない、「200000行201列」です。このコンペは、テストデータの「target」 を予測する問題です。

```python:1-3
print(test.shape)
test.head()
```

###統計量の確認（訓練データ）
今回は、特に使用しませんでしたが、どの程度データにばらつきがあるのかなどを確認しました。
検証に行く前に正規化を行なっていますが、しなくてもいいのでは？とも思いました。

```python:1-4
train.describe()
```
![スクリーンショット 2019-06-07 午後12.58.14 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/b72bebc8-bd45-151d-721a-aefc19e0838f.png)

##（２）データをニューラルネットワーク用に変換
###NumPy配列にする
DataFrameから値を取り出して、浮動小数点数のベクトルに変換しました。

```python:2-1
x_train = train.iloc[:, 2:].values.astype("float32")#訓練データ
train_targets = train["target"].values.astype("float32")#訓練データラベル
y_train = test.iloc[:, 1:].values.astype("float32")#テストデータ
```

##（３）データを詳しく見る
###２００個のデータをヒストグラムで表示(保存)
２００個のデータをそれぞれ、「"target"が０の人」「"target"が１の人」に分けて、ヒストグラムで表示
"target"が０の人と１の人の人数が大きく異なり、グラフを重ね合わせると比較しにくいため、y軸を両方設定し、比較しやすいようにした。

```python:3-1
train_columns_name = train.columns[2:]#データのカラムの名前のリスト

for i in range(len(train_columns_name)):
    hist_data = train.iloc[:, [1, (i+2)]]

    hist_data_0 = hist_data[hist_data["target"]==0]
    hist_data_1 = hist_data[hist_data["target"]==1]

    fig, ax1 = plt.subplots(figsize = (20, 10))
    # ax1とax2を関連させる
    ax2 = ax1.twinx()

    ax1.hist(hist_data_0[train_columns_name[i]], bins = 300, label="0", alpha = 0.5, color = "red")
    ax2.hist(hist_data_1[train_columns_name[i]], bins = 300, label="1", alpha = 0.5, color = "cornflowerblue")

    handler1, label1 = ax1.get_legend_handles_labels()
    handler2, label2 = ax2.get_legend_handles_labels()
    # 凡例をまとめて出力する
    ax1.legend(handler1 + handler2, label1 + label2)
    plt.title("var_"+str(i), fontsize=20)
    
    #通常、下の２行のどちらかはコメントアウト
    plt.savefig("var_"+str(i)+".png")#表示だけなら、ここをコメントアウト
    plt.show()#保存だけなら、ここをコメントアウト
```

###保存された画像（グラフ）を見て、"target"を決まる際に影響が大きそうなものを選ぶ
次のように分類した（明確に分けるプログラムを組んだわけではなく、目視での確認のため、僕の価値観が大きく影響している気がします・・・）

- 大きく影響しそうなもの
- 少しは影響してそうなもの
- 影響してなさそうなもの

２００枚の画像を載せるわけには行かないので、いくつか紹介します。
赤色のヒストグラムが「０の人」、青色のヒストグラムが「１の人」です。
####■大きく影響しそうなもの
赤と青にズレが大きいものは、影響が大きいと判断しました。
![var_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/5dbcc8db-44ed-5723-528d-e6f44ed5c7b1.png)
![var_190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/09cddd17-9d8f-2f66-6e70-af69a18e8368.png)

####■少しは影響してそうなもの
![var_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/1f2ccaf8-7392-9ff8-5f0f-62365cd01be2.png)
![var_104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/e056f13f-6a49-928a-4915-18b187e22afe.png)

####■影響してなさそうなもの
![var_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/a2feaed7-a145-c613-5651-b215fb262ea1.png)
![var_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/3bb9c294-66a2-d34e-4591-c20920db4b5d.png)

###振り分け結果
下のように振り分けてみました。（狙ったわけではありませんが、約３等分されています。）
目視で振り分けましたが、きっちりとしたルールを設けて振り分けるのがいいかなと思いました。

```python:3-2
#■大きく影響しそうなもの
high_feature_list = [1,6,9,12,13,18,21,22,26,32,33,34,40,44,53,56,67,
                     68,75,76,78,80,81,82,86,87,89,92,108,109,110,121,122,
                     123,133,134,139,146,148,164,165,166,169,170,173,174,
                     177,179,184,188,190,191,192,197,198,199]

#■少しは影響してそうなもの
medium_feature_list = [0,2,5,20,23,24,28,31,35,36,43,48,49,51,52,58,
                       63,66,70,71,77,83,85,88,90,91,93,94,95,99,101,104,105,
                       106,107,111,112,114,115,116,118,119,120,125,127,128,
                       130,131,132,135,137,141,142,143,145,147,149,150,153,
                       154,155,156,157,162,163,167,172,178,180,186,187,193,
                       194,195,196]

#■影響してなさそうなもの
low_feature_list = [3,4,7,8,10,11,14,15,16,17,19,25,27,29,30,37,38,39,
                    41,42,45,46,47,50,54,55,57,59,60,61,62,64,65,69,72,73,74,
                    79,84,96,97,98,100,102,103,113,117,124,126,129,136,138,
                    140,144,151,152,158,159,160,161,168,171,175,176,181,182,
                    183,185,189]
```
##（４）[番外編]面白い形をしたヒストグラムができました！
一体、どんなデータをとったらこのようになるのか知りたいです。何のデータかわからないことがとても残念です・・・
（他にも面白いデータがありました）
![var_68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/420ad0bf-f813-2fe7-f968-be86f35cf290.png)
![var_108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427946/2b7f23b6-3455-a2f5-ea31-f9cd95d5a258.png)

続きはこちらから
[Santander Customer Transaction Prediction に挑戦してみた。（その２)](https://qiita.com/pappapa/items/df42b7af5e4779745354)