2. 관리도 작성 도구 비교 _ 엑셀, 미니탭, R, Python
관리도를 작성하기 위해서는 도구가 필요하다, 종이 데이터를 기록후 수작업 계산, 엑셀, 미니탭과 같은 관련된 유료 혹은 무료 통계 프로그램, R에 SPC 라이브러리를 설치해서 작성, Python으로 직접 제작 등 다양하다. 이번 글에서는 관리도를 작성하는 도구들을 간략히 소개하고 어떠한 Tool을 사용 하것이 유리한지 비교하고자 한다..
관리도 작성을 위해 사용 데이터는 Metropolis 병원의 코딩 매니저는 입원 환자 기록의 처리 시간을 모니터링 데이터로 2018년 30일간 5개의 기록을 무적위로 선출하여 기록한 것이다. (Applications of Control Charts for Quality Improvement in Health Care, by Jerome Niyirora, CC By-NC-SA 4.0)
Table 1: Sample Processing Times with Sample Ranges and Sample Means
Number | |||||||
1 | 28 | 32 | 34 | 32 | 33 | 6 | 31.8 |
2 | 31 | 27 | 31 | 28 | 30 | 4 | 29.4 |
3 | 15 | 31 | 20 | 34 | 15 | 19 | 23 |
4 | 33 | 32 | 31 | 31 | 30 | 3 | 31.4 |
5 | 26 | 27 | 34 | 29 | 34 | 8 | 30 |
6 | 34 | 27 | 32 | 30 | 31 | 7 | 30.8 |
7 | 25 | 34 | 33 | 33 | 25 | 9 | 30 |
8 | 32 | 32 | 35 | 26 | 32 | 9 | 31.4 |
9 | 28 | 33 | 35 | 29 | 30 | 7 | 31 |
10 | 25 | 32 | 29 | 28 | 50 | 25 | 32.8 |
11 | 33 | 32 | 30 | 35 | 35 | 5 | 33 |
12 | 34 | 29 | 21 | 32 | 26 | 13 | 28.4 |
13 | 27 | 30 | 31 | 31 | 35 | 8 | 30.8 |
14 | 27 | 28 | 28 | 34 | 34 | 7 | 30.2 |
15 | 29 | 33 | 33 | 25 | 32 | 8 | 30.4 |
16 | 27 | 26 | 27 | 25 | 35 | 10 | 28 |
17 | 29 | 33 | 32 | 30 | 35 | 6 | 31.8 |
18 | 29 | 27 | 29 | 25 | 34 | 9 | 28.8 |
19 | 33 | 27 | 32 | 33 | 44 | 17 | 33.8 |
20 | 32 | 27 | 28 | 29 | 28 | 5 | 28.8 |
21 | 35 | 32 | 34 | 32 | 27 | 8 | 32 |
22 | 28 | 33 | 28 | 40 | 30 | 12 | 31.8 |
23 | 34 | 32 | 32 | 30 | 32 | 4 | 32 |
24 | 35 | 25 | 25 | 28 | 34 | 10 | 29.4 |
25 | 28 | 25 | 26 | 31 | 27 | 6 | 27.4 |
26 | 27 | 33 | 33 | 34 | 34 | 7 | 32.2 |
27 | 33 | 31 | 29 | 27 | 10 | 23 | 26 |
28 | 32 | 31 | 35 | 31 | 29 | 6 | 31.6 |
29 | 30 | 27 | 35 | 33 | 28 | 8 | 30.6 |
30 | 32 | 25 | 33 | 25 | 29 | 8 | 28.8 |
엑셀 작성 관리도
관리도 작성에 가장 쉽게 접근할 수 있는 방법은 엑셀에 관리도 작성 기능을 제작 후 해당 값을 기록하고 관리도를 그리는 것이다.
아래는 McGraw-Hill의 Operations Management 교재에서 학습용으로 제공하는 엑셀 프로그램을 활용한 예시이다.
Calc Sample Means 시트에 데이터를 복사한 후, 계산된 평균과 범위를 붙여넣기만 하면 자동으로 그래프가 생성된다.
Mean Chart(1) 시트는 모집단의 시그마를 알고 있을 때 사용하는 것이지만, 실제로 모집단의 시그마를 정확히 아는 것은 불가능하다.
Mean Chart(2) 시트에서는 평균값과 범위 데이터를 입력하면 X̄ bar관리도가 작성된다.

