courses
t-검정을 실행해 깔끔한 p-값을 얻고 나서, 정작 데이터가 정규분포를 따르는지 확인하지 않았다는 사실을 뒤늦게 깨달아 본 적이 있나요?
통계 검정은 가정이 위배되었는지 알려주지 않습니다. 단지 값을 보고할 뿐이죠. 문제는 t-검정과 ANOVA 같은 검정은 데이터가 정규분포를 따른다고 가정한다는 점입니다. 만약 그렇지 않다면, 불안정한 토대 위에 결론을 세우는 셈입니다.
정규성 검정은 그 가정을 검증하는 방법을 제공합니다. 이를 위한 시각적 방법과 통계적 방법이 모두 있으며, 어떤 방법을 언제 사용할지, 그리고 결과를 어떻게 해석할지를 아는 것이 결과를 자신 있게 뒷받침하는 핵심입니다.
이 글에서는 가장 흔한 시각적/통계적 정규성 확인 방법을 살펴보고, 정규성을 Python과 R에서 실행하는 방법을 보여드리며, 데이터가 검정을 통과하지 못할 때 무엇을 해야 하는지도 설명합니다.
실무에서의 정규분포란
아마도 종 모양 곡선을 본 적이 있을 텐데요 — 이것이 실제 데이터에 어떤 의미인지 알아봅시다.
정규분포는 대부분의 값이 중심에 몰리고, 양쪽 끝으로 갈수록 값이 적어지는 패턴입니다. 이를 그리면 좌우 대칭의 종 모양 곡선이 나타납니다. 왼쪽과 오른쪽이 거울처럼 대응합니다.

정규분포 그래프
정규분포의 고유한 점은 평균, 중앙값, 최빈값이 모두 같은 지점 — 종의 중심 — 에 위치한다는 것입니다. 좌우로 치우침(skew)이 없습니다. 즉, 데이터가 균형 잡혀 있습니다.
이는 실제 측정 데이터에서 끊임없이 나타납니다. 사람의 키, 혈압 측정값, 제조 공정의 공차, 시험 점수 — 충분한 표본을 모으면 대체로 정규분포를 따르는 경향이 있습니다. 생물학적·물리적 시스템의 자연스러운 변이가 이러한 형태를 만들기 때문입니다.
그렇다고 모든 데이터가 이렇게 행동하는 것은 아닙니다. 소득 데이터는 오른쪽으로 치우치고, 웹사이트 응답 시간은 긴 꼬리를 가집니다.
현실에서는 정규성을 확인하지 않고 가정했다가 큰 문제가 생길 수 있습니다.
정규성 검정이 중요한 이유
정규성을 확인하지 않는 문제는, 대부분의 보편적인 통계 검정 — t-검정, ANOVA — 이 모수적 검정이라는 데 있습니다.
즉, 데이터의 분포에 대한 가정 위에 구축되어 있다는 뜻입니다. 정규성은 그중 하나죠. 이 가정이 깨지면 검정의 수학적 토대도 함께 무너집니다. 여전히 결과는 나오지만, 잘못된 결론으로 이어질 수 있습니다.
모수적 검정은 표본이 나온 모집단에 대해 수학적 가정을 세워 작동합니다. 그 가정이 충족되면 유용하고 정확합니다. 그렇지 않으면 p-값이 신뢰할 수 없게 되어 정확한 결론을 내릴 수 없습니다.
이럴 때 비모수적 검정이 등장합니다.
Mann-Whitney U나 Kruskal-Wallis 같은 검정은 정규성을 가정하지 않습니다 — 원시값 대신 순위를 사용합니다. 더 유연하지만, 데이터가 실제로 정규적일 때는 덜 유용한 경향이 있습니다. 따라서 불필요하게 비모수 검정으로 전환하는 것이 정답은 아닙니다.
많은 데이터 사이언스 입문자가 겪는 진짜 문제는 이 확인 절차를 완전히 건너뛴다는 점입니다.
정규성 검정은 몇 줄의 코드면 충분합니다. 검정을 하지 않는다는 건 데이터를 맹신하거나, 아예 고려하지 않는 것과 다름없습니다.
정규성을 확인하는 시각적 방법
형식적 검정을 실행하기 전에 먼저 데이터를 그려보세요. 시각화만으로도 작업 대상에 대해 많은 것을 알 수 있습니다.
히스토그램
히스토그램은 분포의 형태를 보여줍니다.

