확률분포와 정규분포로 이해하는 제조 데이터 품질 분석
- 확률변수, PMF/PDF, KDE, Cp/Cpk, 정규화와 이상치 탐지까지 -
이 글은 확률변수와 확률분포의 기본 개념부터 PMF, PDF, KDE, 주요 확률분포, 정규분포, 공정능력지수 Cp/Cpk, 정규화와 표준화, 이상치 탐지 방법까지 제조·공정 데이터 분석 관점에서 정리한 글이다. 단순히 수식을 외우는 것이 아니라, 품질 데이터에서 어떤 상황에 어떤 분포와 지표를 적용해야 하는지 이해하는 데 초점을 둔다.
목차
1. 확률변수: 시행 결과를 수치로 바꾸는 방법
확률을 다루려면 먼저 어떤 사건의 결과를 숫자로 표현해야 한다. 이때 사용하는 개념이 확률변수(Random Variable)다. 확률변수는 어떤 시행의 결과를 수치로 나타내는 변수다. 예를 들어 동전 2개를 던지는 시행을 생각해 보자. 가능한 결과는 HH, HT, TH, TT 네 가지다.
| 결과 | 의미 | 확률 (앞면 개수를 확률변수 X로 표현) |
| HH | 앞면 · 앞면 | P(X = 2) = 1/4 |
| HT | 앞면 · 뒷면 | P(X = 1) = 1/2 |
| TH | 뒷면 · 앞면 | |
| TT | 뒷면 · 뒷면 | P(X = 0) = 1/4 |
이산형 확률변수와 연속형 확률변수
확률변수는 크게 이산형과 연속형으로 나뉜다. 제조 데이터에서는 이 구분이 중요하다. 결함 건수처럼 셀 수 있는 값인지, 온도나 길이처럼 연속적으로 측정되는 값인지에 따라 사용하는 확률분포와 분석 방법이 달라지기 때문이다.
| 구분 | 정의 | 예시 | 제조·공정 데이터 관점 |
| 이산형 확률변수 | 셀 수 있는 값만 가지는 확률변수 | 불량품 개수, 하루 결함 건수, 고장 횟수 | 불량 개수, 이벤트 발생 횟수, 검사 합격/불합격 분석에 사용 |
| 연속형 확률변수 | 실수값처럼 무한히 많은 값 중 하나를 가질 수 있는 확률변수 | 제품 길이, 무게, 온도, 압력 | 품질 특성값, 센서 데이터, 공정 조건 모니터링에 사용 |
파이썬 예제 : 이산형 변수와 연속형 변수 생성
아래 코드는 하루 동안 발생한 불량 개수와 제품 길이 데이터를 가정하여 각각 이산형 변수와 연속형 변수를 생성한다.
import numpy as np
# 이산형 변수: 하루 동안의 불량 개수 (예: 0~5개)
discrete = np.random.choice(
[0, 1, 2, 3, 4, 5],
size=100,
p=[0.1, 0.2, 0.3, 0.2, 0.1, 0.1]
)
# 연속형 변수: 제품 길이 (정규분포를 따른다고 가정)
continuous = np.random.normal(loc=100, scale=5, size=100)
print(discrete[:10])
print(continuous[:10])

이산형 불량 개수 배열과 연속형 제품 길이 배열의 일부 출력 결과 캡처
이산형 변수는 특정 공정 단계에서 하루에 발생한 결함 수처럼 이벤트의 개수를 분석할 때 유용하다. 연속형 변수는 온도, 길이, 압력, 무게처럼 측정값의 변동을 관리할 때 중요하다. 품질 분석에서는 먼저 데이터가 이산형인지 연속형인지 구분해야 적절한 분포와 시각화 방법을 선택할 수 있다.
2. 확률분포: 값과 확률의 관계
확률분포(Probability Distribution)는 확률변수가 어떤 값을 가질 확률을 정리한 수학적 규칙이다. 쉽게 말해 “어떤 값이 얼마나 자주 또는 얼마나 높은 확률로 나타나는가”를 표현한 것이다.
1. 각 확률은 0 이상이어야 한다.
2. 모든 가능한 값에 대한 확률의 합은 1이어야 한다.
이산형 확률변수 X에 대해: P(X = x1) + P(X = x2) + ... + P(X = xn) = 1

여러 확률분포의 형태
확률분포표 예시
아래는 하루 동안 특정 공정에서 발생하는 결함 수에 대한 확률분포표 예시다. 결함 수가 0개, 1개, 2개, 3개일 확률을 각각 정리했다.
| 결함 수 | 0 | 1 | 2 | 3 |
| 확률 | 0.2 | 0.3 | 0.4 | 0.1 |
파이썬 예제 : 이산형 확률분포 시각화
이산형 확률분포는 막대그래프로 표현하면 직관적으로 해석할 수 있다.
import matplotlib.pyplot as plt
labels = [0, 1, 2, 3]
probs = [0.2, 0.3, 0.4, 0.1]
plt.bar(labels, probs)
plt.title("이산형 확률분포표")
plt.xlabel("결함 수")
plt.ylabel("확률")
plt.show()

