중심극한정리(Central Limit Theorem, 이하 CLT)는 통계학의 기본 개념으로, 특히 표본 크기가 충분히 큰 경우 모집단의 표본 평균 분포를 설명합니다.

 

1. 중심극한정리(Central Limit Theorem, CLT) 개념

 

(1) 무작위 추출 (Random Sampling): 중심극한정리는 모양이 어떤 분포든지 상관없이 주어진 모집단에서 고정된 크기의 무작위 표본을 추출하고 각 표본의 평균을 계산한다고 가정합니다.

 

(2) 표본 평균 분포 (Distribution of Sample Mean): CLT는 원래 모집단 분포의 모양과 상관없이 표본 평균의 분포가 샘플 크기가 증가함에 따라 정규 분포를 근사화한다고 말합니다. 

 

(3) 크기가 큰 표본 (Large Size of Sample): 정규 분포 근사는 표본 크기가 충분히 큰 경우에 특히 잘 적용되며 일반적으로 n ≥ 30입니다. 그러나 경우에 따라서는 적은 표본 크기에서도 CLT 근사가 가능할 수 있습니다. 특히 기본 모집단 분포가 극도로 편향되지 않은 경우입니다. 

 

 

 

이는 표본 평균의 분포(X bar)가 평균이 모집단 평균(mu)과 같고 표준 편차(sigma/sqrt(n))가 모집단 표준 편차를 표본 크기의 제곱근으로 나눈 값인 정규 분포에 근사적으로 따른다는 것을 의미합니다.

 

중심극한의 정리의 중요성은 그 널리 활용성에 있습니다. 중심극한의 정리를 통계학자와 연구자들은 원래 모집단 분포의 모양을 모르더라도 표본 평균의 분포에 대해 특정 가정을 할 수 있게 됩니다. 이는 통계적 추론(statistical inference), 가설 검정(hypothesis testing) 및 신뢰 구간을 추정(estimate of confidence interval)하는 데 중요하며, 많은 통계적 방법이 정규성 가정(hypothesis of normal distribution)에 의존하기 때문에 실무에서 이러한 통계적 기법의 기초 역할을 합니다.

 

 

 

2. Python을 이용한 중심극한정리 시뮬레이션 

 

다음은 Python을 사용해서 균등분포(uniform distribution)를 따르는 모집단(population)으로 부터 각 표본 크기가 30개인 표본을 1,000번 추출하는 시뮬레이션을 하여 각 표본의 평균을 계산하고, 표본 평균의 분포(distribution of sample mean)를 히스토그램으로 시각화해 본 것입니다. 

 

import numpy as np
import matplotlib.pyplot as plt

# Parameters
population_size = 100000  # Size of the population
sample_size = 30        # Size of each sample
num_samples = 1000      # Number of samples to generate

# Generate a non-normally distributed population (e.g., uniform distribution)
population = np.random.uniform(0, 1, population_size)

# Initialize an array to store the sample means
sample_means = []

# Generate samples and calculate means
for _ in range(num_samples):
    sample = np.random.choice(population, size=sample_size, replace=False)
    sample_mean = np.mean(sample)
    sample_means.append(sample_mean)

# Plot the population and the distribution of sample means
plt.figure(figsize=(12, 6))

# Plot the population distribution
plt.subplot(1, 2, 1)
plt.hist(population, bins=30, color='blue', alpha=0.7)
plt.title('Distribution of Uniform Distribution (Population)')

# Plot the distribution of sample means
plt.subplot(1, 2, 2)
plt.hist(sample_means, bins=30, color='green', alpha=0.7)
plt.title('Distribution of Sample Means')

plt.show()

 

central limit themrem simulation

 

왼쪽 히스토그램이 균등분포를 따르는 모집단의 것이고, 오른쪽 히스토그램은 균등분포를 따르는 모집단으로 부터 무작위 추출한 표본의 평균(sample mean)의 분포를 나타내는 것입니다. 오른쪽의 표본 평균의 분포는 평균 mu=(1+0)/2 = 0.5 를 중심으로 좌우 대칭의 종모양의 정규분포를 따름을 알 수 있습니다. 

 

