データフレームの可視化の際、データフレームそのまま操作するのではなく、ラベルでインデックスをしてpltをかける方法を説明します 更に、プレゼン用にグラフにタイトルを付けたりして装飾する方法も紹介します。


チートシート

やりたいこと コーディング
ラベルでインデックスをつけ直す df.index = df.pop('Col')
インデックスをx軸に棒グラフを作成する  df.plot.bar()

'Col' : 任意の列名


今回使うデータのポイント

  1. df.shape => 7 x 3 に集約してデータフレーム名 df_month
  2. デフォルトの0から始まるインデックスからYear of Month列をインデックスにします
  3. PY_03 に一回目のトライ成功数
  4. PY_05 に二回目のトライ成功数
  5. 各月のPY_03PY_05 の結果が7ヶ月分ある

サンプルデータセットについての記事で紹介しているオリジナルデータです。

df.shape

サンプルオペレーション

デフォルトの0から始まるインデックスをラベルインデックスに変更します。

1
2
3
# Year of Month でインデックスする
df_month.index = df_month.pop('Year of Month')
df_month.head()

結果は以下のとおりです。 Year of Month 列にがインデックスになりました。

df.shape

棒グラフを作図します

df_month.plot.bar() とコーディングするだけで以下のような図が出来上がります。 line# 3,4のコーディングでY軸にラベルを棒グラフのタイトルを追加してます。

1
2
3
4
5
# Year of Month でインデックスする
df_month.plot.bar()

plt.ylabel('Points')
plt.title('Points by 1st_try and 2nd_try')

df.shape

これだけでも十分ですが、プレゼン用に同様な作図を通常のコーディングで行います。各月にあるそれぞれ2つのbar を横に並列と縦積みを紹介します。 まず、横に並列させます。

1
2
3
4
5
6
7
8
9
10
11
12
P3 = df_month['PY_03']
P5 = df_month['PY_05']
ind =  df_month.index.tolist()
left = np.arange(len(ind))
width = 0.35  
p3 = plt.bar(left, P3, width, color='lightblue')
p5 = plt.bar(left+width, P5, width, color='orange' )
plt.ylabel('Points')
plt.title('Points by 1st_tryl and 2nd_try')
plt.xticks(left, ind)
plt.legend((p3[0], p5[0]), ('1st_try', '2nd_try'))
plt.show()

df.shape

まず、横に並列させました。 line by line で解説します。

  1. PY_03 をdf_month のデータフレームから取り出し、変数P3 に代入します。P3はシリーズオブジェクトです
  2. PY_05 をdf_month のデータフレームから取り出し、変数P5 に代入します。P5はシリーズオブジェクトです
  3. 変数indにインデックス(=Year of Month)を代入します。ind ははシリーズオブジェクトです
  4. 変数leftは、barの数だけの順序配列で、作図に必要です。そのため、np.arrange関数を用いて作りますが、barの数はind の長さより求めています
  5. 幅を 0.35としています
  6. 変数p3にライトブルーのbarの情報を代入します。7本のbar それぞれのbarの値はP3オブジェクトから取る、barの幅、色を指定しています
  7. 変数p5にオレンジのbarの情報を代入します。7本のbarの横に置いて、その幅、それぞれのbarの値はP5オブジェクトから、幅、色の指定をしています
  8. Y軸のラベル
  9. グラフタイトル
  10. 刻みとラベル
  11. グラフ左上のlegend
  12. おまじないの作図命令

ほとんどコーディングは同じですが、line# 10 で 薄いブルーのP3 が下(bottom) に来ると指定します。 また、同じくline#10 のbar の数を最大とする配列変数leftのみを指定して、bar幅の定数を足し込んでいません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Year of Month でインデックスする
P3 = df_month['PY_03']
P5 = df_month['PY_05']
ind =  df_month.index.tolist()

left = np.arange(len(ind))
width = 0.35  

p3 = plt.bar(left, P3, width, color='lightblue')
p5 = plt.bar(left, P5, width, color='orange', bottom=P3 ) #<- bar to stack

plt.ylabel('Points')
plt.title('Points by 1st_tryl and 2nd_try')
plt.xticks(left, ind)
plt.legend((p3[0], p5[0]), ('1st_try', '2nd_try'))
plt.show()

df.shape

参照ドキュメント(英語)のURLも追記します。

参照 matplotlib_documentation


ひとこと

データ分析での可視化は分析そのものと同じくらい重要な作業です。自らの理解であれば、デフォルトの方法で概観でも大丈夫ですが、クライアントや上司に対して提供するグラフは、タイトルはもちろん、ラベルであったり、色といった付属情報や装飾でグラフが見やすく、グラフ自体で説明できていることが求められます。 特に上に行けば行くほどきれいな行き届いたグラフをいつも見ている場合が多いので、可視化のスキルを求められます。