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

TIL_251022

usungusung 2025. 10. 22. 22:00

Today I learned

 

1. [라이브세션] 머신러닝 기초

- 머신러닝이란?

  • 기계학습 또는 머신러닝은 기계가 학습을 할 수 있도록 하는 연구 분야
    • 전통적 프로그래밍: 데이터+프로그램 -> 결과물 출력
    • 머신러닝: 데이터+결과물 -> 프로그램 출력
  • 머신러닝의 3요소(QAQC 예시)
    • 작업(T): 제품 결함 탐지, 생산 공정 모니터링, 품질 평가
    • 성능 지표(P): 정확도, 정밀도, 재현율 등
    • 경험(E): 수집된 생산 데이터, 검사기록, 공정 센서 데이터
  • 제조업에서의 역할
    • 품질 데이터의 자동 분석
    • 공정 이상 탐지 및 예측
    • 결함률 감소와 생산성 향상

 

- 머신러닝 학습의 종류

  • 지도학습: 문제와 정답을 모두 알려주고 공부시키는 방법
    • 분류: 컴퓨터가 주어진 데이터를 보고 정해진 카테고리 중 하나로 나누는 방법
      • 분류 모델의 특징
        • 입력 데이터
        • 출력 데이터
        • 알고리즘
      • 분류의 유형
        • 이진분류: 데이터가 두 개의 카테고리(정상/비정상)으로 분류
        • 다중분류: 데이터가 세 개 이상의 카테고리로 분류
        • 다중 레이블 분류: 하나의 데이터가 여러 카테고리를 가짐(영화 장르, 문서 태그)
    • 회귀: 데이터를 기반으로 연속적인 숫자 값을 예측
      • 선형회귀: 데이터가 직선 형태로 분포한다고 가정하여 예측
      • 다항 회귀: 데이터를 비선형적으로 모델링할 때 사용
      • 릿지 회귀/라쏘 회귀: 다중 공선성 문제를 해결하기 위해 규제를 추가한 선형 회귀
      • 서포트 벡터 회귀: 서포트 벡터 머신을 기반으로 연속적인 값 예측
      • 결정트리 회귀/랜덤 포레스트 회귀: 의사결정 트리를 기반으로 데이터를 나누어 예측
      • 딥러닝 기반 회귀: 신경망을 활용하여 복잡한 관계를 학습
  • 비지도학습: 답을 알려주지 않고 공부시킴
    • 레이블이 없는 데이터를 분석하여 데이터 간 관계, 그룹, 패턴 등을 찾는 ㅇ라고리즘
    • 데이터의 숨겨진 구조, 특징을 발견하여 새로운 인사이트를 제공
    • 정답이 없어 데이터 간 유사성과 차이를 측정하는데 중점
    • 탐색적 데이터 분석(EDA)나 데이터 전처리 단게에서 주로 사용
      • 클러스터링: 데이터를 유사한 그룹으로 묶음
      • 차원 축소: 데이터를 간결하고 중요한 특징만 남김
      • 연관 규칙 학습: 데이터 간 상관관게를 발견하는 작업
  • 강화학습: 보상을 통해 행위를 강화

- 머신러닝 모델링

1) 문제 정의

  • 모델로 해결하고 싶은 문제가 무엇인지 확실하게 정의
  • 문제에 대한 접근 방식 결정 - 가설 설정/모델 설정

2) 데이터 전처리

  • 데이터 수집: 문제 해결에 사용하기 위한 데이터 수집
  • 데이터 클리닝: 분석에 적합한 형태로 데이터 정제 및 가공
  • 피쳐 엔지니어링: 다양한 독립변수 중에서 분석에 활용하기 위한 변수를 선택 혹은 새로운 변수 생성
  • 데이터 분할: 분석에 사용하기 위한 데이터 나누는 작업

3) 모델링

  • 학습에 사용할 모델을 정하고 모델 생성
  • 학습 데이터를 이용해 모델 학습
  • 테스트 데이터를 이용해 모델을 이용한 예측 진행
  • 성능 지표를 활용해 모델 성능 평가
  • 모델 성능을 끌어올리기 위해 하이퍼파라미터 값을 변경하며 위 과정 반복

