Python × グラフ

Python / matplotlibで散布図を作る方法【ばらつき・分布を確認】

python-scatter-plot

本記事では、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

今回は、件数が多くないですが、件数が多いと、ばらつきの特徴が顕著に出て、特異的に金額大きい件名大部分が集中している金額帯などが把握できます。

 

 

グラフのタイトル、軸ラベルなどの設定は、次の記事をみてみてください。

 

参考Pythonで棒グラフを作成する

 

費目別で、件名の金額のばらつきを表す散布図

次は、費目別で、件名の金額のばらつきを散布図に表します。

横軸を「費目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軸はデータフレームの列名だけで設定できるようになります。

結果は、次のようになります。

散布図_実例2

 

今回の例だと、「委託費」「設備」は金額が大体固まっているのに対して、「消耗品費」は金額にばらつきがあり金額大きいものもあるということが読み取れます。

このように、今回は費目別ですが、いろいろな軸で金額のばらつきをグラフ化すると新しい特徴が発見できるかもしれません。

 

件名の金額の分布を表す散布図

最後に、金額の分布を表す散布図を紹介します。

ここでの金額の分布は、件名の金額を大きいもの順に並べて横軸に、縦軸に金額を書いたグラフで表現します。

これにより、金額のばらつきの度合い、どの件名が特に金額が大きいか、分類を把握できるようになります。

コードは、次のように書きます。

 

#「合計」列で降順に並び替える
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()の書き方は、上で書いたグラフと同じになります。

散布図_実例3

このグラフにより、1つの件名が飛び抜けて金額大きいことが把握できます。

 

こういった金額のばらつきが大きい時は、y軸を対数にすると、特徴が見えてくることがあります。

軸を対数にする時は、次のように書きます。今回は、y軸を対数軸にしています。

 

ax.set_yscale('log')

 

この結果は次の通りになります。

 

散布図_実例4

 

y軸を対数にすることで、(件数が少ないデータですが、)件名の金額別にグルーピング(大型件名、中型件名、小型件名の3分類)できそうだと分かります。

ここで、真ん中のグループについては、直線で近似できそうに見えます。

 

y軸を対数にしているので、このグラフで直線近似できる場合は、金額分布は指数関数的になっていることが分かります。

 

 

これまで紹介してきたように散布図を使えば、金額のばらつき、特異的な事象(件名)の把握、分布を視覚的に把握することができます。

 

 

以上、Python / matplotlibで散布図を書く方法を実例を題材にして、説明してきました。

 

最後まで読んでいただき、ありがとうございました。

よく読まれている記事

se-shikaku 1

  社内SEになるには資格って必要?社内SEでキャリアップするときにおすすめの資格は? 回答としては、 社内SEは、対人スキル、実務での対応力や最新情 ...

社内SEの仕事内容 2

  社内SEってどんな仕事なんだろ~ 検索しても転職サイトの記事ばかりでよく分からない・・   確かにそうですね。。実経験を基に、社内SE( ...

side-work-trial 3

  コロナで会社の経営も不安。。個人でお金稼ぎたいな~ 今、こう考えるサラリーマン、OLの方はごまんといると思います。   僕は、本業では社 ...

adsense-pass 4

【3記事で一発合格】Google AdSense申請に合格したブログ情報 こんにちは、いなサラ(@いなサラ|田舎の情シスサラリーマン)です。 2019年10月5 ...

-Python × グラフ

© 2020 inasala note