파레토 그림(Pareto Diagram) 그리기

파레토 그림(Pareto Diagram) 그리기

통계 관련 책(통계학 파이썬을 이용한 분석)을 보는데, 파레토 그림에 대한 내용이 있어서 관련 내용을 파이썬의 matplotlib를 이용해서 그려보았다.

파레토 그림에 대해서 이야기하면, 파레토는 이탈리아의 경제학자로 80:20 법칙을 발견한 사람이다.

전체 부의 약 80%를 약 20%의 소수가 소유하고 있고, 부의 20%를 약 80%의 다수가 차지하고 있는 현상을 발견하고 이름을 붙였다고 한다.

제품 품질 관리에서 위와 같은 현상을 활용하여 불량 발생을 분석해서 불량의 80%가 약 20%의 현상으로 발생되면, 20% 현상에 대한 원인을 제거하면 불량을 빠르게 감소시킬 수 있어 품질 관리에 많이 사용된다.

예제로 사용되는 내용은 아래와 같다.

불량 항목 수량 상대도수(%)
구멍 뚫림 16 32
잘못 접힘 3 6
찢어짐 23 46
크기 불량 2 4
두께 불량 2 4
기타 4 8

위의 내용을 기반으로 해서 아래의 코드를 통해서 파레토 그림을 그렸다.

원래를 numpy 연습을 위해 numpy만 사용하려고 했는데, 불량 항목을 포함하니, 각 요소의 Data type이 Objct로 되어 연산이 되지 않는 문제가 있었다.

그래서, 결국은 pandas의 DataFrame을 이용했다.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

fault_type = ["Hole", "Folding", "Broken", "Size", "Thickness", "Others"]
arr = np.array([16, 3, 23, 2, 2, 4])
ind_ratio = arr/arr.sum()*100

data_arr = np.array([arr, ind_ratio]).transpose() 
df = pd.DataFrame(data_arr, columns=cols[:2])
df.insert(0, "Fault Type", fault_type)
df.sort_values(cols[1], ascending=False, inplace=True)
df["Cumulative Relative Frequency"] = df["Relative Frequency"].cumsum()

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.set_xlabel(df.columns[0], size=12)
ax.set_ylabel(df.columns[2], size=12)
ax.bar(df["Fault Type"], df["Relative Frequency"])
ax.set_ylim(0, 100)

ax2 = ax.twinx()
ax2.plot(df["Fault Type"], df["Cumulative Relative Frequency"], '-ro', alpha=0.5)
ax2.set_ylabel('', color='r')
ax2.set_ylim(0, 100)
ax2.set_ylabel("Cumulative Relative Frequency", size=12)

plt.show()


위 코드를 사용하면서 배운 것은 아래와 같다.

  • df의 cumsum : 누적 합계를 구해준다. (numpy에도 동일하게 있다.)

  • ax2 = ax.twinx() : 이중 y축 그래프를 그릴 수는 방법이다.

  • df의 insert : 열을 추가하는데, 추가하는 열의 순서를 정할 수 있다.

처음부터 pandas의 DataFrame을 이용하는 방법을 사용하면 이렇게 안 했을테데, numpy를 사용하려고 하다보니 처음 코드가 저렇게 되었다.

위 코드를 실행하면, 아래의 그림을 얻을 수 있다.

pareto-diagram

Written on June 19, 2021