3. PMF, PDF, CDF, KDE의 차이
확률분포를 이해할 때 자주 등장하는 개념이 PMF, PDF, CDF, KDE다. 네 개념은 모두 확률변수의 분포를 설명하지만, 사용하는 데이터 유형과 해석 방식이 다르다.
| 개념 | 전체 이름 | 대상 | 핵심 해석 |
| PMF | Probability Mass Function | 이산형 확률변수 | 특정 값이 나올 확률 |
| Probability Density Function | 연속형 확률변수 | 곡선 아래 구간 면적이 확률 | |
| CDF | Cumulative Distribution Function | 이산형·연속형 모두 가능 | X가 특정 값 이하일 누적확률 |
| KDE | Kernel Density Estimation | 연속형 샘플 데이터 | 데이터를 기반으로 PDF 형태를 추정 |
PMF : 확률질량함수
PMF(Probability Mass Function)는 이산형 확률변수의 각 값에 대한 확률을 정의한다. 주사위 눈, 동전 던지기, 샘플 내 불량품 개수처럼 가능한 값이 분리되어 있는 경우에 사용한다.
PDF : 확률밀도함수
PDF(Probability Density Function)는 연속형 확률변수의 분포를 나타낸다. 여기서 중요한 점은 특정한 한 점의 확률은 0이라는 것이다. 연속형 변수는 가능한 값이 무한히 많기 때문에 “정확히 1.5000mm일 확률”처럼 한 점의 확률을 계산하지 않는다. 대신 “1mm에서 2mm 사이에 있을 확률”처럼 구간을 잡아야 한다.
예를 들어 가공 부품의 표면 거칠기 데이터를 모았더니 오른쪽으로 꼬리가 긴 PDF가 그려졌다고 하자. 이때 “표면 거칠기가 정확히 1.5000mm로 나올 확률”은 수학적으로 0에 한없이 가깝다. 선에는 면적이 없기 때문이다. 대신 실무에서는 “거칠기가 1mm에서 2mm 사이로 생산될 확률”을 계산한다. 이 확률은 PDF 곡선 아래에서 1~2 구간에 해당하는 면적이다.

PMF와 PDF
제품 길이, 온도, 압력, 표면 거칠기처럼 연속형 품질 특성은 특정 값 하나보다 사양 범위 안에 들어갈 확률이 중요하다. Cp, Cpk, 3시그마, 불량률 예측도 결국 분포 곡선 아래에서 사양 범위를 벗어나는 면적을 해석하는 문제와 연결된다.
CDF : 누적분포함수
CDF(Cumulative Distribution Function)는 확률변수 X가 특정 값 x보다 작거나 같을 확률을 누적해서 나타내는 함수다.
제조 데이터에서는 CDF를 이용해 “측정값이 기준값 이하일 비율”, “특정 규격 이하로 생산될 확률”, “불량 기준을 초과하지 않을 확률” 등을 해석할 수 있다.
KDE : 커널 밀도 추정
KDE(Kernel Density Estimation)는 PDF가 명시적으로 주어지지 않았을 때, 샘플 데이터만 가지고 연속형 분포의 밀도를 추정하는 방법이다. 즉, KDE는 데이터 기반의 PDF 근사치다.
- 연속형 변수의 분포를 추정한다.
- 정규분포 같은 특정 분포를 강하게 가정하지 않는 비모수적 방법이다.
- seaborn에서는
sns.kdeplot()으로 쉽게 시각화할 수 있다. - 히스토그램보다 부드러운 분포 형태를 확인할 때 유용하다.
파이썬 예제 : PMF와 PDF 시각화
아래 코드는 이항분포의 PMF와 정규분포의 PDF를 각각 시각화한다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom, norm
# PMF 예시: 이항분포 시각화
x = [0, 1, 2, 3, 4, 5]
# x: 성공 횟수 (0~5), n=5회, p=0.3 성공 확률
pmf = binom.pmf(x, n=5, p=0.3)
plt.bar(x, pmf)
plt.title("PMF of Binomial Distribution (n=5, p=0.3)")
plt.xlabel("성공 횟수")
plt.ylabel("확률")
plt.show()
# PDF 예시: 정규분포 시각화
x = np.linspace(90, 110, 100)
pdf = norm.pdf(x, loc=100, scale=5) # 평균 100, 표준편차 5인 정규분포
plt.plot(x, pdf)
plt.title("PDF of Normal Distribution")
plt.xlabel("측정값")
plt.ylabel("확률 밀도")
plt.show()

