데이터 분석을 위한 통계학 기초 정리
- 기술통계, 추론통계, 확률분포, 가설검정, 회귀, 상관분석, 재현성까지 -
이 글은 데이터 분석을 시작할 때 반드시 연결해서 이해해야 하는 통계학 기초 개념을 정리한 글이다. 평균과 표준편차처럼 데이터를 요약하는 기술통계에서 시작해, 표본으로 모집단을 추정하는 추론통계, 데이터 분포, 가설검정, 회귀분석, 상관분석, 재현 가능성 관리까지 하나의 분석 흐름으로 정리한다. 통계 개념을 단순 공식으로 외우기보다, 실제 데이터 분석과 제조·품질 데이터 해석에서 어떤 판단 기준으로 쓰이는지 이해하는 데 초점을 둔다.
목차
1. 데이터 분석에서 통계가 중요한 이유
데이터 분석의 목적은 단순히 숫자를 계산하는 것이 아니라, 데이터를 통해 의사결정을 돕는 것이다. 통계는 데이터를 요약하고, 패턴을 발견하고, 일부 데이터에서 전체의 특성을 추정하며, 관찰된 차이가 우연인지 의미 있는 변화인지 판단하게 해준다.
예를 들어 고객 만족도 설문조사를 진행했다고 하자. 응답 데이터를 모아두는 것만으로는 충분하지 않다. 만족, 보통, 불만족 응답이 각각 얼마나 되는지 집계하고, 고객 유형별 불만족 비율이 어떻게 다른지 비교해야 한다. 이때 평균, 비율, 분포, 상관관계, 가설검정 같은 통계 개념이 사용된다.
제조 데이터에서도 통계는 핵심이다. 특정 설비의 불량률이 높은지, 공정 온도가 제품 두께에 영향을 주는지, 신규 조건 적용 후 수율이 개선되었는지, 센서값이 이상 패턴을 보이는지 판단하려면 감이 아니라 통계적 기준이 필요하다.
| 분석 질문 | 필요한 통계 관점 |
| 특정 공정의 평균 두께가 기준과 다른가? | 평균, 표준편차, 신뢰구간, t검정 |
| 신규 조건 적용 후 불량률이 낮아졌는가? | 비율 비교, 가설검정, p-value |
| 설비 ID와 불량 유형 사이에 관련이 있는가? | 범주형 데이터, 교차표, 카이제곱검정 |
| 센서값과 품질 특성 사이에 관계가 있는가? | 상관분석, 회귀분석, 변수 선택 |
통계는 분석 결과가 항상 정확하다고 보장하는 도구가 아니다. 통계는 불확실성을 수치화하고, 오차 가능성을 고려하면서도 더 합리적인 판단을 내리게 해주는 기준이다.

