Pandasでデータ概観

# はじめに
pandasでデータ分析を行うとき、分析の前に「そもそも手持ちのデータはどういうデータなのか」を概観することはとても重要です。この記事ではその方法について、まだまだ不慣れなので備忘録として書いておきます。

# Pandasについて
pandasは、DataFrameとSeriesの2種類のデータ構造、およびデータ解析ツールを提供してくれるPythonライブラリです。

- 公式ドキュメント：https://pandas.pydata.org/pandas-docs/stable/

# データを概観するメソッド
ここでは、主に以下のメソッドに触れます。

- head()：データの先頭の表示（デフォルトは5行）
- tail()：データの末尾の表示（デフォルトは5行）
- info()：データの要約
- describe()：データの基本統計量

動作例を見てみましょう。動作環境は、Python 3.7.3, pandas 0.24.2 です。
まず、pandasをインポートし、データをDataFrameとして読み込みます。ここでは、kaggleのチュートリアルで使用されているタイタニックの乗船者のデータ（https://www.kaggle.com/c/titanic/data ）を使います。

```python
import pandas as pd
data = pd.read_csv("train.csv")
```

## head()
head()は、DataFrameの先頭を表示するメソッドです。

```python
data.head()
```
デフォルトでは、以下のようにDataFrameの先頭5行分が表示されます。

<img width="731" alt="head().jpg" src="https://qiita-image-store.s3.amazonaws.com/0/258694/2baf0579-fbaf-d8c5-e498-65870e2b6a07.jpeg">

引数で、先頭の何行分を表示するかを指定できます。例えば、head(10)とすれば、先頭の10行分を表示できます。

```python
data.head(10)
```
<img width="740" alt="head(10).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/258694/804665cc-feac-29b1-9bcd-99d5b0d77e74.jpeg">

## tail()
tail()は、DataFrameの末尾を表示するメソッドです。

```python
data.tail()
```

<img width="664" alt="tail().jpg" src="https://qiita-image-store.s3.amazonaws.com/0/258694/a40ff5df-880f-d3e5-e16b-706df23ac76e.jpeg">

デフォルトでは、DataFrameの末尾5行分が表示されます。head()メソッド同様、引数で末尾の何行分を表示するかを指定できます。（「末尾を確認する必要があるか？」と思う方もいるかもしれません。しかし、ファイルの末尾に備考欄など、データそのものではない入力があった場合、それがまとめてDataFrameに読み込まれてしまいます。こういった状況が発生していないかを確認したいとき、tail()が役に立ちます。）

## info()
info()は、DataFrameの要約情報を表示するメソッドです。

```python
data.info()
```

具体的には、DataFrameの行数、列数、各列の列名、各列に格納されるデータの型、メモリ使用量が表示されます。今回のデータの場合、行数は891（インデックスは0から890）、列数は12、各列の列名には PassengerId, Survived などがあること、格納されるデータの型にはint64, float64, object があること、メモリ使用量は83.6KBであることが確認できます。

```python
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
```
また、行のインデックスの情報、および列名はindex, columnsでも取得できます。

```python
data.index

RangeIndex(start=0, stop=891, step=1)
```

```py
data.columns

Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
```

さらに、行数および列数だけならshapeで取得可能です。

```python
data.shape

(891, 12)
```

## describe()
describe()は、DataFrameの基本統計量を表示します。上から、データ数（count）、平均値（mean）、標準偏差（std）、最小値（min）、第一四分位数（25%）、中央値（50%）、第三四分位数（75%）、最大値（max）です。Ageのcountが行数891に一致しない理由は、欠損値が含まれるためです。

```python
data.describe()
```

<img width="443" alt="describe().png" src="https://qiita-image-store.s3.amazonaws.com/0/258694/b56a3241-a54e-9329-3585-99154c680f46.png">

上に示したように、describe()はデフォルトでは数値データ（int型やfloat型など）の基本統計量を表示しますが、引数にinclude='O'（大文字のオーです）を指定することで、オブジェクトデータ（str型など）に関する情報を表示できます。このとき表示されるのは、上から、データ数（count）、重複を排除したデータ数（unique）、最も多く含まれるデータ（top）、そのデータが含まれる個数（freq）です。

```python
data.describe(include='O')
```

<img width="316" alt="describe(include=[&#x27;O&#x27;]).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/258694/6bf56f65-f05a-f7a1-076b-d7230a584fcc.jpeg">

さらに、引数にinclude='all'を指定することで、数値データとオブジェクトデータに関する情報を合わせて表示することができます。

```python
data.describe(include='all')
```

<img width="721" alt="describe(include=&#x27;all&#x27;).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/258694/9287f107-172f-88c7-13a0-6ce712fa41b0.jpeg">

オブジェクトデータについて、データの種類（重複を排除したデータ数）はdescribe()メソッドで確認できますが、そのデータの内訳を確認するときには、unique()メソッドが役に立ちます。例えば、性別のデータは2種類あることがdescribe()メソッドの実行結果から読み取れますが、以下のようにunique()メソッドを実行することで、その内訳は、'male', 'female'であることが確認できます。

```python
data['Sex'].unique()

array(['male', 'female'], dtype=object)
```

数値データについて、25％刻み以外の分位数を確認したい場合は、quantile()メソッドが役立ちます。具体的には、確認したい分位数を0~1でquantile()メソッドの引数に指定して実行することで、さまざまな分位数を確認できます。例えば、年齢のデータ（data['Age']）に対して、0, 0.1, 0.2, ..., 1.0のリストをquantile()メソッドの引数に与えて実行することで、10％刻みで分位数を確認することができます。

```python
data['Age'].quantile([0.1*i for i in range(11)])

0.0     0.42
0.1    14.00
0.2    19.00
0.3    22.00
0.4    25.00
0.5    28.00
0.6    31.80
0.7    36.00
0.8    41.00
0.9    50.00
1.0    80.00
Name: Age, dtype: float64
```

# まとめ
この記事では、pandasでデータ分析を行うとき、分析の前に「そもそも手持ちのデータはどういうデータなのか」を概観するためのメソッドについて触れました。
手を動かして、いろいろなデータの特徴を把握してみるのがいいかもしれませんね。

# 更新履歴
- （2019/09/28）unique(), quantile() の説明を追記