Today I learned
1. [라이브세션 복습] 기초통계 - 추론통계 4회(10.31 수업분)
1) 복습 겸 정리
- 기초통계 1 요약
| 대분류 | 소분류 | 정의 및 설명 | 특징 및 수식/코드 | 활용 예시 |
| 통계학 구분 | 기술통계 (Descriptive) | 수집된 데이터를 요약, 정리, 시각화하여 데이터의 특징을 파악하는 통계. "데이터는 어떻게 생겼나?"에 답합니다. | 방법: 평균, 분산, 그래프 등 대상: 관측된 전체 데이터 결과: 데이터 현황 제시 |
- 대표값(평균, 중앙값), 산포도(분산, 표준편차) 계산 - 히스토그램, 막대그래프 등으로 데이터 시각화 |
| 추론통계 (Inferential) | 표본(Sample) 데이터를 바탕으로 모집단(Population)의 특성을 추정하거나 검정하는 통계. "이 결과를 일반화할 수 있을까?" | 방법: 확률, 신뢰구간, 가설검정 대상: 표본 데이터 결과: 일반화된 결론 도출 |
- 신뢰구간 추정 - 가설검정 (t-test, ANOVA) - 상관/회귀분석 |
|
| 데이터 종류 | 수치형 (Quantitative) | 연속형 (Continuous): 키, 몸무게, 온도처럼 연속적인 수치. 소수점 표현 가능. 이산형 (Discrete): 학생 수, 사고 건수처럼 정수 단위로 세는 수치. |
사칙연산이 가능 | - 키(cm): 175.5, 180.2 - 불량 개수: 5개, 10개 |
| 범주형 (Categorical) | 명목형 (Nominal): 성별, 혈액형처럼 순서 없는 범주. 순서형 (Ordinal): 만족도, 등급처럼 순서가 있는 범주. |
범주로 구분되며, 산술 연산이 무의미 | - 혈액형: A, B, O, AB - 만족도: 좋음, 보통, 나쁨 |
|
| 데이터 정리 | 도수분포표 | 데이터를 특정 구간(계급)으로 나누고, 각 구간에 속하는 데이터의 개수(도수)를 정리한 표. | 주요 용어:계급: 데이터를 나눈 구간, 도수: 각 계급에 속하는 자료의 개수, 상대도수: (도수) / (전체 도수), 누적도수: 처음부터 해당 계급까지의 도수 합계 | 학생 80명의 키 데이터를 141~145, 146~150 등의 구간으로 나누어 각 구간의 학생 수를 표기 |
| 히스토그램 | 도수분포표를 바탕으로 각 계급을 가로축, 도수를 세로축으로 하여 그린 막대그래프 형태. 데이터의 분포 모양을 시각적으로 파악하기 용이 | plt.hist(data, bins=10) | 키 데이터 분포를 막대그래프로 시각화하여 어느 구간에 가장 많은 학생이 분포하는지 확인 | |
| 대표값 | 평균 (Mean) | 모든 데이터 값을 더해 개수로 나눈 값. | np.mean(data)이상치(Outlier)에 민감하게 반응. | 데이터가 고르게 분포할 때 (정규분포 등) 중심 경향성을 나타내기 위해 사용. |
| 중앙값 (Median) | 데이터를 크기순으로 나열했을 때 중앙에 위치하는 값. | np.median(data)이상치의 영향을 거의 받지 않음. | 마이클 조던의 연봉처럼 극단적인 값이 포함된 데이터의 중심 경향성을 파악할 때 유용. (예: 중위 소득) | |
| 최빈값 (Mode) | 데이터에서 가장 빈번하게 나타나는 값. | stats.mode(data)범주형 데이터에서 주로 사용. | 가장 인기 있는 제품 색상, 선호하는 혈액형 등 빈도를 기반으로 대표 값을 찾을 때 사용. | |
| 산포도 | 편차, 분산, 표준편차 | 데이터가 평균으로부터 얼마나 흩어져 있는지(퍼져 있는지)를 나타내는 척도. | ![]() |
두 집단의 평균이 같더라도 표준편차가 더 큰 집단이 데이터의 흩어짐이 더 심하다고 해석. |
| 변동 계수 (CV) | 표준편차를 평균으로 나눈 값. 단위가 다른 두 데이터 그룹의 상대적인 퍼짐 정도를 비교할 때 사용 | ![]() |
키(cm) 데이터와 몸무게(kg) 데이터 중 어느 쪽의 변동성이 상대적으로 더 큰지 비교. | |
| 사분위수 (Quartile) | 데이터를 4등분하는 위치의 값. Q1(25%), Q2(50%, 중앙값), Q3(75%). | IQR (사분위 범위) = Q3 - Q1<br>np.percentile(data, 25/50/75) | 이상치 탐지: Q1 - 1.5 * IQR 보다 작거나 Q3 + 1.5 * IQR 보다 큰 값 | |
| 분포 형태 | 왜도 (Skewness) | 분포의 좌우 비대칭성. 평균을 중심으로 어느 한쪽으로 치우친 정도. | 양수(+): 오른쪽 꼬리가 김 (Right Skew) 0: 좌우 대칭 음수(-): 왼쪽 꼬리가 김 (Left Skew) |
데이터 분포가 정규분포 대비 얼마나 비대칭적인지 평가. |
| 첨도 (Kurtosis) | 분포의 뾰족한 정도. 중심에 데이터가 얼마나 집중되어 있는지를 나타냄. | > 3: 정규분포보다 뾰족함 = 3: 정규분포와 유사(scipy, pandas에서는 0을 기준으로 판단) < 3: 정규분포보다 평평함 |
데이터가 정규분포보다 더 뾰족한지(이상치가 많을 수 있음) 혹은 평평한지 평가. | |
| 기본 분포 | 정규분포 | 평균을 중심으로 좌우 대칭인 종 모양의 분포. 자연 및 사회 현상에서 흔히 발견 | - 평균 = 중앙값 = 최빈값 - 왜도 = 0, 첨도 = 3 - 표준정규분포: 평균=0, 표준편차=1 |
통계적 추정 및 가설검정의 기본 가정으로 널리 활용. (예: 공정 능력 분석) |
- 기초통계 2 요약
| 대분류 | 소분류 | 정의 및 설명 | 특징 및 수식/코드 | 사용 예시 |
| 확률 기초 | 확률변수 (Random Variable) | 특정 시행의 결과를 수치로 나타내는 변수 - 이산형: 셀 수 있는 값 (결함 수) - 연속형: 연속적인 실수 값 (길이, 온도) |
![]() |
- 이산형: 하루 결함 건수 - 연속형: 제품 길이, 온도, 압력 |
| 확률분포 (Probability Distribution) | 확률변수(X)가 가질 수 있는 값과 그 값이 나타날 확률(P(X))을 나타낸 규칙 또는 함수. 모든 확률의 합은 1임. |
plt.bar(X, P_X) | 동전 던지기 결과의 확률을 시각화하여 분포를 파악함. | |
| 확률분포 함수 | 확률질량함수 (PMF) | 이산형 확률변수의 각 값이 나타날 확률을 정의한 함수임. 특정 값에 대한 확률을 직접 나타냄. |
scipy.stats.binom.pmf(k, n, p) | 제조업: 샘플 중 특정 개수의 불량품이 나올 확률을 계산함. |
| 확률밀도함수 (PDF) | 연속형 확률변수의 확률 분포를 나타내는 함수. 특정 값의 확률은 0이며, 곡선 아래의 면적(적분값)이 특정 구간에 속할 확률을 의미함. |
scipy.stats.norm.pdf(x, loc, scale) | 제조업: 제품 길이가 특정 범위 내에 있을 확률을 계산하고 품질을 관리함. | |
| 커널밀도추정 (KDE) | 실제 데이터(표본)만을 가지고 연속형 변수의 PDF를 비모수적으로 추정하는 방법 데이터 기반의 PDF 근사치 | seaborn.kdeplot(data) | 보유한 센서 데이터의 실제 분포를 특정 이론적 분포(예: 정규분포)를 가정하지 않고 시각화함. | |
| 주요 확률분포 | 이항분포 (Binomial) | 성공 확률이 p인 베르누이 시행을 n번 반복했을 때의 성공 횟수(k)에 대한 이산형 확률분포 | ![]() |
품질 검사: 100개의 제품 중 불량품이 3개 이하일 확률을 예측함. |
| 포아송분포 (Poisson) | 단위 시간 또는 공간 내에서 어떤 사건이 평균 λ번 발생할 때, 실제 사건 발생 횟수(k)에 대한 이산형 확률분포 | 설비 관리: 시간당 평균 2회 고장나는 기계가 다음 1시간 동안 고장나지 않을 확률을 계산함. | ||
| 정규분포 (Normal) | 평균(μ)을 중심으로 좌우 대칭인 종 모양의 연속형 확률분포. 자연 및 사회 현상에서 가장 흔하게 나타남. | ![]() |
품질 관리: 생산된 부품의 무게, 길이 등 대부분의 품질 특성 분포를 모델링하는 데 사용됨. | |
| 정규분포 활용 | 68-95-99.7 법칙 | 정규분포에서 데이터가 평균으로부터 ±1σ, ±2σ, ±3σ 범위 내에 존재할 확률이 각각 약 68%, 95%, 99.7%라는 경험적 규칙 | ![]() |
공정 관리: 관리도(Control Chart)에서 ±3σ를 벗어나는 데이터를 이상 신호로 판단하는 기준이 됨. |
| 식스시그마 (6σ) | 품질 수준을 통계적으로 평가하고 개선하는 방법론. 공정 결과의 99.99966%가 규격 내에 있도록 관리하여 불량률을 3.4PPM(백만 개당 3.4개)으로 낮추는 것을 목표로 함. |
PPM: Parts Per Million (100만 분의 1) | 고정밀 산업: 반도체, 항공 우주 등 거의 무결점을 목표로 하는 공정의 품질 관리 척도로 사용됨. | |
| 공정 능력 지수 (Cp, Cpk) | Cp: 규격(USL-LSL) 대비 공정의 산포(6σ)가 얼마나 넓은지 나타냄. Cpk: 공정 평균이 규격의 중심에서 얼마나 벗어났는지(치우침)를 함께 고려함. |
![]() |
품질 평가: Cp와 Cpk 값이 1.33 이상이면 공정이 안정적이고 규격을 만족한다고 판단함. | |
| 데이터 변환 | 표준화 (Standardization) | 데이터의 평균을 0, 표준편차를 1로 변환하는 작업. 원본 값이 평균에서 몇 표준편차만큼 떨어져 있는지 나타내는 Z-score로 변환됨. |
![]() |
머신러닝: 단위가 다른 여러 변수(온도, 압력 등)를 동등한 스케일로 만들어 모델 성능을 향상시킴. |
| 정규화 (Normalization) | 데이터의 범위를 0과 1 사이로 변환하는 작업 데이터의 상대적인 크기 관계를 유지하면서 스케일을 통일시킴. |
![]() |
시각화: 여러 센서 값을 0~1 범위로 통일하여 대시보드에 표시할 때 유용함. | |
| 데이터 전처리 | 이상치 탐지 (IQR 방식) | 사분위 범위(IQR)를 기준으로 정상 범위를 벗어나는 값을 이상치로 판단 비대칭 분포에 강건함. |
![]() |
데이터 분포가 한쪽으로 치우쳐 있을 때 이상치를 탐지하는 데 효과적임. |
| 이상치 탐지 (Z-Score 방식) | 데이터가 정규분포를 따른다고 가정 Z-score의 절댓값이 특정 임계값(보통 2 또는 3)을 초과하는 값을 이상치로 판단함. |
|||
| 통계적 추론 | 표본분포 (Sampling Distribution) | 모집단에서 동일한 크기의 표본을 반복 추출할 때, 각 표본에서 계산된 통계량(예: 표본평균)들이 이루는 분포 | 표본 통계량의 변동성을 이해하고 모수를 추정하는 이론적 기반이 됨. | |
| 중심극한정리 (CLT) | 모집단의 분포와 상관없이 표본의 크기(n)가 충분히 크면, 표본평균의 분포는 정규분포에 가까워짐 | ![]() |
모집단이 정규분포가 아니더라도 표본평균을 이용한 통계적 추론(가설검정, 신뢰구간)이 가능해짐. | |
| 표준오차 (Standard Error) | 표본분포의 표준편차임. 즉, 표본평균이 얼마나 흩어져 있는지를 나타내는 척도로, 추정의 정밀도를 의미함. | 표본 크기(n)가 클수록 표준오차는 작아지며, 이는 표본평균이 모평균에 더 가깝다는 것을 의미함. | ||
| 관계 분석 | 공분산 (Covariance) | 두 변수가 함께 변하는 정도와 방향을 나타냄. 양수면 같은 방향, 음수면 반대 방향으로 움직임. 단위의 영향을 받아 크기 해석이 어려움. | ![]() |
온도가 증가할 때 불량률도 함께 증가하는지 방향성을 파악함. |
| 상관계수 (Correlation) | 공분산을 -1과 1 사이의 값으로 표준화하여 두 변수 간 선형 관계의 강도와 방향을 나타냄. 단위의 영향을 받지 않음. | ![]() |
공정 분석: 온도와 불량률 간의 상관계수가 0.8이면, 둘 사이에 강한 양의 선형 관계가 있다고 해석함. | |
| 선형 회귀분석 (Linear Regression) | 독립변수(X)를 이용해 종속변수(Y)의 움직임을 예측하고 설명하는 선형 모델을 만듦. 인과관계를 가정함. | ![]() |
품질 예측: 온도를 1도 올릴 때 불량률이 몇 % 증가하는지 예측 모델을 만들어 품질 개선에 활용함. |
- 추론통계 1 요약
| 대분류 | 소분류 | 정의 및 설명 | 특징 및 수식/코드 | 사용 예시 |
| 추론 통계의 기본 | 모집단과 표본 | 모집단: 연구 대상 전체. 특성을 모수(μ, σ)라 함. 표본: 모집단에서 추출한 일부. 특성을 통계량(x̄, s)이라 함. |
대표성이 중요. 전수조사가 불가능할 때(파괴검사, 비용/시간 문제) 표본조사 수행. |
제조업: 제품의 강도/수명 테스트 (파괴검사) 여론조사: 특정 후보 지지율 조사 |
| 표본 추출 방법 | 단순 랜덤 추출: 무작위 추출계통 추출: 규칙적인 간격으로 추출 집락 추출: 특정 구역 전체를 추출 층화 추출: 동질적 그룹으로 나누어 각 그룹에서 추출 |
층화 추출: 그룹 내는 동질적, 그룹 간은 이질적일 때 대표성을 높임. | 층화 추출: 특정 상품군(예: TV, 냉장고)별로 샘플을 나누어 불량률을 조사할 때 | |
| 표본 분포 | 표본분포 | 동일한 모집단에서 같은 크기의 표본을 여러 번 추출할 때, 각 표본에서 계산된 통계량(예: 표본평균)들의 분포. | 모집단이 정규분포가 아니더라도, 표본평균의 분포는 정규분포를 따르는 경향을 보임. | 표본이 하나뿐일 때, 이 표본평균이 정규분포를 따를 것이라 가정하고 통계적 추론을 시작하는 이론적 배경. |
| 중심극한정리 (CLT) | 모집단의 분포와 무관하게, 표본 크기(n)가 충분히 크면 표본평균의 분포가 정규분포에 근사한다는 정리. | 통계적 추론(가설검정, 신뢰구간)의 핵심 이론적 기반. | 제조업: 매일 생산된 제품의 평균 품질 데이터가 정규분포를 따른다고 가정하고 X-bar 관리도, t-검정 등을 적용. | |
| 추정 | 표준오차 (SE) | 표본평균들이 얼마나 흩어져 있는지를 나타내는 값. 즉, 표본평균의 표준편차. 표본평균의 변동성(불확실성)을 의미. | 표본 크기(n)가 커질수록 표준오차는 작아져 더 정밀한 추정이 가능해짐. | 정확도 판단: 신규 센서 도입 후 측정값의 SE가 감소했다면, 측정 정확도가 개선되었다고 판단. |
| 신뢰구간 (CI) | 표본의 통계량을 기반으로, 모집단의 실제 값(모수)이 포함될 것으로 추정되는 범위. | 신뢰구간: xˉ±Zα/2sn\bar{x} \pm Z_{\alpha/2} \frac{s}{\sqrt{n}} 신뢰수준: 이 구간이 실제 모수를 포함할 확률 (보통 95%) 유의수준(α): 이 구간이 틀릴 확률 (1 - 신뢰수준) |
품질 관리: "이 공정에서 생산된 부품의 평균 길이는 50.15mm에서 50.46mm 사이에 있을 것으로 95% 신뢰할 수 있다"고 보고. | |
| 가설 검정 | 가설 검정 개념 | 표본 데이터를 사용해 모집단에 대한 주장(가설)이 통계적으로 타당한지 판단하는 절차. | 귀무가설(H₀): "차이가 없다", "효과가 없다" (기본 입장) 대립가설(H₁): "차이가 있다", "효과가 있다" (입증하려는 주장) p-value: H₀이 맞다고 가정할 때, 관측된 결과가 우연히 나올 확률. |
신약 개발: "신약이 기존 약보다 효과가 있는가?"를 검증하기 위해 사용. |
| 단측/양측 검정 | 양측 검정: "다르다"는 것만 확인 (μ ≠ μ₀) 단측 검정: "크다" 또는 "작다"는 방향성까지 확인 (μ > μ₀ 또는 μ < μ₀) |
대립가설의 형태에 따라 결정됨. | 양측: A, B 두 공정의 효율이 다른지 검정 (크거나~작거나~) 단측: 개선된 공정이 기존보다 효율이 좋아졌는지 검정 |
|
| 1종/2종 오류 | 1종 오류(α): H₀가 참인데 기각하는 오류 (False Positive)2종 오류(β): H₀가 거짓인데 채택하는 오류 (False Negative) | 1종 오류: "효과 없는데 있다"고 잘못 판단 2종 오류: "효과 있는데 없다"고 놓침 |
신규 공정 도입: 실제론 효과 없는데 "효과 있다"고 판단해 불필요한 비용 발생 (1종 오류) | |
| 모수 검정 | 모집단이 정규분포 등 특정 분포를 따른다고 가정하고 수행하는 검정. (예: t-test, z-test, ANOVA) | 가정 충족이 중요: 정규성, 등분산성 등을 만족해야 신뢰할 수 있음. | t-test: 두 생산 라인에서 생산된 제품의 평균 강도 비교ANOVA: 세 개 이상의 공정 간 평균 불량률 비교 | |
| 정규성 검정 | 데이터가 정규분포를 따르는지 확인하는 절차. 모수 검정의 전제조건을 확인하기 위해 필수적. |
Shapiro-Wilk Test: H₀: "데이터가 정규분포를 따른다." (p > 0.05 이면 정규성 만족) Q-Q Plot: 데이터 점들이 직선에 가까우면 정규성 만족. |
t-test를 수행하기 전, 각 그룹의 데이터가 정규분포를 따르는지 Shapiro-Wilk 검정으로 확인. | |
| 비모수 검정 | 모집단의 분포를 가정하지 않고, 데이터의 순위(rank)를 이용하는 검정. 정규성 가정이 깨졌을 때 사용. |
데이터가 순위형이거나, 표본 수가 매우 적거나, 이상치가 많을 때 유용함. | Mann-Whitney U: 정규성을 따르지 않는 두 독립 집단(A, B 공정)의 만족도 점수 비교. |
| 분석 목적 | 데이터 유형 | 모수 검정 | 비모수 검정 |
| 두 집단 평균 비교 (독립표본) | 연속형 | 독립표본 t-검정 (Independent t-test) | Mann–Whitney U 검정 (Wilcoxon rank-sum test) |
| 두 집단 평균 비교 (대응표본) | 연속형 | 대응표본 t-검정 (Paired t-test) | Wilcoxon Signed-Rank 검정 |
| 세 집단 이상 평균 비교 | 연속형 | 일원분산분석 (One-way ANOVA) | Kruskal–Wallis H 검정 |
| 두 개 이상 요인 비교 | 연속형 | 이원분산분석 (Two-way ANOVA) | Friedman 검정 (대응자료의 경우) |
| 두 변수 간 상관관계 | 연속형 | Pearson 상관분석 | Spearman 순위상관분석 |
| 범주형 변수 간 독립성 | 명목형 | x | Chi-square (χ²) 검정, Fisher’s Exact Test |
- 분석 목적에 따른 통계 검정 방법
| 분석 목적 | 검정 방법 | 설명 및 활용 예시 |
| 두 독립 집단 비교 | 모수검정: 독립표본 t-검정(Independent t-test) | 설명: 서로 관련 없는 두 집단의 평균이 통계적으로 다른지 비교합니다. 전제: 데이터의 정규성, 등분산성 예시: "A공정과 B공정에서 생산된 제품의 평균 강도에 차이가 있는가?" |
| 비모수검정: Mann-Whitney U 검정 | 설명: 데이터가 정규성 가정을 만족하지 않을 때, 두 독립 집단의 중앙값(또는 분포)에 차이가 있는지 순위를 기반으로 비교합니다. 예시: "A, B 두 그룹의 고객 만족도 점수(순위형 데이터)에 차이가 있는가?" |
|
| 두 대응 집단 비교 | 모수검정: 대응표본 t-검정(Paired t-test) | 설명: 동일한 집단에 대해 어떤 처치(교육, 약물 등)의 전후 평균을 비교하여 변화가 있었는지 확인합니다. 전제: 두 값의 '차이'가 정규분포를 따름 예시: "특정 교육 프로그램을 이수한 직원들의 교육 전후 업무 성과 점수에 유의미한 변화가 있는가?" |
| 비모수검정: Wilcoxon 부호-순위 검정 | 설명: 대응표본 t-검정의 비모수 버전으로, 전후 값의 차이가 정규성을 따르지 않을 때 순위를 기반으로 변화를 비교합니다 예시: "신약을 복용한 환자 그룹의 복용 전후 통증 지수(순위형) 변화가 유의미한가?" |
|
| 세 집단 이상 비교 | 모수검정: 일원분산분석(One-way ANOVA) | 설명: 세 개 이상의 독립된 집단들의 평균이 모두 같은지, 아니면 적어도 하나는 다른지를 검정합니다. 전제: 정규성, 등분산성 예시: "A, B, C 세 가지 다른 비료를 사용했을 때, 옥수수의 평균 수확량에 차이가 있는가?" |
| 비모수검정: Kruskal-Wallis H 검정 | 설명: ANOVA의 비모수 버전으로, 세 개 이상 집단의 중앙값(또는 분포)에 차이가 있는지 순위를 기반으로 비교합니다. 예시: "서로 다른 세 지역(서울, 부산, 광주) 고객들의 서비스 만족도 점수(순위형)에 차이가 있는가?" |
|
| 두 개 이상 요인 비교 | 모수검정: 이원분산분석(Two-way ANOVA) | 설명: 두 개 이상의 독립변수(요인)가 종속변수에 미치는 영향을 각각 확인하고, 변수 간의 상호작용 효과도 함께 분석합니다. 예시: "온도와 압력, 두 요인이 제품 수율에 각각 어떤 영향을 미치며, 두 요인 간에 상호작용 효과가 있는가?" |
| 비모수검정: 프리드만 검정(Friedman test) | 설명: 대응표본이 세 집단 이상일 때 사용하는 비모수 검정입니다. (반복측정 분산분석의 비모수 버전) 예시: "동일한 참가자들이 세 가지 다른 사용자 인터페이스(A, B, C)를 모두 사용해보고 매긴 선호도 순위에 차이가 있는가?" |
|
| 두 변수 간 상관관계 | 모수검정: 피어슨 상관분석(Pearson Correlation) | 설명: 두 연속형 변수 간의 '선형적인' 관계의 강도와 방향을 측정합니다. (-1 ~ +1) 전제: 선형성, 정규성 예시: "학생들의 하루 공부 시간과 시험 성적 사이에 직선적인 관계가 있는가?" |
| 비모수검정: 스피어만 순위상관분석Spearman Correlation) | 설명: 두 변수의 실제 값 대신 순위를 사용하여 관계의 강도를 측정합니다. 비선형적인 단조 관계도 파악할 수 있으며, 이상치에 덜 민감합니다. 예시: "직원들의 근무 연수와 직무 만족도 순위 사이에 관계가 있는가?" |
|
| 범주형 변수 간 독립성 | 비모수검정: 카이제곱(χ²) 검정 / 피셔의 정확 검정 | 설명: 두 범주형 변수가 서로 관련이 있는지(연관성), 아니면 독립적인지를 검정합니다. (피셔 검정은 표본이 작을 때 사용) 예시: "고객의 성별(남/여)과 선호하는 제품 카테고리(전자기기/의류/식품) 사이에 연관성이 있는가?" |
2) 분산분석
- ANOVA(Analysis of Varience)

