前回は、Pythonで高度なデータ可視化を実現するためのSeabornライブラリの使い方を説明しました。
Seabornは優れたライブラリで、私はいつも好んで使っていますが、少し高度なライブラリであり、慣れるまでに少し時間と練習が必要です。
今回は、もう一つの非常に便利なPythonライブラリであるPandasを、Pythonでのデータ可視化にどのように使用できるかを見ていきます。
Pandasは、PythonライブラリPandasの初心者向けチュートリアルの記事で説明したように、主に様々な形式のデータセットをインポートして管理するために使用されます。
Pandasのデータ可視化機能はあまり知られていません。
この記事では、Pandasのデータ可視化機能に焦点を当てます。
Seabornと同様に、Pandasのデータ可視化機能もMatplotlibライブラリをベースにしていることは適切な言及と言えます。
しかし、Pandasでは、この記事で紹介するPandasのデータフレームから直接、様々な種類の視覚化をプロットすることができます。
基本プロット
このセクションでは、Pandasのデータフレームを使用して、ヒストグラム、カウントプロット、散布図などの簡単なプロットを作成する方法を説明します。
データセット
これらのグラフをプロットするために使用するデータセットは、有名なタイタニックデータセットである。
このデータセットはKaggleからダウンロードすることができます。
この記事では、train.csv
ファイルを使用します。
データセットをアプリケーションにインポートする前に、必要なライブラリをインポートする必要があります。
以下のスクリプトを実行してください。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
以下のスクリプトはデータセットをインポートします。
titanic_data = pd.read_csv(r"E:Datasets rain.csv")
では、実際にデータセットがどのように見えるか見てみましょう。
以下のスクリプトを実行してください。
titanic_data.head()
出力はこのようになる。
このデータセットには、1912年に北大西洋で沈没した不運な船タイタニックの乗客に関する情報が含まれていることがわかる。
このデータセットには、名前、年齢、乗客のクラス、乗客が生存しているかどうか、などの情報が含まれています。
この情報を使って、いくつかの基本的なグラフを描いてみましょう。
ヒストグラム
任意の列に対してヒストグラムを描くには、列の名前に続けて、以下に示す hist()
メソッドを指定する必要があります。
titanic_data['Age'].hist()
Pandasのデータフレームを使って年齢列のヒストグラムを描くことがいかに簡単であるかがわかります。
上のスクリプトの出力は次のようになります。
Pandas は裏で Matplotlib ライブラリを使用しているので、hist()
メソッドに Matplotlib ベースのパラメータを渡すことができます。
例えば、ヒストグラムのビンの数を増やすには、以下のように bin
属性を使用します。
titanic_data['Age'].hist(bins=20)
上記のスクリプトでは、ヒストグラムのビンの数を20に設定しました。
出力はこのようになります。
Seabornライブラリをインポートして、その set_style
属性に値を設定することにより、プロットのスタイルを改善することができます。
例えば、グリッドのスタイルをダークグレーに設定してみましょう。
以下のスクリプトを実行してください。
import seaborn as sns
sns.set_style('darkgrid')
ここでもう一度、次のスクリプトを使ってヒストグラムをプロットしてください。
titanic_data['Age'].hist(bins=20)
出力では、プロットの背景に濃い灰色のグリッドが見えるでしょう。
データフレームを使用してグラフをプロットする方法は2つあります。
その1つは、以下のように plot
関数の kind
パラメータに値を渡す方法です。
titanic_data['Age'].plot(kind='hist', bins=20)
出力はこのようになります。
もうひとつの方法は、関数名を kind
属性に渡さずに、 plot
関数を使って直接プロットのためのメソッド名を呼び出す方法です。
ここでは、2番目の方法(plot
関数を使用してプロットのメソッド名を呼び出す)を使用することにします。
ラインプロット
Pandas のデータフレームで折れ線グラフを描くには、以下のように plot
関数を使って line()
メソッドを呼び出し、x-index と y-axis に値を与える必要があります。
titanic_data.plot.line(x='Age', y='Fare', figsize=(8,6))
上のスクリプトは、X軸に乗客の年齢、Y軸に乗客が支払った運賃をとって折れ線グラフを描画します。
figsize` 属性を使ってプロットの大きさを変更できることがわかります。
出力はこのようになります。
散布図
Pandas のデータフレームで線グラフを描くには、以下のように plot
関数を使って scatter()
メソッドを呼び出し、x-index と y-axis に値を与える必要があります。
titanic_data.plot.scatter(x='Age', y='Fare', figsize=(8,6))
上のスクリプトの出力は以下のようになります。
ボックスプロット
Pandasのデータフレームはボックスプロットを行うために使用することもできます。
pandas dataframe の plot
関数を用いて box()
メソッドを呼び出すだけでよいのです。
titanic_data.plot.box(figsize=(10,8))
出力では、Titanicデータセットのすべての数値カラムの箱ひげ図が表示されます。
六角形プロット
六角形プロットは、x軸とy軸で交差するデータ点を六角形にプロットする。
より多くの点が交差するほど、六角形はより暗くなります。
Pandas のデータフレームで六角形プロットを行うには、以下のように plot
関数を使用して hexbin()
メソッドを呼び出し、x-index と y-axis に値を渡す必要があります。
titanic_data.plot.hexbin(x='Age', y='Fare', gridsize=30, figsize=(8,6))
出力では、X軸に年齢、Y軸に運賃をとった六角形のプロットが表示されます。
カーネル密度プロット
Seaborn や Matplotlib と同様に、Pandas ライブラリでもカーネル密度プロットを描画することができます。
Pandas のデータフレームでカーネル密度プロットを行うには、 plot
関数を用いて kde()
メソッドを呼び出す必要があります。
titanic_data['Age'].plot.kde()
上のスクリプトの出力は以下のようになります。
このセクションでは、Pandasライブラリがどのように最も基本的なプロットを描くために使われるかを見ました。
しかし、データ可視化のための Pandas ライブラリのアプリケーションは、そのような基本的なプロットに限定されるものではありません。
むしろ、Pandas は次のセクションで見るように、時系列データを可視化するために使用することもできます。
時系列を可視化するPandas
時系列データとは、属性や特徴がデータセットの特徴でもある時間軸に依存するタイプのデータです。
時系列データの最も一般的な例としては、1時間あたりの販売個数、毎日の気温、毎日の株価などがあります。
これらの例では、データはある時間単位に依存し、その時間単位に従って変化する。
時間単位は、1時間、1日、1週間、1年など、さまざまです。
Pandasライブラリは、時系列データを可視化するために使用することができます。
Pandasライブラリには、タイムシフトやタイムサンプリングなど、時系列データに対して様々な処理を行うことができる関数が組み込まれています。
このセクションでは、Pandasライブラリがどのように時系列の可視化に使用されるかを、例を挙げて見ていきます。
その前に、時系列データが必要です。
データセット
先に述べたように、時系列データの例として、時間に対して変化する株価があります。
ここでは、5年間(2013年12月11日から2018年12月11日まで)のAAPL株価を使って、時系列データを可視化します。
このデータセットは、このYahoo Financeのリンクからダウンロードできます。
他の企業のティッカーデータは、そのウェブサイトに行き、企業名とデータをダウンロードしたい期間を入力するだけです。
データセットはCSVフォーマットでダウンロードされます。
Pandasで時系列データの可視化に使用するライブラリをインポートしてみましょう。
以下のスクリプトを実行します。
import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
次に、データセットをインポートするために、以下のようにPandasライブラリの read_csv()
メソッドを使用します。
apple_data = pd.read_csv(r'F:/AAPL.csv')
データセットがどのように見えるかを見るには、head()
関数を使います。
以下のスクリプトを実行します。
apple_data.head()
出力では、データセットの最初の5行を見ることができます。
データセットには、日付、その日の株価の始値と終値、その日の最高値と最安値、調整後の終値、そして出来高が含まれていることがわかる。
すべての列が Date に依存していることがわかる。
日付の列が変化すると、他のすべての列が変化する。
したがって、この場合、Dateはインデックスカラムとなります。
しかし、我々のデータセットでは、デフォルトで日付は文字列として扱われます。
まず、Date列の型をstringからDateTimeに変更し、Date列をインデックス列として設定する必要があります。
以下のスクリプトを実行して、DateTimeカラムの型をstringに変更します。
apple_data['Date'] = apple_data['Date'].apply(pd.to_datetime)
上のスクリプトでは、データセットのDateカラムの型を変更するために、to_datetime
メソッドを適用しています。
次に、Date カラムをインデックスカラムとして設定する必要があります。
次のスクリプトはそれを行うものです。
apple_data.set_index('Date', inplace=True)
上記のスクリプトでは、Pandasデータフレームの set_index
メソッドを使用し、パラメータとして ‘Date’ カラムを渡しています。
属性 inplace=True
は、変換がその場で行われ、結果を別の変数に格納する必要がないことを意味します。
では、もう一度 head()
関数を使って、データセットの最初の5行を表示してみましょう。
apple_data.head()
上のスクリプトの出力は次のようになります。
この出力から、Date列の値が太字になっていることがわかります。
これは、Date列がインデックス列として使われていることを強調しています。
タイムシフトのセクションに移る前に、Appleの株価の終値をプロットしてみましょう。
次のスクリプトを実行します。
plt.rcParams['figure.figsize'] = (8,6) # Change the plot size
apple_data["Close"].plot(grid=True)
上のスクリプトでは、単に ‘Close’ カラムに対して plot
メソッドを呼び出していることに注意してください。
日付に関する情報は何も指定していませんが、Date列はインデックス列なので、X軸はDate列の値を含み、Y軸は株価の終値を示します。
上のスクリプトの出力は次のようになります。
Pandasは時系列データに対して、タイムシフト、タイムサンプリング、ローリングエクスパンション、時系列予測など様々な可視化タスクを実行することができます。
この記事では、Pandasの時系列可視化の2つのアプリケーションを紹介します。
タイムシフトとタイムサンプリングです。
タイムシフト
タイムシフトとは、データをあるステップ数だけ前や後ろに移動させることである。
時系列シフトは、時系列分析において最も重要な作業の1つである。
先ほどはデータセットの先頭をプロットしたが、今度はまずデータセットの最後尾をプロットする。
後で、この先頭と末尾のデータフレームを使って、タイムシフトの効果を見ます。
データセットの末尾をプロットするには、次のように tail()
関数を使用します。
apple_data.tail()
出力では、以下のようにデータセットの最後の5行を見ることができます。
まず、データを前に動かして、タイムシフトがどのように正の方向に働くかを見てみよう。
データを特定の時間ステップだけ進めるには、データセットに対して shift()
メソッドを呼び出して、正の整数を渡せばよい。
例えば、次のスクリプトはデータを2ステップ進め、データの先頭を表示します。
apple_data.shift(2).head()
出力では、headの最初の2行のデータが2段階前に移動されるので、データが表示されないことがわかります。
出力では、以前は1番目のインデックス、すなわち2013-12-10に属していたデータが、2ステップ前進した後、以下のように3番目のインデックス、すなわち2013-12-12に属していることがわかります。
一方、データを後ろに移動させるには、再び shift()
関数を使いますが、負の値を指定する必要があります。
例えば、データを2段階後ろにずらすには、次のようなスクリプトを使用します。
apple_data.shift(-2).tail()
上のスクリプトでは、データを2ステップ後ろにシフトし、データの最後尾を表示しています。
出力では、以下のようにデータが2ステップ後ろに移動しているため、最後の2行にはレコードがないことがわかる。
タイムサンプリング
タイムサンプリングとは、インデックスカラムの集計値に基づいて、データの特徴や属性をグループ化することを指します。
例えば、データセット内のすべての年の年間最大始値株価を全体的に見たい場合、タイムサンプリングを使用することができます。
Pandasでタイムサンプリングを実装するのは非常に簡単です。
Pandasのデータフレームを使用して resample()
メソッドを呼び出す必要があります。
また、rule
属性の値を渡す必要があります。
この値は基本的に、データをグループ化する時間枠を指定するタイムオフセットです。
最後に、 mean
, max
, min
などの集計関数を呼び出す必要があります。
次のスクリプトは、データセットの各月について、すべての属性の最大値を表示します。
apple_data.resample(rule='M').max()
上のスクリプトの出力は次のようなものである。
属性 rule
のオフセット値の詳細な一覧は以下の通りである。
B business day frequency
C custom business day frequency (experimental)
D calendar day frequency
W weekly frequency
M month end frequency
SM semi-month end frequency (15th and end of month)
BM business month end frequency
CBM custom business month end frequency
MS month start frequency
SMS semi-month start frequency (1st and 15th)
BMS business month start frequency
CBMS custom business month start frequency
Q quarter end frequency
BQ business quarter end frequency
QS quarter start frequency
BQS business quarter start frequency
A year end frequency
BA business year end frequency
AS year start frequency
BAS business year start frequency
BH business hour frequency
H hourly frequency
T minutely frequency
S secondly frequency
L milliseonds
U microseconds
N nanoseconds
上記のリストはOfficial Pandas Documentationから引用しています。
それでは、このデータセットの四半期ごと(3ヶ月ごと)の平均値を出力してみましょう。
オフセット一覧から、四半期ごとの頻度には Q
が使われていることがわかります。
以下のスクリプトを実行してください。
apple_data.resample(rule='Q').mean()
上のスクリプトの出力は次のようになります。
データセット内のすべての列の集計値を見つけるだけでなく、特定の列のデータを再サンプルすることもできます。
また、特定の列のデータを再標本化することもできる。
データセットの’Close’属性の年平均値を表示する棒グラフをプロットしてみよう。
以下のスクリプトを実行します。
plt.rcParams['figure.figsize'] = (7, 5)
apple_data['Close'].resample('A').mean().plot(kind='bar')
棒グラフを描くには、集約関数の後で plot
関数を呼び出し、描きたいグラフの種類を渡せばよいことがわかります。
上のスクリプトの出力はこのようになります。
同様に、’Close’属性の月別最大株価値を表示する折れ線グラフを描くには、次のスクリプトを使用します。
plt.rcParams['figure.figsize'] = (7, 5)
apple_data['Close'].resample('M').max().plot(kind='line')
上のスクリプトの出力は次のようになります。
結論
Pandasはデータサイエンスに最も有用なPythonライブラリの1つです。
通常、Pandasはデータセットのインポート、操作、クリーニングのために使用されます。
しかし、この記事で示したように、Pandasはデータの可視化にも使用することができます。
この記事では、Pandasがどのように基本的なプロットを作成するために使用されるかを、さまざまな例で見てきました。
また、時系列データの可視化にPandasの機能をどのように使用できるかを学びました。
経験則から言うと、単純な棒グラフ、折れ線グラフ、カウントグラフを描画する必要がある場合は、Pandasを使用する必要があります。