本記事では、Python / matplotlibで実例を使って、散布図を作る方法・ばらつき・分布を確認する方法をご説明します。仕事ですぐに使えるソースコードも紹介します。
Pythonの実行環境
今回は、以下の実行環境でプログラムを実行しています。
・Python 3.7.6
・Jupyterlab 1.2.6
・Pandas:1.1.2
・matplotlib:3.3.2
実例としては、次のような予算管理表を使います。
ファイル名は「テストデータ.xlsx」で、シート名は「予算管理表」です。
■予算管理表
まずは、ライブラリをインポートし、今回扱う予算管理表をdfとして読み込んでおきます。
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
df = pd.read_excel('テストデータ.xlsx', sheet_name = '予算管理表')
Python / matplotlibで散布図を作る方法【基本形】
まずは、Pythonで折れ線グラフを書く際の基本形を確認します。
散布図は、scatter()を使い、第一引数に横軸の値、第二引数に縦軸の値を指定します。
もっとも基本的な形は、次の通りです。
plt.scatter(['2021年度', '2022年度','2023年度'], [100, 200, 150])
plt.show()
ここでは基本形のため、データはテストのものとしてます。
このように、scatter()を使って縦軸と横軸の値を指定するだけで、簡単に散布図が作れます。
Python / matplotlibで散布図を作る方法【実例でばらつき・分布を確認】
実務では、散布図は、値のばらつき、グルーピング、相関を表すために使われることが多いです。
今回は、実例の予算管理表のデータを用いて、次の3つので散布図を作ります。
・年度別で、件名の金額のばらつきを表す散布図
・費目別で、件名の金額のばらつきを表す散布図
・件名の金額の分布を表す散布図
年度別で、件名の金額のばらつきを表す散布図
それでは、横軸を年度として、縦軸を件名別の金額をプロットして、散布図を作成します。
早速コードは、次のように書きます。
#グラフのオブジェクトを定義
fig, ax = plt.subplots(figsize=(8, 4))
year_list = ['2021年度', '2022年度','2023年度']
#横軸の値
x = year_list
#縦軸の値
y = [df[year].sum() for year in year_list]
#グラフの作成
for year in year_list:
ax.scatter([year for i in range(len(df[year]))], df[year].tolist())
#グラフのタイトル、軸ラベルを設定
ax.set_title('年度別の予算額のばらつき')
ax.set_xlabel('年度')
ax.set_ylabel('予算額')
#グラフの座標を設定
ax.grid(axis='x', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
ax.grid(axis='y', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
「#グラフの作成」の部分で、年度ごとにforループを回して、scatter()を使っています。
x座標は、年度の文字列(例えば、'2021 年度')になるので、リスト内包表記で要素をすべて「年度の文字列」とするリストを作っています。
そしてy座標は、tolist()を使って、df[yeear]のSeriesの値部分ををリスト化しています。
tolist()はリスト化するときによく使うので、覚えておくのが良いです。
グラフは次のようになります。
今回は、件数が多くないですが、件数が多いと、ばらつきの特徴が顕著に出て、特異的に金額大きい件名、大部分が集中している金額帯などが把握できます。
グラフのタイトル、軸ラベルなどの設定は、次の記事をみてみてください。
費目別で、件名の金額のばらつきを表す散布図
次は、費目別で、件名の金額のばらつきを散布図に表します。
横軸を「費目1」列、縦軸を「合計」列とします。
実際のコードは次のようになります。
#グラフのオブジェクトを定義
fig, ax = plt.subplots(figsize=(8, 4))
#グラフの作成
ax.scatter('費目1', '合計', data=df)
#グラフのタイトル、軸ラベルを設定
ax.set_title('費目別の予算額のばらつき')
ax.set_xlabel('費目')
ax.set_ylabel('予算額')
#グラフの座標を設定
ax.grid(axis='x', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
ax.grid(axis='y', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
今回は、scatter()の引数に、dataを設定しています。
これは、データフレームdfの列で散布図を作るときに設定します。
これにより、x、y軸はデータフレームの列名だけで設定できるようになります。
結果は、次のようになります。
今回の例だと、「委託費」「設備」は金額が大体固まっているのに対して、「消耗品費」は金額にばらつきがあり金額大きいものもあるということが読み取れます。
このように、今回は費目別ですが、いろいろな軸で金額のばらつきをグラフ化すると新しい特徴が発見できるかもしれません。
件名の金額の分布を表す散布図
最後に、金額の分布を表す散布図を紹介します。
ここでの金額の分布は、件名の金額を大きいもの順に並べて横軸に、縦軸に金額を書いたグラフで表現します。
これにより、金額のばらつきの度合い、どの件名が特に金額が大きいか、分類を把握できるようになります。
コードは、次のように書きます。
#「合計」列で降順に並び替える
df = df.sort_values('合計', ascending=False)
#グラフのオブジェクトを定義
fig, ax = plt.subplots(figsize=(8, 4))
#グラフの作成
ax.scatter([i for i in range(11)], df['合計'])
#グラフのタイトル、軸ラベルを設定
ax.set_title('費目別の予算額のばらつき')
ax.set_xlabel('費目')
ax.set_ylabel('予算額')
#グラフの座標を設定
ax.grid(axis='x', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
ax.grid(axis='y', color='blue', lw=0.5, linestyle='--', alpha = 0.2)
scatter()の書き方は、上で書いたグラフと同じになります。
このグラフにより、1つの件名が飛び抜けて金額大きいことが把握できます。
こういった金額のばらつきが大きい時は、y軸を対数にすると、特徴が見えてくることがあります。
軸を対数にする時は、次のように書きます。今回は、y軸を対数軸にしています。
ax.set_yscale('log')
この結果は次の通りになります。
y軸を対数にすることで、(件数が少ないデータですが、)件名の金額別にグルーピング(大型件名、中型件名、小型件名の3分類)できそうだと分かります。
ここで、真ん中のグループについては、直線で近似できそうに見えます。
y軸を対数にしているので、このグラフで直線近似できる場合は、金額分布は指数関数的になっていることが分かります。
これまで紹介してきたように散布図を使えば、金額のばらつき、特異的な事象(件名)の把握、分布を視覚的に把握することができます。
以上、Python / matplotlibで散布図を書く方法を実例を題材にして、説明してきました。
最後まで読んでいただき、ありがとうございました。