【Pandas】pandasの標準機能でグラフを作成する(plot基本)

Pandas

こんにちは、かつコーチです。
集計まで終わったデータは、表のままだと傾向がつかみにくいものです。
pandasにはplotという標準機能が備わっており、matplotlibを本格的に学ばなくても、数行のコードで簡単なグラフを作成できます。

pandasのplotとは?

plotの定義:DataFrame・Seriesから直接グラフを描く機能

plotとは、DataFrameやSeriesのメソッドとして呼び出すだけで、グラフを描画できる機能です。
内部ではmatplotlib(Pythonの代表的なグラフ描画ライブラリ)を利用しています。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    "月": ["1月", "2月", "3月", "4月"],
    "売上": [100, 150, 130, 180]
})

df.plot(x="月", y="売上", kind="line")
plt.show()

このコードで、月別売上の折れ線グラフが表示されます。

なぜpandasのplotから学ぶべきか

matplotlibを直接使うと、グラフの細部まで自由にカスタマイズできる反面、コード量が多くなりがちです。
pandasのplotは「まず全体の傾向をざっと確認したい」というときに、最小限のコードでグラフ化できるのが魅力です。
本格的なグラフ作成に進む前段階として、まずplotに慣れておくと、後々matplotlibを直接使う際の理解もスムーズになります。

基本の書き方:plotの使い方

手順1:折れ線グラフ(line)

時系列データの推移を見るのに適しています。デフォルトの種類でもあります。

df.plot(x="月", y="売上", kind="line")
plt.show()

手順2:棒グラフ(bar)

カテゴリごとの比較に適しています。

df.plot(x="月", y="売上", kind="bar")
plt.show()

手順3:円グラフ(pie)

構成比を見たいときに使います。

category_sales = pd.Series(
    [300, 200, 100],
    index=["食品", "日用品", "その他"]
)
category_sales.plot(kind="pie", autopct="%.1f%%")
plt.show()

autopct="%.1f%%"を指定すると、各項目の割合をパーセント表示できます。

手順4:ヒストグラム(hist)

データの分布(どの範囲にどれくらいのデータが集中しているか)を見たいときに使います。

scores = pd.Series([65, 70, 72, 80, 85, 88, 90, 95, 60, 75])
scores.plot(kind="hist", bins=5)
plt.show()

つまずきやすい設定・注意点

  • Jupyter Notebook以外(通常のPythonスクリプト)で実行する場合、plt.show()を忘れるとグラフウィンドウが表示されません
  • グラフを画像として保存したい場合は、plt.show()の前にplt.savefig("graph.png")を実行します

よくあるつまずきポイント・エラー対処

グラフの日本語ラベルが文字化けする(豆腐文字)

❌Before:フォント設定をせずにそのままplotを実行する

df.plot(x="月", y="売上", kind="bar")
plt.show()

私がMacで初めてこのグラフを描いたとき、「月」や「売上」といった日本語のラベルが、すべて四角い記号(いわゆる「豆腐文字」)で表示されてしまいました。
matplotlibのデフォルトフォントが日本語に対応していないために起こる、非常によくあるトラブルです。

✅After:日本語対応フォントを明示的に指定する

import matplotlib.pyplot as plt
import matplotlib

# Macの場合の例(Windowsは "MS Gothic" 等を指定)
matplotlib.rcParams["font.family"] = "Hiragino Sans"

df.plot(x="月", y="売上", kind="bar")
plt.show()

環境によって使えるフォント名が異なるため、Windowsの場合は"MS Gothic""Yu Gothic"、Macの場合は"Hiragino Sans"を試すとよいでしょう。
japanize-matplotlibという専用ライブラリをpip installしてimport japanize_matplotlibするだけで解決する方法もあり、こちらの方が手軽な場合もあります。

応用・一歩先の使い方

groupbyの集計結果をそのままグラフ化する

前回の記事で紹介したgroupbyとplotを組み合わせると、集計からグラフ化までを一気通貫で行えます。

df = pd.DataFrame({
    "店舗": ["東京", "東京", "大阪", "大阪", "福岡"],
    "売上": [1000, 1500, 800, 1200, 600]
})

df.groupby("店舗")["売上"].sum().plot(kind="bar", title="店舗別売上合計")
plt.show()

集計結果のSeriesに対して直接.plot()を呼び出せるため、コードが非常にシンプルになります。

グラフのサイズやタイトルを調整する

df.plot(x="月", y="売上", kind="line", figsize=(8, 4), title="月別売上推移")
plt.xlabel("月")
plt.ylabel("売上(円)")
plt.show()

figsizeでグラフのサイズ、titleでタイトルを指定できます。
軸ラベルはplt.xlabel()plt.ylabel()のように、matplotlibの機能をそのまま組み合わせて調整します。

本格的なグラフが必要な場合はmatplotlib・seabornへ

複雑なレイアウトや高度なデザインのグラフが必要な場合は、plotだけでは限界があります。
その場合は、より自由度の高いmatplotlibを直接使う、あるいは統計的な可視化に強いseabornというライブラリを検討するとよいでしょう。
pandasのplotは、あくまで「素早く傾向を確認するための第一歩」と位置づけておくと使い分けがしやすくなります。

まとめ

この記事のポイント

  • pandasのplotは、DataFrame・Seriesから直接グラフを描ける機能
  • kind引数で折れ線(line)・棒グラフ(bar)・円グラフ(pie)・ヒストグラム(hist)を切り替えられる
  • 日本語ラベルの文字化けは、フォント指定またはjapanize-matplotlibで解決する
  • groupbyの集計結果に直接.plot()をつなげると、集計からグラフ化までを一気に行える
  • 本格的なカスタマイズが必要な場合は、matplotlib・seabornの利用を検討する

次に読むべき記事

グラフ作成ができるようになったら、次は列・行に対する柔軟な処理を可能にする「applyとlambdaで列・行に対する処理をまとめる」に進みましょう。
グラフ化の前段階でのデータ加工にも役立つテクニックです。

タグ: Pandas, 中級者向け, 可視化

タイトルとURLをコピーしました