내배캠_Data_3기/TIL

240806_통계학 기초 2주차 데이터의 분포

케일라(Data_3기) 2024. 8. 6. 20:15

강의 : 통계학 기초 2주차 데이터의 분포

 

모집단과 표본

모집단 : 관심의 대상이 되는 전체 집단

표본 : 모집단에서 추출한 일부

 

표본을 사용하는 이유

현실적인 제약

  • 비용과 시간: 전체 모집단을 조사하는 것은 비용과 시간이 많이 들기 때문에 대부분의 경우 불가능하거나 비효율적이다. 표본 조사는 이러한 자원을 절약하면서도 유의미한 결과를 도출할 수 있는 방법이다.
  • 접근성 : 모든 데이터를 수집하는 것이 물리적으로 불가능한 경우가 많다. 예를 들어, 특정 질병에 걸린 모든 환자의 데이터를 수집하는 것은 어려울 수 있다.

대표성

표본의 대표성

  • 잘 설계된 표본은 모집단의 특성을 반영할 수 있습니다. 이를 통해 표본에서 얻은 결과를 모집단 전체에 일반화할 수 있습니다.
  • 무작위로 표본을 추출하면 편향을 최소화하고 모집단의 다양한 특성을 포함할 수 있다.

데이터 관리

데이터 처리의 용이성 : 표본 데이터를 사용하는 것은 전체 데이터를 다루는 것보다 데이터 처리와 분석이 훨씬 용이합니다. 큰 데이터셋은 분석에 많은 컴퓨팅 자원이 필요할 수 있지만, 작은 표본은 이런 부담을 줄여준다.

데이터 품질 관리 : 작은 표본에서는 데이터 품질을 더 쉽게 관리하고 오류나 이상값을 식별하여 수정할 수 있다.

 

모델 검증 용이

모델 적합도 테스트 : 표본 데이터를 사용하여 통계적 모델을 검증할 수 있다. 모델이 표본 데이터ㅓ에 잘 맞는 다면, 모집단에도 잘 맞을 가능성이 높다.

 

전수조사 : 모집단 전체를 조사하는 방법. 대규모일 경우 비용과 시간이 많이 든다.

표본조사 : 표본만을 조사하는 방법. 비용과 시간이 적게 들지만, 표본이 대표성을 가져야 한다.

 

2)실제로 사용되는 방법

실제로 모든 데이터를 다 수집할 수 없을 때 표본을 사용

도시연구 : 한 도시의 모든 가구(모집단) 중 100 가구(표본)를 조사하여 평균 전력 사용량을 추정

의료 연구 : 특정 치료법의 효과를 알아보기 위해 전체 화자를 조사하는 대신, 표본을 통해 추정하고 이를 바탕으로 결론을 도출한다.

시장 조사 : 소비자 선호도를 파악하기 위해 모든 소비자를 조사하는 대신, 무작위로 선택된 표본을 통해 전체 시장의 트렌드를 추정한다.

정치 여론 조사 : 선거 전 여론 조사를 통해 전체 유권가의 투표 경향을 추정하여 선거 결과를 예측한다.

더보기

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()

 

numpy.random (모듈) : NumPy 라이브러리의 일부로, 다양한 확률 분포에 따라 난수를 생성하는 기능을 제공한다. 데이터 분석, 시뮬레이션 방법 등 다양한 분야에서 사용된다.

 

np.random.normal

  • 함수는 정규분포(가우시안 분포)를 따르는 난수를 생성한다.
  • 정규분포는 평균과 표준편차를 중심으로 데이터가 대칭적으로 분포하는 분포이다.
numpy.random.normal(loc=0.0, scale=1.0, size=None)
  • loc(float) : 정규분포의 평균(기본값: 0.0)
  • scale(float) : 정규분포의 표준편차(기본값 : 1.0)
  • size(int 또는 tuple of ints) : 출력 배열의 크기(기본값 : None, 즉 스칼라값 반환)

np.random.choice

  • 주어진 배열에서 임의로 샘플링하여 요소를 선택한다.
  • 이는 지정된 배열에서 무작위로 선택된 요소를 반환하는 기능을 제공
numpy.random.choice(a, size=None, replace=True, p=None)
  • a(1-D array-like or int) : 샘플링할 원본 배열. 정수인 경우 np.arange(a)와 동일하게 간주한다.
  • size(int 또는 tuple of ints) : 출력 배열의 크기(기본값 : None, 즉 단일 값 반환)
  • replace(boolean) : 복원 추출 여부를 나타낸다. True면 동일한 요소가 여러 번 선택될 수 있다.(기본값 : True)
  • p (1-D array-like, optional) : 각 요소가 선택될 확률. 배열의 합은 1이어야한다.

 