이항분포 PMF 막대그래프와 정규분포 PDF 곡선 그래프
PMF는 결함 개수처럼 셀 수 있는 이벤트 분석에 적합하다. PDF는 온도, 길이, 무게 같은 연속형 품질 특성의 분포를 해석하고, 사양 범위 내 생산 확률이나 불량률을 추정할 때 핵심이 된다.
4. 주요 확률분포와 제조업 활용 예시
확률분포는 데이터가 어떤 방식으로 발생하는지 설명하는 모델이다. 제조·품질 데이터에서는 이항분포, 포아송분포, 정규분포를 특히 자주 사용한다.
| 분포 | 데이터 유형 | 핵심 질문 | 제조업 활용 예시 |
| 베르누이분포 | 이산형 | 한 번의 시행이 성공인가 실패인가? | 제품 1개가 합격인지 불합격인지 판단 |
| 이항분포 | 이산형 | n개 중 몇 개가 불량인가? | 샘플 10개 중 불량품 개수 예측 |
| 포아송분포 | 이산형 | 일정 시간·공간에서 이벤트가 몇 번 발생하는가? | 하루 평균 결함 건수, 시간당 기계 고장 수 |
| 정규분포 | 연속형 | 측정값이 평균 주변에서 어떻게 변동하는가? | 제품 길이, 무게, 온도, 압력 분포 분석 |
| 균일분포 | 연속형 또는 이산형 | 각 값이 동일한 가능성을 가지는가? | 무작위 샘플링, 난수 기반 시뮬레이션 |
이항분포
이항분포(Binomial Distribution)는 n번의 독립된 베르누이 시행에서 성공 확률이 p일 때, 성공이 k번 발생할 확률을 나타낸다. 베르누이 시행은 결과가 두 개뿐인 실험이다. 예를 들어 동전 던지기에서는 앞면/뒷면, 품질 검사에서는 합격/불합격이 베르누이 시행에 해당한다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
x = np.arange(0, 11)
y = binom.pmf(x, n=10, p=0.1)
plt.bar(x, y)
plt.title("이항분포: 샘플 10개 중 불량률 10%")
plt.xlabel("불량품 개수")
plt.ylabel("확률")
plt.show()

하샘플 10개 중 불량품 개수별 확률을 나타내는 이항분포 그래프
포아송분포
포아송분포(Poisson Distribution)는 일정한 단위 시간이나 공간에서 발생하는 이벤트 수의 확률분포다. 이벤트가 드물게 발생하지만 평균 발생률은 비교적 일정하다고 볼 수 있을 때 사용한다.
제조 현장에서는 하루 평균 불량 건수, 시간당 설비 알람 발생 횟수, 특정 라인에서 발생한 고장 횟수 등을 분석할 때 포아송분포를 사용할 수 있다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson
x = np.arange(0, 11)
y = poisson.pmf(x, mu=2)
plt.bar(x, y)
plt.title("포아송분포: 하루 평균 2건의 결함")
plt.xlabel("결함 건수")
plt.ylabel("확률")
plt.show()

하루 평균 2건의 결함이 발생한다고 가정한 포아송분포 그래프
정규분포
정규분포(Normal Distribution)는 연속형 변수의 대표적인 분포다. 평균을 중심으로 좌우가 대칭인 종형 곡선을 가지며, 제품의 길이, 무게, 온도, 압력처럼 많은 품질 특성값이 정규분포를 따른다고 가정하고 분석된다.

평균을 중심으로 좌우 대칭인 종형 곡선 형태의 정규분포 이미지
정규분포는 SPC(Statistical Process Control), 관리도, Z-score, 3시그마, Cp/Cpk 해석의 기반이 된다. 단, 실제 제조 데이터가 항상 정규분포를 따르는 것은 아니므로 분포 시각화와 정규성 확인이 함께 필요하다.
5. 정규분포와 68-95-99.7 법칙
정규분포는 평균을 중심으로 좌우가 대칭인 연속 확률분포다. 평균에 가까운 값은 자주 나타나고, 평균에서 멀리 떨어진 값은 드물게 나타난다. 정규분포는 평균 μ와 표준편차 σ 두 개의 파라미터로 정의된다.
μ : 평균, 분포의 중심 위치
σ : 표준편차, 데이터가 평균 주변에서 얼마나 퍼져 있는지 나타내는 값
파이썬 예제 : 정규분포 시뮬레이션
아래 코드는 평균 50, 표준편차 10인 정규분포 데이터를 생성하고 히스토그램과 KDE를 함께 표시한다.
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
mu = 50 # 평균
sigma = 10 # 표준편차
data = np.random.normal(mu, sigma, 1000)
sns.histplot(data, kde=True)
plt.title("정규분포 시뮬레이션")
plt.xlabel("값")
plt.ylabel("빈도")
plt.show()

정규분포 시뮬레이션 결과 히스토그램과 KDE 곡선
68-95-99.7 법칙 (3시그마 법칙)
정규분포에서는 평균을 기준으로 표준편차 몇 배 범위 안에 데이터가 어느 정도 포함되는지 알려진 규칙이 있다. 이를 68-95-99.7 법칙 또는 3시그마 법칙이라고 부른다.

평균 ±1σ, ±2σ, ±3σ 범위와 포함 비율을 보여주는 이미지

