샘플링은 공평한 샘플링 구현이 가장 중요합니다. 어느 한쪽으로 편향된 샘플링을 하게 되면 이후 분석에서 편향된 데이터에 기반한 경향과 잘못된 결과를 도출할 수 있습니다. 공평하게 샘플링하려면 분석 대상이 단위와 샘플링 단위를 서로 맞춰야 합니다.
R을 이용해 집약 ID 단위로 샘플링하려면 먼저 집약 ID의 유니크한 값의 리스트를 뽑아내고, 뽑아낸 집약 ID리스트를 샘플링해 대상 ID을 결정한 다음에 대상 데이터를 추출하면 됩니다.
예를 들어 1행에 1회의 숙박 예약을 나타내는 레코드를 50% 샘플링한 후의 데이터에서 예약 인원 수별 예약 건수 데이터 비율을 생각해보면 샘플링 전후의 분석 결과는 크게 다르지 않습니다. 분석단위가 예약한 건이고, 샘플링 단위도 예약한 건이기 때문입니다. 이번에는 1행에 1회의 숙박 예약을 나타내는 예약 레코드를 50% 샘플링한 후의 데이터에서 연간 예약 횟수별 고객 수의 비율에 대해 생각해보면, 이 경우에는 전체적으로 연간 예약 횟수가 적은 사람의 비율이 증가하므로 샘플링 전후의 분석 결과가 크게 달라집니다. 더구체적으로 연간 예약 횟수가 두 건인 고객을 생각해보면 샘플링으로 이 고객의 레코드가 남을 확률은 다음과 같습니다.
- 예약 레코드 두 건이 남을 확률 : 25%(50% x 50%)
- 예약 레코드 한건이 남을 확률 : 25%(50% x 50% 두 가지 패턴)
- 남지 않을 가능성 : 25%(50% x 50%)
즉 연간 예약이 두 건인 고객이 100명 있다고 했을 때 랜덤 샘플링 후에는 연간 예약 수가 두 건인 고객 25명, 연간 예약이 한건인 고객 50명, 그리고 연간 예약이 0건인 고객 25명이 됩니다. 즉 예약 레코드가 남지 않아 25명의 고객이 사라져 버립니다. 당연히 이러한 샘플링은 데이터를 분석하면 잘못된 분석 결과를 도출합니다. 분석 대상 단위가 고객 한 명인데, 샘플링 단위는 예약한 건수다 보니 분석 대상의 단위와 샘플링 단위가 서로 달라져 발생한 일입니다.
이를 해결하는 방법은 두 가지입니다.
첫 번째는 고객 단위로 집약한 후 샘플링하는 것입니다. 하지만 해당 방법으로 샘플링하면 제외될 고객 데이터에도 집약 처리가 발생하다 보니 불필요한 처리가 발생합니다.
두 번째는 예약 테이블의 고객 ID를 대상으로 랜덤 샘플링을 실행하고 샘플링한 고객 ID의 예약 레코드만 추출하는 방법입니다. 샘플링을 구현하는 방법 자체는 조금 복잡하지만, 대신 불필요한 처리가 발생하지 않습니다. 또한, 분석 대상의 단위와 샘플링 단위가 모두 고객 단위이므로 샘플링도 공평하게 진행할 수 있습니다.
- reserve_tb에서 고객 id 백터를 얻고 중복을 제거한 고객 id 백터를 작성한다.
: add_id <- unique(reserve_tb$customer_id)
reserve_tb %>%
- sample 함수를 이용하여 고객 ID에서 50% 샘플링해 추출 대상의 ID를 얻는다.
- 추출 대상 ID와 일치하는 행을 filter함수로 추출한다.
: filter(customer_id %in% sample(all_id, size = length(all_id)*0.5))
unique 함수는 매개변수에 전달된 백터에서 중복을 제거한 백터를 반환합니다. sample 함수는 백터를 샘플링하는 함수입니다. 첫 번째 매개변수에 샘플링할 백터를 지정하고, 두 번째 size 매개변수에 샘플링할 건수를 지정합니다. 앞서 사용했던 sample_frac 함수는 data.frame만 샘플링할 수 있으므로 여기서는 sample 함수를 사용합니다. filter 함수는 %in% 이용하여 지정한 백터의 값 중 일치하는 열 값을 가지는 데이터를 추출할 수 있습니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
합곗값 계산 (0) | 2021.02.04 |
---|---|
R, 데이터와 종류의 개수 산출 (0) | 2021.02.03 |
R, 데이터 값을 고려하지 않는 샘플링 (0) | 2021.02.02 |
R전처리 - 조건에 따른 데이터 행추출 (0) | 2021.02.02 |
R로 데이터 열 추출 (0) | 2021.02.01 |
댓글