오랑우탄의 반란
[기초통계] 데이터 분포 시각화 (파이썬) 본문
반응형
이전 포스트에 이어 데이터의 다양한 분포를 살펴보겠습니다.
모집단과 표본
모집단과 표본의 개념을 시각화된 그래프를 사용해 알아보겠습니다.
numpy random 함수로 임의의 모집단을 생성해주고, 그 중에서 choice 로 랜덤한 표본을 추출해줍니다.
이때 모집단의 평균, 편차, 그리고 개수도 임의로 지정해줍니다.
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()
그래프로 잘 보이듯이 표본이 모집단의 특성을 거의 동일하게 따라가는 것을 알 수 있습니다. (아주 이상적인 표본이죠)
하지만 저희가 정규분포인 모집단의 구간을 지정해준 것이기에 당연한 결과입니다.
실제 데이터에서는 이 값을 따로 구해서 표본과 모집단이 일치하는지 비교해봐야겠지요?
표본오차와 신뢰구간
표본오차 sampling error |
신뢰구간 confidence interval |
|
개념 | 표본에서 계산된 통계량과 모집단의 실제 값 간의 차이 | 모집단의 특정 파라미터(평균, 비율 등)에 대해 추정된 값이 포함될 것으로 기대되는 범위 |
공식 |
표본 표준편차 σ 표본 수 n |
표본평균 x 신뢰수준 z 표본 표준편차 s 표본 수 n |
특징 | 표본크기 ↑ = 표본오차 ↓ 무작위 추출로 표본오차 줄일 수 있음 |
주로 95% 신뢰수준으로 사용, z=1.96 |
실제 사용 코드는 아래와 같습니다.
import scipy.stats as stats
# 표본 평균과 표본 표준편차 계산
sample_mean = np.mean(sample)
sample_std = np.std(sample)
# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, df=len(sample)-1, loc=sample_mean, scale=sample_std/np.sqrt(len(sample)))
print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")
실제 표본 평균이 95% 신뢰구간 안에 있는 것을 확인할 수 있습니다.
conf_interval = scipy.stats.t.interval(alpha, df, loc=sample_mean, scale=sample_std/np.sqrt(len(sample)))
- alpha = 신뢰도 수준 0.95로 설정
- df = degree of freedom 자유도, 표본에서 1 뺀 값으로 설정
- loc = 위치 파라미터, 표본평균으로 설정
- scale = parameter of scale, 표본 표준오차standard error로 설정 , 표본표준오차 scale = 표본평균 sample_std / 표본크기의 제곱근 sqrt(n)
분포 정리
개념 | 사용예시 | |
정규분포 | 가장 대표적, 평균 주위에 몰린 데이터 | 키/몸무게, 시험점수 |
긴꼬리분포 | 한쪽으로 몰린 비대칭적 분포, 일부 데이터가 전체적으로 큰 영향 미칠 때 | 소득, 페이지 방문자수, 비인기 제품 판매량 |
스튜던트t분포 | 표본이 작을 때 정규분포 대신 사용 | 작은 표본의 평균 비교, 신규 약물에 대한 소규모 임상 시험 |
카이제곱분포 | 범주형 데이터의 독립성 검정/적합도 검정에 사용 | 성별과 직업 선택 간의 독립성 검토, 주사위 각 면이 동일한 확률로 나오는지 검토 |
이항분포 | 결과가 2개 나오는 상황에 사용 (성공실패) | 동전 던지기, 품질 테스트 (불량품 판별) |
푸아송분포 | 특정 시간/공간에서 발생하는 사건 수 | 웹페이지 트래픽, 콜센터, 교통사고 |
정규분포
- 가장 대표적인 대칭 분포, 대부분의 데이터가 평균 주위에 몰려있고 분산이 작음
- ex) 키/몸무게, 시험점수
# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)
# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='green')
# 정규분포 곡선 추가
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()
긴꼬리분포 (롱테일 현상)
- 한쪽 끝에 몰려있는 비대칭적 분포
- ex) 소득, 웹사이트 방문자수 등
- 아마존과 같은 대형 온라인 쇼핑몰에서는 소수의 인기 제품이 많은 판매를 기록하고, 많은 수의 비인기 제품이 적은 판매를 기록하는 긴 꼬리 분포를 보입니다. 이 현상을 "롱테일 현상"이라고 합니다.
- 잘 팔리는 상위 20%가 전체 매출의 80%를 차지
# 긴 꼬리 분포 생성 (예: 소득 데이터)
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()
스튜던트t분포
- 표본이 작을 때 정규분포 대신 사용하는 분포
- 자유도나 표본 크기가 커질수록 정규분포에 가까워짐
- ex) 작은 표본의 시험 평균 시험 점수 비교, 약물 실험
- 작은 표본의 경우 t검정을 사용해 두 그룹의 평균이 유의미하게 다른지 검토
- 새로운 약물 테스트 시 소규모 임상 시험에서 두 그룹의 차이 분석
# 스튜던트 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()
카이제곱분포
- 독립성이나 적합성을 판별할 때 사용
- 자유도에 따라 그래프 모양이 달라짐
- 상관/인과관계 판별 시 원인의 독립변수가 완벽하게 서로 다른 자료일때 활용 ( ex. 성별이나 나이에 따른 선거 후보 지지율 )
- ex) 독립성 검정, 적합도 검정
- 성별과 직업 선택 간의 관계(독립성)이 있는지 확인
- 주사위의 각 면이 동일하게 나오는지, 노란 완두와 녹색 완두의 비율이 예상대로 나오는지 등 관측한 값들이 특정 분포에 해당하는지 검정할 때 사용
# 카이제곱분포 생성
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)
plt.title('카이제곱 분포 히스토그램')
plt.show()
이항분포
- 결과가 2개가 나오는 상황에 사용 (비연속값, 정수값)
- 성공/실패 두 가지 결과가 나오는 경우에 사용
- 독립시행 실험 횟수 n 과 성공 횟수의 확률 p 로 정의됨
- ex) 동전 던지기, 품질 관리 (제조업체 제품 무작위 선정 중 불량품의 수)
# 이항분포 생성 (예: 동전 던지기 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()
푸아송분포
- 희귀한 사건 발생 시 사용하는 분포 (비연속값)
- 평균 발생률 λ가 충분히 크다면 정규분포에 근사
- 평균 발생률 = 주어신 시간이나 공간에서 사건이 몇번 발생했는지 (1시간 동안 콜센터 전화 건수 10건이면 λ =10)
- 단위 시간/면적 당 발생하는 사건 수 모델링 시 사용
- ex) 콜센터, 교통사고, 문자메시지, 웹페이지 트래픽 (모두 특정 시간/구간에서 발생하는 사건 수 카운트)
from scipy.stats import poisson
# 푸아송 분포 파라미터 설정
lambda_value = 4 # 평균 발생률
x = np.arange(0, 15) # 사건 발생 횟수 범위
# 푸아송 분포 확률 질량 함수 계산
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()
- 평균 발생률 λ가 충분히 크다면 정규분포에 근사
- 평균 발생률이란 주어신 시간이나 공간에서 사건이 몇번 발생했는지
이상 기초 분포 형태를 살펴봤습니다.
다음 포스트에서는 유의성검정을 다루겠습니다.
오랑우탄이 영어를 하고 오랑이가 데이터분석가가 되는 그날까지~
반응형
'PYTHON > 데이터분석' 카테고리의 다른 글
[기초통계] 회귀 (파이썬) (0) | 2024.08.02 |
---|---|
[기초통계] 유의성검정 (파이썬) (0) | 2024.08.01 |
[기초통계] 통계 기초 개념 시각화 (파이썬) (0) | 2024.08.01 |
[Pandas] Pivot Table 피벗테이블 완전분석 (실습 포함) (0) | 2024.07.23 |
데이터 전처리 & 시각화 (7) Matplotlib 개념 익히기 (2) | 2024.07.18 |