세션 복습/통계 세션

통계 기본 (2)

경민212 2025. 1. 7. 12:19

정규분포

 

1.1 용어 정리

모집단 Population  : 궁극적으로 관심 있는 집단. 모집단의 특징을 모수(parameter)라 함

표본집단 Sample : 모집단에서 특정한 방법을 이용하여 뽑아낸 임의의 집단. 특징들을 통계량(Statistic)이라 함

 

1.2 표본 추출의 중요성

샘플링 편항(Sampling bias) : 분석 대상이 표본을 선택할 때 과대하게 대표 되거나 반대의 경우

ex) 1936 미국 대선 당시 민주당 루즈벨트 vs 공화당 랜던의 경선 (자동차, 전화기 부유층의 상징)

 

이처럼 편향을 없애기 위한 다양한 표본추출 방법이 있다. 

참고 : https://brunch.co.kr/@hjkim0892/204

 

2. 정규 분포의 중요성

데이터 분석에 대한 피라미드

 

통계학의 대표적인 방법론은 기술통계와 추론통계

기술통계가 데이터의 특징을 요모조모 보는 과정이라면, 추론통계는 표본으로부터 모집단을 추정(Estimation)하는 과정

이 추론통계를 하려면 기반이 필요한데 그것이 바로 분포, 그리고 가장 기반을 많이 두는 것이 정규분포(Normal Distribution)

 

3.1 분포

정의 : 데이터가 특정 값 중심으로 흩어진 형태를 나타내는 통계적 개념이며 경험적인 데이터의 형태

분류 : 이산형 데이터를 다루는 이산확률분포와 연속확률분포 존재

장점

  • 데이터의 요약(중앙값, 평균..) 등에 대한 수식 표현 가능
  • 모집단을 추정하는 가설의 기반
  • 각 분포는 특정 확률 함수를 가지며 이를 통해 예측 가능
  • 분포를 형태 현상을 모델링 할 수 있음 (모델링 : 현실 세계를 추상화, 단순화, 명확화 하는 방법)

* 베르느이 분포 Bernoulli

 

정의 : 확률 변수가 취할 수 있는 경우가 2가지인 경우 (예 : 동전 던지기, 클릭 등)

확률 : 0과 1 사이의 값이며 모든 경우 확률의 합은 1

확률 변수 : 변수가 가질 수 있는 경우의 수를 표현하는 방법

 

- 일반화 수식

우변 : P는 해당하는 확률

 

# 베르누이 분포 모수 정의
p_bernoulli = 0.5  # 확률

# 클릭(=성공) 1, 클릭안함(=실패) 0 으로 정의
x_bernoulli = [0, 1]

# 각 확률 계산
y_bernoulli = [1 - p_bernoulli, p_bernoulli]

# 베르누이 분포 시각화
plt.figure(figsize=(6, 4))
plt.bar(x_bernoulli, y_bernoulli, color='green', alpha=0.7, width=0.4, label=f'Bernoulli Distribution (p={p_bernoulli})')
plt.xticks([0, 1], ['Failure (0)', 'Success (1)'])
plt.xlabel('Outcome')
plt.ylabel('Probability')
plt.title('Bernoulli Distribution')
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

 

  • 유저가 웹페이지에서 클릭할 확률이 0.5일때 10번 방문했을 때의 경우의 수
  • 함수명 bernoulli.rvs
from scipy.stats import bernoulli

# p는 성공 확률 (0과 1 사이)
p = 0.5

# size는 생성할 샘플의 개수
size = 10

# 베르누이 분포 샘플 생성
samples = bernoulli.rvs(p, size=size)

samples

 

* 이항 분포 Bionominal Distribution

 

여러 유저가 입장하는 경우는 어떻게 표현될 수 있을까? 이때 등장하는 것이 사건(경우의 수)

베르누이 분포의 확장버전

 

- 이항분포 표현식

 

- 이항분포 수식

# 이항분포 모수 정의
n_users = 3  # 유저의 수
p_click = 1 / 2  # 클릭 확률

# 클릭 수 생성
x_clicks = np.arange(0, n_users + 1)

# 클릭 0 부터 3(모두 클릭)에 대한 확률을 생성
y_clicks = binom.pmf(x_clicks, n_users, p_click)

# 시각화
plt.figure(figsize=(8, 5))
plt.bar(x_clicks, y_clicks, color='orange', alpha=0.7, label=f'Binomial Distribution (n={n_users}, p={p_click:.2f})')
plt.xlabel('Number of Users Clicking')
plt.ylabel('Probability')
plt.title('Binomial Distribution of Clicks')
plt.xticks(x_clicks)
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

 

  • 유저 3명이 웹페이지를 방문 했을 때 버튼을 2번 클릭할 확률 계산
  • 함수명 binom.pmf
  • pmf함수: Probability Density Function은 확률 밀도 함수로, 특정 값에서 확률을 계산할 때 사용
from scipy.stats import binom

# n: 시행 횟수 (3명)
# p: 성공 확률 (클릭 확률, 0.5로 가정)
# k: 성공 횟수 (클릭한 유저 2명 나올 경우)

n = 3
p = 0.5
k = 2

# 이항 분포 확률 계산
probability = binom.pmf(k, n, p)

probability

 