| 범위 | 포함 비율 | 품질관리 해석 |
| 평균 ± 1σ | 약 68.3% | 대부분의 일반 변동이 모이는 중심 구간 |
| 평균 ± 2σ | 약 95.4% | 정상 변동의 넓은 범위 |
| 평균 ± 3σ | 약 99.7% | 관리도에서 흔히 사용하는 관리한계 기준 |
식스시그마와 불량률
식스시그마(Six Sigma)는 공정 변동을 매우 낮은 수준으로 관리하려는 품질관리 방법론이다. 일반적으로 공정 평균을 기준으로 규격 한계까지의 거리가 6σ 수준이 되도록 관리하는 것을 목표로 한다.

±6σ 범위와 불량률 개념을 설명하는 이미지
식스시그마에서 흔히 말하는 3.4ppm 불량률은 장기적으로 공정 평균이 1.5σ 이동할 수 있다는 가정을 포함한 품질 수준이다. 단순히 중심이 완전히 고정된 정규분포에서 ±6σ 바깥 면적만 계산한 값과는 해석이 다르다.
파이썬 실습 : 1, 2, 3시그마 영역 시각화
아래 코드는 표준정규분포에서 ±1σ, ±2σ, ±3σ 영역을 채색하여 시각화한다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# 평균과 표준편차 설정
mu = 0
sigma = 1
# 정규분포 곡선 그리기
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000)
y = norm.pdf(x, mu, sigma)
plt.plot(x, y, label="정규분포")
# 1, 2, 3 시그마 영역 채색
colors = ["#a6cee3", "#1f78b4", "#b2df8a"]
for i, s in enumerate([1, 2, 3]):
plt.fill_between(
x,
y,
where=(x >= mu - s*sigma) & (x <= mu + s*sigma),
color=colors[i],
alpha=0.3,
label=f"±{s}σ 영역"
)
# 시그마 경계선 표시
for s in [1, 2, 3]:
plt.axvline(mu + s*sigma, color="red", linestyle="--")
plt.axvline(mu - s*sigma, color="red", linestyle="--")
plt.title("정규분포와 68-95-99.7 법칙")
plt.xlabel("값 (X)")
plt.ylabel("확률 밀도")
plt.legend()
plt.grid(True)
plt.show()

정규분포 곡선 위에 ±1σ, ±2σ, ±3σ 영역이 채색된 결과 이미지
6. Cp와 Cpk : 공정능력지수 이해하기
정규분포를 품질관리로 연결하면 공정능력지수(Process Capability Index)를 이해할 수 있다. 공정능력지수는 공정이 고객 또는 설계 규격 안에서 안정적으로 제품을 생산할 수 있는지를 수치로 평가한다.
Cp : 공정 산포가 규격폭 안에 들어가는가?
Cp는 공정이 주어진 공차 내에서 얼마나 일관되게 생산되는지를 나타낸다. 핵심은 공정의 산포가 규격폭에 비해 충분히 작은가이다. 단, Cp는 공정 평균이 규격 중앙에 있는지는 고려하지 않는다.
Cp = (USL - LSL) / (6σ)
USL : Upper Specification Limit (상한 규격)
LSL : Lower Specification Limit (하한 규격)
σ : 공정 표준편차
해석 : 규격폭(USL - LSL)이 공정의 6σ 폭보다 충분히 넓으면 Cp가 커진다.
Cpk : 공정 평균이 규격 중심에 잘 맞는가?
Cpk는 공정의 산포뿐 아니라 평균이 규격 안에서 어느 쪽으로 치우쳐 있는지도 반영한다. 즉, Cp가 “공정이 얼마나 정밀한가”를 본다면 Cpk는 “공정이 정밀하면서도 중심에 잘 맞는가”를 함께 본다.
Cpk = min((USL - μ) / (3σ), (μ - LSL) / (3σ))
μ : 공정 평균
σ : 공정 표준편차
해석 : 상한 규격까지의 여유와 하한 규격까지의 여유 중 더 작은 값을 기준으로 공정능력을 평가한다.
| 상황 | 해석 | 개선 방향 |
| Cp < 1.0 | 공정 산포가 규격폭보다 커서 불량 발생 가능성이 높다. | 산포를 줄이는 공정 안정화가 필요하다. |
| Cp ≥ 1.33 | 공정 산포가 비교적 안정적으로 규격 안에 들어간다. | 현 상태 유지 또는 중심화 확인이 필요하다. |
| Cp는 높고 Cpk는 낮음 | 공정은 정밀하지만 평균이 한쪽 규격으로 치우쳐 있다. | 공정 평균을 규격 중앙으로 이동시켜야 한다. |
| Cp ≈ Cpk | 공정 평균이 규격 중앙에 잘 위치한다. | 산포 관리와 중심 유지가 모두 중요하다. |
| Cp 또는 Cpk ≥ 2.0 | 매우 높은 수준의 공정능력을 의미한다. | 식스시그마 수준의 품질관리 목표로 해석할 수 있다. |
Cp는 공정 평균이 중앙에서 벗어났는지 고려하지 않는다. 반면 Cpk는 실제 공정 평균이 상한과 하한 규격 사이에서 얼마나 중앙에 위치하는지 반영한다. 따라서 Cp만 보고 공정이 좋다고 판단하면 평균 치우침으로 인한 불량 위험을 놓칠 수 있다.
제조업 응용 예시
- 전자부품 직경, 무게, 강도 등에서 Cp/Cpk를 분석하여 고객 규격에 적합한 공정을 선택한다.
- 센서 측정값이 주기적으로 수집되는 경우 일정 주기마다 Cp/Cpk를 계산하여 품질 대시보드에 표시한다.
- 공정 개선 시 Cp 향상은 산포 감소, Cpk 향상은 중심화 개선을 의미한다.
- PAT(Process Analytical Technology), SPC 자동 측정 시스템에도 Cp/Cpk 계산을 내장할 수 있다.
파이썬 실습 : Cp와 Cpk 계산
아래 코드는 직경 측정값을 이용해 평균, 표준편차, Cp, Cpk를 계산한다.
import numpy as np
# 샘플 데이터: 직경 측정값
data = np.array([9.82, 10.01, 10.04, 9.97, 10.03, 9.96, 10.06, 10.10, 9.91, 10.00])
# 공정 사양 상한/하한 (USL/LSL)
USL = 10.2 # Upper Specification Limit
LSL = 9.8 # Lower Specification Limit
# 평균과 표준편차 계산
mu = np.mean(data)
sigma = np.std(data, ddof=1) # 표본 표준편차
# Cp와 Cpk 계산
Cp = (USL - LSL) / (6 * sigma)
Cpk = min((USL - mu) / (3 * sigma), (mu - LSL) / (3 * sigma))
print(f"평균: {mu:.4f}, 표준편차: {sigma:.4f}")
print(f"Cp: {Cp:.3f}, Cpk: {Cpk:.3f}")