히스토그램 예시
데이터가 정규분포를 따른다면, 히스토그램은 중앙이 높고 양쪽으로 대칭적으로 점차 낮아지는 종 모양처럼 보입니다. 여기서 주의할 것은 왜도(skewness)입니다. 오른쪽으로 긴 꼬리는 양의 왜도, 왼쪽으로 긴 꼬리는 음의 왜도를 의미합니다. 어느 쪽이든 데이터가 정규적이지 않을 수 있다는 신호입니다.
히스토그램의 문제는 모양이 구간(bin) 크기에 좌우된다는 것입니다:
- 구간이 너무 적으면 분포가 평평해 보입니다
- 너무 많으면 들쭉날쭉해 보입니다
결론을 내리기 전에 항상 구간 크기를 몇 가지로 바꿔 확인하세요.
Q-Q 플롯
Q-Q 플롯(quantile-quantile plot)은 데이터의 분위수를 이론적 정규분포의 분위수와 비교합니다.

Q-Q 플롯 예시
데이터가 정규적이면 점들이 대각선 직선 위에 놓입니다. 선에서 벗어나는 정도는 정규성이 어디에서 깨지는지를 알려줍니다. 끝부분이 위로 굽으면 꼬리가 두껍다는 뜻입니다. S자 형태는 왜도를 시사합니다.
Q-Q 플롯은 특히 히스토그램이 놓치기 쉬운 꼬리 부분에서, 정규성에서의 미묘한 이탈을 포착하는 데 더 정교합니다.
박스 플롯
박스 플롯은 중앙값, 분산 범위, 이상치를 한눈에 보여줍니다.