2. 통계학 기초

2-1. 모집단과 표본

  의미 예시
모집단 연구, 관심의 대상이 되는 전체 집단 한 국가의 모든 성인
표본 모집단에서 추출한 일부 조사 대상 중 100명

 

- 왜 표본을 쓰는가?

  • 현실적 제약
  • 접근성 한계
  • 대표성 확보
  • 데이터 관리 효율

 

- python 실습(히스토그램 시각화)

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', color='blue')
plt.hist(sample, bins=50, alpha=0.5, label='sample', color='red')
plt.legend()
plt.title('population and sample distribution')
plt.show()

 

※코드 설명

  • np.random.normal: 정규분포를 따른느 난수 생성
  • np.random.choice: 주어진 배열에서 임의로 샘플링 진행
  • plt.hist: 히스토그램을 그리는 함수
    • bins: 데이터를 몇개의 구간으로 나눌 것인가?
    • alpha: 막대의 투명도
    • label: 레이블 지정
    • color: 히스토그램 색상

 

 

2-2. 표본오차와 신뢰구간

- 표본오차

  • 표본 통계량과 모집단의 실제 값 차이
  • 표본오차 = 표본 평균 - 모집단 평균
  • 왜 발생하는가?
    • 표본이 모집단을 완벽하게 대표하지 못하기 때문
    • 표본 크기가 커질수록 오차가 줄어듦
    • 무작위 추출(random sampling)로 오차 최소화 가능
    • 모집단 특성이 반영될 확률이 높아짐

- 신뢰구간

  • 모집단의 '참값'이 포함될 것으로 기대되는 범위
  • 신뢰구간=표본평균±z×표준오차
    • ex) 95 % 신뢰수준이다 - 표본평균이 여러변 계산될 때 95%는 모집단 평균을 포함하는 범위에 속한다.

- 시각적 이해

  • 모집단 - 표본분포
    • 모집단 분포는 넓고, 표본 평균 분포는 좁음
    • 표본 크기가 커질수록 표본 평균은 모집단 평균에 근접함

- python 실습

import scipy.stats as stats
# 표본 평균과 표본 표준편차 계산

sample_mean = np.mean(sample)
sample_std = np.std(sample)
# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, len(sample)-1, loc=sample_mean, scale = 1)
print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")

 

※코드 설명

  • stats.t.interval
    • spicy.stats: SciPy 라이브러리의 모듈, 통게 분석을 위한 함수와 클래스를 제공
    • stats.t.interval: 주어진 신뢰 수준에서 t-분포를 사용하여 신뢰구간을 계산
  • stats.t.interval(0.95  , len(sample)-1, loc=sample_mean, scale = 1)
  • stats.t.interval(alpha,         df           ,           loc=0             , scale=1)
    • alpha: 신뢰수준을 의미함, 95% 신뢰구간을 원하면 0.95
    • df: 자유도다. degree of freedom으로, 데이터프레임이 아니다. 표본 크기 -1
    • loc: 위치, 일반적으로 표본 평균
    • scale: 일반적으로 표본 표준 오차를 설정함. 일반적으로 다음 식을 가진다. scale = sample_std / sqrt(n)

 

 

2-3. 정규분포

- 정규분포?

  • 종 모양의 대칭 분포, 대부분의 데이터가 평균 근처에 집중되어 있는 형태
    • 평균: 분포의 중심
    • 표준편차: 데이터가 퍼져있는 정도
  • 특징:
    • 평균을 중심으로 좌우 대칭
    • 평균에서 멀어질 수록 빈도가 급격히 감소
      • 68%가 ±1σ (표준편차 1배 이내),
      • 95%가 ±2σ,
      • 99.7%가 ±3σ 범위 내에 존재

- python 실습 예시

# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)
# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='g')
# 정규분포 곡선 추가
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('normal distribution histogram')
plt.show()

 

 

2-4. 긴 꼬리 분포