평균, 표준편차, Cp, Cpk 출력 결과 또는 계산 결과 캡처 이미지를 삽입한다.
7. 표준정규분포, Z-score, 정규화와 표준화
제조 데이터는 변수마다 단위와 범위가 다르다. 온도는 ℃, 압력은 bar, 두께는 mm, 불량률은 %로 표현된다. 이처럼 단위가 다른 변수를 함께 분석하려면 스케일 조정이 필요하다. 대표적인 방법이 Z-score 기반 표준화와 Min-Max 정규화다.
표준정규분포와 Z-score
표준정규분포(Standard Normal Distribution)는 평균이 0이고 표준편차가 1인 특수한 정규분포다. 실측값 x를 평균 μ에서 얼마나 떨어져 있는지 표준편차 σ 단위로 환산한 값이 Z-score다. (그리스-로마자 표기이면 모집단에 대한 분포)

평균 0, 표준편차 1인 표준정규분포와 Z-score 위치를 설명하는 이미지
z = (x - μ) / σ
x : 개별 측정값 / μ : 평균 / σ : 표준편차
해석: z = 2이면 평균보다 2표준편차 큰 값, z = -2.1이면 평균보다 2.1표준편차 작은 값
Z-score는 서로 다른 단위를 가진 변수들을 비교하거나 머신러닝 모델 학습 전에 데이터를 표준화할 때 사용된다. 또한 |Z| 값이 큰 데이터는 평균에서 멀리 떨어진 값이므로 이상치 후보로 볼 수 있다.
파이썬 실습 : Z-score 변환 후 분포 확인
from scipy.stats import zscore
import seaborn as sns
import matplotlib.pyplot as plt
z_scores = zscore(data) # 데이터 배열 전체를 Z-score로 변환
sns.histplot(z_scores, kde=True)
plt.title("Z-score 변환 후 분포")
plt.xlabel("Z-score")
plt.ylabel("빈도수")
plt.show()

Z-score로 변환된 데이터의 히스토그램과 KDE 결과 이미지
정규화와 표준화의 차이
정규화와 표준화는 모두 스케일링 기법이지만 목적과 해석이 다르다. 정규화는 값의 범위를 0과 1 사이로 압축하고, 표준화는 평균을 0, 표준편차를 1로 맞춘다.
| 구분 | 정규화 | 표준화 |
| 기준 | 최솟값과 최댓값 | 평균과 표준편차 |
| 변환 범위 | 일반적으로 0~1 | 평균 0, 표준편차 1 |
| 공식 | (x - min) / (max - min) | (x - μ) / σ |
| 이상치 민감도 | 이상치에 매우 민감 | 정규화보다 상대적으로 덜 민감 |
| 주요 목적 | 값의 범위를 압축하여 비교 | 평균 기준의 상대적 위치 비교 |
| 제조업 예시 | 센서 데이터를 0~1 범위로 대시보드 표시 | 온도, 압력, 습도 등 단위가 다른 품질지표를 통합 모델에 투입 |
Min-Max 정규화: x_scaled = (x - x_min) / (x_max - x_min)
Z-score 표준화: z = (x - μ) / σ
파이썬 실습 : 정규화와 표준화 비교
아래 코드는 정규분포 기반 데이터를 생성한 뒤 Min-Max 정규화와 Z-score 표준화를 적용하고, 두 분포를 KDE로 비교한다.
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 정규분포 기반 데이터 생성 (평균=150, 표준편차=30)
np.random.seed(42)
data = np.random.normal(loc=150, scale=30, size=100).reshape(-1, 1)
# 정규화
norm_scaler = MinMaxScaler()
norm_data = norm_scaler.fit_transform(data)
# 표준화
std_scaler = StandardScaler()
std_data = std_scaler.fit_transform(data)
# 시각화
sns.kdeplot(norm_data.flatten(), label="정규화 (0~1)")
sns.kdeplot(std_data.flatten(), label="표준화 (Z-score)")
plt.title("정규분포 기반 데이터의 정규화 vs 표준화")
plt.xlabel("스케일 조정된 값")
plt.ylabel("밀도")
plt.legend()
plt.grid(True)
plt.show()

