본문 바로가기

Python/Default

Pyspc를 사용하여 SPC Graph 그리기

 

2019/05/09 - [계약/SIDE] - Statistical Process Control (SPC)

 갑자기 하늘에서 떨어져 내게 온 SPC를 세미 체험해보기 위해 Python을 켰다. SPC에 관련된 내용은 이전 글을 읽자. 그리 어려운 내용은 아니고 그저 내가 원하는 조건에서 벗어나는 친구들이 생기는지 생기지 않는지 감시하는 용도로 간단히 생각하면 될 듯 하다. Python님은 못가진거빼고 다 가지고 계시기 때문에 검색을 통해 라이브러리를 찾아본다. 역시 사귄지 얼마안된 내 친구 파이썬은 원하는 라이브러리가 있었다.

 감사한 분에게 인사드리며 pyspc 라이브러리는 다음 주소로 찾아가면 된다. 제공하는 차트는 아래와 같다.

pip install pyspc

마법의 주문으로 새로운 라이브러리를 맞이해준다.

from pyspc import *

a = spc(pistonrings) + ewma()
print(a)

간단하게 내장된 테스트를 진행하여 라이브러리가 잘 실행되는지 확인해준다.

이 친구 겉으로는 얌전한 척 하더니 sample이 거듭되자 range 밖의 값을 내뱉는다. EWMA는 지수가중 이동평균 모형으로 가중치를 가진 모형이다. 통계 전공이 아니므로 잘 모르지만 간단하게 생각해서 t번째 시도를 할 때 t-1번째가 t에게 영향을 많이줄까 t-100번째가 t에게 영향을 많이 줄까? 당연히 t-1번째일 것이다. 그런 개념으로 접근하면 될 것 같다. (저도 잘 모름) 일단 내가 원하는 데이터로 그래프를 그려보기 이전에 p-chart를 그리기 위해 어떤 데이터가 필요한지 생각해보자. 

 p-chart의 식은 다음과 같다.

 샘플데이터 중 하나인 circuits.csv로 생각해보자. 

샘플 결함(부적합)
100 21
100 24
100 16
... ...

 이런 데이터를 가지고 있다. 먼저 p를 구한다.

 

0.198이란 수가 나온다. 이 데이터의 평균은 0.198인 것이다. 이제 UCL과 LCL을 구해본다.

과연 계산 결과가 맞을까? 파이썬으로 그려본다.

from pyspc import *
import numpy

a = spc(circuits) + p() + rules()
print(a)

다른 P-chart도 그려본다. chanjuice.csv라는 파일이 있다.

이젠 쉽게 생각할 수 있다.


 다음은 c-chart이다. c차트의 공식은 다음과 같다.

- pip로 다운받는 pyspc에 에러가 있다. 

	def plot(self, ax, data, size, newdata=None):
		print(data.T)
		sizes, data = data.T
		if self.size == 1:
			sizes, data = data, sizes

        # the samples must have the same size for this charts
		assert np.mean(sizes) == sizes[0]

		cbar = np.mean(data)

		lcl = cbar - 3 * np.sqrt(cbar)
		ucl = cbar + 3 * np.sqrt(cbar)
#
		# ax.plot([0, len(data)], [cbar, cbar], 'k-')
		# ax.plot([0, len(data)], [lcl, lcl], 'r:')
		# ax.plot([0, len(data)], [ucl, ucl], 'r:')
		# ax.plot(data, 'bo-')

		return (data, cbar, lcl, ucl, self._title)

라이브러리 내에 c.py를 열어보면 plot 함수에 들어가는 인자가 (self, ax, data, size, newdata=None)으로 되어 있는데 여기서 ax를 제거해주어야 한다. 데이터가 하나씩 밀려서 들어간다.

	def plot(self, data, size, newdata=None):
		print(data.T)
		sizes, data = data.T
		if self.size == 1:
			sizes, data = data, sizes

        # the samples must have the same size for this charts
		assert np.mean(sizes) == sizes[0]

		cbar = np.mean(data)

		lcl = cbar - 3 * np.sqrt(cbar)
		ucl = cbar + 3 * np.sqrt(cbar)
#
		# ax.plot([0, len(data)], [cbar, cbar], 'k-')
		# ax.plot([0, len(data)], [lcl, lcl], 'r:')
		# ax.plot([0, len(data)], [ucl, ucl], 'r:')
		# ax.plot(data, 'bo-')

		return (data, cbar, lcl, ucl, self._title)

 이렇게 바꾸면 아주 잘 실행된다. c차트의 공식을 이용하여 값을 먼저 구해본다.

from pyspc import *
import numpy
import pandas

a = spc(circuits) + c() + rules()
print(a)

python이 계산을 다 해주더라도 직접 한 번씩 구해보는게 좋다.


이제 variable 차트를 그려본다.

mean chart는 xbar_rbar를 사용하면된다.

sample data인 diameter.csv를 10개만 사용하여 공식을 대입해본다.

번거로워서 엑셀로 한번에 정리했다.

근데 얘는 사용하는 규칙이 조금 다르다.

A2 = [0, 0, 1.880, 1.023, 0.729, 0.577, 0.483, 0.419, 0.373, 0.337, 0.308]

이걸 사용한다..

from pyspc import *
import numpy
import pandas

a = spc(circuits) + xbar_rbar() + rules()
print(a)


R-bar 차트도 그려보자.

데이터는 똑같은거 쓸거임~~! 어려울 거 없이 D4, D3만 알아내서 대입해주면된다.

D3 = [0, 0, 0, 0, 0, 0, 0, 0.076, 0.136, 0.184, 0.223]
D4 = [0, 0, 3.267, 2.575, 2.282, 2.115, 2.004, 1.924, 1.864, 1.816, 1.777]
from pyspc import *
import numpy
import pandas

a = spc(diameter) + rbar() + rules()
print(a)

여기까지하면 기본적인 4개의 그래프는 다 그려보았다.