박스 플롯 예시
정규적으로 분포한 데이터셋은 중앙값이 박스의 중앙쯤에 있고, 수염(whisker)이 양쪽으로 비슷한 길이로 뻗습니다. 중앙값이 중심에서 벗어나 있거나 한쪽 수염이 훨씬 길다면 왜도입니다. 수염 밖의 점들은 이상치입니다.
시각화의 일반적인 한계는 주관성입니다. 같은 히스토그램을 보고도 해석이 다를 수 있습니다. 먼저 데이터를 가늠하는 용도로 사용하고, 그다음 형식적 검정으로 확인하세요.
통계에서 흔한 정규성 검정
모든 상황에 가장 좋은 단 하나의 정규성 검정은 없습니다. 올바른 선택은 표본 크기와 무엇을 탐지하려는지에 따라 달라집니다.
Shapiro-Wilk 검정
Shapiro-Wilk 검정은 일반적으로 수백 개 관측치까지의 소·중규모 표본에 가장 적합한 선택입니다.
관측값을 정규분포에서 기대되는 값과 비교해, 데이터가 정규분포를 얼마나 잘 따르는지 측정합니다. 널리 사용되고 잘 이해되어 있으며 주요 통계 라이브러리에 모두 포함돼 있습니다. 대부분의 분석가에게는 가장 먼저 시도할 검정입니다.
주요 한계는 표본 크기가 커지면 과민해진다는 점입니다. 실무적으로 의미 없는 아주 미세한 이탈도 통계적으로 유의하다고 표시하는 경향이 있습니다.
Kolmogorov-Smirnov 검정
Kolmogorov-Smirnov(KS) 검정은 표본의 누적분포를 이론적 분포 — 여기서는 정규분포 — 와 비교합니다.
Shapiro-Wilk보다 일반적이며 정규분포뿐 아니라 어떤 분포와도 비교할 수 있습니다. 다만 정규성 검정 측면에서는 Shapiro-Wilk보다 검출력이 낮아, 미묘한 이탈을 놓치기 쉽습니다. 또한 분포 매개변수를 사전에 지정해야 하며, 이를 동일한 데이터로 추정하면 편향이 발생합니다.
빠른 범용 점검이 필요할 때 사용하고, 주된 정규성 검정으로는 쓰지 마세요.
Anderson-Darling 검정
Anderson-Darling 검정은 KS 검정의 변형이지만, 한 가지 핵심 차이가 있습니다. 분포의 꼬리에 더 큰 가중치를 둡니다.
이 덕분에 극단에서 나타나는 이탈 — 두꺼운 꼬리, 이상치, KS 검정이 놓칠 수 있는 비정규적 거동 — 을 더 잘 포착합니다. 꼬리 거동이 중요한 사용 사례라면 Anderson-Darling이 좋은 선택입니다.
D'Agostino-Pearson 검정
D'Agostino-Pearson 검정은 다른 접근을 택합니다.
분포를 직접 비교하는 대신, 데이터의 두 가지 특성 — 왜도(비대칭성)와 첨도(꼬리의 두꺼움/가벼움) — 를 측정합니다.
이 둘을 하나의 검정 통계량으로 결합합니다. 덕분에 데이터가 왜 정규적이지 않을 수 있는지까지 파악하는 데 유리합니다. 왜도와 첨도 추정이 신뢰할 수 있는 큰 표본에서 가장 잘 작동합니다.
Jarque-Bera 검정
Jarque-Bera 검정도 D'Agostino-Pearson과 유사하게 왜도와 첨도를 사용합니다.
계량경제학과 시계열 분석에서 흔합니다. D'Agostino-Pearson과 마찬가지로 신뢰할 만한 결과를 위해서는 충분히 큰 표본이 필요합니다. 작은 표본에서는 검정 신뢰도가 높지 않습니다. 금융·경제 맥락에서는 이 검정을 자주 보게 될 것입니다.
정리하면, 작은 표본에는 Shapiro-Wilk로 시작하고 Q-Q 플롯과 함께 보세요. 꼬리 거동이 중요하면 Anderson-Darling을, 이탈의 성격을 이해하고 싶다면 D'Agostino-Pearson을 사용하세요.
정규성 검정 결과 해석법
모든 정규성 검정은 가설 검정입니다.
정규성 검정의 귀무가설은 데이터가 정규분포를 따른다는 것입니다. 검정은 이렇게 묻습니다. 관측된 데이터를 고려할 때, 이 귀무가설이 참일 가능성은 얼마나 되는가?
답은 p-값으로 돌아옵니다:
- p > 0.05 - 정규성을 기각할 근거가 부족합니다. 데이터를 정규로 가정하고 모수적 검정을 진행하세요
- p < 0.05 - 정규성과 통계적으로 구분될 정도의 차이가 관측되었습니다. 정규성 가정을 기각하세요
간단해 보이지만, 많은 이들이 여기서 실수합니다.
낮은 p-값은 데이터가 얼마나 비정규적인지를 알려주지 않습니다 — 단지 차이가 탐지되었음을 뜻할 뿐입니다. 큰 표본에서는 정규성 검정이 극도로 민감해져, 분석에 실질적 영향이 없는 미세한 이탈도 표시합니다.
반대 문제도 존재합니다. 작은 표본에서는 눈에 띄게 왜곡된 데이터조차 검정력이 부족해 p > 0.05가 나올 수 있습니다.
통계적 유의성과 실질적 유의성은 다릅니다.
p-값은 정규성에서의 이탈이 존재하는지를 알려줄 뿐입니다. 그 이탈이 해당 분석에서 중요하다면 별개 문제입니다. 항상 검정 결과에 Q-Q 플롯을 병행하세요 — 점들이 선을 가깝게 따른다면, p-값이 무엇을 말하든 데이터는 아마 충분히 정규적일 것입니다.
Python에서의 정규성 검정
Python의 scipy.stats 모듈에는 정규성 검정을 몇 줄의 코드로 실행하는 데 필요한 모든 것이 있습니다.
아래 모든 예제에서는 동일한 데이터셋 — 정규분포에서 뽑은 100개의 표본 — 을 사용합니다. 코드를 실행하며 따라오실 수 있습니다.
import numpy as np
from scipy import stats
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=100)
Shapiro-Wilk 검정
작은 데이터셋에서는 특히 shapiro()를 첫 점검으로 사용하세요.
stat, p_value = stats.shapiro(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")
다음과 같은 출력이 나옵니다:

Python에서 Shapiro-Wilk 검정 출력
p-값이 0.05보다 충분히 크므로 정규성을 기각하지 않습니다. 데이터는 정규적으로 보입니다 — 정규분포에서 생성했으니 타당합니다.
Kolmogorov-Smirnov 검정
kstest()는 표본을 명명된 분포와 비교합니다. 정규성 검정의 경우 표본의 평균과 표준편차와 함께 "norm"을 전달합니다.
stat, p_value = stats.kstest(data, 'norm', args=(data.mean(), data.std()))
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Python에서 Kolmogorov-Smirnov 검정 출력
역시 p > 0.05 — 정규성에 반하는 증거가 없습니다.
이 검정을 Python에서 사용할 때는 항상 args로 평균과 표준편차를 명시적으로 전달하세요. 생략하면 kstest()는 표준정규(평균=0, 표준편차=1)를 기본값으로 사용하므로, 데이터가 이미 표준화되지 않았다면 결과가 신뢰할 수 없습니다.
D'Agostino-Pearson 검정
normaltest()는 왜도와 첨도를 결합해 정규성을 검정합니다. 큰 표본에서 가장 잘 작동합니다.
stat, p_value = stats.normaltest(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Python에서 D'Agostino-Pearson 검정 출력
여기도 p > 0.05입니다. 이 데이터는 세 검정을 모두 통과하는데, 정규분포로 생성했으므로 당연합니다. 실제로는 특히 0.05 경계 근처에서 검정 결과가 서로 달라지는 경우가 흔합니다. 그런 경우에는 Q-Q 플롯으로 최종 판단을 내리세요.
R에서의 정규성 검정
R에는 정규성 검정을 위한 내장 함수가 있습니다. 기본적인 작업에는 추가 패키지가 필요하지 않습니다.
Python 예제와 마찬가지로, 여기서도 정규분포에서 뽑은 100개의 표본을 사용합니다.
set.seed(42)
data <- rnorm(100, mean = 0, sd = 1)
Shapiro-Wilk 검정
shapiro.test()는 소·중규모 표본에서 표준 선택입니다. 데이터 벡터를 그대로 전달하세요:
shapiro.test(data)

R에서 Shapiro-Wilk 검정 출력
p > 0.05 — 정규성에 반하는 증거가 없습니다. W 통계량은 0에서 1 사이이며, 1에 가까울수록 데이터가 정규분포를 잘 따른다는 뜻입니다.
Kolmogorov-Smirnov 검정
ks.test()는 표본을 이론적 분포와 비교합니다. 정규성 검정에서는 "pnorm"을 지정하고 표본 평균과 표준편차를 전달하세요.
ks.test(data, "pnorm", mean(data), sd(data))

R에서 Kolmogorov-Smirnov 검정 출력
여기도 p > 0.05입니다. R에서의 이 검정도 Python과 같은 주의점이 있습니다. mean(data)와 sd(data)를 항상 명시하세요. 생략하면 표준정규가 기본값이 되어, 데이터가 이미 표준화되지 않았다면 결과가 왜곡됩니다.
Q-Q 플롯
R의 내장 함수 qqnorm()와 qqline()으로 두 줄이면 Q-Q 플롯을 그릴 수 있습니다.
qqnorm(data, main = "Q-Q Plot")
qqline(data, col = "steelblue", lwd = 2)

R의 Q-Q 플롯
qqnorm()은 표본 분위수를 이론적 정규 분위수와 비교합니다. qqline()은 기준선을 그립니다. 점들이 그 선을 가깝게 따르면 데이터가 정규적으로 행동하는 것입니다. 끝부분의 이탈은 꼬리 문제를 시사하므로 조사할 가치가 있습니다.
데이터가 정규적이지 않을 때의 대처법
데이터가 정규성 검정을 통과하지 못하면 몇 가지 확실한 선택지가 있습니다.
데이터 변환
때로는 데이터를 변환해 정규적으로 보이도록 한 뒤, 변환된 값으로 원래의 검정을 수행하는 것이 해법입니다.
로그 변환은 가장 흔한 선택입니다. 소득, 응답 시간, 오른쪽으로 긴 꼬리를 가진 생물학적 측정 등 우측 왜도 데이터에 잘 작동합니다. Python에서는 np.log(data), R에서는 log(data)를 사용합니다.
제곱근 변환은 중간 정도의 왜도에 대한 완만한 대안이며, 데이터에 0이 포함된 경우(로그를 취할 수 없음)에 유용합니다. Python에서는 np.sqrt(data), R에서는 sqrt(data)를 사용하세요.
변환 후에는 정규성 검정을 다시 실행하세요. 변환된 데이터가 통과하면 모수적 검정을 진행하되, 결과 해석은 변환 스케일에서 이루어져야 함을 잊지 마세요.
비모수 검정 사용
변환이 통하지 않거나 데이터에 맞지 않으면 비모수 검정으로 전환하세요. 이들은 정규성을 가정하지 않으며, 원시값 대신 순위를 사용합니다.
- Mann-Whitney U 검정은 독립 표본 t-검정의 비모수 대안입니다. 두 그룹을 비교할 때 사용하세요
- Kruskal-Wallis 검정은 일원분산분석(ANOVA)의 비모수 버전입니다. 세 그룹 이상을 비교할 때 사용하세요
두 검정은 scipy.stats(mannwhitneyu() 및 kruskal())과 R의 기본 패키지(wilcox.test() 및 kruskal.test())에 포함되어 있습니다.
큰 표본에 의존
표본이 충분히 크면, 종종 정규성 걱정을 건너뛸 수 있습니다.
중심극한정리에 따르면 표본 크기가 커질수록, 평균의 표집분포는 원래 데이터의 분포와 무관하게 정규분포에 가까워집니다. 실무적으로는, 기저 데이터가 완벽히 정규가 아니어도 큰 표본에서는 모수적 검정이 대체로 신뢰할 수 있다는 뜻입니다.
정규성 검정 시 흔한 실수
정규성 검정은 쉽습니다 — 한 줄이면 충분하다는 것을 보셨죠. 그럼에도 틀릴 수 있는 지점들이 몇 가지 있습니다.
데이터 사이언스 입문자들이 자주 하는 실수는 다음과 같습니다:
- p-값만 의존하기: p-값은 정규성에서의 이탈이 탐지되었는지 여부만 알려줄 뿐, 그 크기나 중요성을 말해주지 않습니다. p > 0.05는 무조건 통과, p < 0.05는 무조건 탈락처럼 해석하는 것은 지나치게 단순합니다. 항상 Q-Q 플롯과 함께 해석하세요
- 표본 크기 효과 무시: 작은 표본에서는 실제 이탈을 놓치고, 데이터가 눈에 띄게 왜곡되었어도 p > 0.05를 반환할 수 있습니다. 큰 표본에서는 검정이 너무 민감해져 사소한 이탈도 통계적으로 유의하다고 표시합니다. 표본 크기에 따라 p-값의 의미가 달라질 수 있습니다
- 정규성 과도 검정: 모든 분석에 형식적 정규성 검정이 필요한 것은 아닙니다. 탐색적 작업에서는 히스토그램과 Q-Q 플롯만으로도 충분한 경우가 많습니다
- 미세한 이탈 오해: 실제 데이터는 거의 완벽히 정규적이지 않습니다. Q-Q 플롯의 기준선에서 약간 벗어나거나 p-값이 0.05 바로 아래라고 해서 데이터가 크게 비정규라는 뜻은 아닙니다. 핵심은 수행 중인 검정에 충분히 정규적인지 여부입니다
결론적으로, 정규성 검정은 데이터 점검 항목 중 하나일 뿐입니다. 최종 판단이 아니라 여러 입력 중 하나로 활용하세요.
정규성 검정을 생략해도 되는 경우
정규성 검정이 항상 필요한 것은 아닙니다. 마감에 쫓길 때, 언제 건너뛰어도 되는지 알면 결과에 영향 없이 시간을 절약할 수 있습니다.
대규모 데이터셋
표본이 크면 중심극한정리가 보장하는 바에 따라, 원자료의 모양과 관계없이 평균의 표집분포는 대략 정규가 됩니다. 이 경우 모수적 검정은 대체로 신뢰할 수 있으므로, 형식적 정규성 검정은 부가가치가 적습니다.
일부 통계 기법은 비정규성에 강건하기도 합니다. 선형회귀 같은 기법은 표본 크기가 적절하고 위반이 극단적이지 않다면 비교적 잘 버텨냅니다. (단, 선형회귀는 잔차의 정규성을 가정합니다.)
탐색적 분석
패턴을 훑고, 직관을 쌓고, 추가로 탐색할 변수를 고르는 단계에서는 간단한 히스토그램이나 Q-Q 플롯이면 충분합니다. 형식적 검정은 결론을 뒷받침해야 하는 확인적 분석 단계에서 필요합니다.
정규성 검정은 잘못된 결론을 막기 위한 안전장치입니다. 잘못된 결론의 대가가 크지 않거나, 사용하는 방법이 정규성에 의존하지 않는다면, 검정은 선택 사항입니다.
맺음말
정규성 검정의 핵심은, 결과를 신뢰할 만큼 가정이 충분히 성립하는지 확인하는 것입니다.
완벽히 정규적인 데이터셋은 없습니다. 목표는 데이터의 거동을 이해하고 그에 맞는 방법을 선택하는 것입니다. Q-Q 플롯은 이탈이 어디에 있는지 알려주고, 형식적 검정은 그것이 통계적으로 검출 가능한지를 알려줍니다. 둘을 결합하면 어느 한쪽만 볼 때보다 더 명확한 그림을 얻습니다.
적합한 검정은 맥락에 달려 있습니다. 작은 표본에는 Shapiro-Wilk, 꼬리가 중요하면 Anderson-Darling, 정규성을 가정할 수 없으면 비모수 대안을 사용하세요. 그리고 — 큰 표본이나 강건한 방법이 있다면 — 때로는 검정을 아예 하지 않아도 됩니다.
p-값 자체가 헷갈리시나요? 올바르게 해석하고 있는지 확인하려면 가설 검정 쉽게 이해하기 글을 읽어보세요.
정규성 검정 FAQ
정규성 검정이란 무엇인가요?
정규성 검정은 데이터가 정규(가우시안) 분포를 따르는지 확인하는 통계적 방법입니다. t-검정, ANOVA, 선형회귀 등 대부분의 일반적인 통계 검정은 정규성을 가정하므로, 분석 전에 이 가정을 점검하면 잘못된 결론을 피하는 데 도움이 됩니다.
항상 정규성을 검정해야 하나요?
항상 그런 것은 아닙니다. 큰 표본에서는 중심극한정리 덕분에, 기저 분포와 무관하게 모수적 검정이 신뢰할 만합니다. 탐색적 분석 단계라면 간단한 히스토그램이나 Q-Q 플롯으로도 충분한 경우가 많고, 형식적 정규성 검정은 결론을 검증해야 하는 확인적 분석에서 가장 유용합니다.
데이터가 정규성 검정을 통과하지 못하면 어떻게 해야 하나요?
선택지가 몇 가지 있습니다. 로그 또는 제곱근 변환으로 데이터를 변환한 뒤 다시 검정할 수 있습니다. 변환이 효과가 없으면, 정규성을 가정하지 않는 Mann-Whitney U(두 그룹 비교)나 Kruskal-Wallis(세 그룹 이상 비교) 같은 비모수 검정으로 전환하세요.
Shapiro-Wilk 검정과 Kolmogorov-Smirnov 검정의 차이는 무엇인가요?
Shapiro-Wilk은 정규성 검정을 위해 특별히 설계되었고 소·중규모 표본에서 가장 잘 작동합니다. Kolmogorov-Smirnov 검정은 보다 일반적이라 정규분포뿐 아니라 어떤 이론적 분포와도 비교할 수 있지만, 정규성 검정에 한해서는 Shapiro-Wilk보다 검출력이 낮아 미묘한 이탈을 놓칠 가능성이 큽니다.
정규성을 위한 Q-Q 플롯은 어떻게 해석하나요?
Q-Q 플롯은 데이터의 분위수를 이론적 정규분포의 분위수와 비교합니다. 점들이 대각선 기준선 근처에 놓이면 데이터가 정규적으로 행동하고 있다는 뜻입니다. 끝부분에서의 이탈은 꼬리 문제를 시사합니다 — S자 곡선은 왜도를, 양 끝에서 선에서 멀어지는 형태는 정규분포보다 꼬리가 더 두껍거나 더 가벼움을 의미합니다.