- 긴 꼬리 분포?

  • 데이터가 분포의 한쪽 끝에 몰려잇음
  • 여러 종류의 분포를 포함할 수 있음.
  • 소득 분포, 온라인 쇼핑, 도서 판매 등

-파이썬 실습

# 긴 꼬리 분포 생성 (예: 소득 데이터)
long_tail = np.random.exponential(1, 1000)
# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color='b')
plt.title('long tail distribution histogram')
plt.show()

 

 

2-5. Student's t 분포

- Student's t 분포?

  • 모집단의 표준편차를 알 수 없고 표본의 크기가 30 미만일 때 사용되는 분포
  • 정규분포와 유사하지만 표본의 크기가 작을수록 꼬리가두꺼워짐
  • 표본의 크기가 커지면 정규분포에 가까워짐
  • 작은 표본의 평균 비교, 소규모 임상 실험에서 두 그룹 간 차이 분석

- 파이썬 실습

# 스튜던트 t 분포 생성
t_dist = np.random.standard_t(df=10, size=1000)
# 히스토그램으로 시각화
plt.hist(t_dist, bins=30, density=True, alpha=0.6, color='r')
# 스튜던트 t 분포 곡선 추가
x = np.linspace(-4, 4, 100)
p = stats.t.pdf(x, df=10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('student t distribution histogram')
plt.show()

※ bin 30인거 보이죠?

 

2-6. 카이제곱 분포

  • 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포
  • 자유도에 따라 모양이 달라짐
  • 상관관계나 인과관게를 판별하고자 하는 원인의 독립변수가 '완벽하게 서로 다른 질적 자료'일 때 활용
  • 독립성 검정/적합도 검정에 활용

- 파이썬 실습

# 카이제곱분포 생성
chi2_dist = np.random.chisquare(df=2, size=1000)
# 히스토그램으로 시각화
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6, color='m')
# 카이제곱분포 곡선 추가
x = np.linspace(0, 10, 100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, 'k', linewidth=2)

 

2-7. 이항분포

  • 연속된 값을 가지지 않고 특정한 정수 값만을 가질 수 있음.
  • 성공/실패와 같은 두가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포
  • 독립적인 시행이 n번 반복되고 각 시행에서 성공/실패 중 하나의 결과만 가능한 경우를 모델링하는 분포
  • 성공 확률이 p일 때 성공 횟수를 확률적으로 나타냄
  • n:실험 횟수, p:성공 확률 로 정의됨.

- 파이썬 실습

# 이항분포 생성 (예: 동전 던지기 10번 중 앞면이 나오는 횟수)
binom_dist = np.random.binomial(n=10, p=0.5, size=1000)
# 히스토그램으로 시각화
plt.hist(binom_dist, bins=10, density=True, alpha=0.6, color='y')
plt.title('이항 분포 히스토그램')
plt.show()

 

 

2-8. 푸아송 분포

  • 이항 분포처럼 연속된 값을 가지지 않기 때문에 이산형 분포에 해당
  • 평균 발생률이 충분히 크다면 정규분포에 근사
    • 평균발생률: 주어진 시간이나 공간에서 사건이 몇 번 발생했는가?
  • 단위 시간 or 단위 면적 당 발생하는 사건의 수
  • 특정 시간 동안 도착하는 전화의 수, 특정 구간에서 발생하는 교통사고의 수, 특정 시간동안 웹사이트 이용자 수 

- 파이썬 실습

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson

# 푸아송 분포 파라미터
lambda_value = 4  # 평균 발생률
x = np.arange(0, 15)  # 사건 발생 횟수 범위

# PMF 계산
poisson_pmf = poisson.pmf(x, lambda_value)

# 그래프
plt.figure(figsize=(10, 6))
plt.bar(x, poisson_pmf, alpha=0.6, color='b',
        label=f'Poisson PMF ($\\lambda$={lambda_value})')
plt.xlabel('Number of Events')
plt.ylabel('Probability')
plt.title('Poisson Distribution')
plt.legend()
plt.grid(True)
plt.show()

 

