はじめに
pandasでデータ分析を行うとき、分析の前に「そもそも手持ちのデータはどういうデータなのか」を概観することはとても重要です。この記事ではその方法について、まだまだ不慣れなので備忘録として書いておきます。
Pandasについて
pandasは、DataFrameとSeriesの2種類のデータ構造、およびデータ解析ツールを提供してくれるPythonライブラリです。
データを概観するメソッド
ここでは、主に以下のメソッドに触れます。
- head():データの先頭の表示(デフォルトは5行)
- tail():データの末尾の表示(デフォルトは5行)
- info():データの要約
- describe():データの基本統計量
動作例を見てみましょう。動作環境は、Python 3.7.3, pandas 0.24.2 です。
まず、pandasをインポートし、データをDataFrameとして読み込みます。ここでは、kaggleのチュートリアルで使用されているタイタニックの乗船者のデータ(https://www.kaggle.com/c/titanic/data )を使います。
import pandas as pd
data = pd.read_csv("train.csv")
head()
head()は、DataFrameの先頭を表示するメソッドです。
data.head()
デフォルトでは、以下のようにDataFrameの先頭5行分が表示されます。
引数で、先頭の何行分を表示するかを指定できます。例えば、head(10)とすれば、先頭の10行分を表示できます。
data.head(10)
tail()
tail()は、DataFrameの末尾を表示するメソッドです。
data.tail()
デフォルトでは、DataFrameの末尾5行分が表示されます。head()メソッド同様、引数で末尾の何行分を表示するかを指定できます。(「末尾を確認する必要があるか?」と思う方もいるかもしれません。しかし、ファイルの末尾に備考欄など、データそのものではない入力があった場合、それがまとめてDataFrameに読み込まれてしまいます。こういった状況が発生していないかを確認したいとき、tail()が役に立ちます。)
info()
info()は、DataFrameの要約情報を表示するメソッドです。
data.info()
具体的には、DataFrameの行数、列数、各列の列名、各列に格納されるデータの型、メモリ使用量が表示されます。今回のデータの場合、行数は891(インデックスは0から890)、列数は12、各列の列名には PassengerId, Survived などがあること、格納されるデータの型にはint64, float64, object があること、メモリ使用量は83.6KBであることが確認できます。
<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でも取得できます。
data.index
RangeIndex(start=0, stop=891, step=1)
data.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
さらに、行数および列数だけならshapeで取得可能です。
data.shape
(891, 12)
describe()
describe()は、DataFrameの基本統計量を表示します。上から、データ数(count)、平均値(mean)、標準偏差(std)、最小値(min)、第一四分位数(25%)、中央値(50%)、第三四分位数(75%)、最大値(max)です。Ageのcountが行数891に一致しない理由は、欠損値が含まれるためです。
data.describe()
上に示したように、describe()はデフォルトでは数値データ(int型やfloat型など)の基本統計量を表示しますが、引数にinclude='O'(大文字のオーです)を指定することで、オブジェクトデータ(str型など)に関する情報を表示できます。このとき表示されるのは、上から、データ数(count)、重複を排除したデータ数(unique)、最も多く含まれるデータ(top)、そのデータが含まれる個数(freq)です。
data.describe(include='O')
さらに、引数にinclude='all'を指定することで、数値データとオブジェクトデータに関する情報を合わせて表示することができます。
data.describe(include='all')
オブジェクトデータについて、データの種類(重複を排除したデータ数)はdescribe()メソッドで確認できますが、そのデータの内訳を確認するときには、unique()メソッドが役に立ちます。例えば、性別のデータは2種類あることがdescribe()メソッドの実行結果から読み取れますが、以下のようにunique()メソッドを実行することで、その内訳は、'male', 'female'であることが確認できます。
data['Sex'].unique()
array(['male', 'female'], dtype=object)
数値データについて、25%刻み以外の分位数を確認したい場合は、quantile()メソッドが役立ちます。具体的には、確認したい分位数を0~1でquantile()メソッドの引数に指定して実行することで、さまざまな分位数を確認できます。例えば、年齢のデータ(data['Age'])に対して、0, 0.1, 0.2, ..., 1.0のリストをquantile()メソッドの引数に与えて実行することで、10%刻みで分位数を確認することができます。
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() の説明を追記