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): 가설을 정하지 않고 데이터를 탐색해보면서 가설 후보를 추림
- 단계
- 귀무가설(H0)과 대립가설(H1) 설정
- 유의수준 설정
- 검정통계량 계산
- p값과 유의수준 비교
- 결론 도출
- 통계적 유의성
- 결과가 우연이 아니라 어떤 효과가 실제로 존재함ㅇ르 나타내는 지표
- 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 |