위의 Python codes 에서 모집단(population) 을 이산형, 연속형 확률분포 별로 바꿔서 시뮬레이션을 해보시면 중심극한정리를 눈으로 확인해볼 수 있습니다. 

(가령, 베타분포의 경우 population = np.random.beta(0.8, 0.8, population_size) 처럼 수정하시면 됩니다)

 

 

 

3. 중심극한정리를 이용한 문제풀이 예시

 

중심극한정리를 이용하여 이항분포의 확률값을 정규분포로 근사해서 구할 수 있습니다. 이항분포는 n 이 비교적 작을 때 (통상 n <= 25) 정확한 확률값을 얻는데 유용하지만 n 이 클 때는 계산이 복잡해집니다. 이 경우 정규분포를 이용하여 이항분포의 확률의 근사값을 구할 수 있습니다. 즉, n이 클수록 또한 p값이 0.5에 가까울수록 이항분포는 정규분포화 유사해집니다. 이산형 확률변수 Y가 이항분포 B(n, p)를 따를 때, 이를 표준화(Z)한 후 표준정규분포 Z~N(0, 1)에 근사시킵니다. 

 

연속형 변수를 사용하여 이산형 변수를 근사할 때에는 연속성 수정계수(continuity correction factor)를 사용하여 오차를 줄입니다. 부등호에 따라 0.5를 가감함으로써 이항분포의 구간을 정규분포의 구간으로 수정합니다. 

 

[예시 문제] 한국인 성인 50%가 최소한 한 개의 신용카드를 가지고 있다고 가정하자.만일 30명의 성인을 표본추출할 때 19명에서 20명 사이의 성인이 최소한 한 개의 신용카드를 소지하고 있을 확률을
(1) 이항분포를 사용하여 구하고, 
(2) 정규근사를 사용하여 구하라. 

 

 

(1) 이항분포를 사용한 풀이

 

이산형 확률변수 Y가 최소한 한 개의 신용카드를 가지고 있을 성인의 수라고 하면, Y~B(30, 0.50)이 됩니다. 이에 대한 확률은 다음과 같이 계산합니다. 

 

이항분포를 사용한 풀이

 

 

 

(2) 정규근사를 사용한 풀이

 

Y~B(30, 0.50)일 때 E(Y)=n*p=30*0.50=15, Var(Y)=n*p*(1-p)=30(0.50)(1-0.50)=7.5 이고, 표준화의 변수를 Z라고 할 때, 이를 정규분포로 근사시킨 후 연속성 수정(+-0.5)을 하여 계산하면 다음과 같습니다. 

 

정규근사를 이용한 풀이

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요.  :-)

 

728x90
반응형
Posted by Rfriend
,

데이터 변환 방법으로서

 

(1) 표준화 (Standardizatio)

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

(5) 차원 축소

   - 주성분분석

   - 요인분석 

(6) 시그널 데이터 압축

 

중에서 (1) 표준화(Standardization)에 대해서 알아보겠습니다. 

 

 

다양한 소스로 부터 데이터를 R로 불러와서, 결합하고, 결측값과 특이값을 확인 후 처리하고, 필요한 부분의 데이터만 선별적으로 선택 혹은 제거한 후에 분석의 목적과 필요에 따라서, 그리고 데이터의 형태에 따라서 다양한 데이터 변환 (data transformation) 작업을 수행합니다. 

 

고급 분석가와 그렇지 않는 분석가가 나뉘는 부분, 데이터 엔지니어와 데이터 분석가가 나뉘어 지는 부분이 여기서 부터 이지 않을까 싶습니다.  업에 대한 지시과 더불어 분석의 목적과 분석의 기법에 대해서 정확히 알아야 하고, 데이터의 형태가 그에 맞는지, 맞지 않다면 어떻게 변환을 해야 하는지 알아야 하기 때문입니다.  그리고 데이터 변환을 하는데 있어 통계적인 기본 지식이 필요하다보니 여기부터는 프로그래밍을 잘하지만 통계를 잘 모르는 데이터 엔지니어의 경우 어려움을 겪기 시작합니다.

 