- 3개 이상의 그룹 평균 차이 검정
- 반복 t 검정으로 인한 1종 오류 증가 방지
- F 통계량

F = (집단 간 분산) / (집단 내 분산)
- F↑ → 그룹 간 차이 큼 → 유의미한 차이
- 전제조건: 정규성, 등분산성, 독립성
귀무가설: 모든 그룹 평균 같다
대립가설: 적어도 한 그룹은 다르다
핵심 원리: ANOVA는 분산의 두 가지 종류를 비교하여 결론을 내립니다.
- 집단 간 분산 (Between-group variance): 각 그룹의 평균이 전체 데이터의 평균과 얼마나 다른지 나타냅니다. (그룹 간 차이가 클수록 이 분산이 커짐) 즉, 그룹 평균들 사이의 "차이"를 설명합니다.
- 집단 내 분산 (Within-group variance): 각 그룹 내부의 데이터가 얼마나 흩어져 있는지 나타냅니다. (그룹 내 데이터가 비슷할수록 이 분산이 작아짐) 즉, 같은 그룹 안에서의 "오차"나 "잡음"을 설명합니다.
ANOVA는 이 2가지 분산의 비율인 F-값을 계산합니다.
- F-값이 클수록 → 집단 간 차이가 집단 내 변동보다 크다 → 그룹 간 평균 차이가 통계적으로 유의하다고 판단할 수 있습니다.
- 반대로 F-값이 작다면 → 그룹 간 평균 차이가 크지 않으며, 집단 내의 오차에 비해 뚜렷한 차이가 없다 → 유의한 차이 없음.
ANOVA의 기본 가정:
- 정규성(Normality): 각 그룹의 데이터는 정규분포를 따라야 합니다. (Shapiro-Wilk 검정으로 확인)
- 등분산성(Homoscedasticity): 각 그룹의 분산은 서로 동일해야 합니다. (바틀렛, 레빈(Levene) 검정으로 확인)
- 독립성(Independence): 각 그룹의 데이터는 서로 독립적이어야 합니다.
- 일원 분산분석(One-Way ANOVA)

