Pandas:図示#

in English or the language of your choice.

説明#

import pandas as pd
import numpy as np
import japanize_matplotlib

# 警告メッセージを非表示
import warnings
warnings.filterwarnings("ignore")

プロット用のパッケージMatplotlibを紹介したが,実はPandasDataFrameSeriesにはメソッドplot()が備えられており,それを使えば基本的なプロットをより簡単なコードで実現できる。裏で動いているのはMatplotlibであり,より複雑な図を作成する場合は、Matplotlibのコードを直接書くことが必要になるだろうが,手っ取り早くプロットしたい場合には重宝する手法である。詳細は参考サイト(英語)を参考にして欲しいが,ここでは基本的な使い方を紹介する。

次のdf0を使って説明する。

dic = {'X':[10, 20, 30],
       'Y':[5.0, 30.0, 15.0],
       'Z':[3.0, 2.0, 5.0]}
df0 = pd.DataFrame(dic)
df0
X Y Z
0 10 5.0 3.0
1 20 30.0 2.0
2 30 15.0 5.0

プロット方法#

プロット方法は簡単で,メソッド.plot()を使うと全ての列がプロットされる。

df0.plot()
<Axes: >
_images/57bd2f88fae2ab3b2eea98ea2523c618d542eb99d31deb0f9ba4e7ee192779c5.png
  • デフォルトでは横軸に行インデックスが使われ、floatとして扱われて表示されている。

  • 凡例は自動的に表示され、列ラベルが使われる。

  • 図の上に文字が表示されるが,表示したくない場合は最後に;を加えるか次の行にpassと書くと良いだろう。

次にある列だけをプロットしたい場合を考えよう。その場合は,プロットしたい列を抽出しメソッドplot()を使う。選択には[]を使い,その中に列ラベルをリストとして指定する。まず1つの列を選択する場合を考えよう。例えば,Xを選択するとしよう。この場合、2つの方法がある。

  • XSeriesとして抽出する場合

    df0['X']
    
  • XDataFrameとして抽出する場合

    df0[['X']]
    

    ここではXをリスト['X']として使っている。

列ラベルは文字列Xで指定していることに留意しよう。

まずXSeriesとして抽出しよう。

df0['X']
0    10
1    20
2    30
Name: X, dtype: int64

次にXDataFrameとして抽出する。

df0[['X']]
X
0 10
1 20
2 30

表示が少し異なることが確認できるが,メソッドplot()でも少しだけ違いがある。まずXSeriesとしてプロットしてみる。

df0['X'].plot()
pass
_images/9cc3dbf63ee0edc28a2a5deb7ebea7f3d332fc824e9b958545e2b835c446ac4a.png

XDataFrameとしてプロットすると凡例も表示される。

df0[['X']].plot()
pass
_images/a89b16dcd11e7fd7582d7147011ecd4f09b245073ca5c1093cd754ce07326f2f.png

この場合の凡例は列ラベルがそのまま使われている。

次にXZをプロットしたいとしよう。2つの列を抽出するためには,以下のように列ラベルをリストとして書く。

df0[['X','Z']]
X Z
0 10 3.0
1 20 2.0
2 30 5.0

メソッドplot()を使いプロットする。

df0[['X','Z']].plot()
pass
_images/78eeb7a4eabf8b03285e4ef2ae6bdd98b1846664ff9027513750a389f03dcc75.png

もしくはSeriesを2行に分けても同じ図となるが,凡例は表示されない。

df0['X'].plot()
df0['Z'].plot()
pass
_images/0ca68b1cd5a5218d28e331fb5b997a883ff6afb5eb205cc1783f8cb9bd84a637.png

デフォルトでは横軸に行インデックスが使われるが,横軸を指定したい場合は,次の引数を使う。

  • x:横軸に使う列ラベル

  • y:縦軸に使う列ラベル(複数の場合はリスト)

df0.plot(x='X',y=['Y','Z'])
pass
_images/bf997cb0ed0df0bd3ebeb664c691e87121da4420c0b36ab7a9b7d340ea604ac7.png

引数とメソッド#

基本的な引数#

