[Python] データ分析やるなら知っておきたい基本のキ _φ(･_･

# はじめに

Pythonが人気となっている昨今、興味で勉強してみたのでそこで得た知識をまとめました😊
特にデータ分析において基本的な内容を中心にまとめていますので、これから学習する人の一助となれば幸いです。

___

今回Python・データ分析を学習する際にUdemyを利用しました！
[【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門](https://www.udemy.com/optworks_1/)

【学べること】

* Pythonの基礎を身につけられます。
* 2つのケースを通して、ビジネス上のデータ分析ができるようになります。


わかりやすくてオススメの講座ですのでぜひ！！
___


# よく使用されるライブラリ

Pythonにはたくさんの標準または外部ライブラリがありますが、その中からこれからデータ分析をしていく人が知っておくと便利なPythonのライブラリを簡単にご紹介します。

## pandas
pandasはPythonのライブラリの1つで<font color="OrangeRed">データを効率的に扱う</font>ために開発されたものです。
例えばcsvファイルなどの基本的なデータファイルを読み込み、追加や、修正、削除、など様々な処理をすることができます。

## numpy
numpyはpythonのオープンソースライブラリで、<font color="OrangeRed">大規模な多次元配列や行列の演算など、科学技術計算を効率的に行う</font>ことができます。

## matplotlib
matplotlibを使うことでpythonで<font color="OrangeRed">データをグラフにプロット</font>データをグラフにプロットできるようになります。

## sklearn
scikit-learnはオープンソースライブラリで、<font color="OrangeRed">分類や回帰、クラスタリングなどの機能</font>が実装されています。


# まずは基礎集計

基礎集計とは？
具体的にデータを分析する前に行うデータの整理のこと。
異常値の発見やデータの分布の確認（ヒストグラム、散布図、箱ひげ図など）、欠損値の有無、変数の作成などを行ってデータの概要を知る。


## データの確認

### データの概要をみる

pandas を使用して簡単にデータ概要をみることができます👀

```
#データの冒頭5行を取得
df.head()

#データの末尾5行を取得
df.tail()

#データの型の確認
df.info()

```

⬇️ ```head()``` を使うとこんな感じで見られます☺️

<img width="953" alt="スクリーンショット 2018-05-19 14.36.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/8bb207e1-ebf7-d9ba-fdba-5a2cd7d29ae6.png">


### 欠損値
単純にデータがないもの（欠損値）を分析対象にはできないので、そこへの対応が必要になってくるわけです。
欠損値の確認には pandas の ``` isnull() ```を使用します。
```train```に学習用データが入っているとき、 ```train.isnull().sum()``` とすると以下のように各カラムにnull値が何個入っているかがわかります。

```
datetime           0
y                  0
week               0
soldout            0
name               0
kcal              41
remarks          186
event            193
payday           197
weather            0
precipitation      0
temperature        0
dtype: int64

```

で、欠損値調べてどうすんの？ 

・別のなんらかの値を代入（補間といいます）をする
・欠損値を含む行を削除する

という対応を行います。


ほかにも異常値の発見やデータの分布の確認（ヒストグラム、散布図、箱ひげ図など）など基礎集計の段階でやることは多く、ここでしっかり分析できていないとこの後の分析の質が落ちてしまいます😙

## 予測の種類

データ分析をするということを、「データからモデルを作成し予測を行う」という風に捉えたときに、
「どんなものを予測するのか」、という視点で問題を２通りに分けることができます。

### 回帰問題

目的変数が数値
▶️ 株価予想、売上予想、など

### 分類問題

目的変数がカテゴリ
▶️ 成功するかしないか、犬か猫か、など


## 過学習を疑え

過学習というのは、「学習に使ったデータに対しては精度が高く分析できるけど、他のデータに対しては精度が極端に低くなってしまう」モデルのことを指します。

###過学習の原因

・データが少ない時
・モデルが、問題に対して複雑すぎる時

汎用的な予測モデルをつくることが大事

# 特徴量

機械学習の分野では説明変数のことを「特徴量」と呼びます。

特徴量を作る
▶️ 与えられたデータを加工したら、他のデータを使用して予測の手がかりとなるものをつくること

<img width="500" alt="スクリーンショット 2018-05-19 18.15.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/a1a3db44-8912-0260-e622-8a87e794269d.png">

特徴量が多すぎてもよくない
→ 過学習の原因となる

## 特徴量の選び方

特徴量として何を選んでモデルを作成していくかは大きな問題です。重要なものだけを残して分析をしたい。
特徴量を選ぶ際の手法として代表的なものを3つ紹介します

### 単変量解析
目的変数とそれぞれの説明変数（特徴量）を１対１で確認し、取捨選択する。個々の特徴量を個別に考慮する。
▶️ 他の特徴量と組み合わさって意味を持つような特徴量は捨てられる。

特徴量が多すぎてモデルを作ることができない場合や、多くの特徴量が全く関係ないと思われるような場合には、この手法が有効。
sklearn では、```SelectPercentile```を用いる。

### モデルベース選択

教師あり学習モデルを1つ用いて特徴量の重要性を算出し、取捨選択していく手法。
sklearn では、```SelectFromModel```を用いる。

### 反復選択

特徴量を増減させながらモデルを生成し、良い特徴量を探る
sklearn では、```RFE```を用いる。


# 重回帰モデル

データ分析のメインであるモデル作成に関して見てみましょう☺️

まずは重回帰モデルの作成手順を簡単に見てみます🐕

👇ライブラリのインポート

```.python

from sklearn.linear_model import LinearRegression as LR
```

👇モデル作成

```.python

# モデル作成
model = LR()
model.fit("説明変数","目的変数")

# 傾き
model.coef_

# 切片
model.intercept_

```

# 決定木（機械学習）

決定木分析とは、「段階的にデータを分割していき、木のような分析結果を出力する」ものです。回帰、分類の両方が可能です。

<img width="800" alt="スクリーンショット 2018-05-22 0.21.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/138735/a7eb0403-f665-84e2-ee9e-3539074704bc.png">


## 実装


👇ライブラリのインポート

```.python

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.tree import DecisionTreeClassifier as DT
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image

```

👇モデル作成
・max_depth
深さ。深いほど分岐数が増えて説明力向上。```max_depth=2``` の場合は分岐数が最大２回となる。増やしすぎると過学習になることもあるので注意。

・min_samples_leaf=500
それぞれの葉に属する最小サンプル数。

```.python
clf1 = DT(max_depth = 2, min_samples_leaf=500)
clf1.fit("説明変数","目的変数")

```


👇モデルの可視化
決定木を可視化する為には、まず決定木の図データをdotファイルで書き出し、その後jupyter上で表示する必要があります。まずdotファイル書き出しにはexport_graphviz関数を使います。
（graphviz：テキストをグラフに変換するツール。インストールが必要）

```.python

# ① dotファイル作成
export_graphviz(clf1, out_file="tree.dot", feature_names=trainX.columns, class_names=["0","1"], filled=True, rounded=True)

# ② dotファイルからpngファイルを生成して表示
g = pydotplus.graph_from_dot_file(path="tree.dot")
Image(g.create_png())
```

## パラメーターの設定方法
決定木においてはモデル作成の際に```max_depth```や```min_samples_leaf```といったパラメーターに何を設定するかを考える必要があります。

その際によく使用されるのが「クロスバリデーション法」です。

### クロスバリデーション法

```
o : 学習データ
x : テストデータ

test1: |xx|oo|oo|
test2: |oo|xx|oo|
test3: |oo|oo|xx|
```

クロスバリデーション法では用意したデータを例えば3個に分けて、1回目はそのうちの一つをテストデータ、それ以外を学習データとして、学習・評価します。2回目は1回目と異なる別のデータをテストデータとして使い、3回目は1,2回目と異なるデータで評価をします。そして、各回で測定した精度の平均を取ります。


```.python

# 決定木モデルの箱
clf = DT(max_depth=2, min_samples_leaf=500)

# クロスバリデーションをして精度を確認する（cv: 分割数, scoring: 評価尺度, n_jobs: 処理に使用するCPU設定）
cross_validate(clf, "説明変数", "目的変数", cv=5, scoring="roc_auc",n_jobs=-1)

```

以下のように結果が出力されます

```

{'fit_time': array([0.12181211, 0.14208412, 0.15454793, 0.14222717, 0.09385228]),
 'score_time': array([0.00815201, 0.00657582, 0.00514817, 0.00531077, 0.00263095]),
 'test_score': array([0.88264002, 0.88482571, 0.86778474, 0.89238631, 0.88344359]),
 'train_score': array([0.88842017, 0.89038512, 0.89288003, 0.88763037, 0.88561317])}
```

・グリッドサーチ
パラメーターを設定してクロスバリデーション
→ 違うパラメーターを設定してクロスバリデーション
→ ・・・

という感じで複数のパラメーターを設定して調べていくのは手間が掛かってしまいます。
そんなときに、グリッドサーチを使用します。
グリッドサーチでは、パラメータの範囲を指定し、その範囲をしらみつぶしに調べることで、最適なパラメータを探索していきます。

👇グリッドサーチの実装

```.python
# 探索するパラメータの範囲を表す変数を作成
parameters = {"max_depth":list(range(2,11))}

# GridSearchCV関数を用いて最適なパラメーターを探す
gcv = GridSearchCV(clf, parameters, cv=5, scoring="roc_auc",n_jobs=-1)
gcv.fit(trainX, y)

# 結果の確認
gcv.best_params_

# 出力結果：{'max_depth': 6}

```


# おわりに

今回はPythonでデータ分析する際の概要をまとめてみました😁
Pythonは昨今注目度が高く、また実用性も高いです。
基本的な分析方法を学習し、[Kaggle](https://www.kaggle.com/)や[Signate](https://signate.jp/)といったコンテストに参加することで独学でも実践的な技術を身につけていけると思っています👍

では良いエンジニアライフを！！