データ分析チートシート

# はじめに
　自分用にデータ分析チートシートを作成しました。

# Pandas
```python
import pands as pd
```

## <span style="color: yellow; ">データの要約</span>

| 関数名                        | 内容                       | メモ |
| :---------------------------- | :------------------------- | :--- |
| df.describe()                 | データ要約                 |      |
| df.info()                     | データ要約<br>欠測値の確認 |      |
| df.nunique()                  | ユニークな要素数の確認     |
| df['name'].value_counts() | 要素と出現回数の確認       |
| df.mean(axis=1)               | 列方向に平均値を算出       |
| df.groupby('age').max()       | グルーピングして算出       |
| df.corr()                     | Peasonの相関行列           |
| df.idxmax()                   | 最大値の行名を取得         |
| df.value_counts()             | 要素数の確認               |


<br><br>

## <span style="color: yellow; ">データ取り出し</span>


| 関数名                                | 内容                                  | メモ                     |
| :------------------------------------ | :------------------------------------ | :----------------------- |
| df.iloc(index,columns(数字)           | データ取出<br>[行,列(数字)]で指定する |                          |
| df.sort_index(axis=0)                 | インデックスで並べ替え                |                          |
| df.copy()                             | 値渡しでコピー                        | df2 = dfだとbyRef        |
| df.index.values                       | インデックスをnparrayで取り出し       | tolist()ならリストで出力 |
| df.loc[:,:]                           | 行・列を指定してデータを取り出し      | 列はラベルで指定         |
| df.iloc[:,:]                          | 行・列を指定してデータを取り出し      | 列はindexで指定          |
| df_copy.to_csv('t.csv')               | CSVに出力                             |
| df[df['age']>=30]                     | 指定条件でデータを抽出                |
| df['sex'][df['sex']=='male']          | 指定条件 & 指定列                     |
| df.query('sex=="female" and age>=40') | 指定条件をクエリで指定                |
| df.query(' a == @x')                  | x=1等、変数を使用して検索条件を指定   |
| df.query(' a in @y')                  | y=[1,2,3]等、変数リストを使用         |
| df.query('name.str.contains("Sato")')  | 文字列に特定文字が含まれる場合        |'　"を使い分ける
<br><br>

## <span style="color: yellow; ">加工</span>

| 関数名                                 | 内容                              | メモ |
| :------------------------------------- | :-------------------------------- | :--- |
| df.round()                             | 数字の丸め                        |
| df.drop(3,axis=0)                      | 軸を指定してdropする              |
| df.rename(columns={'name':'nickname'})     | 列名をリネーム                    |
| df.rename(index={1:10})                | indexをリネーム                   |
| df['age'] = df['age'].fillna(17)       | Na(欠測値)を置換                  |
| df.dropna()                            | 一つでも欠測値がある行を削除      |
| df.sample(frac=0.5)                    | データの一部をランダムに抽出      |
| df2.drop_duplicates()                  | 重複行を削除                      |
| df.transpose()                         | 行と列を入れ替え                  |
| pd.merge(df2,df3,on='name',how='left') | SQLのように指定列に対して結合する |
| pd.get_dummies(df, colums=['sex'])    | ワンホットエンコーディング        |

<br><br>

## <span style="color: yellow; ">グラフ化</span>

```python
# 以下を入力することで、日本語対応可能
from matplotlib import rcParams
rcParams['font.family'] = 'meiryo'
```


| 関数名                           | 内容         | メモ                           |
| :------------------------------- | :----------- | :----------------------------- |
| df.hist()                        | ヒストグラム |
| df.plot(kind='hist',x=a)         | ヒストグラム | kind = bar, scatterなど種々グラフに対応                    |
| pd.plotting.scatter_matrix(df)   | 散布図行列   | sns.pairplot()の方がベターか？ |
| df.plot(kind='scatter', x=a,y=b) | 個別散布図   |

<br><br><br><br>
# seaborn
```python
import seaborn as sns
# 以下を入れることで日本語対応
from matplotlib import rcParams
rcParams['font.family'] = 'meiryo'
```
#### 参考
[Python初学者のためのPandas100本ノック](https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c)

<br><br>
----

# scikit-learn
インポート時はそれぞれのクラスをインポートして使用することが多い。

```python
from scikit-learn import MinMaxScaler
```
<br><br>
## <span style="color: yellow; ">標準化の方法</span>
scikit-learnで標準化を行う場合、keras等と同様に `StandardScaler`をインスタンス化したのち、fitで訓練 → transformで適応する。

```python
# 標準化モデルのインスタンス化
scaler = StandardScaler()
# データ訓練
scaler.fit(df)

# 訓練データで変換 (出力は多重リスト)
df_std = scaler.transform(df)

# データフレームへ変換
df_std = pd.DataFrame(df_std, columns=df.columns)

# 元データへの変換
df_inverse = scaler.inverse_transform(df_std)
```

<br><br>

## <span style="color: yellow; ">ラベルのエンコーディング</span>
`StandardScaler`と同様に`LabelEncoder`をインスタンス化して使用する。


```python
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder() #ラベルエンコーダのインスタンスを作成

df['sex'] = le.fit_transform(df['sex']) #エンコーディング
df.head()
```

<br><br>

## <span style="color: yellow; ">テストデータの分割</span>
単純にデータを分解する方法は以下の通り。

```python
from sklearn.model_selection import  train_test_split
(features , test_X , target , test_y) = train_test_split(features, target , test_size = 0.3 , random_state = 0)
```
#### 参考

[sklearn.model_selection.cross_val_score](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html?highlight=cross_val_score#sklearn.model_selection.cross_val_score)


<br><br>

## <span style="color: yellow; ">予測の実行と評価</span>
単純にデータを分解する方法は以下の通り。

```python
from sklearn.ensemble import RandomForestClassifier
# ランダムフォレストのインスタンスを作成
model = RandomForestClassifier(n_estimators=100,random_state=0)
# 学習の実行
model.fit(features,target)
# 予測の実行
pred = model.predict(test_X)


# 予測の整合性確認（評価指標は選択する必要有）
from sklearn.metrics import accuracy_score
accuracy_score(pred,test_y)

# 特徴量の重要度を表示
importace = model.feature_importances_
print('Feature Importances:')
for i, feat in enumerate(['pclass','age','sex','fare','embarked']):
    print('\t{0:20s} : {1:>.5f}'.format(feat, importace[i]))
```
#### 参考
[sklearn.ensemble.RandomForestClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html?highlight=randomforestclassifier#sklearn.ensemble.RandomForestClassifier)