통계 기본 (2)
정규분포
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 : 표준편차