이 변환 작업에는 많은 시간과 노력이 필요합니다.  그래서 데이터 분석을 업으로 삼으려고 생각했던 사람이라도 소위 데이터 전처리, 데이터 변환의 지난한 과정에 대해서 재미를 느끼지 못하면 오래 견디지 못하고 다른 커리어로 전향을 하기도 합니다.  그만큼 본격적인 통계/데이터마이닝 과정에 진입하기 위한 전초 단계로 중요하지만 쉽지 많은 않은 과정이라는 얘기입니다. 

 

모델링을 하는데 있어 분석 목적에 유의미하고 적합한 파생변수를 개발하고 input으로 넣는 것이 정말 중요합니다.  개념적 정의, 조작적 정의를 통해 파생변수를 개발하는 과정에 필수로 필요한 이론적 지식이 이번부터 해서 총 6번에 나누어서 진행할 데이터 변환이 되겠습니다. 

 

데이터 변환을 (1) 표준화, (2) 정규분포화, (3) 범주화, (4) 개수 축소(샘플링), (5) 차원 축소, (6) 시그널 데이터 압축 등의 6개 카테고리로 구분하였습니다.  대략적으로 봤을 때 (1) 표준화, (2) 정규분포화, (3) 범주화는 데이터 분포나 속성을 변화시키는 기법이고, (4) 개수 축소(샘플링), (5) 차원 축소, (6) 시그널 데이터 압축은 데이터 크기를 축소하는 기법이 되겠습니다.

 

이번 포스팅에서는 (1) 표준화의 (1-1) z 변환, (1-2) [0-1] 변환에 대해서 알아보겠습니다.  

 

 

데이터 변환 (1) 표준화 

 

 

[ 데이터 변환 구성 ]

 

 

 

 

(1-1) 표준정규분포 z 변환

 

우선 정규분포에 대해서 간략히 짚고 z 변환으로 넘어가겠습니다. 일상 생활 속에서 우리는 다양한 정규분포를 접하고 삽니다.  만약 100명의 수강생을 대상으로 통계와 R 분석 교육을 받고 시험을 치면 아마도 평균을 중심으로 종모양으로 좌우 분포가 비슷한 성적 분포를 띨 것입니다.  수강생 100명의 키와 몸무게를 조사를 해서 히스토그램을 그려보면 이 또한 평균을 중심으로 종모양으로 좌우 대칭인 정규분포를 띨 것입니다.  수강생 얼굴을 아직 본적도 없는데 이렇게 예언을 할 수 있다는거, 이게 참 신기한겁니다. ^^  만약 키의 평균과 표준편차를 저한테 알려주고, 수강생 100명 중에서 한 명의 수강생을 뽑아서 키를 재서 저에게 알려주면 그 수강생이 전체 100명 중에서 상위 몇 % 키에 속할지도 추측할 수 가 있습니다. 놀랍지요?

 

통계학에서는 '중심극한정리(central limit theorem)'이 정말 중요한 역할을 하는데요, 중심극한정리란 분포의 모양을 모르는 모집단으로부터 표본을 추출할 때, 표본평균 의 분포는 표본의 크기 n이 커짐(일반적으로 )에 따라 점점 정규분포로 근사해 간다는 성질을 말합니다.

 

 

참고 ) 중심극한정리 (Central Limit Theorem)

 

을 평균 , 분산 인 모집단으로부터의 크기 n 인 확률표본이라고 했을 때,

표본평균 의 분포는 n이 커짐에 따라 정규분포 으로 근사해 간다.

 

 

중심극한정리에서 표본평균 를 표준화하면

 

통계량 근사적으로 표준정규분포 을 따른다.

 

 

 

 

 이 중심극한정리에 근거해서 보통 샘플이 대략 30개 이상이면 표본평균이 정규분포로 근사한다고 가정하고 정규분포 가정에 근거한 다양한 통계분석 기법(추정과 검정 등...)을 적용할 수 있게 됩니다. 

 