통계는 설문, 마케팅, 품질, 제조 데이터 등 다양한 상황에서 데이터 기반 의사결정을 돕는다.
2. 기술통계와 추론통계
통계는 크게 기술통계와 추론통계로 나눌 수 있다. 기술통계는 이미 수집된 데이터를 요약하고 설명하는 방법이고, 추론통계는 표본 데이터를 바탕으로 모집단의 특성을 추정하거나 가설을 검정하는 방법이다.
2.1 기술통계
기술통계는 현재 데이터가 어떤 상태인지 빠르게 파악하는 데 사용한다. 대표적인 기술통계량에는 평균, 중앙값, 분산, 표준편차, 범위가 있다.
| 기술통계량 | 의미 | 해석 포인트 |
| 평균 | 데이터의 전체 합을 개수로 나눈 값 | 전체적인 중심을 파악할 때 사용한다. |
| 중앙값 | 데이터를 정렬했을 때 가운데 위치한 값 | 이상치가 있을 때 평균보다 안정적인 중심값이 될 수 있다. |
| 분산 | 데이터가 평균에서 얼마나 퍼져 있는지 나타내는 값 | 편차를 제곱해 계산하므로 단위가 제곱 단위가 된다. |
| 표준편차 | 분산의 제곱근 | 원래 데이터와 같은 단위로 변동성을 해석할 수 있다. |
| 범위 | 최대값과 최소값의 차이 | 전체 퍼짐을 가장 간단하게 확인한다. |
2.2 추론통계
추론통계는 일부 표본을 통해 모집단을 추정하는 방법이다. 전체 고객, 전체 생산품, 전체 공정 로그를 모두 조사하기 어렵기 때문에 일부 표본을 사용해 전체 특성을 추정한다.
| 개념 | 의미 |
| 모집단 | 분석자가 관심을 가지는 전체 대상 |
| 표본 | 모집단에서 추출한 일부 데이터 |
| 표본오차 | 표본 통계량과 모집단의 실제 값 사이의 차이 |
| 신뢰구간 | 모집단의 모수가 포함될 것으로 기대되는 추정 범위 |
| 가설검정 | 데이터가 특정 주장을 뒷받침하는지 검정하는 절차 |
기술통계는 현재 데이터 자체를 요약하고, 추론통계는 표본을 이용해 전체 모집단을 추정한다. 표본이 모집단을 대표하지 못하면 추론 결과가 왜곡될 수 있으므로 표본 추출 방법과 표본 크기가 중요하다.
3. 데이터 분석의 기본 흐름
통계 기반 데이터 분석은 보통 위치 추정, 변이 추정, 분포 탐색, 범주형 데이터 탐색, 변수 간 관계 탐색 순서로 진행된다. 이 흐름은 단순 계산이 아니라 데이터를 이해하는 순서다.
3.1 기본 라이브러리 불러오기
실습에서는 pandas, numpy, matplotlib, seaborn을 자주 사용한다. pandas는 표 형태 데이터 처리, numpy는 수치 계산, matplotlib과 seaborn은 시각화에 사용된다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
3.2 위치 추정
위치 추정은 데이터의 중심이 어디에 있는지 확인하는 과정이다. 대표적으로 평균과 중앙값을 사용한다.
import numpy as np
data = [85, 90, 78, 92, 88, 76, 95, 89, 84, 91]
mean = np.mean(data)
median = np.median(data)
print(f"평균: {mean}")
print(f"중앙값: {median}")
평균과 중앙값이 비슷하면 데이터가 비교적 대칭적으로 분포한다고 볼 수 있다. 반대로 평균과 중앙값의 차이가 크다면 이상치가 있거나 분포가 한쪽으로 치우쳤을 가능성이 있다.
3.3 변이 추정
변이 추정은 데이터가 얼마나 퍼져 있는지 확인하는 과정이다. 대표적으로 분산, 표준편차, 범위를 사용한다.
variance = np.var(data)
std_dev = np.std(data)
data_range = np.max(data) - np.min(data)
print(f"분산: {variance}")
print(f"표준편차: {std_dev}")
print(f"범위: {data_range}")
3.4 데이터 분포 탐색
중심과 변동성을 계산한 뒤에는 실제 분포 모양을 확인해야 한다. 히스토그램은 데이터가 어느 구간에 많이 몰려 있는지 보여주고, 박스플롯은 중앙값, 사분위수, 이상치를 확인하는 데 좋다.
import matplotlib.pyplot as plt
plt.hist(data, bins=5)
plt.title("Histogram")
plt.show()
plt.boxplot(data)
plt.title("Boxplot")
plt.show()

히스토그램은 전체 분포 모양을, 박스플롯은 중앙값·사분위수·이상치를 빠르게 확인하는 데 사용한다.
3.5 범주형 데이터 탐색
범주형 데이터는 평균보다 빈도와 비율을 확인하는 것이 중요하다. 고객 만족 여부, 불량 유형, 설비 ID, 작업조, 제품 종류 등이 범주형 데이터에 해당한다.
import pandas as pd
import matplotlib.pyplot as plt
satisfaction = [
"satisfaction", "satisfaction", "dissatisfaction",
"satisfaction", "dissatisfaction", "satisfaction",
"satisfaction", "dissatisfaction"
]
counts = pd.Series(satisfaction).value_counts()
counts.plot(kind="bar")
plt.title("Satisfaction Distribution")
plt.show()

범주형 데이터에서는 각 범주의 빈도와 비율을 확인하는 것이 핵심이다.
3.6 변수 간 관계 탐색
두 변수 사이의 관계를 볼 때는 산점도와 상관계수를 함께 확인한다. 상관계수는 -1에서 1 사이 값을 가지며, 1에 가까우면 양의 선형 관계, -1에 가까우면 음의 선형 관계, 0에 가까우면 선형 관계가 약하다고 해석한다.
상관관계는 두 변수가 함께 움직이는 정도를 의미하지만, 인과관계를 의미하지 않는다. 아이스크림 판매량과 익사 사고 수가 함께 증가한다고 해서 아이스크림이 익사 사고의 원인이라고 볼 수는 없다. 두 변수 모두 여름철 기온이라는 제3의 요인에 의해 증가했을 수 있다.
4. 모집단과 표본
모집단은 분석자가 알고 싶은 전체 대상이고, 표본은 모집단에서 추출한 일부 데이터다. 예를 들어 특정 제품의 전체 생산품이 모집단이라면, 그중 검사 대상으로 뽑은 1,000개가 표본이다.
| 구분 | 의미 | 예시 |
| 모집단 | 관심 대상 전체 | 특정 공정에서 생산된 모든 웨이퍼 |
| 표본 | 모집단에서 추출한 일부 | 검사를 위해 선택한 일부 웨이퍼 |
| 전수조사 | 모집단 전체를 조사 | 모든 제품을 검사 |
| 표본조사 | 모집단 일부만 조사 | 일부 제품을 샘플링해 검사 |
import numpy as np
import matplotlib.pyplot as plt
population = np.random.normal(170, 10, 1000)
sample = np.random.choice(population, 100)
plt.hist(population, bins=50, alpha=0.5, label="population")
plt.hist(sample, bins=50, alpha=0.5, label="sample")
plt.legend()
plt.title("Population and Sample Distribution")
plt.show()