일원 분산분석은 하나의 범주형 독립변수가 하나의 연속형 종속변수에 미치는 영향을 분석할 때 사용합니다. 즉, 독립변수의 종류(그룹)에 따라 종속변수의 평균이 달라지는지를 확인합니다.
→ 비유:
- 일원(One-way): 비교하고 싶은 '원인'의 종류가 '비료' 딱 하나라서 '일원'입니다. (만약 '비료'와 '물 주는 방식' 두 가지를 동시에 본다면 '이원분산분석'이 됩니다.)
- 분산분석(ANOVA): A, B, C 비료를 준 밭의 옥수수 평균 키가 그룹별로 차이가 있는지 한 번에 검사해주는 방법입니다.
| ANOVA 파이썬 예시 | |
|
import pandas as pd
import numpy as np
from scipy.stats import f_oneway, shapiro, levene
import seaborn as sns
import matplotlib.pyplot as plt
# 1. 데이터 정의 (생산 라인별 품질 점수)
df = pd.DataFrame({
'score': [80, 82, 79, 81, 83, # 라인 A 품질 점수
76, 77, 75, 74, 78, # 라인 B 품질 점수
88, 85, 87, 86, 89], # 라인 C 품질 점수
'line': ['A']*5 + ['B']*5 + ['C']*5
})
|
데이터를 만들었습니다. |
|
# 2. 데이터 시각화 (Boxplot)+ 에러바(error bar)
plt.figure(figsize=(8, 6))
# sns.barplot은 기본적으로 각 그룹의 평균을 막대 높이로, 95% 신뢰구간을 오차 막대로 표시합니다.
sns.barplot(x='line', y='score', data=df, capsize=.1, palette='viridis') # capsize는 오차 막대 끝부분 가로선
plt.title('생산 라인별 평균 품질 점수 (95% 신뢰구간)')
plt.xlabel("생산 라인")
plt.ylabel("평균 품질 점수")
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.show()
print("\n--- 바 그래프 해석 ---")
print("막대의 높이는 각 라인의 평균 점수를, 막대 위의 검은 선(오차 막대)은 95% 신뢰구간을 의미합니다.")
print("B 라인의 신뢰구간이 A와 C의 신뢰구간과 전혀 겹치지 않는 것으로 보아, B 라인의 평균이 다른 라인들과 유의미하게 다를 것임을 시각적으로 추측할 수 있습니다.")
|
![]() |
| --- 바 그래프 해석 --- 막대의 높이는 각 라인의 평균 점수를, 막대 위의 검은 선(오차 막대)은 95% 신뢰구간을 의미합니다. B 라인의 신뢰구간이 A와 C의 신뢰구간과 전혀 겹치지 않는 것으로 보아, B 라인의 평균이 다른 라인들과 유의미하게 다를 것임을 시각적으로 추측할 수 있습니다. |
|
|
# 3-1. 정규성 검정 (각 그룹이 정규분포를 따르는지 확인)
print("--- 정규성 검정 (Shapiro-Wilk Test) ---")
print(f"라인 A: p-value = {shapiro(line_a).pvalue:.4f}")
print(f"라인 B: p-value = {shapiro(line_b).pvalue:.4f}")
print(f"라인 C: p-value = {shapiro(line_c).pvalue:.4f}")
|
--- 정규성 검정 (Shapiro-Wilk Test) --- 라인 A: p-value = 0.9672 라인 B: p-value = 0.9672 라인 C: p-value = 0.9672 모든 p value가 0.05보다 크므로, 정규성 가정을 만족! |
|
3-2. 등분산성 검정 (그룹들의 분산이 동일한지 확인)
stat, p_val_levene = levene(line_a, line_b, line_c)
print(f"\n--- 등분산성 검정 (Levene's Test) ---")
print(f"p-value = {p_val_levene:.4f}")
|
--- 등분산성 검정 (Levene's Test) --- p-value = 1.0000 등분산성 가정이 깨지지 않음 |
|
# 4. 일원 분산분석(One-Way ANOVA) 수행
f_stat, p_value = f_oneway(line_a, line_b, line_c)
print(f"\n--- 일원 분산분석 결과 ---")
print(f"F 통계량: {f_stat:.3f}")
print(f"p-value: {p_value:.4f}"
|
--- 일원 분산분석 결과 --- F 통계량: 60.667 p-value: 0.0000
|
|
# 5. 결과 해석
alpha = 0.05
if p_value < alpha:
print(f"\n결론: p-value({p_value:.4f})가 유의수준({alpha})보다 작으므로 귀무가설을 기각합니다.")
print("-> 세 생산 라인 중 적어도 한 곳의 평균 품질 점수는 다른 라인과 통계적으로 유의미한 차이가 있습니다.")
print("(어떤 라인 간에 차이가 있는지는 사후 분석이 필요합니다.)")
else:
print(f"\n결론: p-value({p_value:.4f})가 유의수준({alpha})보다 크므로 귀무가설을 기각할 수 없습니다.")
print("-> 생산 라인에 따른 평균 품질 점수에 통계적으로 유의미한 차이가 있다고 보기 어렵습니다.")
|
결론: p-value(0.0000)가 유의수준(0.05)보다 작으므로 귀무가설을 기각합니다. -> 세 생산 라인 중 적어도 한 곳의 평균 품질 점수는 다른 라인과 통계적으로 유의미한 차이가 있습니다. (어떤 라인 간에 차이가 있는지는 사후 분석이 필요합니다.) |
해석 기준
- p-value < 0.05 → 세 집단 중 적어도 한 곳의 평균이 다르다 (귀무가설 기각)
- p-value ≥ 0.05 → 평균 차이가 유의하지 않다 (귀무가설 유지)
3) 사후분석
ANOVA 유의 시, “어느 그룹끼리 차이?” 확인
| 분석 방법 | 정의 | 주요 특징 및 사용 | 상황 예시 |
| 투키의 HSD (Tukey's HSD) | 모든 그룹 쌍 간 평균 차이를 동시에 비교해 유의한 차이 판단 | 특징: 모든 그룹을 서로 비교, 1종 오류 제어에 강함 상황: 표본 크기 비슷하고 전체 그룹 간 품질 차이를 전반적으로 보고 싶을 때 |
세 가지 공정 조건(A, B, C)에서 제품 불량률 차이 비교 (A vs B, A vs C, B vs C) |
| 던 검정 (Dunn's Test) | 순위 기반 비모수 방법. 크루스칼-왈리스 후 그룹 간 순위 차이 검정 | 특징: 정규성 가정 불필요 상황: 공정 데이터가 비정규 분포일 때 사용 |
세 가지 도금 처리 방식(A, B, C)에서 표면 거칠기 순위 비교 |
| 더넷 검정 (Dunnett's Test) | 하나의 통제 그룹을 기준으로 다른 실험 그룹 평균을 각각 비교 | 특징: 대조군 중심 비교에 특화 상황: 기존 공정을 기준으로 개선 공정 성능 비교할 때 |
기존 생산 라인(통제군) 대비 신규 공정 A, B의 생산 효율 비교 |
| 셰페 검정 (Scheffé Test) | 모든 평균 간 단순·복합 비교에서 1종 오류를 엄격히 제어 | 특징: 매우 보수적, 검정력 약함 상황: 표본 크기가 다르거나 평균 조합 비교할 때 유용 |
작업조별(인원수 다른) 제품 강도 평균 비교 |
| 본페로니 교정 (Bonferroni) | 다중 비교 시 1종 오류 방지를 위해 유의수준(α)을 비교 횟수로 나눔 | 특징: 가장 보수적, 실제 차이 놓칠(2종 상황: 품질 검증에서 잘못된 결론을 절대 피해야 할 때 |
10개 설비의 평균 가동률 비교 시, 우연한 차이 배제 |
| 피셔의 LSD (Fisher's LSD) | ANOVA F검정이 유의할 때만 각 그룹 쌍에 대해 t검정 유사 방식 적용 | 특징: 덜 엄격, 민감도 높음. 그룹 많으면 1종 오류 증가 상황: 그룹 수 3개 정도일 때 적합 |
세 가지 원자재 공급처(A, B, C)의 품질 지표 평균 비교 |
| 뉴먼-컬스 (Newman-Keuls) | 그룹 평균을 크기순으로 정렬 후 인접 평균부터 단계적으로 비교 | 특징: 투키보다 검정력 높지만 1종 오류 제어 약함 상황: 평균값이 순서를 이룰 때 유용 |
다섯 가지 열처리 온도 조건에서 인장강도 평균 순차 비교 |
2. [라이브세션] 베이직반 5회차
- titanic 데이터셋 가져오가
| 타이타닉 데이터셋 가져오기 | |
|
import numpy as np, pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
# 시각화 스타일 지정
sns.set_theme(style="whitegrid")
# 예제 데이터셋 로드
tips = sns.load_dataset("tips").copy()
# 파생 변수: 팁 비율
tips["tip_rate"] = tips["tip"] / tips["total_bill"]
# 범주형 변수 정렬 (요일 순서 고정)
tips["day"] = pd.Categorical(tips["day"],
categories=["Thur","Fri","Sat","Sun"],
ordered=True)
tips.head()
|
![]() |
1) 문제 정의 & 가설 세우기
"EDA는 데이터를 보는게 아닌 질문을 던지는 과정이다."
| 질문 | 귀무가설(H₀) | 대립가설(H₁) |
| 점심과 저녁 팁 비율은 다를까? | 차이 없음 | 차이 있음 |
| 주말 손님이 평일보다 총 금액이 클까? | 동일 | 다름 |
| 흡연자와 비흡연자의 팁 금액은 같을까? | 동일 | 다름 |
2) 데이터 기본 점검
| 데이터 기본 점검 파이썬 예시 | |
|
#데이터 기본 점검
tips.info() # 데이터 타입, 결측치 개수
tips.describe() # 수치형 변수 요약
tips.isna().mean() # 결측 비율
tips.nunique() # 고유값 개수
|
![]() |
3) 단변량 탐색
| 단변량 탐색 예시 | |
|
#수치형 분포 - 히스토그램+KDE
sns.histplot(tips["total_bill"], bins=20, kde=True)
plt.title("총 금액 분포 (Histogram + KDE)")
plt.show()
|
![]() - 히스토그램: 데이터의 빈도 문포 확인, 왜도(꼬리), 중심, 분산 등 |
|
# 이상치 확인 - boxplot
sns.boxplot(x=tips["tip_rate"])
plt.title("팁 비율 분포 (Boxplot)")
plt.show()
|
![]() 중앙값, 사분위수, 이상치, 시각적으로 확인 |
|
#범주형 분포 - countplot
sns.countplot(x="day", data=tips)
plt.title("요일별 방문 수")
plt.show()
|
![]() 표본 불균형 체크 |
4) 이변량 탐색
| 이번량 탐섹 파이썬 예시 | |
|
#수치형 vs 수치형
sns.lmplot(x="total_bill", y="tip", data=tips)
plt.suptitle("총 금액 vs 팁 (회귀선 포함)", y=1.02)
plt.show()
|
![]() |
|
#수치형 vs 범주형
sns.boxplot(x="time", y="tip_rate", data=tips)
plt.title("식사 시간별 팁 비율")
plt.show()
|
![]() |
|
#범주형 vs 범주형
ct = pd.crosstab(tips["sex"], tips["smoker"], normalize="index")
sns.heatmap(ct, annot=True, fmt=".2f", cmap="Blues")
plt.title("성별 vs 흡연자 비율")
plt.show()
#근데 이건 프로젝트 목표랑은 맞지 않음
|
![]() |
5) 다변량 탐색
| 다변량 탐색 파이썬 예시 | |
|
# 색상: 성별, 열 패싯: 흡연 여부
sns.lmplot(x="total_bill", y="tip", hue="sex", col="smoker", data=tips)
plt.suptitle("총 금액 vs 팁 (성별 + 흡연자)", y=1.02)
plt.show()
|
![]() 성별/흡연 여부를 동시에 고려한 산점도 + 회귀선 남성 흡연자는 팁이 일정 패턴인가? 여성 비흡연자는 다르게 나타나는가? |
6) 그룹 분석
| Groupby, Pivot 파이썬 예시 | |
|
# 평균 팁 비율 by 식사 시간
tips.groupby("time")["tip_rate"].mean()
# 여러 지표 한 번에 요약
tips.groupby("day").agg(
n=("tip_rate","size"),
mean_tip=("tip","mean"),
mean_tip_rate=("tip_rate","mean")
)
# 피벗테이블
pd.pivot_table(tips,
index="day", columns="time",
values="tip_rate", aggfunc="mean")
|
![]() |
7) 통계 검정+효과 크기
| 통계 검정+효과 크기 예시 | |
|
#평균 차이 검정
lunch = tips.loc[tips["time"]=="Lunch", "tip_rate"]
dinner = tips.loc[tips["time"]=="Dinner", "tip_rate"]
t, p = stats.ttest_ind(lunch, dinner, equal_var=False, nan_policy="omit")
print("t-stat:", round(t,3), "p-value:", round(p,4))
|
t-stat: 0.654 p-value: 0.5138
p > 0.05 이므로, 유의하지 않다. |
|
#효과 크기 검정(Cohen's d)
def cohens_d(a, b):
a, b = pd.Series(a).dropna(), pd.Series(b).dropna()
s_p = np.sqrt(((len(a)-1)*a.var(ddof=1) + (len(b)-1)*b.var(ddof=1)) / (len(a)+len(b)-2))
return (a.mean() - b.mean()) / s_p
print("Cohen's d:", round(cohens_d(dinner, lunch), 3))
|
Cohen's d: -0.075
코헨스는 효과가 얼마나 큰가? 를 보는 거임 d~0.2(작음), 0.5(중간), 0.8(큼).
|
8) EDA 리포트 작성법
9) 데이터 분석 전체 프로세스
| ① 데이터 이해 | 데이터의 목적·맥락 파악 | 변수 의미부터 정리 |
| ② EDA & 통계 분석 | 기초통계 + 시각화 + 검정 | t-test/ANOVA/χ² 포함 |
| ③ 전처리 | 결측치, 이상치, 인코딩 | 이유 설명 필수 |
| ④ 피처 엔지니어링 | 파생변수 생성 | 모델보다 더 중요 |
| ⑤ 모델링 | Baseline→고도화 | GridSearch, KFold |
| ⑥ 평가 | RMSE/F1 등 + 시각화 | 지표 선택 이유 설명 |
| ⑦ 해석 | Feature 중요도 등 | 단순 정확도보다 ‘왜’ |
2. [라이브세션] 머신러닝 특강 1일차
1) 회귀 VS 분류

