LoginSignup
70
72

More than 3 years have passed since last update.

Pandasでデータ概観

Last updated at Posted at 2018-05-21

はじめに

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().jpg

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

data.head(10)

head(10).jpg

tail()

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

data.tail()

tail().jpg

デフォルトでは、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().png

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

data.describe(include='O')

describe(include=['O']).jpg

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

data.describe(include='all')

describe(include='all').jpg

オブジェクトデータについて、データの種類(重複を排除したデータ数)は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() の説明を追記
70
72
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
72