무작위 표본이 모집단의 분포를 어느 정도 반영하는지 확인하는 예시이다.
5. 표본오차와 신뢰구간
표본오차는 표본에서 계산한 값과 모집단의 실제 값 사이의 차이다. 표본 평균이 모집단 평균과 완전히 같을 가능성은 낮다. 표본은 전체가 아니라 일부이기 때문이다.
표본오차는 일반적으로 표본 크기가 커질수록 줄어든다. 또한 무작위 추출이 잘 이루어지고 표본이 모집단을 잘 대표할수록 줄어든다.
표준오차 = 표본표준편차 / √표본크기
신뢰구간은 모집단 평균이나 비율 같은 모수가 포함될 것으로 기대되는 추정 범위다. 95% 신뢰구간은 같은 방식으로 표본 추출과 신뢰구간 계산을 반복했을 때, 그중 약 95%의 구간이 모집단 모수를 포함한다는 의미로 이해하는 것이 적절하다.
import numpy as np
import scipy.stats as stats
sample = np.array([72, 75, 78, 80, 74, 77, 79, 81, 76, 73])
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
n = len(sample)
conf_interval = stats.t.interval(
confidence=0.95,
df=n - 1,
loc=sample_mean,
scale=sample_std / np.sqrt(n)
)
print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")

신뢰구간은 표본을 통해 모집단 평균을 추정할 때 불확실성을 범위로 표현한다.
6. 주요 확률분포
통계 분석에서는 데이터가 어떤 분포를 따르는지 이해하는 것이 중요하다. 분포를 알아야 적절한 검정 방법과 모델을 선택할 수 있기 때문이다.
6.1 정규분포
정규분포는 평균을 중심으로 좌우 대칭인 종 모양의 분포다. 평균, 중앙값, 최빈값이 거의 같고, 표준편차가 작을수록 분포가 좁아지고 표준편차가 클수록 넓게 퍼진다.
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
normal_dist = np.random.normal(170, 10, 1000)
plt.hist(normal_dist, bins=30, density=True, alpha=0.6)
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, linewidth=2)
plt.title("Normal Distribution")
plt.show()

정규분포는 평균 주변에 데이터가 몰리고 평균에서 멀어질수록 빈도가 줄어드는 대표적인 연속형 분포이다.
6.2 긴 꼬리 분포
긴 꼬리 분포는 대부분의 데이터가 한쪽에 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 비대칭 분포다. 소득, 매출, 웹사이트 방문자 수, 고객별 구매 금액처럼 일부 큰 값이 전체 평균을 끌어올리는 데이터에서 자주 나타난다.
long_tail = np.random.exponential(1, 1000)
plt.hist(long_tail, bins=30, density=True, alpha=0.6)
plt.title("Long Tail Distribution")
plt.show()

긴 꼬리 분포에서는 평균이 중앙값보다 크게 나타날 수 있으므로 중앙값과 분위수를 함께 봐야 한다.
데이터 수가 많아진다고 원자료 자체가 무조건 정규분포가 되는 것은 아니다. 중심극한정리는 표본평균의 분포가 표본 크기가 커질수록 정규분포에 가까워진다는 의미이다. 원자료가 긴 꼬리 분포라면 여전히 비대칭 분포일 수 있다.
6.3 스튜던트 t 분포
t분포는 모집단의 표준편차를 알 수 없고 표본 크기가 작은 경우에 사용된다. 정규분포와 비슷하지만 표본 크기가 작을수록 꼬리가 두껍고, 자유도가 커질수록 정규분포에 가까워진다.
t_dist = np.random.standard_t(df=10, size=1000)
plt.hist(t_dist, bins=30, density=True, alpha=0.6)
x = np.linspace(-4, 4, 100)
p = stats.t.pdf(x, df=10)
plt.plot(x, p, linewidth=2)
plt.title("Student t Distribution")
plt.show()

t분포는 작은 표본의 평균 비교와 평균 신뢰구간 계산에 자주 사용된다.
6.4 카이제곱분포
카이제곱분포는 범주형 데이터의 적합도 검정이나 독립성 검정에 사용된다. 0 이상의 값만 가지며, 자유도에 따라 분포 모양이 달라진다.
chi2_dist = np.random.chisquare(df=2, size=1000)
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6)
x = np.linspace(0, 10, 100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, linewidth=2)
plt.title("Chi-square Distribution")
plt.show()