| 구분 | 목적 | 예시 |
| 회귀 | "얼마나" | 집값 3.2억, 온도 23.5도 |
| 분류 | "무엇인가" | 스팸/정상 메일, 생존/사 |
- 이진 분류: Yes/No, 0/1
(예: 암 진단, 대출 승인) - 다중 분류: 3개 이상 클래스
(예: 제품 불량 유형, 고객 등급
2) 타이타닉 데이터로 알아보는 생존 예측
| 데이터 불러오기 | |
|
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.head()
|
![]() |
|
#성별에 따른 생존자 EDA
sns.countplot(data=titanic, x = 'sex', hue = 'survived')
|
![]() |
|
#그럼 여성은 생존, 남성은 사망 이라고 극단적으로 예측해볼까?
import pandas as pd
# 결측치 제거 (sex 또는 survived에 NaN이 있는 경우 제외)
titanic = titanic.dropna(subset=['sex', 'survived'])
# 성별 기반 예측
titanic['predicted'] = titanic['sex'].apply(lambda x: 1 if x == 'female' else 0)
# 정확도 계산
accuracy = (titanic['predicted'] == titanic['survived']).mean()
print(f'성별만을 활용한 예측 정확도: {accuracy:.4f}')
|
성별만을 활용한 예측 정확도: 0.7868
|
3) 로지스틱 회귀 분석