정규화된 데이터와 표준화된 데이터의 KDE 비교 그래프
정규화는 진동 센서처럼 값의 범위를 0~1로 압축해 대시보드에서 비교할 때 유용하다. 표준화는 온도, 습도, 압력, 불량률처럼 단위가 다른 변수를 하나의 모델에 넣을 때 변수 간 스케일 차이를 줄이는 데 유용하다. 다변량 공정관리, 이상 탐지 모델, 품질 예측 모델에서는 표준화가 자주 사용된다.
8. 이상치 탐지와 분포 시각화
이상치(Outlier)는 일반적인 데이터 패턴에서 크게 벗어난 값이다. 제조 데이터에서 이상치는 단순한 노이즈일 수도 있지만, 설비 이상, 센서 오류, 원재료 문제, 공정 조건 이탈의 신호일 수도 있다.

Z-score, IQR, 박스플롯 등 이상치 탐지 방법을 요약한 이미지
이상치 탐지 방법 비교
| 방법 | 기준 | 장점 | 주의점 |
| Z-score | 평균에서 표준편차 기준으로 얼마나 떨어졌는지 |
정규분포 가정 데이터에서 해석이 직관적 | 평균과 표준편차가 이상치에 영향을 받을 수 있음 |
| IQR | Q1 - 1.5×IQR, Q3 + 1.5×IQR 범위 밖 |
분포 가정이 약하고 중앙값 기반이라 견고함 | 데이터가 매우 비대칭이면 기준 해석에 주의 필요 |
| 박스플롯 | IQR 기반 시각화 | 중앙값, 사분위수, 이상치를 한 번에 확인 | 분포의 밀도 형태는 자세히 보이지 않음 |
| 바이올린플롯 | 박스플롯과 KDE를 결합한 시각화 |
분포의 밀도와 그룹 간 차이를 함께 확인 | 표본 수가 적으면 밀도 해석이 불안정할 수 있음 |
IQR 방식
IQR(Interquartile Range)은 3사분위수 Q3와 1사분위수 Q1의 차이다. 일반적으로 Q1 - 1.5×IQR보다 작거나 Q3 + 1.5×IQR보다 큰 값을 이상치로 본다.
IQR = Q3 - Q1
하한 경계 (Lower limit) = Q1 - 1.5 × IQR
상한 경계 (Upper limit) = Q3 + 1.5 × IQR
이 범위를 벗어나면 이상치 후보로 판단한다.
import numpy as np
q1, q3 = np.percentile(data, [25, 75])
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = data[(data < lower_bound) | (data > upper_bound)]
print("이상치:", outliers)
이상치: [71.40764688]
Z-score 방식
Z-score 방식은 데이터가 평균으로부터 얼마나 떨어져 있는지를 표준편차 단위로 측정한다. 일반적으로 |Z| > 3인 값을 이상치로 간주한다.
import numpy as np
z_scores = np.abs((data - np.mean(data)) / np.std(data))
print("Z-score 기반 이상치:", data[z_scores > 3])
Z-score 기반 이상치: [ ]
분포 시각화 방법
이상치 탐지는 수치 기준만으로 끝내기보다 시각화를 함께 확인하는 것이 좋다. 제조 데이터는 라인, 설비, 작업조, 시간대에 따라 분포가 다를 수 있으므로 그룹별 시각화가 특히 중요하다.
- 히스토그램: 데이터 분포의 전체 형태를 확인한다.
- 박스플롯: 중앙값, IQR, 이상치를 빠르게 확인한다.
- 바이올린플롯: 분포의 밀도와 그룹별 차이를 함께 확인한다.
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(data=data)
plt.title("박스플롯 예시")
plt.show()
sns.violinplot(data=data)
plt.title("바이올린플롯 예시")
plt.show()

