今回はパレート図についてです。
パレート図は品質管理の分野でよく使われるグラフですが、その意味やグラフの見方を押さえていきたいと思います。
また、Pythonでの実装方法も紹介していきます。
パレート図とは
パレート図とは、値が降順(大きい順)になるようにプロットした棒グラフと、その値を累積で表示した折れ線グラフを組み合わせたグラフを指します。
品質管理(QC:Quality control)における7つの基本的道具の1つとして、製造業などではよく使われるグラフです。
パレート図は、パレートの法則を元に、それを可視化しようとしたものです。
パレートの法則
パレートの法則は、イタリアの経済学者のパレートさんが発見した法則です。経済において、全体の大部分はそれを構成する一部の要素が生み出しているというものです。
たとえば、以下のような例があります。
- 税金納付額の80%は、国民のうち20%の富裕層が負担している。
- 故障の原因の80%は、全ての部品のうち20%に起因する。
- 売り上げの80%は、全顧客のうち20%が占めている
このようなケースは、現実でもよくある話です。
これをデータとして出すことができれば、ビジネスにおいてより効果的な施策を打つことができます。
パレート図の目的は、複数の要因の中から重要なものを抽出することです。例えば、欠陥を引きおこす主要原因の把握等に優れています。
品質管理以外では、在庫管理やABC分析においてもしばしば用いられているようです。
Pythonでパレート図を描く
パレート図の内容を把握したところで、実際にPythonを使って描いていきましょう。
今回使用するデータ
今回も、ボストンの住宅価格データを使います。
(品質関連のデータとか使えよ)という声が聞こえてきますが、気にしない気にしない、、
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
name = pd.DataFrame(data.target).rename(columns={0:"name"})
df = pd.DataFrame(data.data, columns=data.feature_names).merge(name, left_index=True, right_index=True)
df = pd.DataFrame(data.data, columns=data.feature_names)
データを整形する
生のデータのままではパレートを描けないので、加工していきます。
項目ごとの平均値を算出する
今回は、”ZN”の値を使ってパレート図を描いていきます。”RAD”のユニークな値の数が8つなので、”RAD”でグルーピングをして”ZN”の平均値を算出します。
data = df.groupby("RAD").mean()
data =data[["ZN"]]
data = data.sort_values(by="ZN", ascending=False)
グルーピングにはgroupby()を用います。全ての列で計算してから、”ZN”列を抽出するという流れです。
そして、棒グラフは降順データなので、ソーティングしておきます。
累積和の割合を算出する
折れ線グラフを描くために、累積和の割合を算出します。
まずは累積和を算出します。累積和の算出には、numpyのcumsum()を用います。
import numpy as np
data["cumsum"] = np.cumsum(data["ZN"])
そして、全体に占める累積和の割合を算出します。
data["cumsum_per"] = data["cumsum"] / sum(data["ZN"]) * 100
手動での計算です。たまには自分で式も書きます。
ここまでで、データフレームの中身は以下の通り
これで、パレート図を描く準備ができました。
パレート図を描く
パレート図は、単純に棒グラフと折れ線グラフの組み合わせです。
基本的には、matplotlibのsubplotを使って描いていけばいいと思います。
import matplotlib.pyplot as plt
#グルーピングした項目の数
data_count = range(len(data.index))
figure = plt.figure()
ax = figure.add_subplot(111)
#棒グラフ
ax.bar(data_count, data["ZN"])
#折れ線グラフ
ax2 = ax.twinx()
ax2.plot(data_count, data["cumsum_per"], color="red")
棒グラフは”ZN”の平均値を、折れ線グラフは累積和の割合を累積値として表示しています。
このように、棒グラフと折れ線グラフの色を変えることで、見やすい図になります。
axを使った図の描画が苦手という方もいらっしゃるかもしれませんが、これが使えるようになると世界が広がるので、頑張ってほしいです!
という筆者も得意ではないですが^^;
見やすいパレート図にする
あとは、図が見やすくなるようにいろいろいじくります。
コードとしては以下のようにしました。
data_count = range(len(data.index))
figure = plt.figure()
ax = figure.add_subplot(111)
ax.bar(data_count, data["ZN"])
#X軸の値を全て表示
ax.set_xticks(data_count)
#RADの値を軸に表示
ax.set_xticklabels(data.index.tolist())
#軸ラベル
ax.set_xlabel("RAD")
ax.set_ylabel("ZN")
ax2 = ax.twinx()
ax2.plot(data_count, data["cumsum_per"], color="red")
#軸ラベル
ax2.set_ylabel("累積(%)", fontname="MS Gothic")
こうすることで、
情報をが追加されて見やすい図になりました^^
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
まとめ
パレート図について、その意味とPythonでの描き方を見てきました。
業界によってはあまり馴染みのない図だという方もいるかもしれませんが、実際の現場だけでなく応用情報技術者試験等でも出てくるので、知っておいて損はないと思います。
ビジネスにおいては、その理論含めチェックしておく価値がありそうです^^
ではでは👋