解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python でパレート図を描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回はパレート図の描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# パレート図を作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 100, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# グラフの作成 ------------------------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント ---------------------------------------------------------------
data_num = len(sample_df)
 
accum_to_plot = [0] + sample_df["accum_percent"].tolist()
 
percent_labels = [str(i) + "%" for i in np.arange(0, 100 + 1, 10)]
 
# 棒グラフのプロット ---------------------------------------------------------------
ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
ax1.tick_params(axis="x", which="major", direction="in")
ax1.set_ylim([0, sum(sample_df["data"])])
 
# 横軸に名前をつける -------------------------------------------------------------
ax1.set_xlabel("label")
 
# 縦軸に名前をつける -------------------------------------------------------------
ax1.set_ylabel("counts")
 
# 第 2 軸のグラフの作成 ----------------------------------------------------------
ax2 = ax1.twinx()
 
# 押せ連グラフのプロット ------------------------------------------------------------
ax2.set_xticks(range(data_num + 1))
ax2.plot(range(data_num + 1), accum_to_plot, c="red", marker="o")
ax2.set_xticklabels([])
ax2.set_xlim([0,data_num])
ax2.set_ylim([0, 100])
ax2.set_yticks(np.arange(0, 100 + 1, 10))
ax2.set_yticklabels(percent_labels)
ax2.grid(True, which='both', axis='y')
 
# グラフタイトル設定 ---------------------------------------------------------------
ax1.set_title("PARETO_CHART")
 
# パーセンテージライン -------------------------------------------------------------
ax2.hlines(y=80, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=85, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=90, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=95, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Pareto_Chart.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

赤線は 100% 積み上げの折れ線グラフで、黄色は 80% 、 85% 、 90% 、 95% 線です。

図2 パレート図



コメント

パレート図って分析してる感じが出ますね。

全体の 80% を超えるデータなどがひと目で分かるようになりました。



以上