카이제곱분포는 관측 빈도와 기대 빈도의 차이를 검정할 때 사용된다.
6.5 이항분포
이항분포는 성공과 실패처럼 결과가 두 가지인 시행을 여러 번 반복했을 때 성공 횟수의 분포를 나타낸다. 제품 100개 중 불량품 개수, 고객 1,000명 중 구매 고객 수처럼 이진 결과를 다룰 때 유용하다.
binom_dist = np.random.binomial(n=10, p=0.5, size=1000)
plt.hist(binom_dist, bins=10, density=True, alpha=0.6)
plt.title("Binomial Distribution")
plt.show()

이항분포는 n번의 독립 시행과 성공확률 p로 정의된다.
6.6 푸아송분포
푸아송분포는 특정 시간이나 공간에서 사건이 몇 번 발생하는지 모델링할 때 사용된다. 콜센터 전화 수, 하루 동안 설비 알람 수, 단위 면적당 결함 개수처럼 일정 구간 안에서 발생 횟수를 다룰 때 적합하다.
from scipy.stats import poisson
lambda_value = 4
x = np.arange(0, 15)
poisson_pmf = poisson.pmf(x, lambda_value)
plt.bar(x, poisson_pmf, alpha=0.6)
plt.xlabel("Number of Events")
plt.ylabel("Probability")
plt.title("Poisson Distribution")
plt.show()

푸아송분포는 평균 발생률 λ를 기준으로 사건 발생 횟수를 모델링한다.
| 분포 | 사용 상황 | 핵심 포인트 |
| 정규분포 | 연속형 데이터가 평균 중심으로 대칭 분포 | 평균과 표준편차로 설명 |
| 긴 꼬리 분포 | 일부 큰 값이 전체에 큰 영향 | 평균보다 중앙값, 분위수 확인 |
| t분포 | 표본이 작고 모집단 표준편차를 모름 | 평균 비교, 신뢰구간 |
| 카이제곱분포 | 범주형 데이터의 빈도 검정 | 적합도, 독립성 검정 |
| 이항분포 | 성공/실패 결과의 성공 횟수 | n과 p로 정의 |
| 푸아송분포 | 일정 시간·공간의 발생 횟수 | 평균 발생률 λ로 정의 |
7. 가설검정
가설검정은 표본 데이터를 이용해 특정 주장이 통계적으로 타당한지 판단하는 절차다. 새로운 공정 조건을 적용했을 때 불량률이 낮아졌다고 주장하려면, 단순히 표본에서 불량률이 낮게 나왔다는 사실만으로는 부족하다. 그 차이가 우연히 발생한 것인지, 실제로 의미 있는 차이인지 검정해야 한다.
| 가설 | 의미 | 예시 |
| 귀무가설 H0 | 변화가 없다, 차이가 없다, 효과가 없다는 기본 가설 | 신규 공정 전후 평균 불량률 차이는 없다. |
| 대립가설 H1 | 변화가 있다, 차이가 있다, 효과가 있다는 주장 | 신규 공정 전후 평균 불량률 차이가 있다. |
가설검정은 보통 귀무가설과 대립가설 설정, 유의수준 결정, 검정통계량 계산, p-value 계산, p-value와 유의수준 비교, 결론 도출 순서로 진행된다.
p-value는 귀무가설이 참이라고 가정했을 때, 현재 관찰된 결과 또는 그보다 더 극단적인 결과가 나올 확률이다. p-value가 작다는 것은 귀무가설 아래에서 현재 결과가 우연히 나오기 어렵다는 뜻이다.
p-value가 작다고 해서 효과의 크기가 크다는 의미는 아니다. 표본 수가 매우 크면 아주 작은 차이도 통계적으로 유의하게 나올 수 있다. 따라서 p-value와 함께 효과 크기, 신뢰구간, 실무적 의미를 함께 봐야 한다.