plt.hist : Matplotlib 라이브러리에서 히스토그램을 그리는 함수. 히스토그램은 데이터의 분포를 시각화하는데 유용한 도구이다.

  bins

  • 히스토그램의 빈(bins)의 개수 또는 경계이다.
  • 빈(bins)은 데이터 몇개의 구간으로 나눌 것인지에 대한 것이라고 생각하면 된다.
  • 정수나 리스트로 입력할 수 있다.
  • 정수 : 빈의 개수를 지정
  • 리스트 : 각 빈의 경계를 직접 지정한다.(140-150, 150-160,... 이렇게 경계를 지정하고 싶으면 리스트로 작성)

 alpha : 히스토그램 막대의 투명도를 지정한다. 0(투명)에서 1(불투명) 사이의 값이다.

 label : 히스토그램의 레이블을 지정한다. 여러 히스토그램을 그릴 때 범례를 추가하는데 사용된다.

 color : 히스토그램 막대의 색상을 지정한다.

 

2.2 표본오차와 신뢰구간

표본이 모집단 대비래서 얼마나 차이나는지, 신뢰할 수 있는지 파악가능

 

1)표본오차와 신뢰구간

표본오차(Sampling Error)

  • 표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이.
  • 표본 크기가 클수록 표본오차는 작아짐.
  • 이는 표본이 모집단을 완벽하게 대표하기 못하기 때문에 발생하며, 표본의 크기와 표본 추출 방법에 따라 달라질 수 있다.
  • 표본의 크기 : 표본의 크기가 클수록 표본오차는 줄어든다. 더 많은 데이터를 수집할수록 모집단을 더 잘 대표하게 된다.
  • 표본 추출 방법 : 무작위 추출 방법을 사용하면 표본 오차를 줄일 수 있다. 모든 모집단 요소가 선택될 동등한 기회를 가지게 해야한다.

신뢰구간(Confidence Interval)

  • 신뢰구간은 모집단의 특정 파라미터(예 : 평균, 비율)에 대해 추정된 닶이 포함될 것으로 기대되는 범위를 나타낸다.
  • 신뢰구간 계산 방법
  • 신뢰구간 = 표본평균 ± z × 표준오차
  • 여기서 z는 선택된 신뢰수준에 해당하는 z-값이다. 예를 틀어, 95% 신뢰수준의 z-값은 1.96이다.
  • 일반적으로 95% 신뢰수준을 많이 사용한다.

 

실제로 사용되는 형태

수학점수 표본으로부터 모집단의 평균 범위를 계산해보자. 100명의 학생을 표본으로 추출하여 그들의 평균 수학 점수를 구하고 이 점수의 신뢰구간을 계산

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=sample_std/np.sqrt(len(sample)))

print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")

 

 

stats.t.interval

scipy.stats는 SciPy 라이브러리의 일부로, 통계 분석을 위한 다양한 함수와 클래스들을 제공하는 모듈이다.

scipy.stats.t.interval 함수는 주어진 신뢰 수준에서 t-분포를 사용하여 신뢰구간(confidence interval)을 계산하는 데 사용된다.

scipy.stats.t.interval(alpha, df, loc=0, scale=1)

 

alpha : 신뢰수준(confidence level)을 의미한다. 예를 들어 95% 신뢰구간을 원하면 alpha를 0.95로 설정한다.

df : 자유도(degrees of freedom)를 나타낸다. 일반적으로 표본크기에서 1을 뺀 값으로 설정한다(df = n - 1)

loc : 위치(parameter of location)로, 일반적으로 표본 평균을 설정한다.

scale: 스케일(parameter of scale)로, 일반적으로 표본 표준오차(standard error)를 설정한다. 표본 표준오차는 표본 표준편차를 표본 크기의 제곱근으로 나눈 값이다.(scale = sample_std / sqrt(n))

 

2.3 정규분포

1)정규분포

정규분포는 종 모양의 대칭 분포로, 대부분의 평균 주위에 몰려있는 분포이다.

평균을 중심으로 좌우 대칭이며, 평균에서 멀어질수록 데이터의 빈도가 감소한다.

표준편차는 분포의 퍼짐 정도를 나타낸다.

 

특징 : 대부분의 데이터가 평균 주변에 몰려있으며, 평균에서 멀어질수록 빈도가 줄어든다.

 

실제로 어떻게 사용되어질까?

키와 몸무게, 시험 점수

# 정규분포 생성
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 긴 꼬리 분포

1) 긴 꼬리 분포

긴 꼬리 분포는 대부분의 데이터가 분포의 한쪽 끝에 몰려있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포이다.

이는 정규분포와 달리 대칭적이지 않고 비대칭적이다.