plot()には様々な引数があり図に「飾り付け」をすることができる。詳しくはこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • style:線のスタイル(複数ある場合はリストにして列の順番で指定する;----.:

  • linewidth or lw:線の幅

  • color:色(リストにして列の順番で指定する; 参照サイト

    • rは赤

    • kは黒

    • gはグリーン

  • marker:観測値のマーカー(o.>^などがある; 参照サイト

  • markersize:マーカーの大きさ

  • fontsize:横軸・縦軸の数字のフォントサイズの設定

  • figsize:図の大きさ

    • figsize=(キャンバスの横幅、キャンバスの縦の長さ)

  • legend:凡例の表示を指定

    • DataFrameの場合はデフォルトはTrue

    • Seriesの場合はデフォルトはFalse

    • 複数の図を表示する際は下で説明する「軸」のメソッドとして指定することもできる。

  • label:凡例の表現を指定(Seriesのみ有効)

  • grid:グリッド表示(ブール型;デフォルトはFalse)

    • 複数の図を表示する際は,この引数は使わずに下で説明する「軸」のメソッドとして指定する。

  • ax:プロットする「軸」を指定する。

    • 1つの「軸」に複数の図を表示する際に使う(後で使い方を説明する)。

# df0はDataFrame

df0.plot(style=[':','--','-'],
         linewidth=2,
         color=['r','k','g'],
         marker='o',
         markersize=10,
         fontsize=15,
         figsize=(8, 4),   # 8は横軸、4は縦軸のサイズ
         legend=False,
         grid=True,
        )
pass
_images/9ee82492a7b671741349155a9b2b33e7314e310c0d275cd055e65a84c5f0ebcf.png

タイトルとラベルのサイズの調整#

タイトルのフォント・サイズの指定,横軸と縦軸のラベルとフォント・サイズの指定をおこなう場合は、plot()の引数ではなく下で説明する方法でおこなう。この方法を理解するために、Pandas(実はMatplotlib)が表示する図はFig. 4で示している階層的な構造となることをイメージして欲しい。ここで重要なのは「キャンバス」と「軸」の違いである。

_images/figure_axes_pandas.png

Fig. 4 「キャンバス」と「軸」の関係#

  1. 「キャンバス」とは実際に表示される領域であり,実際には表示されない「透明のキャンバス」である。

    • figurefigなどの変数名や引数名があれば、「キャンバス」を指していると理解すれば良いだろう。

  2. 「軸」とは1つの図を表示する「キャンバス」上の区域である。

    • axaxesなどの変数名があれば、「軸」を表していると理解すれば良いだろう。

    • 「キャンバス」上に複数の図を表示する場合は複数の「軸」が必要となる。

    • 「軸」に図のタイトルや縦軸・横軸のラベルなどを追加することになる。

「軸」の中にメソッド.plot()を使いグラフを表示することになる。

従って,概ね次のように理解して良いだろう。

  • 上で説明した「基本的な引数」は上の図のピンクのエリア内での変更となる。

    • figsizeは「キャンバス」の大きさを指定する引数だが,メソッドplot()は自動で「キャンバス」を作成するためplot()内で変更できるようになっている。

  • タイトルや縦・横軸ラベルは「軸」のメソッドを使い変更する。

では実際に手順を説明する。

  • df0.plot()は自動で「キャンバス」と「軸」を作成すると同時に「軸」を返す。それを変数(例えば,ax)に割り当てる。

  • axのメソッドを使って以下を設定する。

    • タイトル:.set_title()

    • 横軸ラベル:.set_xlabel()

    • 縦軸ラベル:.set_ylabel()

実際にそれらの引数を使ってプロットしてみよう。

ax = df0.plot(
              grid=True,
              style=[':','--','-'],
              marker='o',
              fontsize=15,
             )
ax.set_title('A Large Title', size= 30)     # タイトルの設定
ax.set_xlabel('Horizontal Axis', size=20)   # 横軸ラベルの設定
ax.set_ylabel('Vertical Axis', size=20)     # 縦軸ラベルの設定
pass
_images/0a0e248f729f0e222d68c11f0a13680b60dcb7a1bf659cdda0ef38cef5d04cfb.png

「軸」を指定してプロットする場合#

上で「軸」のメソッドとしてタイトルなどを追加できることを説明したが,plot()の引数として「軸」を指定して図を追加することができる。次のコードを考えてみよう。

ax_ = df0[['X','Y']].plot()  # 1行目
df0[['Z']].plot(ax=ax_)      # 2行目
pass
_images/57bd2f88fae2ab3b2eea98ea2523c618d542eb99d31deb0f9ba4e7ee192779c5.png

1行目の右辺では「キャンバス」と「軸」が自動生成され,その内「軸」のみが返され変数ax_に割り当てられている。2行目のplot()の引数axは「軸」を指定する引数であり,それにax_を設定している。即ち,Zを「軸」ax_にプロットすることを指定している。このコードには2つの利点がある。

  1. XYと異なる「飾り付け」をZに簡単に施すことができる。

  2. 2行目にdf0ではなく別のDataFrameを使うことも可能となる。

もちろん,タイトルや軸ラベルのメソッドをつけ加えることも可能である。

ax_ = df0[['X','Y']].plot(marker='o',markersize=10)
df0[['Z']].plot(ax=ax_, marker='^',markersize=15)
ax_.set_title('This is a title', size=20)
ax_.set_xlabel('Horizontal axis', size=15)
ax_.set_ylabel('Vertical axis', size=15)
ax_.grid()
ax_.legend(['Xの凡例','Yの凡例','Zの凡例'])
pass
_images/60cdb50440f140cb97f52a184196faa60182a85a2918771246b769423a62712a.png

また上のコードの最後に2行を付け加えているので便利なので参考にして欲しい。

  • ax_.grid():グリッド線を表示するメソッド。

    • 1つの「軸」にplotを複数回適用する場合,個々のplotの引数grid=Trueを使わずax_.grid()を指定する。

  • ax_.legend(['Xの凡例','Yの凡例','Zの凡例'])

    • 凡例に列ラベルではなく他の表現を指定したい場合に使う。

図を並べる#

図を縦に並べるにはsubplots=Trueを指定する。

df0.plot(subplots=True)
pass
_images/f5606ae56a990e8e8f17eeb17dcf0d3461eeb1812b4813e2fd39110ff995702d.png

図を横に並べるにはlayout=(1,3)を付け加える。layoutは図の配置を行列のように考えて指定し、1は行の数であり、3は列の数。

layout(行の数、列の数)
df0.plot(subplots=True, layout=(1,3), figsize=(8,3))
pass
_images/f11f1ef89b7f86d12f8c2d17994a03ac9a60f04206da904dc29d3c0e07106ee3.png

2軸グラフ#

左軸をXYに,右軸をZに使うとしよう。その場合,引数secondary_yZを設定する。

df0.plot(secondary_y='Z')
pass
_images/2179ef02240a856ba6413a0b44e6af434cd6ef2df5d415cfec2d8b717c5d4dbe.png

別々の飾り付けをする場合は次のようにすると良いだろう。

ax_ = df0[['X','Y']].plot()
df0[['Z']].plot(marker='x', markersize=10, linestyle=':',
                secondary_y=True, ax=ax_)
pass
_images/f9ce3f629e544ebbb47e461b5d8cad9e48932a5a0edf355219d8cf109f57d33f.png

上の図との主な違いが3行目にある

  • secondary_y=TrueZを右軸に使うことを指定する。

  • ax=ax_:「軸」ax_Zをプロットする。

日本語#

2つ方法を紹介するが、japanize_matplotlibを使う方法がより簡単であろう。

japanize_matplotlib#

使い方は到って簡単で、Pandasと同様にインポートするだけである。

import japanize_matplotlib
ax = df0.plot(grid=True
             ,style=[':','--','-']
             ,marker='o'
             ,fontsize=15
             )
ax.set_title('縦横タイトル', size= 30)
ax.set_xlabel('横軸', size=20)
ax.set_ylabel('縦軸', size=20)
pass
_images/a9ad7ac17dbf5fe309c7c07e65c63e04646af1ebe454ccd0ec5dd46f7b428c97.png

フォントを指定する#

2つの方法:

  1. フォントはインストールせず、PC内にあるフォントを指定する。

  2. フォントをインストールする方法

方法1の場合、以下で説明に使う変数jfontにフォントを指定する。 * Macの場合、例えばAppleGothic * Windowsの場合、例えばYu Gothic * この方法では一部の日本語が文字化けする場合がある。

方法2の場合:

  • このサイトから次の内の1つをダウンロードする。

  • このサイトに従ってインストールする。

  • 次の両方もしくは1つがPCにインストールされる

    • IPAexMincho(IPAex明朝)

    • IPAexGothic(IPAexゴシック)

上の例を使い、設定方法の例を示す。

jfont = 'IPAexGothic'    # (1)

ax = df0.plot(grid=True
             ,style=[':','--','-']
             ,marker='o'
             ,fontsize=15
             )
ax.set_title('縦横タイトル', size= 30, fontname=jfont)   # (2)
ax.set_xlabel('横軸', size=20, fontname=jfont)          # (3)
ax.set_ylabel('縦軸', size=20, fontname=jfont)          # (4)
ax.legend(prop={'family':jfont, 'size':17})            # (5)
pass
_images/941e18d3148489c491370ef3f1b7f3e934e6057adecb03f5452dda4a37cc061c.png
  • (1) 使用するフォントをjfontに割り当てる。

  • (2) 引数fontnamejfontを指定する。タイトルのフォントが変更される。

  • (3) 引数fontnamejfontを指定する。横軸名のフォントが変更される。

  • (4) 引数fontnamejfontを指定する。縦軸名のフォントが変更される。

  • (5) legendは他と設定方法が異なる。 * propはフォントのプロパティを設定する引数であり、辞書で指定する。 * キーfamilyに値jfontを指定する。凡例のフォントが変更される。 * キーsizeに数値を設定してフォントの大きさが変更される。

この例では個別にフォントを設定したが、一括で全てのフォントを変更する方法もあるが説明は割愛する。

マクロ経済学の例#

投資関数#

実質利子率rによって投資がどのように変化するかを考えてみよう。まず投資関数を次のように仮定する。

def investment(r):
    return 100/(1+r)**50
  • 100:実質利子率が0の場合の投資

実質利子率は次のarrayで与えられるとする。

r_arr = np.arange(0.01,0.11,0.01)
r_arr
array([0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ])

次に関数investmentr_arrを使い投資のarrayを作成しよう。

inv_arr = investment(r_arr)
inv_arr
array([60.80388247, 37.15278821, 22.81070798, 14.07126153,  8.7203727 ,
        5.42883618,  3.39477594,  2.13212286,  1.34485389,  0.85185513])

これらのデータを使いDataFrameを作成する。

df_inv = pd.DataFrame({'investment':inv_arr,
                       'interest_rate':r_arr})

最初の5行を表示する。

df_inv.head()
investment interest_rate
0 60.803882 0.01
1 37.152788 0.02
2 22.810708 0.03
3 14.071262 0.04
4 8.720373 0.05

ではプロットしてみよう。

df_inv.plot('interest_rate','investment')
pass
_images/530719cfef5f6f45cdce3da7ef7800c9dd87777405ba4394ac23fb4dc50d2817.png

将来価値#

x万円を実質年率r%の利息を得る金融商品に投資し,t年間の将来価値(期首の値)をリストで示す関数は以下で与えられた。

def calculate_futre_value(x, r, t):
    
    value_list = [x]           # 初期値が入ったリスト
    
    for year in range(1,t+1):  # 1からtまでの期間
        x = x*(1+r)            # 来期のxの値の計算
        value_list.append(x)   # リストに追加
    
    return value_list          # リストを返す

これを使い,

  • x=100

  • t=30

の下で実質利子率が次のリストで与えられる値を取る場合の将来価値を図示する。

r_list = [0.01, 0.03, 0.06]   # 実質利子率のリスト
dic = {}                      # 空の辞書

for r in r_list:
    dic['r='+str(r)] = calculate_futre_value(100, r, 30)  # 辞書に追加

df_future = pd.DataFrame(dic) # DataFrameの作成

dic['r='+str(r)]の説明:

  • str(r)r_listの要素のダミーであるrは浮動小数点型なので関数str()を使って文字列型に変換する。

  • 'r='+str(r):文字列型のr=と文字列型のstr(r)+で結合する。

  • dic['r='+str(r)]:辞書dicにキー・値のペアを作成する。

    • キー:'r='+str(r)

    • 値:calculate_futre_value(100, r, 30)の返り値

最初の5行を表示する。

df_future.head()
r=0.01 r=0.03 r=0.06
0 100.000000 100.000000 100.000000
1 101.000000 103.000000 106.000000
2 102.010000 106.090000 112.360000
3 103.030100 109.272700 119.101600
4 104.060401 112.550881 126.247696

最後の5行を表示する。

df_future.tail()
r=0.01 r=0.03 r=0.06
26 129.525631 215.659127 454.938296
27 130.820888 222.128901 482.234594
28 132.129097 228.792768 511.168670
29 133.450388 235.656551 541.838790
30 134.784892 242.726247 574.349117
df_future.plot()
pass
_images/9036674e7c9aeebf275efb83c4b3f8fd65a90a2cf14718b63f128733e1f6f5b0.png

その他のプロット#

種類#

メソッド.plot()には様々な引数が用意されているが,その中にkindがある。次を文字列として指定すると様々な種類のプロットが可能となる。

  • line:ライン・プロット

    • デフォルトの値であり,上で説明した直線・曲線のプロットとなる。

    • .plot().plot.line()と同じでもある。

    • プロットの例

  • bar:縦向きの棒グラフ(カテゴリーなどの離散変数に使う)

  • barh:横向き棒グラフ(カテゴリーなどの離散変数に使う)

    • barhhはHorizontalのH

    • .plot(kind='hbar').plot.hbar()と同じでもある。

    • プロットの例

  • hist:ヒストグラム(連続変数に使う)

    • histはHISTogramのHIST

    • .plot(kind='hist').plot.hist()と同じでもある。

    • プロットの例

  • box:ボックスプロット

  • kde:カーネル密度推定プロット

    • kdeはKernel Density EstimateのKDE

    • .plot(kind='kde').plot.kde()と同じでもある。

    • プロットの例

  • densitykdeと同じ

  • area:エリア・プロット

  • pie:パイチャート

  • scatter:散布図(DataFrameのみ)

  • hexbin: : 六角形プロット(DataFrameのみ)

上で説明したライン・プロットの引数は他のプロットと共通のものが多いが,それぞれ独自の引数もある。

以下では散布図,ヒストグラム,カーネル密度推定プロット,棒グラフについて説明する。

説明には次のコードで生成するDataFrameを使う。列XYには標準正規分布(平均0,標準偏差1)から生成した100個のランダム変数が含まれている。Zには正規分布(平均2,標準偏差1)から抽出した100個のランダム変数が格納されている。

df1 = pd.DataFrame({'X':np.random.normal(size=100),
                    'Y':np.random.normal(size=100),
                    'Z':np.random.normal(loc=2, size=100)})

XYは同じ標準正規分布から生成されているが,異なる値から構成されている。

散布図#

散布図をプロットする場合は次の構文となる。

df1.plot(<横軸の列ラベル>, <縦軸の列ラベル>, kind='scatter')

XYを使ってプロットしてみよう。

df1.plot('X', 'Y', kind='scatter')
pass
_images/25b014dfa853294e8c597db86b610830c6747beb3625873ccd61ba085e9a9151.png

<基本的な引数>

様々な引数があり図に「飾り付け」をすることができる。詳しくはこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • title:図のタイトル(文字列型で指定)

  • color:色(リストにして列の順番で指定する; 参照サイト

    • rは赤

    • kは黒

    • gはグリーン

  • marker:観測値のマーカー(o.>^などがある; 参照サイト

  • s:マーカーの大きさ(markersizeではない!)

  • fontsize:横軸・縦軸の数字のフォントサイズの設定

  • figsize:図の大きさ

    • figsize=(キャンバスの横幅、キャンバスの縦の長さ)

  • legend:凡例の表示を指定

    • DataFrameの場合はデフォルトはTrue

    • Seriesの場合はデフォルトはFalse

  • label:凡例の表現を指定(Seriesのみ有効)

  • grid:グリッド表示(ブール型;デフォルトはFalse)

  • ax:プロットする「軸」を指定する。

# df1はDataFrame

df1.plot('X', 'Y', kind='scatter',
         title='タイトルです',
         color='red',
         marker='^',
         s=100,
         fontsize=20,
         figsize=(8,4),
#          legend=True,
         label='Y',
         grid=True
        )
pass
_images/0afe762b3915f115713095e53dda2adea927dd35032b7e5307534a955193a551.png

この図ではタイトルと横軸・縦軸ラベルの大きさが調整できていないが,上で説明したタイトルとラベルのサイズの調整のコードと共通なので,そちらを参照しよう。

またライン・プロットと同じように引数axを使うことにより,複数の散布図を重ねてプロットできる。次のコードはXY,そしてXZの散布図を同じ「軸」に表示している。

# df1はDataFrame

ax_ = df1.plot('X', 'Y', kind='scatter',label='Yのデータ')
df1.plot('X', 'Z', kind='scatter',
         color='red', marker='^', label='Zのデータ', ax=ax_)
pass
_images/ce4b0dcdc9d322d6b3c50bfe1e1ca418af871b918013447da090c91d0d0b926a.png

ヒストグラム#

ヒストグラムは次の構文となる。

df1.plot(kind='hist')

この場合,df1にある全ての列(整数型もしくは浮動小数点型)がヒストグラムとして重ねて表示される。特定の列だけを使う場合は次のように列を選択してplot()を使おう。

# df1['Y']はSeries

df1['Y'].plot(kind='hist')
pass
_images/669f742264f2860344c149025b711d338c3573c736b679623b6d47aa92e160d4.png

<基本的な引数>

様々な引数があり図に「飾り付け」をすることができる。詳しくはこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • title:図のタイトル(文字列型で指定)

  • bins:柱の数

  • color:色(リストにして列の順番で指定する; 参照サイト

    • rは赤

    • kは黒

    • gはグリーン

  • edgecolor又はec:柱の境界線の色

  • alpha:透明度(0から1.0; デフォルトは1

  • density:縦軸を相対度数にする(デフォルトはFalse

    • 全ての柱の面積の合計が1になるように縦軸が調整される。1つの柱の高さが1よりも大きくなる場合もある。

  • fontsize:横軸・縦軸の数字のフォントサイズの設定

  • figsize:図の大きさ

    • figsize=(キャンバスの横幅、キャンバスの縦の長さ)

  • legend:凡例の表示を指定

    • DataFrameの場合はデフォルトはTrue

    • Seriesの場合はデフォルトはFalse

  • label:凡例の表現を指定(Seriesのみ有効)

  • grid:グリッド表示(ブール型;デフォルトはFalse)

  • subplots:複数の図をプロットする(詳細はライン・プロットを参照)

  • ax:プロットする「軸」を指定する。

引数を指定してXのヒストグラムをプロットしてみよう。

# XはSeriesとして抽出されている

df1['X'].plot(kind='hist',
         bins=20,
         title='タイトルです',
         color='red',
         ec='white',
         alpha=0.5,
         density=True,
         fontsize=20,
         figsize=(8,4),
         legend=True,
         label='Xの凡例',
         grid=True
        )
pass
_images/c6df0cc530c2799d7f5241d30f163700dcf813a7074db4036ef91d79c5d1d41c.png

この図ではタイトルと横軸・縦軸ラベルの大きさが調整できていないが,上で説明したタイトルとラベルのサイズの調整のコードと共通なのでそちらを参照しよう。

次に複数のデータを重ねてプロットする場合を考えよう。ここで役に立つ引数がalphaである。

df1[['Y','Z']].plot(kind='hist',
                    bins=30,
                    color=['r','k'],
                    edgecolor='k',
                    alpha=0.4)
pass
_images/e2bac4cfe5be2dffd5366a94fe87660f794e921df7d49a6f66318c017ab75b4a.png

濃い部分が重なっている部分となる。また柱を積み上げて表示するにはstacked=True(デフォルトはFalse)を使う。

df1[['Y','Z']].plot(kind='hist', 
                    bins=30,
                    color=['r','k'],
                    edgecolor='white',
                    stacked=True)
pass
_images/9c5af3948058bc06bc9ccb95d75ddf20abc3bc82a89cae581a51f283ea610f60.png

赤の上に黒が積み上げられている。

カーネル密度推定プロット#

ヒストグラムは縦軸に度数,横軸に階級を取ったグラフだが,関連する手法にカーネル密度推定と呼ばれるものがある。考え方は簡単で,上のようなヒストグラムのデータに基づき面積が1になるようにスムーズな分布を推定する手法である。ヒストグラムとカーネル密度関数を重ねてプロットすることもできる。

次の構文となる。

df1.plot(kind='kde')

この場合,df1にある全ての列がヒストグラムとして重ねて表示される。特定の列だけを使う場合は列を選択してplot()を使う。

df1.plot(kind='kde')
pass
_images/9fe05153c61b1701472afd79a09f767776284ed159291457379a847d8e245da5.png

<基本的な引数>

様々な引数があり図に「飾り付け」をすることができる。詳しくはこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • title:図のタイトル(文字列型で指定)

  • linestyle又はstyle:線のスタイル(リストにして列の順番で指定する;----.:

  • linewidth or lw:線の幅

  • color:色(リストにして列の順番で指定する; 参照サイト

    • rは赤

    • kは黒

    • gはグリーン

  • alpha:透明度(0から1.0; デフォルトは1

  • fontsize:横軸・縦軸の数字のフォントサイズの設定

  • figsize:図の大きさ

    • figsize=(キャンバスの横幅、キャンバスの縦の長さ)

  • legend:凡例の表示を指定

    • DataFrameの場合はデフォルトはTrue

    • Seriesの場合はデフォルトはFalse

  • label:凡例の表現を指定(Seriesのみ有効)

  • grid:グリッド表示(ブール型;デフォルトはFalse)

  • ax:プロットする「軸」を指定する。

引数を指定してXをプロットしてみる。

# XはSeriesとして抽出されている

df1['X'].plot(kind='kde',
         title='タイトルです',
         linewidth=5,
         linestyle='-.',
         color='red',
         alpha=0.5,
         fontsize=20,
         figsize=(8,4),
         legend=True,
         label='Xの凡例',
         grid=True
        )
pass
_images/7843890a3a711c7eb0b6f6f60053f190f43bea54c433ec781ebe7b670ccb393d.png

この図ではタイトルと横軸・縦軸ラベルの大きさが調整できていないが,上で説明したタイトルとラベルのサイズの調整のコードと共通なのでそちらを参照しよう。

次にヒストグラムとカーネル密度推定プロットを重ねて図示してみる。ここで重要な点がヒストグラムに引数density=Trueを設定することである。これがないと縦軸の単位が異なり上手く表示できない。

ax_ = df1['X'].plot(kind='hist',
                    density=True,
                    label='Xのヒストグラム',
                    legend=True)
df1['X'].plot(kind='kde',
              ax=ax_,
              label='XのKDE',
              legend=True)
pass
_images/f30e634f00dc63f11016bd7f92ed9ca748528ff3ae46e380b5902465b343c214.png

縦線・横線#

図に縦線や横線を追加したい場合がある。その場合は,タイトルとラベルのサイズの調整にあるように「軸」に追加していく事になる。次のような書き方となる。

  • 縦線の場合

    ax_.axvline(<横軸の値>)
    

    ここでaxvlineaxはAXis,vはVertical,lineはLINEのことを表している。

  • 横線の場合

    ax_.axhline(<縦軸の値>)
    

    ここでaxhlineaxはAXis,hはHorizontal,lineはLINEのことを表している。

ここでax_.plot()で返された「軸」のことである。

Yのヒストグラムを使ってプロットしてみよう。

ax_ = df1['Y'].plot(kind='hist', alpha=0.1)
ax_.axvline(0)
ax_.axhline(10)
pass
_images/59534effc5b115e6c8adedab75eacc37cf77fdc831c71004e24fb0de1ad21e1d.png

<基本的な引数>

様々な引数があり図に「飾り付け」をすることができる。詳しくはこのリンクこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • yminaxvlineの縦軸における最小値(0~1の値; デフォルト0

  • ymaxaxvlineの縦軸における最大値(0~1の値; デフォルト1

  • xminaxhlineの横軸における最小値(0~1の値; デフォルト0

  • xmaxaxhlineの横軸における最大値(0~1の値; デフォルト1

  • linestyle:線のスタイル(リストにして列の順番で指定する;- -- -. :

  • linewidth or lw:線の幅

  • color:色(リストにして列の順番で指定する; 参照サイト

    • rは赤

    • kは黒

    • gはグリーン

  • alpha:透明度(0から1.0; デフォルトは1

引数を指定してプロットしてみる。

ax_ = df1['Y'].plot(kind='hist', alpha=0.1)
ax_.axvline(0,
            ymin=0.3,
            ymax=0.95,
            linestyle=':',
            linewidth=5,
            color='g',
            alpha=0.8)
ax_.axhline(10,
            xmin=0.05,
            xmax=0.7,
            linestyle='-.',
            linewidth=3,
            color='k',
            alpha=0.5)
pass
_images/1cc1dff70dded83c75a9add9a9d79aeb4be55f72a9b7741985a37b5a5cf3c600.png

最後に上のヒストグラムとカーネル密度推定プロットに縦線を加えてみよう。

ax_ = df1['X'].plot(kind='hist',
                    density=True,
                    label='Xのヒストグラム',
                    legend=True)
df1['X'].plot(kind='kde',
              ax=ax_,
              label='XのKDE',
              legend=True)
ax_.axvline(0, color='red')
pass
_images/5439918b003321dd3d2aee13d2f7f59641afdf9b7cfd9a722542acb52568a692.png

棒グラフ#

まず次のコードでデータを準備しよう。

df2 = pd.DataFrame({'country':['A','B','C'],
                    'gdp':[100,90,110],
                    'con':[50,60,55],
                    'inv':[15,10,20],
                    'gov':[10,5,30],
                    'netex':[25,15,5]})

3国のGDPとその構成要素からなるDataFrameである。

  • country:国

  • gdp:GDP

  • con:消費

  • inv:投資

  • gov:政府支出

  • netex:純輸出

このDataFrameを使って棒グラフの作成方法を説明するが,次の構文となる。

df1.plot(<横軸の列ラベル>, <縦軸の列ラベル>, kind='bar')

まずA国のgdpの棒グラフを表示してみよう。

df2.plot('country', 'gdp', kind='bar')
pass
_images/4ce7aefb9934af25e42d1ba9c2d446c0edc783b1bae501a2e864cb87bb1f90f8.png

複数の棒(データ)を並べたい場合もあるだろう。その場合は<縦軸の列ラベル>にリストとして指定すれば表示できる。

df2.plot('country', ['gdp','con'], kind='bar')
pass
_images/2ac94de0b00b03e8944a8f3e57debe1409a980a668166bb8c37360357863d8fd.png

<基本的な引数>

詳しい引数についての説明はこのリンクを参照することにして,ここでは基本的な引数だけを紹介する。

  • color:色(リストにして列の順番で指定する; 参照サイト

    • r又はred:赤

    • k又はblack:黒

    • g又はgreen:グリーン

  • stacked:(ブール型;デフォルトはFalse)

    • 複数データを使う場合に棒を積み上げるかどうかを指定

  • fontsize:横軸・縦軸の数字のフォントサイズの設定

  • figsize:図の大きさ

    • figsize=(キャンバスの横幅、キャンバスの縦の長さ)

  • legend:凡例の表示を指定

    • DataFrameの場合はデフォルトはTrue

  • label:凡例の表現を指定

  • grid:グリッド表示(ブール型;デフォルトはFalse)

  • rot(rotationの略):横軸の変数の表示の角度(デフォルトは90

  • subplots:複数の図をプロットする(詳細はライン・プロットを参照)

  • ax:プロットする「軸」を指定する。

これらの引数を使いプロットしてみよう。

df2.plot('country', ['con','inv','gov','netex'], kind='bar',
         color=['red','black','green','orange'],
         stacked=True,
         fontsize=20,
         figsize=(8,4),
#          legend=False       
         label=['消費','投資','政府支出','純輸出'],
         grid=True,
         rot=0
        )
pass
_images/0aa92f8696e4aca48907ba3599b307df05045251d0edf5055fc664cee32c8368.png

次に,ライン・プロットを追加する例を考えてみよう。df2には列gdpがあり,それを表すライン・プロットを重ねることにしよう。

ax_ = df2.plot('country', ['con','inv','gov','netex'],
         kind='bar',
         stacked=True,
         fontsize=15,
         label=['消費','投資','政府支出','純輸出'],
         rot=0)

df2['gdp'].plot(color='black',      # ライン・プロット (Series)
                      marker='o',
                      legend=True,
                      label='国内総生産',
                      ax=ax_)       # Seriesに有効

ax_.set_title('3カ国のGDPと構成要素', size=20)
ax_.set_xlabel('国', size=15)
ax_.set_ylabel('単位:億米ドル', size=15)
pass
_images/5c6e28f692e67177585c8bee8f1dd18f6cfced3d74477cced92ab79c80cfdcce.png

棒の高さとGDPのマーカーの高さは同じであることがわかる。このコードでは次の点に注意する必要がある。gdpSeriesとして抽出し,メソッドplot()を使っていることである。これにより,凡例の表記を自由に変更できることになる。