2-9. 분포 정리하기

  • 데이터 수가 충분하다: 정규분포
  • 데이터 수가 작다: student's t 분포
  • 일부 데이터가 전체적으로 큰 영향을 미친다: 롱 테일 분포
  • 범주형 데이터의 독립성 검정/적합도 검정: 카이 제곱 분포
  • 결과가 두 개만 나오는 상황: 이항 분포
  • 특정 시간/공간에서 발생하는 사건: 푸아송 분포

 

3-1. A/B 테스트

  • A/B 검정은 A 버전과 B 버전 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정법
  • 두 그룹 간 변화가 통계적으로 유의미한지 확인

-파이썬 실습

import numpy as np
import scipy.stats as stats
# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100) # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100) # 45% 전환율
# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
 
T-Statistic: -1.4436795095573638, P-value: 0.15040949892881467

※ t 통계량: 두 집단 간 평균의 차이와 크기의 방향

※ P-value: 귀무가설이 참일 때 현재 데이터보다 극단적인 결과가 나올 확률

 

3-2. 가설 검정

  • 표본 데이터를 통해 모집단의 가설을 검증하는 방법
  • 귀무가설(H0)과 대립가설(H1)을 설정하고 귀무가설을 기각할 지 결정
  • 데이터 분석 시 두가지 전략 수립
    • 확증적 자료분석: 미리 가설을 설정하고 가설을 검증해 나가는 분석
    • 탐색적 자료분석(EDA): 가설을 정하지 않고 데이터를 탐색해보면서 가설 후보를 추림
  • 단계
    1. 귀무가설(H0)과 대립가설(H1) 설정
    2. 유의수준 설정
    3. 검정통계량 계산
    4. p값과 유의수준 비교
    5. 결론 도출
  • 통계적 유의성
    • 결과가 우연이 아니라 어떤 효과가 실제로 존재함ㅇ르 나타내는 지표
    • p값은 귀무 가설이 참 일 경우 관찰된 통계치가 나올 확률
    • p < 0.05이면 결과가 통계적으로 유의하다고 판단
  • p값
    • 귀무가설이 참 일 때 관찰된 결과 이상으로 극단적인 결과가 나올 확률
    • p < 유의수준 일 때 귀무가설 기각
    • ex) p = 0.03 이라면 3%의 확률로 우연히 이런 결과가 나올 수 있음.
  • 신뢰구간과 가설검정
    • 신뢰구간: 특정 모수가 포함 될 범위를 제공
      • ex) 95% 신뢰구간: 모집단 평균이 이 구간 내에 95% 확률로 있다.
    • 가설검정: 모수가 특정 값과 같은지 다른지 테스트

- 파이썬 실습

# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)
# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)
# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)
print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")
# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f"p-값: {p_value}")
if p_value < 0.05:
 print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.")
else:
 print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")
 
A 평균 효과: 49.84775418531409
B 평균 효과: 55.79789704456062
t-검정 통계량: -4.124774634491517
p-값: 5.460151385429679e-05
p-값: 5.460151385429679e-05
귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.

 

3-3. t-test

  • 두 집단의 평균 차이가 통계적으로 유의미한지 확인
  • 독립포본 t검정과 대응표본 t 검정으로 나뉨
    • 독립표본 t 검정: 두개의 독립된 그룹의 평균을 비교
    • 대응표본 t 검정: 동일한 그룹의 사전/사후 평균을 비교

- 파이썬 실습

# 학생 점수 데이터
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)
# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
 
T-Statistic: -1.1384010321882518, P-value: 0.25963355202229677

 

 

3-4. 다중검정

  • 여러 가설을 동시에 검정할 때 발생하는 문제
  • 각 검정마다 유의수준을 조정하지 않으면 1종 오류 발생 확률 증가
  • 보정 방법
    • 본페로니 보정(가장 대표적), 튜키 보정, 던넷 보정, 윌리엄스 보정 등

- 파이썬 실습

import numpy as np
import scipy.stats as stats
# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(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})")
 