박스플롯과 바이올린플롯으로 확인한 분포 및 이상치 시각화 결과
온도, 압력, 무게에서 이상치가 감지되면 설비 점검, 센서 보정, 작업 조건 확인이 필요할 수 있다. 실시간 공정 데이터에서 이상치 탐지는 예지보전과 불량 원인 분석의 출발점이 된다.
9. 퀴즈와 실습 문제
아래 문제는 확률변수, 확률분포, 정규분포, 스케일링, 이상치 탐지 개념을 점검하기 위한 연습이다.
개념 퀴즈 1 : 확률분포와 PMF/PDF/KDE
A. 하루 동안 발생한 고장 수
B. 10개 중 불량품의 개수
C. 제품의 길이(mm 단위 측정)
D. 고객 불만 접수 건수
A. 제품의 무게 분포 시각화
B. 온도의 정규분포를 시각화
C. 결함 수에 대한 이항분포 확률 계산
D. 연속 데이터에 KDE 적용 (❌)
A. 연속형 데이터를 기반으로 확률 밀도 추정을 수행한다
B. 실제 데이터에서 PDF를 근사한다
C. 이산형 데이터만 다룰 수 있다
D. seaborn의 kdeplot()으로 시각화할 수 있다
A. 불량률이 10%인 경우, 샘플 10개 중 불량 개수 (❌)
B. 하루 평균 2건의 불량 발생
C. 제품 길이의 정규성 검정
D. 1개 제품이 합격 또는 불합격인지 판단
Q1 : C / Q2 : C / Q3 : C / Q4 : B
실습 1 : 정규분포에서 ±1σ, ±2σ, ±3σ 범위 시각화
평균이 100, 표준편차가 15인 정규분포에서 ±1σ, ±2σ, ±3σ 범위를 시각화한다.
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
mu = 100
sigma = 15
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000)
y = stats.norm.pdf(x, mu, sigma)
plt.plot(x, y)
plt.axvline(mu - sigma, color="r", linestyle="--", label="-1σ")
plt.axvline(mu + sigma, color="r", linestyle="--", label="+1σ")
plt.axvline(mu - 2*sigma, color="g", linestyle="--", label="-2σ")
plt.axvline(mu + 2*sigma, color="g", linestyle="--", label="+2σ")
plt.axvline(mu - 3*sigma, color="b", linestyle="--", label="-3σ")
plt.axvline(mu + 3*sigma, color="b", linestyle="--", label="+3σ")
plt.title("정규분포 및 ±1σ, ±2σ, ±3σ 경계선")
plt.xlabel("측정값")
plt.ylabel("확률 밀도")
plt.legend()
plt.show()

평균 100, 표준편차 15인 정규분포와 ±1σ, ±2σ, ±3σ 경계선을 시각화한 이미지
실습 2 : PDF와 KDE를 하나의 그래프에 시각화
평균 100, 표준편차 5인 정규분포에서 샘플 데이터 100개를 생성하고, 이론적인 PDF와 샘플 기반 KDE를 하나의 그래프에 함께 표시한다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import seaborn as sns
# 1. 정규분포에서 샘플 100개 생성
data = np.random.normal(loc=100, scale=5, size=100)
# 2. x축 범위 생성
x = np.linspace(80, 120, 200)
# 3. 이론 PDF 계산
pdf = norm.pdf(x, loc=100, scale=5)
# 4. 시각화
plt.figure(figsize=(8, 5))
sns.kdeplot(data, label="KDE (실제 샘플)", fill=True)
plt.plot(x, pdf, label="PDF (이론 분포)", linestyle="--")
plt.title("정규분포 PDF vs. 샘플 기반 KDE")
plt.xlabel("측정값")
plt.ylabel("밀도")
plt.legend()
plt.show()

이론 PDF 곡선과 샘플 기반 KDE 곡선이 함께 표시된 그래프 이미지
개념 퀴즈 2 : 정규분포, Z-score, 관리한계, PAT
A. 30 ~ 70
B. 40 ~ 60
C. 45 ~ 55
D. 35 ~ 65
A. 평균보다 2.1배 큰 값
B. 표준편차보다 2.1만큼 더 큰 값
C. 평균보다 2.1 표준편차만큼 작은 값
D. 평균보다 2.1만큼 작은 값
A. 정규화
B. 표준화
C. 둘 다 민감하지 않다
D. 상황에 따라 다르다
A. 상한/하한 사양
B. 품질 기준선
C. 평균 ± 3σ 관리한계
D. 실시간 품질 편차
A. 생산 속도 향상
B. 사후 불량률 분석
C. 실시간 품질 예측 및 공정 제어
D. 인력 운영 자동화
Q1 : B / Q2 : C / Q3: A / Q4: C / Q5: C
실습 3 : Z-score 계산 및 이상치 탐지
온도 센서 측정값에서 Z-score를 계산하고, 절댓값이 3보다 큰 값을 이상치로 판단한다.
import pandas as pd
# 온도 센서 측정값 12개
data = {
"temperature": [23.4, 24.1, 22.8, 23.9, 24.5, 23.7, 100.0, 24.0, 23.8, 22.9, 23.6, 24.2]
}
df = pd.DataFrame(data)
df["z_score"] = (df["temperature"] - df["temperature"].mean()) / df["temperature"].std()
# Z-score가 절댓값 3 이상인 값을 이상치로 간주
outliers = df[df["z_score"].abs() > 3]
print(df)
print(outliers)