가설검정은 관찰된 차이가 우연인지 실제 효과인지 판단하기 위한 절차이다.
8. A/B 테스트
A/B 테스트는 두 그룹을 비교하여 어떤 버전이 더 효과적인지 평가하는 실험 방법이다. 웹사이트 버튼 디자인, 광고 문구, 랜딩 페이지, 앱 푸시 알림, 제조 공정 조건 비교 등에 사용할 수 있다.
A/B 테스트의 핵심은 두 그룹 간 차이가 우연인지 실제 효과인지 검정하는 것이다. 온라인 쇼핑몰에서 기존 랜딩 페이지 A와 새로운 랜딩 페이지 B의 구매 전환율을 비교한다면 다음처럼 가설을 세울 수 있다.
H1: A와 B의 구매 전환율 차이는 있다.
import numpy as np
import scipy.stats as stats
group_a = np.random.binomial(1, 0.30, 100)
group_b = np.random.binomial(1, 0.45, 100)
t_stat, p_value = stats.ttest_ind(group_a, group_b)
print(f"t-statistic: {t_stat}")
print(f"p-value: {p_value}")
구매 여부처럼 0/1로 기록된 데이터는 평균이 전환율이므로 t-test로 평균 차이를 비교할 수도 있다. 다만 전환율 비교에서는 두 비율 검정, 카이제곱 검정, Fisher exact test 등을 함께 고려하는 것이 더 자연스럽다.
9. t검정
t검정은 두 그룹의 평균 차이가 통계적으로 유의한지 확인하는 대표적인 검정 방법이다.
| 검정 종류 | 사용 상황 | 예시 |
| 독립표본 t검정 | 서로 다른 두 그룹의 평균 비교 | A반과 B반 시험 점수, 기존 공정과 신규 공정 평균 생산량 비교 |
| 대응표본 t검정 | 같은 대상의 전후 평균 비교 | 교육 전후 점수, 설비 개선 전후 동일 라인의 불량률 비교 |
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)
t_stat, p_value = stats.ttest_ind(scores_method1, scores_method2)
print(f"T-statistic: {t_stat}")
print(f"p-value: {p_value}")
독립표본 t검정은 두 집단이 서로 독립일 때 사용하고, 대응표본 t검정은 같은 대상에서 전후 차이를 볼 때 사용한다. 분석 전에는 두 그룹이 독립인지, 같은 대상의 반복 측정인지 먼저 구분해야 한다.
10. 다중검정과 오류 증가
다중검정은 여러 가설을 동시에 검정할 때 발생하는 문제다. 검정을 한 번만 수행할 때 유의수준을 0.05로 설정하면 제1종 오류를 5% 수준으로 관리한다. 하지만 검정을 여러 번 반복하면 전체 실험에서 한 번이라도 제1종 오류가 발생할 확률이 커진다.
1 - (1 - α)^m α = 0.05, m = 10일 때 1 - (1 - 0.05)^10 ≈ 0.401
즉, 10개의 가설을 동시에 검정하면 하나 이상의 제1종 오류가 발생할 확률이 약 40.1%까지 증가할 수 있다. 이를 줄이기 위해 본페로니 보정, Tukey 보정, Dunnett 보정 같은 방법을 사용한다.
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)
p_values = [
stats.ttest_ind(group_A, group_B).pvalue,
stats.ttest_ind(group_A, group_C).pvalue,
stats.ttest_ind(group_B, group_C).pvalue
]
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
print(f"본페로니 보정 유의수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
if p < adjusted_alpha:
print(f"검정 {i+1}: 유의미한 차이 있음, p={p:.4f}")
else:
print(f"검정 {i+1}: 유의미한 차이 없음, p={p:.4f}")
수백 개 센서 변수와 불량 여부의 관계를 각각 검정하면 우연히 유의하게 나오는 변수가 많아질 수 있다. 따라서 다중검정 보정, 검증 데이터 분리, 도메인 기반 변수 해석이 함께 필요하다.
11. 카이제곱검정
카이제곱검정은 범주형 데이터를 분석할 때 사용한다. 크게 관찰된 빈도가 기대 빈도와 일치하는지 확인하는 적합도 검정과, 두 범주형 변수 사이에 관계가 있는지 확인하는 독립성 검정이 있다.
| 구분 | 질문 | 예시 |
| 적합도 검정 | 관찰 빈도가 기대 빈도와 일치하는가? | 주사위 각 면이 동일한 확률로 나오는가? |
| 독립성 검정 | 두 범주형 변수는 서로 독립인가? | 설비 종류와 불량 유형 사이에 관계가 있는가? |
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"카이제곱 통계량: {chi2_stat}")
print(f"p-value: {p_value}")
observed = np.array([
[30, 10],
[20, 40]
])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"카이제곱 통계량: {chi2_stat}")
print(f"p-value: {p_value}")
print(f"자유도: {dof}")
print(f"기대 빈도:\n{expected}")
독립성 검정에서 p-value가 작으면 두 범주형 변수가 독립이 아니라고 판단할 수 있다. 즉, 두 변수 사이에 연관성이 있을 가능성이 있다.
12. 제1종 오류와 제2종 오류
가설검정은 항상 오류 가능성을 가진다. 대표적인 오류는 제1종 오류와 제2종 오류다.
| 구분 | 의미 | 다른 표현 | 제조 예시 |
| 제1종 오류 | 귀무가설이 참인데 기각하는 오류 | 위양성, false positive |
실제 개선 효과가 없는데 불량률이 개선되었다고 판단 |
| 제2종 오류 | 귀무가설이 거짓인데 기각하지 않는 오류 | 위음성, false negative |
실제 개선 효과가 있는데 데이터 부족으로 차이가 없다고 판단 |
유의수준 α를 낮추면 제1종 오류는 줄어들 수 있지만 제2종 오류가 커질 수 있다. 표본 크기를 늘리면 일반적으로 제2종 오류를 줄이고 검정력을 높일 수 있다.
13. 회귀분석
회귀분석은 독립변수와 종속변수 사이의 관계를 모델링하고 예측하는 방법이다. 상관분석이 두 변수의 관계 정도를 보는 데 초점을 둔다면, 회귀분석은 독립변수를 이용해 종속변수를 설명하거나 예측하는 데 초점을 둔다.
13.1 단순선형회귀
단순선형회귀는 하나의 독립변수 X와 하나의 종속변수 Y 사이의 관계를 직선으로 모델링하는 방법이다.
β0: 절편 | β1: 기울기
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
print("MSE:", mean_squared_error(y_test, y_pred))
print("R2:", r2_score(y_test, y_pred))

