概要
python(matplotlib)でパレート図を作成してみました。以下のページを参考にしました。
https://self-development.info/python%E3%81%A7%E3%83%91%E3%83%AC%E3%83%BC%E3%83%88%E5%9B%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%90matplotlib%E3%80%91/
環境構築
上記ページのパレート図には日本語が入っているのでそれを扱えるように日本語用のmatplotlibをインストールしました。
$ sudo pip3 install japanize_matplotlib
ソースコード
上記ページのソースでは日本語がうまく表示されなかったので、japanize_matplotlibをimportしました。
pareto_chart3.py
# coding: UTF-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
# ラベル
labels = ['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ']
# 値
values = [100, 90, 80, 70, 60 ,50, 40, 30, 20, 10]
# データ操作用
df = pd.DataFrame({"label": labels, "value": values}, columns=["label", "value"])
# 「値」の降順にデータを並び替える
df = df.sort_values(by="value", ascending=False)
# 累積和を求める
df["accum"] = np.cumsum(df["value"])
# 比率の累計を求める
df["accum_percent"] = df["accum"] / sum(df["value"]) * 100
# サイズ指定
fig = plt.figure()
# 軸関係の表示
ax = fig.add_subplot(111)
# データ数のカウント
data_num = len(df)
# 棒グラフの描画
ax.bar(range(data_num), df["value"])
ax.set_xticks(range(data_num))
ax.set_xticklabels(df["label"].tolist())
ax.set_xlabel("(項目)")
ax.set_ylabel("(頻度)")
# 折れ線グラフの描画
ax_add = ax.twinx()
ax_add.plot(range(data_num), df["accum_percent"])
ax_add.set_ylim([0, 100])
ax_add.set_ylabel("(比率の累計)")
# グラフを画像保存
plt.savefig("result.png", facecolor="white")
実行
以下の通りコマンドを実行しました。
$ python3 pareto_chart3.py
すると以下の通り画像ファイル(result.png)が出力されました。
実行結果
何かの役に立てばと。