- S자(Sigmoid) 곡선을 이용해 확률(0~1) 예측
- 선형회귀의 한계를 해결
- y = sigmoid(ax+b) 라고 생각하면 된다!

- X는 연속형 변수, Y는 특정 값이 될 확률
- 선형으론 설명하기 쉽지 않다. 확률은 0~1 사이 값인데, 직선 함수는 이 제약을 만족할 수 없다.
| 로지스틱 회귀 분석 예시 | |
|
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import pandas as pd
import numpy as np
import seaborn as sns
|
준비 |
|
# 타이타닉 데이터셋 로드
titanic = sns.load_dataset('titanic')
# 기본 정보 확인
print("데이터셋 기본 정보:")
print(f"전체 데이터 수: {len(titanic)}")
print(f"생존자 수: {titanic['survived'].sum()}")
print(f"생존률: {titanic['survived'].mean():.3f}")
print("\n데이터 샘플:")
print(titanic.head())
# 결측치 확인
print("\n결측치 현황:")
print(titanic.isnull().sum())
|
데이터셋 기본 정보: 전체 데이터 수: 891 생존자 수: 342 생존률: 0.384 데이터 샘플: survived pclass sex age sibsp parch fare embarked class \ 0 0 3 male 22.0 1 0 7.2500 S Third 1 1 1 female 38.0 1 0 71.2833 C First 2 1 3 female 26.0 0 0 7.9250 S Third 3 1 1 female 35.0 1 0 53.1000 S First 4 0 3 male 35.0 0 0 8.0500 S Third who adult_male deck embark_town alive alone 0 man True NaN Southampton no False 1 woman False C Cherbourg yes False 2 woman False NaN Southampton yes True 3 woman False C Southampton yes False 4 man True NaN Southampton no True 결측치 현황: survived 0 pclass 0 sex 0 age 177 sibsp 0 parch 0 fare 0 embarked 2 class 0 who 0 adult_male 0 deck 688 embark_town 2 alive 0 alone 0 dtype: int64 |
|
# 데이터 전처리
# 1. 필요한 특성만 선택
features_to_use = ['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']
titanic_clean = titanic[features_to_use + ['survived']].copy()
# 2. 결측치 처리
titanic_clean['age'] = titanic_clean['age'].fillna(titanic_clean['age'].median())
titanic_clean['fare'] = titanic_clean['fare'].fillna(titanic_clean['fare'].median())
titanic_clean['embarked'] = titanic_clean['embarked'].fillna(titanic_clean['embarked'].mode()[0])
# 3. 범주형 변수 인코딩
titanic_clean['sex'] = titanic_clean['sex'].map({'male': 0, 'female': 1})
titanic_clean = pd.get_dummies(titanic_clean, columns=['embarked'], prefix='embarked', drop_first=True)
# 독립변수와 종속변수 분리
X = titanic_clean.drop('survived', axis=1)
y = titanic_clean['survived']
print("전처리 완료!")
print(f"특성 수: {X.shape[1]}")
print(f"특성 목록: {list(X.columns)}")
print("\n전처리된 데이터:")
print(X.head())
|
![]() |
|
# 훈련/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 로지스틱 회귀 모델 생성
model = LogisticRegression(random_state=42, max_iter=1000)
# 모델 학습
model.fit(X_train, y_train)
print("모델 학습 완료!")
|
모델 학습 완료! 계수(coefficients): [-1.09222983e+00 2.55900264e+00 -3.85595116e-02 -2.44583077e-01 -7.09089505e-02 2.23685026e-03 2.79081185e-01 -3.82296622e-01] 절편(intercept): 2.432 |
|
# 테스트 데이터로 예측
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
# 정확도 계산
train_accuracy = accuracy_score(y_train, y_pred_train)
test_accuracy = accuracy_score(y_test, y_pred_test)
print(f"훈련 데이터 정확도: {train_accuracy:.3f}")
print(f"테스트 데이터 정확도: {test_accuracy:.3f}")
# 상세한 분류 보고서
print("\n=== 테스트 데이터 분류 보고서 ===")
print(classification_report(y_test, y_pred_test, target_names=['사망', '생존']))
|
![]() |
|
# 모델 계수 분석
feature_names = X.columns
coefficients = model.coef_[0]
print("=== 타이타닉 생존에 영향을 미치는 요인 분석 ===")
coef_df = pd.DataFrame({
'Feature': feature_names, #사용했던 칼럼들
'Coefficient': coefficients,
'Odds_Ratio': np.exp(coefficients)
}).sort_values('Coefficient', ascending=False)
print(coef_df)
print("\n=== 상세 해석 ===")
for feature, coef in zip(feature_names, coefficients):
odds_ratio = np.exp(coef)
print(f"{feature}: 계수 {coef:.3f}")
if coef > 0:
print(f" → 이 변수가 1단위 증가하면 생존 오즈비가 {odds_ratio:.3f}배 증가")
print(f" → 생존에 긍정적인 영향")
else:
print(f" → 이 변수가 1단위 증가하면 생존 오즈비가 {odds_ratio:.3f}배 감소")
print(f" → 생존에 부정적인 영향")
print()
# 각각에 대해 y = 12.92(x)+ b 이런 식이 되었다는 얘기임
|
![]() |
| ① 오즈비(Odds Ratio) | |
| ② 로짓(Logit) 변환 | ![]() |
| ③ 로지스틱 함수 | 로짓을 다시 확률로 역변환 |
주제 핵심 포인트
| 분류 개념 | 0/1 판단 문제, 회귀와 다름 |
| 로지스틱 회귀 | Sigmoid(확률 예측) + Logit(선형변환) |
| 학습 방법 | 경사하강법으로 β최적화 |
| 모델 평가 | Confusion Matrix, Precision, Recall, F1, ROC-AUC |
| 실무 팁 | 비즈니스 상황에 맞는 지표 선택 (의료: Recall↑, 금융: Precision↑) |
'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글
| TIL_251107 (0) | 2025.11.07 |
|---|---|
| TIL_251105 (0) | 2025.11.05 |
| TIL_251030 (0) | 2025.10.30 |
| TIL_251029 (1) | 2025.10.29 |
| TIL_251028 (0) | 2025.10.28 |


