단순선형회귀는 하나의 X로 Y를 설명하며, 데이터가 직선적 경향을 따를 때 해석이 쉽다.
13.2 다중선형회귀
다중선형회귀는 두 개 이상의 독립변수를 사용해 하나의 종속변수를 예측한다.
여러 변수를 동시에 고려할 수 있다는 장점이 있지만, 변수들끼리 강하게 상관되어 있으면 다중공선성 문제가 발생할 수 있다.
13.3 다중공선성
다중공선성은 독립변수들끼리 강한 상관관계를 가지는 문제다. 예를 들어 공정 온도와 히터 출력이 거의 같은 정보를 담고 있다면 두 변수를 동시에 넣었을 때 각각의 효과를 분리하기 어렵다.
| 문제 | 설명 |
| 계수 해석 불안정 | 변수 하나가 조금만 바뀌어도 회귀계수가 크게 달라질 수 있다. |
| 유의성 왜곡 | 실제로 중요한 변수가 통계적으로 유의하지 않게 나올 수 있다. |
| 변수 효과 분리 어려움 | 서로 비슷한 정보를 가진 변수의 개별 효과를 해석하기 어렵다. |
13.4 회귀에서 범주형 변수 처리
회귀모델은 기본적으로 숫자를 입력으로 사용한다. 따라서 성별, 지역, 설비 ID, 제품 종류처럼 문자로 된 범주형 변수는 숫자로 변환해야 한다.
| 범주형 변수 | 의미 | 처리 방법 |
| 순서형 변수 | 범주 사이에 순서가 있음 | 순서를 반영한 숫자 변환 |
| 명목형 변수 | 범주 사이에 순서가 없음 | 원-핫 인코딩 |
import pandas as pd
from sklearn.linear_model import LinearRegression
data = {
"Gender": ["Male", "Female", "Female", "Male", "Male"],
"Experience": [5, 7, 10, 3, 8],
"Salary": [50, 60, 65, 40, 55]
}
df = pd.DataFrame(data)
df_encoded = pd.get_dummies(df, drop_first=True)
X = df_encoded[["Experience", "Gender_Male"]]
y = df_encoded["Salary"]
model = LinearRegression()
model.fit(X, y)
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
13.5 다항회귀와 스플라인 회귀
다항회귀는 독립변수와 종속변수의 관계가 직선이 아니라 곡선일 때 사용한다. 독립변수의 다항식을 사용해 비선형 관계를 표현한다. 스플라인 회귀는 독립변수의 구간별로 다른 회귀식을 적용하여 복잡한 비선형 관계를 더 유연하게 모델링한다.
from sklearn.preprocessing import PolynomialFeatures
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100)
X = X[:, np.newaxis]
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
model = LinearRegression()
model.fit(X_poly, y)
y_pred = model.predict(X_poly)
print("MSE:", mean_squared_error(y, y_pred))
print("R2:", r2_score(y, y_pred))

