전치리 과정 중에 순위를 계산해야 하는 경우가 있다. 대상 데이터를 추리거나 복잡한 시간 데이터를 결합할 때 시간 순위를 매겨서 결합의 조건으로 이용할 수도 있습니다. 순위를 매길 때는 계산 비용을 고려해야 하는데, 이때, 정렬 기능도 구현해야 하므로 데이터 수가 많으면 계산 비용이 비약적으로 늘어납니다. 하지만, 순위를 매기는 범위를 나누는 처리 등으로 계산 비용을 줄일 수 있습니다. 이처럼 그룹별로 순서를 정렬하고 순위를 매기는 계산은 Window() 함수를 이용하면 간략하고 성능 좋은 코드를 작성할 수 있습니다. Window() 함수는 집약 함수 중 하나인데, 일반적인 집약 함수와 비교하여 행을 집약하는 것이 아니라 집약한 결과를 계산하여 각 행에 첨부하는 점이 다릅니다.
순위를 구하는 함수
같은 값을 가지는 데이터가 여러 개 존재할 때는 순위를 매기는 함수의 종류와 매개변수의 설정으로 순위를 어떻게 부여할 것인지 제어할 수 있습니다. 함수의 종류와 매개변수 값에 따라 예약 횟수에 따른 순위가 어떻게 변하는지 나타냅니다. 예약 횟수가 많을수록 높은 순위입니다.
- min_rank() : 같은 값의 순위 2~5위를 최소인 2위로 매긴다
- row_number() : 같은 값의 순위 2~5위에서 먼저 읽힌 순서대로 매긴다.
- dense_rank() : 같은 값의 순위 2~5위를 최소 순위인 2위로 매기고 다음 순위를 3위로 매긴다.
시간 데이터의 번호 부여
데이터 셋은 호텔 예약 레코드를 사용합니다. 예약 테이블을 이용하여 고객별 예약 시간에 따른 순위를 매겨봅시다. 같은 시간에 예약한 경우에는 읽어 들인 데이터 순으로 순위를 매깁니다.
R에서 같은 값의 순위를 어떻게 처리할 것인가에 따라 사용할 함수가 달라지는데 row_number() 함수를 사용해보겠습니다.
- row_number() 함수를 정렬하기 위해서 자료형을 문자열에서 POSIX형으로 변환한다.
: reserve_tb$reserve_datetime <-
as.POSIXct(reserve_tb$reserve_datetime, format = '%Y-%m-%d %H:%M:%S')
reserve_tb %>%
- group_by() 함수를 사용하여 집약 단위를 지정한다.
: group_by(customer_id) %>% - mutate() 함수로 log_no라는 열을 새롭게 추가한다.
- row_number() 함수로, 예약 시간을 기준으로 해 순위를 계산한다.
: mutate(log_no = row_number(reserve_datetime))
mutate() 함수는 data.frame에 새로운 열을 추가할 수 있는 함수입니다. 등호(=) 왼쪽에 새로운 열 이름을, 오른쪽에 새로운 열의 값을 지정합니다.
row_number() 함수는 순위를 계산하는 함수입니다. 문자열의 순위를 계산할 수 없기 때문에 시간과 같은 문자열 데이터는 크기를 비교할 수 있는 시간 데이터로 변환해야 합니다.
랭킹
데이터 셋은 호텔 예약 레코드를 사용합니다. 예약 테이블을 이용하여 호텔별 예약 건수에 따른 순위를 배겨봅시다. 예약 건수가 같으면 예약 건수가 같은 모들 호텔에 최소 순위를 매깁니다.
이 예제는 dplyr 패키지의 파이프로 연결하는 처리의 훌륭함을 알 수 있습니다.
reserve_tb %>%
- hotel_id를 집약 단위로 지정하여 호텔별 예약 건수를 계산합니다.
: group_by(hotel_id) %>% - 데이터 건수를 계산하여 호텔별 예약 횟수를 계산한다.
: summarise(rsv_cnt = n()) %>% - 예약 횟수를 기준으로 순위를 계산, desc() 함수를 이용해 내림차순으로 정렬한다.
- transmute() 함수로 rsv_cnt_rank를 생성하여 필요한 hotel_id의 rsv_cnt_rank만을 추출한다.
: transmute(hotel_id, rsv_cnt_rank = min_rank(desc(rsv_cnt)))
transmute() 함수는 mutate() 함수와 마찬가지로 새로운 열을 추가할 수 있지만, 지정한 열만을 남깁니다. 즉 mutate() 함수와 select가 합쳐진 기능을 가집니다.
min_rank() 함수 등 순위를 계산할 때 순서를 내림차순으로 변경하려면 정렬 시에 참조하는 열에 desc() 함수를 적용합니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
R전처리 - 조건에 따라 결합할 마스터 테이블 변경 (0) | 2021.02.15 |
---|---|
R전처리 - 결합 (0) | 2021.02.14 |
R전처리 - 최빈값 계산 (0) | 2021.02.09 |
분포 계산 (0) | 2021.02.08 |
최댓갓, 최솟값, 데푯값 산출 (0) | 2021.02.05 |
댓글