이때 두 개 이상의 모집단으로 부터 표본의 크기가 큰 표본을 추출했을 때, 각 집단의 평균과 표준편차가 다르거나, 혹은 측정 scale 이 다른 경우에는 다수의 집단 간, 변수 간 직접적인 비교가 불가능하게 됩니다.   미국 달러, 유럽의 유로화, 중국의 위안화, 일본의 엔화, 그리고 한국의 원화를 각 각 1000 단위를 가지고 있다고 했을 때, 이게 서로간에 대비해서 얼마나 많은 건지, 값어치가 있는건지 직접 비교하는게 불가능한 것과 같은 이치입니다.  이때 특정 나라의 통화를 기준으로 삼고 다른 나라의 통화를 기준으로 변환을 하면 각 나라별 통화간의 돈의 가치를 비교할 수 있게 됩니다.  이게 표준화의 원리입니다.

 

위에서 정규분포의 중요성에 대해서 설명했는데요, 정규분포 중에서도 평균이 0, 표준편차가 1인 정규분포를 표준정규분포(standadized normal distribution) 이라고 합니다.  평균이 표준편차가 서로 다른 다수의 집합을 표준정규분포로 표준화를 하면 서로 비교를 할 수 있게 됩니다. 

 

그러면, 이제 R로 표준정규화 하는 방법에 대해서 알아보겠습니다.

 

  • 한국 성인 남성 1,000 명의 키가 평균 170cm, 표준편차 10cm의 정규분포
  • 남아프리카 부시맨 성인 남성 1,000명의 키가 평균 150cm, 표준편차 8cm의 정규분포

를 따른 다고 했을 때 두 집단의 키를 평균이 0, 표준편차가 1인 표준정규분포로 표준화를 해보도록 하겠습니다.

 

 

 먼저, 데이터 생성은 아래와 같이 랜덤하게 생성하였습니다.

 

> ## 한국인, 부시맨 각 성인 1000명 키 데이터 생성 > height_korean <- rnorm(n=1000, mean = 170, sd = 10) > height_bushman <- rnorm(n=1000, mean = 150, sd = 8) > > height <- data.frame(height_korean, height_bushman) # 데이터 프레임 생성

> rm(height_korean, height_bushman) # 벡터 삭제

> > head(height) # 상위 6개 데이터 확인 height_korean height_bushman 1 162.7654 132.5271 2 180.5701 135.5497 3 172.6752 142.5168 4 171.8035 156.7872 5 186.5258 154.3027 6 171.4634 156.1118 

 

> ## 한국인, 부시맨 키 히스토그램

> attach(height)
> par( mfrow = c(1,2))
> hist(height_korean, freq = TRUE, main = "한국인 키 빈도 히스토그램")
> hist(height_korean, freq = FALSE, main = "한국인 키 확률밀도함수 그래프")
> 

 

 

> hist(height_bushman, freq = TRUE, main = "부시맨 키 빈도 히스토그램")
> hist(height_bushman, freq = FALSE, main = "부시맨 키 확률밀도함수 그래프")

 

 

> detach(height)

 

 

그리고 표준정규화를 해보겠는데요, (a) scale()함수를 쓰는 방법과 (b) (x-mean(x))/sd(x) 처럼 공식을 직접 입력하는 방법이 있습니다.  결과는 동일합니다.

 

> ## a. scale() 함수
> 
> height <- transform(height, 
+                     z.height_korean = scale(height_korean), 
+                     z.height_bushman = scale(height_bushman)
+                     )
> 
> head(height)
  height_korean height_bushman z.height_korean z.height_bushman
1        179.19         140.60         0.89308         -1.18393
2        164.54         152.70        -0.60892          0.35689
3        184.18         136.76         1.40477         -1.67426
4        196.37         144.26         2.65531         -0.71833
5        162.61         155.72        -0.80706          0.74198
6        158.02         147.19        -1.27775         -0.34510

 

> ## b. z=(x-mean(x))/sd(x)
> height <- transform(height, 
+                     z2.height_korean = (height_korean - mean(height_korean))/sd(height_korean), 
+                     z2.height_bushman = (height_bushman - mean(height_bushman))/sd(height_bushman)
+                     )
> 
> head(height)
  height_korean height_bushman z.height_korean z.height_bushman z2.height_korean z2.height_bushman
