본문 바로가기

Data Science : Study/5. R

R : n_distinct 실행 시 1 높게 나옴 이유 (n_distinct ignore NA)

반응형

썸네일

 

 

 

문제

r 활용하여 데이터 집계 진행하고, 엑셀로 집계 전 raw data 내려서 검증 진행했는데 두 값이 일치하지 않는다.

 

 

 

문제 발생 이전 과정

data_raw %>%
	group_by(key) %>%
	summarise(
		gr1_cnt = n_distinct(cust_no[gr1_key == "O"]),
		gr2_cnt = n_distinct(cust_no[gr2_key == "O"]),
		gr3_cnt = n_distinct(cust_no[gr3_key == "O"])
	)
    
# 코드결과
# 	key		gr1_cnt	gr2_cnt	gr3_cnt
# 1	O		760     88		807
# 2	X		232     105		1010

 

data_raw에서 각 gr 기준을 만족하는 cust_no의 개수를 세고자 했다.

gr 기준이 여러개이기 때문에 filter로 일부 데이터를 날리는 것이 아닌 n_distinct 내에 조건을 추가하는 방식을 사용했다.

 

data_raw %>%
	filter(gr1_key == "O" & key == "O") %>%
	select(cust_no) %>%
	distinct()

data_raw %>%
	filter(gr1_key == "O" & key == "X") %>%
	select(cust_no) %>%
	distinct()

# 759
# 231

그런데 동일한 조건을 filter로 걸어서 해당 데이터를 확인했을 때는 숫자가 하나씩 줄어있었다.

엑셀에서 해당 raw data 활용하여 피벗테이블 실행 시 동일한 결과로 확인되었다.

그래서 n_distinct 과정 중 문제의 원인이 있을 것으로 파악하였다.

 

 

 

원인

data_raw$cust_no[data_raw$gr1_key == "O"]

열에 조건을 추가하여 데이터를 조회하면 위와 같이 조건에 맞는 데이터는 해당 값이 조회되고, 아닌 값은 NA로 변경된 것을 확인할 수 있다.

 

chk <- data_raw$cust_no[data_raw$gr1_key == "O"] %>%
	as.data.frame %>%
	distinct()

중복 없는 값 확인을 위해 chk를 생성해보니 값 중에 NA가 살아있었다.

이 값이 count되어 n_distinct를 쓸 때는 개수가 1개씩 늘어나 있었던 것 !!!

 

 

 

해결

data_raw %>%
	group_by(key) %>%
	summarise(
		gr1_cnt = n_distinct(cust_no[gr1_key == "O"], na.rm = TRUE),
		gr2_cnt = n_distinct(cust_no[gr2_key == "O"], na.rm = TRUE),
		gr3_cnt = n_distinct(cust_no[gr3_key == "O"], na.rm = TRUE)
	)

위와 같이 NA ignore option을 추가하면 NA 값을 포함하지 않고 n_distinct가 실행된다. (n_distinct NA ignore option)

 

 

 

 

 

반응형

'Data Science : Study > 5. R' 카테고리의 다른 글

R : 이중 for문으로 key 값 부여  (1) 2024.03.12