특정한 하나의 분포를 의미하지 않으며 여러 종류의 분포(예: 파레토 분포, 지프의 법칙, 멱함수)를 포함할 수 있다.

특징: 소득 분포, 웹사이트 방문자 수 등에서 관찰된다.

 

2)실제 어떻게 사용되어질까?

일부가 전체적으로 큰 영향을 미치는 경우 : 소득분포, 온라인 쇼핑, 도서 판매

# 긴 꼬리 분포 생성 (예: 소득 데이터)
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 스튜던트 t 분포

 

1)스튜던트 t 분포 : 자유도가 커질수록 정규분포에 가까워짐(자유도란 표본의 크기와 관련이 있는 값)

  • t분포는 모집단의 표준편차를 알 수 없고 표본의 크기가 작은 경우(일반적으로 30 미만)에 사용되는 분포
  • 정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워지는 특징이 있다.
  • 특징: 표본 크기가 커미녀 정규분포에 가까워짐.

2) 실제로 어떻게 사용되어질까?

데이터가 적은 경우 사용 : 작은 포본의 평균 비교, 약물 실험

# 스튜던트 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()

 

 

2.6 카이제곱분포 : 독립성 검정이나 적합도 검정에 사용되는 분포

1)카이제곱분포 : 카이제곱분포는 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포

 

특징

자유도에 따라 모양이 달라짐

상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 '완벽하게 서로 다른 질적 자료'일 때 활용

ex) 성별이나 나이네 따른 선거 후보 지지율

범주형 데이터 분석에 사용

 

2)실제로 어떻게 사용되어질까?

독립성 검정이나 적합도 검정이 필요할 때 

  • 독립성 검정
  • 두 범주형 변수 간의 관계가 있는지 확인할 때 사용된다.
  • 예를 들어, 성별과 직업 선택 간의 독립성을 검토할 수 있다.
  • 혹은, 성별이 후보 지지율에 영향을 끼치는가? 검토할 수 있다.

 

  • 적합도 검정
  • 관측한 값들이 특정 분포에 해당하는지? 검정할 때 사용된다.
  • 예를 들어, 주사위의 각 면이 동일한 확률로 나오는지 검토할 수 있다.
  • 노란색 완두가 녹색완두가 3:1 의 비율로 나와야 하는데 실험적으로 측정한 데이터가 그렇게 나오는지?
# 카이제곱분포 생성
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.7 이항분포 : 결과가 2개가 나오는 상황일 때 사용하는 분포

1)이항분포

이항분포는 연속된 값을 가지지 않고, 특정한 정수 값만을 가질 수 있다. 예를 들어, 동전을 10번 던질 때 앞면이 나오는 횟수는 0, 1, 2,...,10과 같은 정수이다. 따라서 이항분포가 연속적으로 그려지지 않는다.

이런 이항분포처럼 연속된 값을 가지지 않는 분포를 이산형 분포라고 지칭하기도 한다.

 

이항분포

  • 성공/실패와 같은 두 가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포이다.
  • 독립적인 시행이 n번 반복되고, 각 시행에서 성공과 실패 중 하나의 결과만 가능한 경우를 모델링하는 분초라고도 할 수 ㅣㅆ다.
  • 성공 확률을 p라 할 때, 성공의 횟수를 확률적으로 나타낸다.

특징: 실험 횟수(n)와 성공확률(p)로 정의됨.

 

2) 실제 사용 사례

결과가 2개만 나오는 상황을 여러번 하는 경우 : 동전 던지기, 품질관리

# 이항분포 생성 (예: 동전 던지기 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 푸아송 분포: 희귀한 사건이 발생할 때 사용하는 분포

1)푸아송 분포

단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링할 때 사용하는 분포이다.

푸아송 분포는 평균 발생률 λ를 가진 사건이 주어진 시간 또는 공간 내에서 몇 번 발생하는지를 나타낸다

 

특징: 푸아송 분포는 단위 시간 또는 단위 면적당 희귀하게 발생하는 사건의 수를 모델링하는 데 적합하다.

 

2) 실제 사용 사례

특정 공간이나 특정 시간에 사건이 발생하는 경우 : 콜센터, 교통사고, 문제메세지, 웹사이트 트래픽

import numpy as np
import matplotlib.pyplot as plt
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()

 

 

분포를 어떻게 고르면 될까?

데이터 수가 충분하다 : 무조건 정규분포

데이터 수가 작다 : 스튜던트 t 분포

일부 데이터가 전체적으로 큰 영향을 미친다 : 롱 테일 분포(파레토 분포)

범주형 데이터의 독립성 검정이나 적합도 검정 : 카이 제곱 분포

결과가 두 개(성공 or 실패)만 나오는 상황 : 이항 분포

특정 시간, 공간에서 발생하는 사건 : 푸아송 분포