Py) 통계 - 표본추출

Py) 통계 - 표본추출

파이썬으로 표본추출을 하는 방법을 알아보자.


개요

표본추출의 의의

표본추출(sampling)은 모집단(population)을 전수조사하기 어려운 여러 현실적인 이유 때문에 시행하는 방법이라고 할 수 있다. 전체를 조사하는 것은 아니지만 표본을 조사함으로써 마치 전체를 조사하는 것과 유사한 결과를 얻을 수 있다면 충분히 그 의의가 있다고 할 수 있다.

표본추출 종류

표본추출은 크게 확률적 표본추출과 비확률적 표본추출로 나뉘어진다. 확률적 표본추출은 단순 임의 표본추출(simple random sampling), 층화 임의 표본추출(stratified random sampling), 체계적 표본추출(systematic sampling), 군집 표본추출(cluster sampling)이 있다.

확률적 표본 추출은 그 이름 답게 임의 확률과정을 포함하고 있으며 해당 표본추출을 구현하고 그 결과를 보면 표본추출을 시행할 때 마다 결과가 바뀌는 것을 볼 수 있을 것이다.
※ 해당 임의 확률과정을 고정하는 방법은 별도의 게시글에서 다룰 예정이다.

실습

NumPy

NumPy 라이브러리의 “random” 모듈에는 다양한 표본추출 함수가 있다. 그 중 random(), random_sample(), sample(), rand() 함수는 동일한 기능을 하며 예시는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
np.random.random()
## 0.5889976214882765

np.random.random(size = 5)
## array([0.3663542 , 0.91034083, 0.41035236, 0.31958062, 0.45093614])

np.random.random_sample()
## 0.46571958844576755

np.random.random_sample(size = 5)
## array([0.72038911, 0.26004797, 0.86931801, 0.3152195 , 0.36913294])

np.random.sample()
## 0.9355209184544506

np.random.sample(5)
## array([0.62040987, 0.02336931, 0.78021252, 0.69540037, 0.55339614])

np.random.rand()
## 0.9321468712379437

np.random.rand(5)
## array([0.61546099, 0.56480188, 0.58347607, 0.44848567, 0.06667012])

상기 실행결과는 임의의 숫자가 나오기 때문에 실행할 때 마다 결과가 다르게 나올것이다. 그리고 해당 결과의 범위는 0에서 1사이의 유리수가 나오는 것을 알 수 있다. 그리고 각 함수 내부에 아무것도 입력하지 않으면 하나의 숫자가 반환되며, 입력한 자연수 만큼 임의의 숫자가 NumPy 1차원 어레이 객체로 반환되는 것을 알 수 있다.

상기 함수에 튜플을 입력하면 해당 튜플의 원소 개수와 원소에 기반한 객체구조를 가지는 NumPy 어레이 객체가 반환된다. 물론 해당 어레이 객체의 원소는 0부터 1 사이의 난수이다.

1
2
3
4
np.random.rand(3, 5)
## array([[0.3082864 , 0.1043762 , 0.09198154, 0.56360911, 0.65971317],
## [0.12787132, 0.70126943, 0.58464441, 0.11964972, 0.93265876],
## [0.89072153, 0.68430685, 0.22849158, 0.81716856, 0.37735211]])

그리고 주어진 데이터에서 뽑는 choice() 함수도 있다.

1
2
3
4
5
np.random.choice([1, 2, 3, 4, 5], size = 2)
## array([3, 2])

np.random.choice([1, 2, 3, 4, 5], size = 10)
## array([5, 4, 1, 1, 4, 3, 4, 3, 4, 2])

choice() 함수는 “replace” 인자의 기본값이 True로 되어있어 복원추출을 기본으로 한다. 만약 주어진 객체의 원소 개수보다 “size”인자가 크면서 복원추출을 하지 않을 경우 다음과 같이 에러가 발생한다.

1
2
3
4
5
6
7
8
9
np.random.choice([1, 2, 3, 4, 5], size = 10, replace = False)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[11], line 1
----> 1 np.random.choice([1, 2, 3, 4, 5], size = 10, replace = False)

File mtrand.pyx:984, in numpy.random.mtrand.RandomState.choice()

ValueError: Cannot take a larger sample than population when 'replace=False'

그리고 정수를 반환하는 randint() 함수도 있다. 이 함수의 “low” 인자는 반환되는 정수가 지정한 숫자보다 낮은(low)값이 되도록 설정하는 인자이며 다음 코드의 경우 100 이하의 정수가 반환되는 것을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
np.random.randint(low = 100)
## 14

np.random.randint(low = 100, size = 5)
## array([ 7, 26, 22, 10, 37])

np.random.randint(low = 100, size = (3, 5))
## array([[80, 28, 76, 31, 89],
## [24, 66, 44, 47, 7],
## [47, 68, 78, 82, 66]])

Pandas

Pandas 라이브러리의 객체 또한 표본추출을 지원하며 그 중 데이터프레임 객체와 관련된 내용을 알아보도록 하자.

다음과 같이 데이터를 준비한다.

1
2
3
4
df = pd.DataFrame(dict(obs = range(10),
value = range(10)))
df["value"] = df["value"] + 100
df
obs value
0 0 100
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105
6 6 106
7 7 107
8 8 108
9 9 109

.sample() 메서드를 사용하면 기준 데이터프레임에서 지정한 숫자 만큼의 임의의 행을 반환하도록 할 수 있다.

1
df.sample(n = 2)
obs value
0 0 100
4 4 104

“frac” 인자를 사용하면 데이터프레임 객체의 행 개수를 기준으로 비율을 지정할 수 있으며 다음의 코드는 기준 데이터프레임 객체의 20%에 해당하는 임의의 행을 반환하는 코드이다.

1
df.sample(frac = 0.2)
obs value
9 9 109
2 2 102

그리고 “frac” 인자에 비율을 입력하는 경우 반환되는 데이터프레임 객체의 행 개수가 딱 떨어지지 않으면 반올림을 실시하니 참고하도록 하자.

1
2
3
4
5
len(df.sample(frac = 0.25))
## 2

len(df.sample(frac = 0.26))
## 3

“weights” 인자에 가중치를 부여하게 되면 해당 가중치에 비례해서 표본추출이 되는 것을 볼 수 있으며 다음의 코드를 여러번 실행시키면 윗부분의 행 보다는 아랫부분의 행이 보다 빈번하게 반환되는 것을 볼 수 있을 것이다.

1
df.sample(n = 2, weights = range(1, 11))
obs value
9 9 109
8 8 108

다음의 코드를 통해 상기 내용을 확인 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
df.sample(n = 10000, weights= range(1, 11), replace = True).value_counts().sort_index()
## obs value
## 0 100 177
## 1 101 372
## 2 102 564
## 3 103 717
## 4 104 957
## 5 105 1049
## 6 106 1308
## 7 107 1464
## 8 108 1600
## 9 109 1792
## Name: count, dtype: int64
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×