다항회귀와 스플라인 회귀는 직선 하나로 설명하기 어려운 비선형 관계를 표현할 때 사용한다.
단, 차수나 매듭점 선택에 따라 과적합이 발생할 수 있다.
14. 상관분석
상관분석은 두 변수 사이에 어떤 관계가 있는지 확인하는 방법이다. 상관계수는 일반적으로 -1에서 1 사이 값을 가지며, 1에 가까우면 강한 양의 관계, -1에 가까우면 강한 음의 관계, 0에 가까우면 선형 관계가 약하다고 해석한다.
14.1 피어슨 상관계수
피어슨 상관계수는 두 연속형 변수 사이의 선형 관계를 측정한다. 선형 관계에는 강하지만, 비선형 관계를 잘 잡지 못할 수 있으므로 산점도를 함께 확인해야 한다.
14.2 스피어만 상관계수와 켄달의 타우
스피어만 상관계수는 값 자체가 아니라 순위 간 관계를 측정한다. 데이터가 정규분포를 따르지 않거나 순서형 데이터일 때 유용하다. 켄달의 타우는 순위 쌍이 얼마나 일관되게 움직이는지 계산하며, 표본 수가 작거나 순위 일관성을 보고 싶을 때 사용할 수 있다.
14.3 상호정보
상호정보는 두 변수 사이의 정보 의존성을 측정한다. 선형 관계뿐 아니라 비선형 관계도 탐지할 수 있으며, 범주형 변수에도 적용할 수 있다. 다만 피어슨 상관계수처럼 -1에서 1 사이로 표준화된 값은 아니므로 값 자체의 절대적 해석에는 주의해야 한다.
from scipy.stats import pearsonr, spearmanr, kendalltau
np.random.seed(0)
study_hours = np.random.rand(100) * 10
exam_scores = 3 * study_hours + np.random.randn(100) * 5
pearson_corr, pearson_p = pearsonr(study_hours, exam_scores)
spearman_corr, spearman_p = spearmanr(study_hours, exam_scores)
kendall_corr, kendall_p = kendalltau(study_hours, exam_scores)
print(f"피어슨 상관계수: {pearson_corr}")
print(f"스피어만 상관계수: {spearman_corr}")
print(f"켄달의 타우: {kendall_corr}")
from sklearn.metrics import mutual_info_score
X = np.array(["cat", "dog", "cat", "cat", "dog", "dog", "cat", "dog"])
Y = np.array(["high", "low", "high", "high", "low", "low", "high", "low"])
mi = mutual_info_score(X, Y)
print(f"Mutual Information: {mi}")

상관계수는 데이터의 형태와 분석 목적에 따라 선택해야 한다.
선형 관계는 피어슨, 순위 관계는 스피어만·켄달, 복잡한 비선형 의존성은 상호정보를 고려할 수 있다.
15. 분석 결과의 신뢰성 관리
통계 분석에서 중요한 것은 계산 결과만이 아니다. 분석 결과가 우연히 나온 것이 아닌지, 반복해도 같은 결론이 유지되는지, 분석 과정에서 연구자의 편향이 개입되지 않았는지 확인해야 한다.
15.1 재현 가능성
재현 가능성은 동일한 연구나 분석 절차를 반복했을 때 일관된 결과가 나오는지를 의미한다. 데이터 분석 결과가 한 번만 우연히 나온 결과라면 신뢰하기 어렵다.
| 재현 가능성이 낮아지는 이유 | 설명 |
| 표본 수 부족 | 우연 변동이 크게 반영될 수 있다. |
| p-해킹 | 유리한 p-value가 나올 때까지 반복 분석한다. |
| 선택적 보고 | 유의미한 결과만 보고하고 나머지는 숨긴다. |
| 탐색·검증 미분리 | 탐색 데이터에서 찾은 패턴을 같은 데이터로 다시 검증한다. |
15.2 p-해킹
p-해킹은 원하는 결과를 얻기 위해 데이터를 반복적으로 분석하고, p-value가 유리하게 나오는 결과만 선택하는 행위다. 여러 변수를 바꿔가며 p-value가 0.05보다 작게 나오는 결과만 보고하거나, 표본 수를 조금씩 늘리다가 유의미해지는 순간 수집을 멈추는 방식이 대표적이다.
15.3 선택적 보고
선택적 보고는 유의미한 결과만 보고하고 유의미하지 않은 결과를 숨기는 행위다. 예를 들어 100개의 센서 변수와 불량 여부의 관계를 분석했는데 p-value가 낮게 나온 3개 변수만 보고하면 전체 맥락이 왜곡된다. 나머지 97개 변수에서 유의미한 관계가 없었다는 사실도 함께 고려해야 한다.
15.4 자료수집 중단 시점 결정
자료수집 중단 시점을 사전에 정하지 않으면 원하는 결과가 나올 때까지 데이터를 계속 모으는 문제가 발생할 수 있다. 분석 전에 목표 표본 크기, 수집 기간, 제외 기준, 주요 평가 지표, 검정 방법, 중간 분석 여부를 정해야 한다.

