Pandasの基本的な操作

こんにちは、Mottyです。
最近kaggleを初めましたので、必須であるPandasを使ったデータ加工の簡単な操作を記事にまとめていきたいと思います('`)。
・Kaggle公式HP
https://www.kaggle.com/
・Pandas UserGuide
https://pandas.pydata.org/docs/user_guide/index.html
##概要
PandasはPythonのデータ加工ライブラリです。テーブルの操作や集計、欠損値の補完などが簡単に行えます。他にも列を結合したり相関行列を表示したり、クロス集計できたり・・・と様々です。
![ 2020-07-31 18.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/bb30a588-be55-3b95-3659-b20d9d297e00.png)
##使用するデータ
kaggle定番ですが、タイタニックの生存状況に関するデータを使用します。

```python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib.inline
import pandas as pd
df_train = pd.read_csv("train.csv")
```
#データの確認
```python
df_train.columns #項目リスト
```
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')<Figure size 1080x1080 with 0 Axes>

```python
df_train.shape #サイズ
```
(891,12)　行列のサイズですね。
先頭の５行だけ覗いてみましょう。

```Python
df_train.head()
```

![ 2020-07-31 18.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/67f4e89c-19a6-4b70-30d2-40c954f80c61.png)
量的データと質的データが混在していますね。（PClassも互いに量的な関係ではないので質的データと見なせますね！。）
#列/行の抽出
```Python
df_train["Name"] #1列抽出
df_train.loc[:,["Name","Sex"]] #複数列抽出

df_train[10:15] #行抽出
df_train[10:20:2] #1行飛ばし

df_train[df_train["Age"] < 20] #値指定
df_train[1:300].query('Age < 20 and Sex == "male"') #queryで複数条件指定
```
#集計
```Python
df_train["Pclass"].value_counts()
```

3    491
1    216
2    184
Name: Pclass, dtype: int64
各項目についての集計結果を返してくれます。

#欠損値の確認
```python
df_train.isnull() #True→欠損値
df_train.isnull().sum()
```
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

各列項目のNaNの合計数が一覧で得られます。これを基に欠損値補完の方針を立てていきます。

#相関行列の表示
相関行列は各変数間の相関係数です。
```Python
df_train.corr() #相関係数の表示
```
PassengerId	Survived	Pclass	Age	SibSp	Parch	Fare
PassengerId	1.000000	-0.005007	-0.035144	0.036847	-0.057527	-0.001652	0.012658
Survived	-0.005007	1.000000	-0.338481	-0.077221	-0.035322	0.081629	0.257307
Pclass	-0.035144	-0.338481	1.000000	-0.369226	0.083081	0.018443	-0.549500
Age	0.036847	-0.077221	-0.369226	1.000000	-0.308247	-0.189119	0.096067
SibSp	-0.057527	-0.035322	0.083081	-0.308247	1.000000	0.414838	0.159651
Parch	-0.001652	0.081629	0.018443	-0.189119	0.414838	1.000000	0.216225
Fare	0.012658	0.257307	-0.549500	0.096067	0.159651	0.216225	1.000000

対角成分は自分自身との相関となるので必ず１となります。しかし量的データだけでなく、文字列（Sex,Embark)や数字を使った質的データ(Pclass)などがありこれらをone-hot表現に変換してあげなければなりません。

```Python
dummy_df = pd.get_dummies(df_train, columns = ["Sex","Embarked","Pclass"]) #ダミー変数の取得
dummy_df.columns
```
Index(['PassengerId', 'Survived', 'Name', 'Age', 'SibSp', 'Parch', 'Ticket',
       'Fare', 'Cabin', 'Sex_female', 'Sex_male', 'Embarked_C', 'Embarked_Q',
       'Embarked_S', 'Pclass_1', 'Pclass_2', 'Pclass_3'],
      dtype='object')

```Python
dummy_df.corr()
```
巨大なので書きませんが、先ほどの相関行列は文字列データについては省かれていました。今回は質的変数をダミー（0,1)に置き換えたものとの相関行列が返ってきます。

#可視化
seabornのHeatMapを使って相関行列をみてみましょう。カラーパレットは、０を中心として色の濃さが対照的なを選びました。

```Python
import seaborn as sns
plt.figure(figsize = (12,10))
sns.heatmap(dummy_df.corr(), cmap = "seismic",vmin = -1 ,vmax = 1, annot = True)
```
![ 2020-07-31 18.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/4a08703f-76d9-0132-1b50-89a6110a1cf3.png)

Servivedと高い相関関係にあるものが、Servivedに影響を及ぼしていると考えることができます。Sex_femaleとPclass_1との相関が高いですね。これは女性であったり部屋の階級が1である人の生存率が高いということになります。
うまく使ってあげれば機械学習の前段階で方針の目星はつけることもできるということですね！

##参考文献
以下の記事を参考にさせていただきました。
参考URL
・データ分析で頻出のPandas基本操作
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a
・追伸。そろそろおまえもseabornヒートマップを使うように。　母より
https://qiita.com/hiroyuki_kageyama/items/00d0f52724f16ad7cf77
参考書籍
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B07C3JFK3V/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07C3JFK3V&linkCode=as2&tag=organiccrypt-22&linkId=6c77a66b9fc05a4999cb9b22aa18a714">前処理大全［データ分析のためのSQL/R/Python実践テクニック］</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=organiccrypt-22&l=am2&o=9&a=B07C3JFK3V" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B084MD5DGG/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B084MD5DGG&linkCode=as2&tag=organiccrypt-22&linkId=01eb2e4908fc6bfcc725ec1e65d8f43f">現場で使える！pandasデータ前処理入門 機械学習・データサイエンスで役立つ前処理手法</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=organiccrypt-22&l=am2&o=9&a=B084MD5DGG" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

##終わりに
単にデータ処理だけならNumpy配列に入れるだけでもできるんじゃないの？と思っていましたが、データ加工が簡単にできるのが魅力ですね。逆にDataFrameに対して高度な計算を行うのであれば１度配列に移したほうがいいのかも・・・？