1        179.19         140.60         0.89308         -1.18393          0.89308          -1.18393
2        164.54         152.70        -0.60892          0.35689         -0.60892           0.35689
3        184.18         136.76         1.40477         -1.67426          1.40477          -1.67426
4        196.37         144.26         2.65531         -0.71833          2.65531          -0.71833
5        162.61         155.72        -0.80706          0.74198         -0.80706           0.74198
6        158.02         147.19        -1.27775         -0.34510         -1.27775          -0.34510 

 

 

아래 히스토그램은 한국인과 부시맨의 성인 남자 키를 z 표준화 한 값에 대한 히스토그램이 되겠습니다.  둘다 평균이 0, 표준편차가 1인 표준정규분포로 표준화 되었음을 확인할 수 있습니다.

 

> hist(height$z.height_korean, freq=TRUE, main="standized freq. of Korean H")
> hist(height$z.height_bushman, freq=TRUE, main="standized  freq. of Bushman H ")

 

 

 

 

 

(1-2) [0-1] 변환

 

연속형 변수의 값을 '0~1' 사이의 값으로 변환하는 [0-1]변환도 z변환과 함께 많이 쓰이는 표준화 기법입니다.  만약 변수들 간의 scale 이 다른 상태에서 인공신경망 분석을 하려면 [0-1]변환으로 단위를 표준화해준 후에 분석을 시행해야 합니다.  Scale이 다른 두 변수를 [0-1] 변환하게 되면 상호간에 비교가 가능해집니다.

 

[0-1] 변환은  (x-min(x) /(max(x)-min(x)) 의 수식으로 계산하면 됩니다.

 

위의 한국 성인 남성과 부시맨 성인 남성 각 1,000명의 키 데이터를 가지고 이번에는 [0-1] 표준화 변환을 해보도록 하겠습니다.  일단 위 데이터셋 height에서 첫번째와 두번째 변수만 선택하고, 변수명이 너무 길므로 짧게 변수이름을 변경해보겠습니다.

 

> ## [0-1] transformation
> height <- height[,c(1:2)]
> library(reshape)
> height <- rename(height, c(height_korean = "h_kor", height_bushman = "h_bush"))
> head(height)
   h_kor h_bush
1 179.19 140.60
2 164.54 152.70
3 184.18 136.76
4 196.37 144.26
5 162.61 155.72
6 158.02 147.19

 

 

그 다음 [0-1] 변환을 하고 히스토그램을 그려보겠습니다.

 

> height <- transform(height, 
+                     h_kor_01 = (h_kor - min(h_kor))/(max(h_kor) - min(h_kor)), 
+                     h_bush_01 = (h_bush - min(h_bush))/(max(h_bush) - min(h_bush))
+                     )
> 
> head(height)
   h_kor h_bush h_kor_01 h_bush_01
1 179.19 140.60  0.64341   0.27053
2 164.54 152.70  0.41760   0.51072
3 184.18 136.76  0.72034   0.19410
4 196.37 144.26  0.90835   0.34311
5 162.61 155.72  0.38781   0.57074
6 158.02 147.19  0.31705   0.40129
> 
> hist(height$h_kor_01)
> hist(height$h_bush_01)
 
 

 

 

 

한국 성인 남성 키와 부시맨 성인 남성 키가 0~1 사이의 값으로 표준화되었음을 알 수 있습니다.

 

이해가 쉽도록 166cm의 한국 남성과 156cm의 부시맨 남성의 키를 가지고 [0-1] 변환 했을 때의 예시를 개념도로 아래에 작성하였습니다.  참고하시기 바랍니다.

 

 

[0-1] 변환 예시 (한국 남성 166cm, 부시맨 남성 156cm) 

 

 

 

많은 도움 되었기를 바랍니다. 

 

다음번 포스팅에서는 정상화 변환에 대해서 알아보도록 하겠습니다.



여러개의 변수를 가진 DataFrame에 대해서 층화 무작위 추출을 사용해서 Train, Test set 분할을 하는 방법은 아래의 포스팅을 참고하세요. 

==> https://rfriend.tistory.com/515


 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 


728x90
반응형
Posted by Rfriend
,