こんにちは、かつコーチです。
集計まで終わったデータは、表のままだと傾向がつかみにくいものです。
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, 中級者向け, 可視化