-
프로그래밍 통계1: 표본 추출의 방법과 pandas/ python에서 샘플 추출하기Statistics 2021. 7. 16. 01:35728x90반응형
*해당 글은 본인의 naver blog에 2012.1.14 작성된 글에서 추가 보완한 글입니다.
조사 방법
- 전수조사: 관심의 대상이 되는 모집단 전체를 대상으로 조사하는 것
- 표본조사: 모집단에서 표본을 추출하여 표본을 대상으로 조사를 시행하는 것이다.
전수조사가 정확한 결과를 도출할 수는 있으나, 비용이나 현실적 제약이 따르기 때문에 표본조사를 시행하는 경우가 많다. 이 때, 표본은 모집단을 대표할 수 있는 근거가 명확한 기준으로 추출되어야 한다.
표본추출 시, 과잉 대표나 최소 대표로 인해 표본추출 오차가 발생할 수 있다.
- 과잉대표 : 중복선택 등이 원인이 되어 모집단이 반복 또는 중복된 데이터만으로 규정이 되는 현상
- 최소 대표: 추출된 표본이 실제 모집단의 대표성을 나타낸 표본이 아닌 다린 데이터가 되는 현상을 뜻한다.
해당 현상을 피하기 위해 표본 추출시에는 표본의 크기보다는 대표성에 중점을 두는 것이 중요하다.
표본 추출 방법
표본 추출 방법은 크게 확률 표본 추출법과 비확률 표본 추출법으로 나뉜다.
- 확률 표본 추출법: 모집단의 모든 단위가 표본으로 선택될 수 있는 확률을 동일하게 가지고 있을 때 시행하는 방법으로 , 무작위성을 기반으로 시행된다.
- 비확률 표본 추출법: 모집단의 단위가 표본으로 선택될 수 있는 확률을 고려하지 않고 연구자의 판단을 기반으로 시행되는 추출법이다.
확률 표본 추출법
1. Simple random sampling (단순 표본 추출, 단순 무작위 추출)
기준 없이 모집단에서 무작위로 표본(sample)을 추출하는 방법. 모집단에 대해 사전지식이 많지 않은 경우 시행하는 방법.
#1부터 100까지 숫자 중 20개 simple random sampling import numpy as np a = list(range(1,101)) np.random.choice(a, 20) #데이터 프레임에서 랜덤 추출하고자 할 때 .sample 기능으로 간단하게 구현 가능 df.sample(n=추출하고자 하는 샘플의 개수)
2. Systematic sampling (계통 표본 추출)
모집단에서 샘플을 추출할 때 일정한 규칙을 가지고 추출하는 방법 (그룹을 나누지는 않음). 전체 모집단이 N개인 집단에서 K라는 추출 간격으로 뽑는다면 N/K수만큼 표본이 선택될 수 있다.
모집단이 일정한 질서에 따라 배열되어 있을 때 매 K번째 데이터의 추출이 필요할 경우 사용
#모집단: 1부터 100까지 정수, 기준: 매 5번째 숫자 Systematic sampling population = [x for x in range(1,101)] sample = [x for x in population if x%5 == 0]
3. Stratified random sampling (층화 표본 추출)
모집단을 여러 그룹으로 나누고, 그룹별로 무작위 추출을 하는 방법
데이터에서 층화 추출을 사용하는 경우는 대표적으로 Class별 data양의 balance를 맞추거나, 또는 특정 변수의 데이터 비율을 맞춤으로써 모델 학습시 편향성을 방지하기 위해 사용된다.
<라벨별로 동일한 숫자의 샘플 데이터 생성>
#df를 샘플링하고자하는 original data(모집단) #target: 라벨이 명시되어 있는 컬럼 #n_sample: 라벨별로 뽑고자 하는 샘플의 개수. 충 n_sample*class개수의 샘플이 추출됨 def sampling_func(data, n_sample): np.random.seed(10) #실행할 때마다 동일한 샘플을 추출하기 위해 random seed 고정 N = len(data) sample = data.take(np.random.permutation(N)[:n_sample]) return sample df = df.groupby('target', group_keys=False).apply(sampling_func, n_sample=100000)
<Sklearn 사용하여 층화추출법으로 train/ testset 분할하기>
from sklearn.model_selection import StratifiedShuffleSplit """ n_split: 분리할 데이터셋의 개수 (몇 개의 개층으로 나눌지) test_size: testset 비율 train_size: trainset 비율 (test_size 명시한 경우 지정할 필요 없음) random_stat: 난수 고정 """ spliter = StratifiedShuffleSplit(n_split=2, test_size=0.2, random_state=10) for train_idx, test_idx in spliter.split(df,df['target']): #X:변수 데이터, y:타겟 데이터 train = df.loc[train_idx] #train dataset test = df.loc[test_idx] #test dataset #2개의 trainset과 2개의 testset이 생성된다.
4. Cluster sampling (군집 표본 추출)
모집단을 여러 그룹으로 나누고, 특정 그룹을 무작위로 선택하는 방법. 모집단에 대한 추출기반을 마련하기가 어려운 경우 사용한다. 예를 들어 대한민국 국민의 통계를 낼 때, 서울 시민 전체를 대상으로 조사를 하는 경우가 이에 속한다.
보통 데이터셋에서 바로 군집 추출을 시행하지 않고, K-Means clustering 등 군집 분석을 시행해 데이터들을 일정 군집으로 나눈 후 표본 추출을 시행한다.
비확률표본추출법
1. Convenience sampling (편의 표본 추출)
연구자가 표본 추출을 하기 쉬운 집단을 대상으로, 또는 임의로 정한 지역과 시간대에 연구자가 원하는 사람들로 표본을 선택하는 방법이다.
가장 대표적인 예로 앙케이트 조사가 있다. 비용이 많이 들지 않고 절차가 간단하다는 장점이 있으나 연구자의 임의적 판단이 크게 작용하므로 추출된 표본이 모집단을 대표하지 않기 때문에 학술적 연구에는 잘 활용되지 않는다.
2. Purposive sampling (판단/유의 표본 추출)
연구자의 주관적인 판단에 의해 모집단을 잘 대표할 것이라고 생각되는 표본들을 추출하는 것이다. 연구자의 경험이나 전문성을 바탕으로 함으로 해당 기준의 정확도에 따라 표본의 대표성이 결정된다.
3. Quota sampling (할당 표본 추출)
모집단의 특성을 반영할 수 있는 기준으로 전체 집단을 일부 그룹으로 나눈 뒤 각 집단 별로 일정 표본 수를 임의로 추출하는 방법이다. 예로 전체 인구 중 연령을 기준으로 10대, 20대, 30대, 40대에서 10명씩 추출하는 방법을 들 수 있다. 모집단의 특성을 잘 반영하기 때문에 가장 널리 사용되지만 애초에 모집단 분류 시 연구자의 편견이 개입될 수 있으며, 무작위성이 결여되어 있기 때문에 결과의 일반화에 문제가 있다.
4. Snowball sampling (눈덩이/누적 표본 추출)
연구자가 임의로 선정한 제한된 표본의 해당자로부터 추천을 받아 표본을 늘려가는 방법이다. 연결망을 가진 사람들의 특성을 파악할 때 적절한 방법이며 모집단을 파악하기 곤란한 경우에 사용 가능하다. 하지만 표본 선정에 각 사람들의 주관이 들어가므로 편견의 개입 소지가 크고 따라서 결과의 일반화가 어렵다는 단점이 있다.
728x90반응형'Statistics' 카테고리의 다른 글
프로그래밍 통계2: 가설 검정의 종류와 자료의 형태 (0) 2021.07.17 프로그래밍 통계0: 통계 기본 중의 기본 개념과 용어 정리 (분산이란? 표준편차란? 자유도란?) (0) 2021.07.15