Xbar-R관리도에서는 먼저 Range 관리도를 확인한다. 10번째 Sample의 이상이 발견된다. 10번째의 마지막 데이터가 50초가 소요되는 평소 처리 시간보다 과다하게 소요된 것을 알 수 있다. 이 이유를 파악하고 조치해야 할 것이다.

평균 관리도의 3번째 샘플이 관리하한에 있다. 처리 시간은 짧으면 짧을 수록 좋은 망소특성이지만, 다른 날 보다 처리 시간이 짧게 소요되었으니, 어떤 다른 특별한 경우가 있는지 확인하여, 좋은 Process가 있다면 처리 시간을 단축 할 수 있도록 계속 반영하는 것이 좋을 것으로 판단된다.

해당 프로그램은 데이터 입력 sheet, r 챠트, xbar 챠트가 각각 분리되어 있어 불편한 점이 있다. 각 부분에 맞게 수정해서 사용하면 될 것이다.
엑셀 관리도는 소규모 데이터 분석이나 학습용으로 적합하지만, 반복적인 분석이나 대량의 데이터를 다룰 경우 미니탭, R, Python 등의 전문 통계 도구를 활용하는 것이 더 효율적이다.
미니탭 관리도
미니탭은 식스시그마 유행하는 시절 활발하게 활용되던 통계 소프트웨어로, 다양한 분석 기능과 세분화된 메뉴 및 옵션을 제공한다.
미니탭에서 관리도를 작성하는 방법은 다음과 같다.
– 데이터 입력: 먼저, Worksheet(시트)에 데이터를 입력한다.
– 관리도 생성: 메뉴에서 통계 분석 > 관리도 > 부분군 계량 관리도 > X̄-R 관리도를 선택한다.
– 데이터 지정: 적용할 컬럼을 선택한 후 확인을 누르면 관리도가 자동으로 생성된다.
– 이상점 표시: 관리도에서 관리 한계를 벗어난 점들은 자동으로 감지되며, 붉은색으로 표시된다.

관리도에 적용할 이상 검출 기준은 관리도 옵션의 검정 메뉴에서 설정 할 수 있다.

미니탭은 편리한 많은 기능이 있지만, 정품을 사용하기에는 가격이 상당히 높아 (1년에 1Copy 당 몇백만원 수준) 회사내에서 라이센스 충분히 구입하지 않아, 동시에 많은 사용자가 사용하면 접속되지 않는 경우가 서 많아 사용상에 불편 함이 발생하곤 했다.
eZ SPC 관리도
한양대학교 산업공학과에서는 통계 및 품질 관련 필수 기능 가지고 있는 ez-SPC를 개발하여 무료로 제공하고 있다. 이를 활용하면 별도의 무료로 관리도를 작성할 수 있다.
이 프로그램을 관리도 작성 방법은 다음과 같다.
– 데이터 입력: 분석할 데이터를 프로그램에 입력한다.
– 그래프 생성: 관리도를 작성할 데이터를 마우스로 선택한 후, 그래프 > X̄-R 관리도 메뉴를 선택하면 자동으로 차트가 생성된다.
– 해석 및 모니터링: 해석용 관리도와 실시간 관리도를 구분하여 작성할 수 있어, 공정 데이터를 실시간으로 입력하면서 관리 상·하한선을 벗어났는지 즉시 확인할 수 있다.
– 이상 감지 시 시각적으로 강조하여 품질 변동을 쉽게 파악할 수 있도록 도와준다.
ez-SPC는 무료 프로그램으로 접근성이 뛰어나며, 기본적인 SPC 분석을 수행하기에 적합하다. 다만, 미니탭과 같은 상용 소프트웨어에 비해 여러 옵션 설정 기능이 제한이다.

관리도를 선택하고 나면 바로 챠트가 그려지고, 어떤 점이 벗어 났는지 알 수 있고, 자료 Tab을 클릭하면 벗어난 값들의 내용을 확인 할 수 있다.

R에서 작성하는 관리도
R은 통계 분석 및 데이터 시각화를 위한 프로그래밍 언어이다. 강력한 패키지 생태계를 갖추고 있으며, 데이터 분석, 머신러닝, 시뮬레이션, 품질 관리 등 다양한 분야에서 활용된다. 특히 ggplot2
, dplyr
, caret
등의 패키지는 데이터 처리 및 모델링에 유용하다. R에는 SPC(Statistical Process Control, 통계적 공정 관리)를 위한 다양한 패키지가 존재한다. R은 공식 사이트에서 다운로드 받고 R을 사용하기 쉽게 지원하는 IDE인 R Studio를 함께 설치한 후 사용하면 된다.
설치된 Rstudio를 최초 실행하면 Project를 생성 하면, 아래와 같은 화면이 나타나면
오른쪽 상단의 Import Dataset을 click하여 data를 읽어 오거나, 왼쪽 Consol창에 명령을 입력하면 분석을 위한 데이터를 읽어 들일 수 있다.
이때 관리자 권한으로 실행하시기 바랍니다.