만약 n이 매우 커지면 자연스럽게 정규분포의 모양과 비슷해진다. 

일반적으로 np > 5 이면서 n(1 - p) > 5인 경우 정규분포를 따른다고 "경험적"으로 알려져 있다.

 

위 근사가 중요한 것은 n수가 충분히 많다면 클릭률과 같은 데이터를 정규분포로 간주할 수 있고 정규분포를 근간으로 하는 다양한 추론통계를 적용시킬 수 있다는 점이다.

 

* 균등 분포 Uniform Distribution

 

정의 : 모든 x에 대해서 확률이 동일한 분포

연속확률분포 중 하나

이론적으로 주사위는 균등 분포의 유사한 사례긴 하지만 이산확률이기 때문에 정확한 비유는 아니다. 

from scipy.stats import uniform

# 균등 분포 생성 (예시: 0에서 1 사이)
uniform_dist = uniform.rvs(size=10, loc=0, scale=1)

# 결과 출력 (선택 사항)
uniform_dist

 

* 정규분포 Normal Distribution

 

정의 : 평균을 기준으로 좌우 대칭이며, 종 모양으로 봉우리가 1개인 연속확률 분포

정규분포의 장점은 평균과 표준편차를 알고 있으면 전체 데이터의 몇 %가 포함되는지 알 수 있다.

 

- 정규분포 표현식

  • 함수명: norm.cdf
  • cdf함수: Cumulative Distribution Function 누적분포함수로, 특정 K값 이하의 확률을 계산할때 사용
from scipy.stats import norm

# 1380점에 대한 백분율 계산
percentile = norm.cdf(1380, loc=1150, scale=150) * 100

print(f"SAT 점수 1380점의 백분율은 약 {percentile:.2f}% 입니다.")

import scipy.stats as stats
stats.norm.ppf(0.937,  loc = 1150, scale= 150)

 

* 왜도와 첨도

 

- 왜도(skewness) : 확률의 비대칭 정도를 나타내는 측도

  긴꼬리 분포라고도 하며 보통 결제 금액, 월급과 같은 수치가 right.skewness 특성을 띈다

 

- 첨도(kurtosis) : 종모양의 뾰족한 정도를 나타내는 측도

첨도가 정규분포보다 낮으면 뭉특한 모양으로 이상치가 적으며

첨도가 정규분포보다 높으면 꼬리(tail)가 길고 이상치가 많다.

 

* 표준정규분포

 

매번 다른 측정 값들 등을 데이터를 수집하기 보다 일관된 하나의 분포를 계산하길 원해서 등장했다. 

모든 데이터에 대해 "정규화" 수행

- 정규화 : 어떤 대상을 규칙이나 기준에 따른 상태를 만드는 방법

- 추론 통계에서는 '모든 데이터에서 평균을 빼고 표준편차를 나누는 방법'

모든 Z 값에 대해 계산한 표가 존재하는데 이를 표준정규분포표 라고 한다. 

 

4. Scipy 모듈

 

4.1 자주 쓰는 라이브러리

scipy
│
├── stats                      # 통계 분석과 확률 분포 관련 함수 제공
│   ├── norm                   # 정규분포 관련 함수 (PDF, CDF, 랜덤 샘플링 등)
|   |── uniform                # 균등분포
|   |── bernoulli              # 베르누이 분포
|   |── binom                  # 이항분포
│   ├── ttest_ind              # 독립 두 표본에 대한 t-검정
│   ├── ttest_rel              # 대응표본 t-검정
│   ├── mannwhitneyu           # Mann-Whitney U 비모수 검정
│   ├── chi2_contingency        # 카이제곱 독립성 검정
│   ├── shapiro                # Shapiro-Wilk 정규성 검정
│   ├── kstest                 # Kolmogorov-Smirnov 검정 (분포 적합성 검정)
│   ├── probplot               # Q-Q plot 생성 (정규성 시각화)
│   ├── pearsonr               # Pearson 상관계수 계산
│   ├── spearmanr              # Spearman 순위 상관계수 계산
│   └── describe               # 기술 통계량 제공 (평균, 표준편차 등)

 

- rvs : 난수생성

numpy의 random 모듈에 대응

scipy.stats.norm.rvs : loc = 1150, scale = 150, size = 1, random_state = None

  • loc : 평균
  • scale : 표준편차
  • size : 생성할 데이터 갯수
  • random_state : 시드 설정

- pdf : 특정 위치의 확률 구하기

pdf : probability density function 확률밀도함수

scipy.stats.norm.pdf : x = 1380, loc = 1150, scale = 150

  • x : 구할 x 축 값
  • loc : 평균
  • scale : 표준편차

- cdf : 누적확률 분포 구하기

cdf : cumulative density function(누적밀도함수, pdf의 적분값)

pdf와 전달인자는 같으나 누적된 확률(밑변 넓이)를 구함

scipy.stats.norm.cdf : x = 1380, loc = 1150, scale = 150

  • x : 구할 x 축 값
  • loc : 평균
  • scale : 표준편차

- ppf : 백분율을 알 때 거꾸로 x 값 구하기

ppf : percent point function

cdf의 역함수

scipy.stats.norm.ppf : q = 0.937, loc = 1150, scale = 150

  • q : 백분율
  • loc : 평균
  • scale : 표준편차