본문 바로가기

Data Science/Data Preprocessing

[04. Feature Sampling] 002. Stratified Random Sampling

728x90

데이터의 특성상 몇 개의 층(Strata)으로 나누어진 데이터의 경우는 동일한 확률로 뽑는 것보다 층간의 비율에 맞춰 각 층 안에서 표본을 뽑는 것이 낫다. 모든 데이터에서 표본을 뽑는 경우 특정층이 뽑히지 않거나 소수로 뽑힐 확률도 있기 때문이다. 각 층 내에서 동질적이고 유사한 개체들로 묶여있는 데이터 집단에서는 층화추출이 단순확률추출보다 더 효율적이다.

 

import pandas as pd
import pandas as pd
from sklearn.model_selection import StratifiedShuffleSplit

if __name__ == '__main__':
    data = [{'이름': '영수', '분야': '언어', '국어': 100, '영어': 90, '수학': 50, '과학': 45, '중국어': 92},
            {'이름': '철수', '분야': '언어', '국어': 98, '영어': 99, '수학': 30, '과학': 46, '중국어': 82},
            {'이름': '미혜', '분야': '수리', '국어': 20, '영어': 30, '수학': 99, '과학': 99, '중국어': 42},
            {'이름': '영이', '분야': '수리', '국어': 40, '영어': 50, '수학': 80, '과학': 85, '중국어': 62},
            {'이름': '영구', '분야': '언어', '국어': 70, '영어': 90, '수학': 40, '과학': 65, '중국어': 99},
            {'이름': '구희', '분야': '융합', '국어': 90, '영어': 96, '수학': 60, '과학': 85, '중국어': 100},
            {'이름': '지혜', '분야': '융합', '국어': 99, '영어': 92, '수학': 80, '과학': 75, '중국어': 82},
            {'이름': '미영', '분야': '융합', '국어': 98, '영어': 90, '수학': 99, '과학': 100, '중국어': 82},
            {'이름': '영미1', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
            {'이름': '수환1', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
            {'이름': '영미2', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
            {'이름': '수환2', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
            {'이름': '영미3', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
            {'이름': '수환3', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22},
            {'이름': '영미4', '분야': '수리', '국어': 42, '영어': 40, '수학': 98, '과학': 88, '중국어': 17},
            {'이름': '수환4', '분야': '수리', '국어': 33, '영어': 10, '수학': 99, '과학': 89, '중국어': 22}]

    data = pd.DataFrame(data)

    sss = StratifiedShuffleSplit(n_splits=1, train_size=0.7, random_state=0)

    X = data[['국어', '영어', '수학', '과학','중국어']]
    y = data['분야']
    sss.get_n_splits(X, y)

    for train_index, test_index in sss.split(X, y):
        print("TRAIN:", train_index, "TEST:", test_index)
        X_train, X_test = X.iloc[train_index], X.iloc[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]

    print('Train:', y_train.tolist())
    print('Test:', y_test.tolist())


결과 값
TRAIN: [12 10 15  3  6  8  5  4 13 14  1] TEST: [11  0  7  2  9]
Train: ['수리', '수리', '수리', '수리', '융합', '수리', '융합', '언어', '수리', '수리', '언어']
Test: ['수리', '언어', '융합', '수리', '수리']

 

결과 값을 보면 Train set과 Test set이 모집단의 비율에 맞춰 뽑힌 것을 볼 수 있다.

728x90