統計的データ分析前の準備（pandas編）

# この記事の目的
データ分析を行うとき、統計的データ分析（EDA）を行っていると思います。
データを可視化する前の準備（データ加工）でpandasを使用すると思います。
そこで、データを眺める際に便利なpandasの機能を簡単に記事にまとめます。

# 便利機能
使用するデータは有名なタイタニックのデータを用いて説明します。
せっかくなんでSeabornから読み込んできましょう。
```python
df = sns.load_dataset('titanic')
```
**データの先頭を確認**
```python 
df.head()
```
![head.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/9fbe24dc-c498-7278-c14c-91f11168a816.png)
データの先頭5行を表示できます。
引数に数字を入れることで、その分表示できます。

**データの末尾を確認**
```python 
df.tail()
```
![ta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/3dfdb9e0-691e-432f-2222-6bf3d3f66203.png)

データの末尾５行を表示できます。

**データ全体の量を確認**
```python
df.shape
```
(891, 15)
インデックスの数とカラムの数を表示できます。

**データの情報を確認**
```python
df.info()
```
![ta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/43635ad8-6b88-2652-bed8-570a5fed25a7.png)
各カラムのデータ情報を確認できます。
non-nullとは欠損値ではないデータを意味しています。
このデータでは、deckというカラムのデータが欠損値が多いようですね。
あとは、どのような型でデータが入っているかもわかります。
ここで、数値に直す必要があるのか、ダミー変数、カテゴリー変数に直す必要があるのかなどを考える必要があります。

**データの要素の確認**
```python
df['pclass'].unique()
```
array([3, 1, 2], dtype=int64)
pclassというカラムには1,2,3というデータが入力されていることがわかります。
ちなみに、.**n**unique()とnを追加すると、要素数を確認できます。

**データの統計値の確認**
```python
df.describe()
```
![ta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/3127d726-71d4-0094-b78a-dbf1e6d1b6d7.png)

データの数、平均値、標準偏差などの統計値を算出することができます。

**各要素のデータ数の確認**
```python
df['pclass'].value_counts()
```
pclass
3    491
1    216
2    184
Name: count, dtype: int64

pclassの要素が1,2,3であり、それぞれどれだけデータがあるかを確認できます。
今回のデータでは3が491と一番データが多いようですね。

**グルーピング**
追記
以前まではエラーが生じて実行できませんでしたが、ご教授いただきましたので共有します。

groupbyのエラーメッセージとして
```
FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
```
numeric_onlyはデフォルトでFalseになっているため、mean()を取れない列（文字列のデータが含まれる列）があるときには、numeric_only=Trueを明示するか、必要な列だけを指定する必要があるみたいです。
```python
df.groupby('pclass').mean(numeric_only=True)
```
通常、groupby()はデータフレームをグループ化し、その後指定した処理を行うため、グループ化したデータフレーム全体を処理するのは無謀であるようです。

以下のように書き換えることが良いようです。
```python
group_df = df.groupby('pclass')
group_df[['age', 'sibsp']].mean()
```
この例ではデータフレームをグループ化し、それに対して必要な列のみに平均を出していますね。

非常に勉強になりました。
ご指摘いただきありがとうございました！！！

**ソート**
```python
df.sort_values('age')
```
![ta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/bb93a4e7-fcde-8f25-0c1b-1c71c9801ad4.png)

ageでソートをかけました。
デフォルトは昇順のため、降順にするなら以下のように書き換えてください。
```python
df.sort_values('age',ascending=False)
```
ascending=Flaseを追加すればできます。

**欠損値の確認**
```python
df.isnull().sum()
```
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

各カラムの欠損値の数を確認できます。
この情報から欠損値補完をどのようにしていくかを考えます。

欠損値を削除したい場合には
```python
df.dropna()
```
特定の数字で補完したい場合には（今回は0で補完）
```python
df['age'].fillna(0)
```
上記では年齢を0で補完しましたが、通常年齢は中央値や平均値で補完することが多いので、例として平均値で補完してみましょう。
```python
df['age'].fillna(df['age'].mean())
```
fillna()の引数にageの平均値を入れるだけですね。

**文字列のデータをダミー変数に変換**
```python
pd.get_dummies(df)
```
![ta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/e220f16d-da44-9107-35e1-3b8682bf8bff.png)
文字列で入力されていたデータがダミー変数に変換されましたね。
sex_femaleというカラムが追加され、sexカラムでmaleであれば0が、femaleであれば1が入力されていることがわかります。

ちなみに、カテゴリー変数に変換したい場合は
```python
df['sex'].astype('category')
```
でいけます。

**相関係数**
```python
df.corr()
```
相関係数は数字として出てくるので、Seabornなどでヒートマップを作成すると可視化できます。
```python
sns.heatmap(df.corr())
```

# まとめ
お疲れさまでした！
ひとまずはこのあたり知ってれば大丈夫だろってやつを紹介しました。
他にも、これ便利だよ～ってのがあれば紹介していただけると嬉しいです！！！

groupbyができない理由については調査しますが、もしわかる方いましたら教えてください( ；∀；)
それでは！！！