온도 데이터의 Z-score 계산 결과와 이상치 탐지 결과를 삽입한다.
실습 4 : 온도 데이터의 정규화와 표준화 비교
import matplotlib.pyplot as plt
# 표준화
df["temperature_std"] = (df["temperature"] - df["temperature"].mean()) / df["temperature"].std()
# 정규화 (min-max)
df["temperature_minmax"] = (
(df["temperature"] - df["temperature"].min()) /
(df["temperature"].max() - df["temperature"].min())
)
plt.plot(df["temperature"], label="original")
plt.plot(df["temperature_std"], label="standardized")
plt.plot(df["temperature_minmax"], label="min-max")
plt.legend()
plt.title("온도 원본 / 표준화 / 정규화 비교")
plt.show()

원본 온도 데이터, 표준화 데이터, 정규화 데이터를 선 그래프로 비교한 이미지를 삽입한다.
개념 퀴즈 3 : 이상치 탐지
A. 평균 ± 2 × 표준편차
B. Q1 ~ Q3 사이 값
C. Q1 - 1.5×IQR ~ Q3 + 1.5×IQR
D. 최소값 ~ 최대값
A. 정규분포를 가정하고 계산한다.
B. 평균과 표준편차를 사용하여 이상치를 정의한다.
C. Z-score가 0에 가까울수록 이상치이다.
D. 일반적으로 |Z| > 3인 값을 이상치로 간주한다.
A. 박스플롯은 이상치를 보여주지 않는다.
B. 바이올린플롯은 분포의 밀도를 함께 시각화한다.
C. 박스플롯은 연속형 데이터에 사용하지 못한다.
D. 바이올린플롯은 사분위수를 표시하지 않는다.
Q1 : C / Q2 : C / Q3 : B
실습 5 : 바이올린플롯으로 공정별 제품 무게 분포 시각화
아래는 공정 A/B의 제품 무게 분포 예시다. 바이올린플롯을 사용하면 공정별 중심 위치와 분포의 밀도 차이를 함께 확인할 수 있다.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
"process": ["A"]*6 + ["B"]*6,
"weight": [101, 102, 100, 99, 98, 102, 120, 121, 122, 119, 118, 121]
})
# 바이올린플롯으로 공정별 분포 시각화
sns.violinplot(x="process", y="weight", data=df)
plt.title("공정별 제품 무게 분포")
plt.xlabel("공정")
plt.ylabel("제품 무게")
plt.show()

공정 A와 공정 B의 제품 무게 분포를 비교한 바이올린플롯 이미지를 삽입한다.
10. 정리
확률변수는 시행 결과를 수치로 표현하는 출발점이다. 확률변수가 이산형인지 연속형인지에 따라 PMF와 PDF처럼 다른 확률분포 표현을 사용한다. 이산형 데이터에서는 결함 수, 불량품 개수, 고장 횟수처럼 셀 수 있는 이벤트를 분석하고, 연속형 데이터에서는 길이, 무게, 온도, 압력 같은 품질 특성의 분포를 분석한다.
제조업 품질 분석에서 정규분포는 매우 중요한 기준이다. 68-95-99.7 법칙, 3시그마, 관리한계, Cp/Cpk는 모두 공정 변동을 정량적으로 해석하는 데 사용된다. 다만 실제 데이터가 항상 정규분포를 따르지는 않기 때문에 히스토그램, KDE, 박스플롯, 바이올린플롯을 함께 확인해야 한다.
정규화와 표준화는 단위와 범위가 다른 공정 데이터를 함께 분석하기 위한 전처리 방법이다. 정규화는 값을 0~1 범위로 압축할 때 유용하고, 표준화는 평균과 표준편차 기준으로 변수의 상대적 위치를 비교할 때 유용하다. 이상치 탐지에서는 Z-score와 IQR이 대표적으로 사용되며, 실시간 공정 모니터링과 예지보전, 품질 이상 탐지의 기초가 된다.
결함 개수처럼 셀 수 있는 데이터는 이산형 확률변수로 보고 PMF, 이항분포, 포아송분포를 활용한다. 온도나 길이처럼 연속적인 측정값은 연속형 확률변수로 보고 PDF, KDE, 정규분포, Z-score, Cp/Cpk를 활용한다. 품질 분석에서는 분포를 먼저 이해한 뒤, 공정 산포와 중심 위치, 이상치 발생 여부를 함께 해석해야 한다.
출처
※ KDT 빅데이터 기반 품질 관리(QA/QC) 양성 과정 6회차
'TIL > 기초 통계' 카테고리의 다른 글
| 기초 통계학 정리 (0) | 2026.06.26 |
|---|---|
| 기초적인 통계 개념 (0) | 2026.06.17 |
