ELOコンペにトライ part1_EDA

## これは何の記事？
ELO MERCHANT CATEGORY RECOMMENDATIONコンペの学習ログです
まずは探索的データ分析（EDA）を行います

## 環境
Google Colab

## 記事の流れ
<ul>
<li>データの読み込み
<li>データの概要把握
    <ul>
        <li>1. trainデータ
    </ul>
</ul>

## データの読み込み
**データが重すぎて読み込めない（エラーが起きる）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/44bbcddc-412e-bf68-9e6c-33a758c63298.png)
以下の方法で何とか読み込めたが、他の良い方法を知りたい…
```python
# ドライブをマウント
from google.colab import drive
drive.mount('/content/drive')

# 使用するライブラリをインポート
import pandas as pd
import numpy as np

# 訓練データの読み込み
train_df = pd.read_csv("/content/drive/MyDrive/Elo/train.csv")
test_df = pd.read_csv("/content/drive/MyDrive/Elo/test.csv")

# 1000行ずつに区切って結合する
historical_reader = pd.read_csv("/content/drive/MyDrive/Elo/historical_transactions.csv", chunksize=1000)
historical_df = pd.concat((r for r in historical_reader), ignore_index=True)
new_merchant_df = pd.read_csv("/content/drive/MyDrive/Elo/new_merchant_transactions.csv")
merchant_df = pd.read_csv("/content/drive/MyDrive/Elo/merchants.csv")

# 3分20秒かかった
```

## データの概要把握
```python
historical_df.head(5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/6c0ea586-7d9f-d706-9616-1ca217c315b1.png)


## 探索的データ分析（EDA）
#### 1. trainデータ
feature_1~3はEloによってマスキングされた特徴量
|Columns|Description|
|---|---|
|card_id|Unique card identifier|
|first_active_month|初回購入月|
|feature_1|特徴量1|
|feature_2|特徴量2|
|feature_3|特徴量3|
|target|Loyalty score（評価期間の2か月後に算出されるらしい）|
```python
train_df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/74fb70c9-db99-6fb6-3831-a17b05a59037.png)
欠損値はない
```python
train_df.info()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/8c4208d9-83ed-ab74-8941-14fbec7b6383.png)
カードIDに重複なし
```python
print(train_df.nunique())
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/b88c8b6f-be3c-7dee-c705-6f1b6e351fb0.png)
targetの分布を確認、異常値（？）に注意
```python
# 使用するライブラリをインポート
import matplotlib.pyplot as plt
import seaborn as sns

# targetのヒストグラムを作る
plt.figure(figsize=(10,4))
plt.hist(train_df["target"], bins=50)
plt.title('Histgram of Target')
plt.xlabel("target")
plt.ylabel("count")
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/128b57c1-9538-c58b-fc14-17156cb03e94.png)
-30周辺のtargetは9σ離れており、異常値として削除してもよさそう
※targetは正規分布として
```python
train_df.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/9e0af3bb-8351-f02d-9448-cee21261db74.png)
上昇傾向？2012年2月~5月間に異常値が集結している模様
```python
# first_active_monthをdatetime方にしたdfを用意
# 可視化した際、x軸のmonthの表示間隔を調整できるため。object型だとドリルアップできない。
train_df_term = train_df.copy()
train_df_term["first_active_month"] = pd.to_datetime(train_df_term["first_active_month"])

# first_active_monthはobjectタイプである
mean_target_per_month = train_df_term[["first_active_month", "target"]].groupby("first_active_month").mean().reset_index()
mean_target_per_month.columns = ["first_active_month", "mean_target"]

# 可視化
plt.figure(figsize=(20,4))
plt.plot(mean_target_per_month["first_active_month"], mean_target_per_month["mean_target"])
plt.title('Mean Target by Month')
plt.xlabel('Month')
plt.ylabel('MeanTaeget')
x_ticks = pd.date_range(start='2011-11', end='2018-02', freq='3M')
plt.xticks(x_ticks, [date.strftime('%Y-%m') for date in x_ticks])
plt.xticks(rotation=45)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/1c2d6c0d-cb7e-10eb-7061-227e13e9dd51.png)

相関行列を確認
```python
# 相関行列を作成
train_corr = train_df.corr()

train_corr
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/9e2e39e0-a586-d27b-49a6-eddb2e704973.png)

feature_1 と feature_3 に正の相関がみられる。どれもtargetとの相関はなし
```python
# ヒートマップ作成
plt.figure(figsize=(8,6))
sns.heatmap(train_corr, vmax=1, vmin=-1, center=0, annot=True)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/ab1b5d3d-da06-af1a-d2b9-0102305c3ee8.png)

～part2に続く～