아래 데이터를 사용해 실습해 보거나, 공정에서 취급하는 데이터를 직접 사용해서 처리해 보기 바랍니다.
데이터를 불러 오면 자동으로 View(data)명령이 실행되어 어던 데이터가 있는지 보여주고, 입력된 Dataset이 왼쪽 하단에 보여집니다.

관리도 작성을 위해서는 “spc”,”qcc” library를 설치해야 한다.
실행 중 R normalizePath(path.expand(path) 오류가 발생하면 해당 디렉토리의 “문서”라고 되어 있는 것을 Documents로 변경하면 library 정상적으로 설치 된다.
> install.packages('qcc')
URL 'https://cran.rstudio.com/bin/windows/contrib/4.1/qcc_2.7.zip'을 시도합니다
Content type 'application/zip' length 3556996 bytes (3.4 MB)
downloaded 3.4 MB
package ‘qcc’ successfully unpacked and MD5 sums checked
> library(qcc)
__ _ ___ ___
/ _ |/ __/ __| Quality Control Charts and
| (_| | (_| (__ Statistical Process Control
\__ |\___\___|
|_| version 2.7
Type 'citation("qcc")' for citing this R package in publications.
경고메시지(들):
패키지 ‘qcc’는 R 버전 4.1.3에서 작성되었습니다
> data <- read.csv("D:/spc_blog/data.csv", encoding="UTF-8")
> sample_data <- as.matrix(data[,-1])
> qcc(sample_data, type='xbar')
List of 11
$ call : language qcc(data = sample_data, type = "xbar")
$ type : chr "xbar"
$ data.name : chr "sample_data"
$ data : int [1:30, 1:5] 28 31 15 33 26 34 25 32 28 25 ...
..- attr(*, "dimnames")=List of 2
$ statistics: Named num [1:30] 31.8 29.4 23 31.4 30 30.8 30 31.4 31 32.8 ...
..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
$ sizes : int [1:30] 5 5 5 5 5 5 5 5 5 5 ...
$ center : num 30.2
$ std.dev : num 3.97
$ nsigmas : num 3
$ limits : num [1, 1:2] 24.9 35.6
..- attr(*, "dimnames")=List of 2
$ violations:List of 2
- attr(*, "class")= chr "qcc"
다음과 같은 X-bar Chart를 얻을 수 있다.

범위 관리도는 아래 코드를 입력하면 간단하게 작성된다.
> qcc(sample_data, type='R')
List of 11
$ call : language qcc(data = sample_data, type = "R")
$ type : chr "R"
$ data.name : chr "sample_data"
$ data : int [1:30, 1:5] 28 31 15 33 26 34 25 32 28 25 ...
..- attr(*, "dimnames")=List of 2
$ statistics: Named int [1:30] 6 4 19 3 8 7 9 9 7 25 ...
..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
$ sizes : int [1:30] 5 5 5 5 5 5 5 5 5 5 ...
$ center : num 9.23
$ std.dev : num 3.97
$ nsigmas : num 3
$ limits : num [1, 1:2] 0 19.5
..- attr(*, "dimnames")=List of 2
$ violations:List of 2
- attr(*, "class")= chr "qcc"

“R”프로그램은 통계와 관련된 모든 부분을 Cover하며, 머신러닝 및 자동화까지도 구현할 수 있는 기능도 보유하고 있으며, 대용량 데이터의 처리도 가능하며 무료 및 오픈소스라는 강점 있다.
머신러닝 분야에서 AutoML h2o, mlr3, pyCaret도 지원하고, 딥러닝 keras, torch 등도 활용 가능하며, Explainable AI(XAI) 기능도 사용 할 수 있는 데이터 분석과 통계 계산에 특화된 언어라 할 수있다.
Python 관리도
통계 분석 및 관리도 작성에는 R도 매우 유용한 도구이며, 간단한 작업이라면 엑셀을 활용할 수도 있다. 그러나 특정 데이터를 입력받아 DB에 저장하고, 웹 환경에서 구현하며, API 개발 및 서비스 운영까지 고려한다면 Python이 가장 적합한 선택이다.
특히, Python은 스마트 공장 구축과 같은 산업 자동화 및 데이터 연계 프로젝트에서 확장성이 뛰어나기 때문에 더욱 유리하다. 다양한 라이브러리(Pandas, SciPy, Statsmodels, Matplotlib 등)를 활용하면 데이터 분석과 시각화를 효율적으로 수행할 수 있으며, Django, FastAPI 등을 사용해 웹 애플리케이션 및 API 개발도 가능하다.
또한, 생성형 AI 모델을 활용하면 Python 코드를 쉽게 학습하고 구현할 수 있다. 프로그램에 익숙하지 않은 경우에도 AI에게 코드 작성 방법을 질문하면 상세한 설명과 함께 구현 방식을 제공받을 수 있다. 물론 AI가 제시하는 코드가 완벽하지 않을 수도 있지만, 오류가 발생하면 해당 코드를 입력하여 수정 방법을 빠르게 찾을 수 있다.
과거에는 논리(Logic) 구상과 오류 해결을 위해 며칠씩 웹을 검색하며 시행착오를 거쳐야 했지만, 최근에는 AI의 도움을 받아 코드 작성 및 디버깅 과정이 훨씬 간편해졌다. 따라서, Python을 활용한 데이터 분석 및 시스템 구축은 더욱 쉽게 접근할 수 있는 환경이 조성되고 있다.
먼저 Python으로 개발하기 위해서는 Python을 설치하고, 가상환경을 구성하여야 한다. 이 부분은 다음 글에서 자세히 설명하고 이번 장에는 GPT를 이행해 질문하고 Code를 받아 구글 Colab에서 챠트가 구현되는 것 정도만 소개하고자 한다.
GPT에 먼저 다음과 같이 질문을 하자.
그대로 입력하면 오류 없이 작동되는 경우도 있지만, 오류 가 발생하면, 오류 부분을 다시 입력하면 보완해 준다.
[질문] 파이썬으로 Xbar-R관리도를 작성하려고 하는데, csv 파일을 읽어오고, 이상처리은 8가지를 적용하는 코드 알려줘
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# CSV 파일 읽기
# df = pd.read_csv("data.csv") # 데이터 파일 경로에 맞게 수정
data = df.to_numpy()
n = data.shape[1] # 샘플 크기 (각 그룹 내 개수)
# 관리도 계수 (샘플 크기 n=5 기준)
A2, D3, D4 = 0.577, 0, 2.114
# X̄, R 계산
xbar = np.mean(data, axis=1) # 각 그룹의 평균
R = np.ptp(data, axis=1) # 범위 (max - min)
# 중심선 (CL) 및 관리한계 (UCL, LCL)
xbar_bar = np.mean(xbar)
R_bar = np.mean(R)
UCL_xbar = xbar_bar + A2 * R_bar
LCL_xbar = xbar_bar - A2 * R_bar
UCL_R = D4 * R_bar
LCL_R = max(D3 * R_bar, 0) # 음수일 경우 0 처리
# 이상점 탐지 함수
def detect_outliers(xbar, UCL_xbar, LCL_xbar):
outliers = []
# 이상점 검출 기준 적용
for i in range(len(xbar)):
if xbar[i] > UCL_xbar or xbar[i] < LCL_xbar:
outliers.append((i, "1점이 관리한계 초과"))
for i in range(len(xbar) - 8):
if all(x > xbar_bar for x in xbar[i:i+9]) or all(x < xbar_bar for x in xbar[i:i+9]):
outliers.append((i, "연속 9점이 중심선 한쪽"))
for i in range(len(xbar) - 5):
if all(xbar[j] < xbar[j+1] for j in range(i, i+5)) or all(xbar[j] > xbar[j+1] for j in range(i, i+5)):
outliers.append((i, "연속 6점 증가 또는 감소"))
for i in range(len(xbar) - 13):
if all((xbar[j] < xbar[j+1]) != (xbar[j+1] < xbar[j+2]) for j in range(i, i+13)):
outliers.append((i, "연속 14점이 번갈아 변화"))
sigma = (UCL_xbar - xbar_bar) / 3 # 표준편차 추정
for i in range(len(xbar) - 1):
if abs(xbar[i] - xbar_bar) > 2 * sigma and abs(xbar[i+1] - xbar_bar) > 2 * sigma:
outliers.append((i, "연속 2점 중 2점이 2σ 이상 동일 방향"))
for i in range(len(xbar) - 2):
if sum(abs(xbar[j] - xbar_bar) > 2 * sigma for j in range(i, i+3)) >= 2:
outliers.append((i, "연속 3점 중 2점이 2σ 이상 동일 방향"))
for i in range(len(xbar) - 3):
if sum(abs(xbar[j] - xbar_bar) > 2 * sigma for j in range(i, i+4)) >= 3:
outliers.append((i, "연속 4점 중 3점이 2σ 이상 동일 방향"))
for i in range(len(xbar) - 14):
if all(abs(x - xbar_bar) < sigma for x in xbar[i:i+15]):
outliers.append((i, "연속 15점이 1σ 이내"))
return outliers
outliers = detect_outliers(xbar, UCL_xbar, LCL_xbar)
# 관리도 그리기
fig, ax = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
# X̄ 관리도
ax[0].plot(xbar, marker='o', linestyle='-', color='b', label='X̄')
ax[0].axhline(UCL_xbar, color='r', linestyle='dashed', label='UCL')
ax[0].axhline(xbar_bar, color='g', linestyle='solid', label='CL')
ax[0].axhline(LCL_xbar, color='r', linestyle='dashed', label='LCL')
ax[0].set_title("X̄ 관리도")
# 이상점 표시
for i, reason in outliers:
ax[0].plot(i, xbar[i], 'ro')
ax[0].annotate(reason, (i, xbar[i]), fontsize=8, rotation=30)
# R 관리도
ax[1].plot(R, marker='o', linestyle='-', color='b', label='R')
ax[1].axhline(UCL_R, color='r', linestyle='dashed', label='UCL')
ax[1].axhline(R_bar, color='g', linestyle='solid', label='CL')
if LCL_R > 0:
ax[1].axhline(LCL_R, color='r', linestyle='dashed', label='LCL')
ax[1].set_title("R 관리도")
plt.xlabel("샘플 그룹")
plt.tight_layout()
plt.show()
# 이상점 출력
print("📌 이상점 목록:")
for i, reason in outliers:
print(f"샘플 그룹 {i+1}: {reason}")
GPT 답변을 받은 후 google colab (웹상에서 파이썬 코드를 실행하고 결과를 볼 수 있는 Site) 접속 한 후 파일 > Driver 새노트를 클릭하면 쥬피터 개발 환경에 접속 할 수 있다.
우리가 가지고 있는 파일을 업로드 해야 하는 이것도 GPT에 물어보자.. cobab에 파일 올리는 법을 물어보니, 아래와 같이 답변한다.
from google.colab import files
import pandas as pd
import io
# 파일 업로드
uploaded = files.upload()
# 업로드된 파일 이름 가져오기
filename = list(uploaded.keys())[0]
# CSV 파일 읽기
df = pd.read_csv(io.BytesIO(uploaded[filename]))
# 데이터 확인
df.head()
해당 부분을 복사하여 Colab에 복사하여 붙여 넣고, 앞에 삼각형을 click하면, 아래에 파일 선택 버턴이 생기고 내 PC에서 파일을 선택해 올리면 된다.

데이터를 업로드 해서 보니 Sample 부분도 분석 데이터 처리되어 있어 df = pd.read_csv(io.BytesIO(uploaded[filename]),index_col=0) 로 수정해 준다.
다음 (+ 코드) 버턴을 Click하여 관리도를 그리는 코드를 복사해 넣자. 여기서 파일을 읽은 df 부분은 앞부분에 #을 넣어 주석 처리한다.
보통 한글이 깨져 보이는데,, 이것도 GTP에 질문하면 한글 폰트 설치 코드를 알려준다. 이것을 추가하도록 하자.
한글 폰트를 설치 한 후에는 런타임>세션 다시 시작 해 주고 다시 반복해야 한다.
한번에 완벽한 오류 없는 코드가 나올 수 도 있고 오류가 나올 수 있다. 오류 코드를 복사해 GPT에 질문하면 수정 사항을 알려준다.

직접 GPT에 질의하며, Colab에 입력해서 실습해 보시기 바란다.
[링크] 위에 구현된 Colab 코드는 다음과 같다.
작업 현장에 맞는 적절한 도구를 선택은
– 빠르게 관리도를 작성하고 싶다면 → 엑셀, 미니탭 활용
– 대량 데이터, 자동화, 실시간 분석이 필요하다면 → Python, R 활용
– 스마트 공장, 웹 기반 시스템과 연계하려면 → Python이 가장 유리
다음 글들에서는 파이썬으로 개발환경을 구축하고, PyQT로 SPC UI 설계, Raw Data와 연계해 자동으로 관리도를 그리는 내용을 추가하고자 한다.