빅데이터 QAQC_3기/빅데이터 QAQC_3기 TIL

TIL_251103

usungusung 2025. 11. 3. 20:57

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의 기본 가정:

  1. 정규성(Normality): 각 그룹의 데이터는 정규분포를 따라야 합니다. (Shapiro-Wilk 검정으로 확인)
  2. 등분산성(Homoscedasticity): 각 그룹의 분산은 서로 동일해야 합니다. (바틀렛, 레빈(Levene) 검정으로 확인)
  3. 독립성(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

  • 귀무가설 H₀: 세 라인의 모평균이 모두 같다.
  • 대립가설 H₁: 적어도 하나의 평균은 다르다.
  • 출력:
    • F 통계량: “집단 간 분산 / 집단 내 분산” 비율. 클수록 차이가 큼.
      • p-value: 유의확률. p<0.05면 H₀ 기각 ⇒ “세 라인 평균 중 적어도 하나는 다르다”.


# 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