결과를 보면서 자료수집을 중단하면 연구자의 편향이 분석 결과에 영향을 줄 수 있다.
15.5 데이터 탐색과 검증 분리
데이터 탐색과 검증을 분리하는 것은 분석 결과의 신뢰성을 높이는 핵심 원칙이다. 탐색 데이터는 패턴을 찾고 가설을 세우는 데 사용하고, 검증 데이터는 탐색 과정에서 발견한 패턴이 새로운 데이터에서도 유효한지 확인하는 데 사용한다.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = LinearRegression()
model.fit(X_train, y_train)
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
print("Train MSE:", mean_squared_error(y_train, y_train_pred))
print("Train R2:", r2_score(y_train, y_train_pred))
print("Test MSE:", mean_squared_error(y_test, y_test_pred))
print("Test R2:", r2_score(y_test, y_test_pred))
훈련 데이터 성능은 좋은데 테스트 데이터 성능이 낮다면 과적합을 의심해야 한다. 통계 분석에서도 탐색한 데이터에서만 유의미한 결과가 나오는지, 새로운 검증 데이터에서도 같은 결과가 나오는지 확인해야 한다.
16. 전체 흐름 정리
통계학 기초는 서로 독립된 개념의 나열이 아니라 하나의 분석 흐름으로 연결된다. 데이터를 수집하면 먼저 기술통계로 중심과 변동성을 파악하고, 히스토그램·박스플롯·산점도 등으로 분포와 이상치를 확인한다. 전체 데이터를 모두 알 수 없다면 표본을 이용해 모집단을 추정하고, 신뢰구간으로 불확실성을 표현한다.
특정 차이나 효과가 있는지 확인하려면 가설검정을 수행한다. 두 그룹의 평균 차이는 t검정, 범주형 변수의 관계는 카이제곱검정, 여러 그룹이나 여러 변수를 동시에 비교할 때는 다중검정 문제를 고려한다. 변수 간 관계를 설명하고 예측하려면 회귀분석을 사용하고, 관계의 강도를 파악하려면 상관분석을 사용한다. 마지막으로 재현 가능성, p-해킹, 선택적 보고, 탐색-검증 분리를 관리해야 분석 결과의 신뢰성을 지킬 수 있다.
| 단계 | 핵심 질문 | 주요 개념 |
| 데이터 요약 | 데이터의 중심과 퍼짐은 어떤가? | 평균, 중앙값, 분산, 표준편차 |
| 분포 확인 | 데이터가 어떤 모양으로 분포하는가? | 히스토그램, 박스플롯, 정규분포, 긴 꼬리 분포 |
| 표본 추정 | 일부 데이터로 전체를 추정할 수 있는가? | 모집단, 표본, 표본오차, 신뢰구간 |
| 가설검정 | 관찰된 차이가 우연인가 실제 효과인가? | p-value, t검정, 카이제곱검정 |
| 오류 관리 | 잘못된 결론 가능성은 무엇인가? | 제1종 오류, 제2종 오류, 다중검정 |
| 관계 분석 | 변수들이 서로 어떤 관계를 가지는가? | 회귀분석, 상관계수, 상호정보 |
| 신뢰성 확보 | 결과가 반복되어도 유지되는가? | 재현 가능성, p-해킹 방지, 검증 데이터 분리 |

17. 마무리
통계는 데이터 분석의 기본 언어다. 평균, 표준편차, 분포, 신뢰구간, 가설검정, 회귀, 상관분석은 각각 따로 외우는 공식이 아니라 데이터를 해석하는 연결된 도구다.
기술통계는 현재 데이터를 설명하고, 추론통계는 일부 표본으로 전체를 추정한다. 확률분포는 데이터가 어떤 구조를 가지는지 이해하게 해주고, 가설검정은 관찰된 차이가 우연인지 판단하게 해준다. 회귀분석과 상관분석은 변수 간 관계를 설명하고, 재현성 관리는 분석 결과가 신뢰할 수 있는지 점검하게 해준다.
데이터 분석에서 중요한 것은 단순히 p-value가 0.05보다 작은지 확인하는 것이 아니다. 데이터가 어떤 방식으로 수집되었는지, 어떤 분포를 가지는지, 어떤 검정 방법이 적절한지, 결과가 새로운 데이터에서도 재현되는지를 함께 판단해야 한다.
좋은 데이터 분석은 계산을 많이 하는 것이 아니라, 데이터의 구조와 불확실성을 올바르게 이해하고, 적절한 통계 방법으로 해석하며, 결과가 반복 가능한지까지 확인하는 과정이다.
출처
※ KDT 빅데이터 기반 품질 관리(QA,QC) 양성 과정 6회차
※ 통계학 기초 Chap.1~3 강의자료
※ 통계학 기초 Chap.4~6 강의자료
'TIL > 기초 통계' 카테고리의 다른 글
| 확률분포와 정규분포로 이해하는 제조 데이터 (0) | 2026.06.18 |
|---|---|
| 기초적인 통계 개념 (0) | 2026.06.17 |