본페로니 보정된 유의 수준: 0.0167
검정 1: 유의미한 차이 발견 (p = 0.0000)
검정 2: 유의미한 차이 발견 (p = 0.0058)
검정 3: 유의미한 차이 없음 (p = 0.1461)

 

3-5. 카이제곱검정

- 카이제곱검정

  • 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정
  • 두 범주형 변수 간의 독립성을 검정

- 적합도 검정

  • 관찰된 분포와 기대된 분포가 일치하는 검정
  • p값이 높으면 데이터가 귀무 가설이 잘 맞음. - 관찰 데이터와 귀무 가설이 적합
  • p값이 낮으면 데이터가 귀무 가설에 잘 안맞음. - 관찰 데이터와 귀무 가설 부적합

- 독립성 검정

  • 두 범주형 변수 간 독립성 검정
  • p값이 높으면 두 변수 간 연관성 없음 - 독립성 있음
  • p값 낮으면 두 변수 간 연고나성 없음 - 독립성 없음

- 파이썬 실습

# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 독립성 검정
observed = np.array([[10, 10, 20], [20, 20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 성별과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
 
적합도 검정 카이제곱 통계량: 2.0, p-값: 0.5724067044708798
독립성 검정 카이제곱 통계량: 0.0, p-값: 1.0
독립성 검정 카이제곱 통계량: 15.041666666666666, p-값: 0.00010516355403363098

 

3-6. 제 1종 오류와 2종 오류

  1종 오류 2종 오
정의 실제로는 **참인 귀무가설(H₀)**을 기각하는 오류 실제로는 **거짓인 귀무가설(H₀)**을 기각하지 못하는 오류
쉽게 말하면 “틀린 결론을 너무 빨리 냄” → 거짓 양성(False Positive) “틀린 결론을 놓침” → 거짓 음성(False Negative)
상황 예시 실제로 결백한 사람을 유죄라고 판단 실제로 유죄인 사람을 무죄라고 판단
통계적 의미 유의수준(α)에 해당 (보통 0.05 또는 5%) 검정력(1−β)에 관련 (β는 제2종 오류 확률)
결과 해석 잘못된 경고 (불필요한 조치 발생) 변화를 놓침 (필요한 조치 실패)
줄이는 방법 신뢰수준을 낮추거나, 표본 크기를 늘림 표본 크기 확대, 검정력(power) 향상
영문 용어 False Positive False Negative

 

 

3. QAQC 문제풀이

- 기술통계 4번

import pandas as pd
import numpy as np

df = pd.Series([25, 28, 22, 26, 30, 24, 29, 95, 27, 24])


Q1 = np.percentile(df, 25)
Q3 = np.percentile(df,75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
outliers = df[(df < lower_bound)|(df>upper_bound)]

print(f"평균: {df.mean()}, 중앙값: {df.median()}, 이상치: {list(outliers)}")
평균: 33.0, 중앙값: 26.5, 이상치: [95]
 

 

- 베이직 1번

import pandas as pd

cities = ['Seoul', 'Busan', 'Incheon', 'Daegu']
population = [9500000, 3400000, 2900000, 2400000]

df = pd.DataFrame({'City':cities, 'Population':population}, index = ['A','B','C','D'])

print(df)
print(df['Population'])
print(df.iloc[0])
print(df.loc['D'])

 

- 베이직 2번

import pandas as pd

cities = ['Seoul', 'Busan', 'Incheon', 'Daegu']
population = [9500000, 3400000, 2900000, 2400000]

df = pd.DataFrame({'City':cities, 'Population':population}, index = ['A','B','C','D'])


print(df[df['Population'] >= 3000000])
df.loc['E'] = ['Daejeon',1470000]
print(df)
print(df[(df['City'] == 'Seoul')| (df['City'] == 'Incheon')])

'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글

TIL_251024  (0) 2025.10.24
TIL_251023  (0) 2025.10.23
TIL_251021  (0) 2025.10.21
TIL_251020  (0) 2025.10.20
TIL_251017  (0) 2025.10.17