결측치 무한대, infinite, NA,iflese 계산 하기

   일반적인 교육용 데이터는  infinite, NA 값이 거의 나오지 않는다. 이미 모형을 설명하기 위해 모든 데이터는 잘 정리되어 있기 때문이다.  하지만,  현업에서 실무 할때는 이런 값들이 많이 나타 나게 된다.    

  즉 사람이 데이터 입력을 잘못 시켰거나,  데이터를 입력 하지 않은 건,  즉 데이터를 다룰때 문제가 되는 데이터는  전체의 1~3%의 가 나타난다.  이것도 사람마다 다르고,  상황 마다 다르다.  하지만 R에서 모형을 잘 다루기 위해서는 이 부분에 대해서 잘 다루어야 한다. 

3.6 결측값 무한대, 숫자가 아닌값

계산 결과는 R에서 Inf로 표현되는 양의 무한대 또는 -Inf 로 표현되는 음의 무한대가 될 수 있습니다.

3/0
## [1] Inf
-12/0
## [1] -Inf


무한대를 포함하는 계산은 연산이 가능 합니다. 예를 들면 다음과 같습니다.

exp(-Inf)
## [1] 0
0/Inf
## [1] 0
(0:3)^Inf
## [1]   0   1 Inf Inf

그러나 다른 계산은 숫자가 아닌 수량으로 계산되며 R에서는 NaN(not a number)로 표시됩니다. 몇 가지 예를 들면 다음과 같습니다.

0/0
## [1] NaN
Inf-Inf
## [1] NaN
Inf/Inf
## [1] NaN


NaN과 NA 간의 차이를 명확히 이해 하도록 합시다. R에서는 NA는 not available의 약자로서 누락된 값을 의미하며 다음 내용을 참고하십시오. in.nan 함수는 특별히 NaN을 확인하기 위해 사용하며, is.na는 NaN에 대해 TRUE값을 반환 합니다. NaN을 논리형 또는 정수형으로 숫자가 유한 또는 무한한지 여부를 확인하기 위한 내장 함수는 다음과 같습니다.

is.finite(10)
## [1] TRUE
is.infinite(10)
## [1] FALSE
is.infinite(Inf)
## [1] TRUE



3.6 결측값:NA

데이터 프레임에서 결측값은 모형 적합 함수에 영향을 주며 원하는 모델링의 설명력을 상당히 감소시킬 수 있기 때문에 문제가 발생하는 원인이 됩니다.

벡터의 값에서 누락된 값을 발견하기 위한 예제코드는 다음과 같습니다.

y<-c(4,NA,7)

결측값 확인을 위한 코드의 실행 결과는 FALSE TRUE FALSE 이어야 합니다.
위의 있는 값을 2개의 등호를 이용해서 실행 한 결과를 보면은 제대로 작동 하지 않을 수 있습니다.

y == NA
## [1] NA NA NA

제대로 작동하지 않는 이유는 모든 값이 NA이기 때문이며, 원하지 않은 결과 입니다. 그리고 아래의 코드도 작동 하지 않습니다.

y == "NA"
## [1] FALSE    NA FALSE

위의 결과는 숫자가 문자가 아니라는 것을 알려줍니다. 하지만 누락된 값 자체에 대해 TRUE 보다는 NA를 반환 합니다. 다음 실행 결과는 is.na 함수를 사용한 결과이며 정확한 결과를 보여주고 있습니다.

is.na(y)
## [1] FALSE  TRUE FALSE

NA를 제거한 벡터를 생성하려면 not !연산자를 갖는 첨자를 사용합니다.

y[! is.na(y)]
## [1] 4 7


데이터 값이 누락된 경우 일부 함수는 기본 설정에서 제대로 작동하지 않습니다. 이러한 함수 중에 mean이 있습니다.

x<-c(1:8,NA)
mean(x)
## [1] NA


결측값이 없는 값의 평균을 계산하여려면, na.rm=TRUE 매개변수를 이용해 NA를 제거 해야 합니다.

mean(x,na.rm = T)
## [1] 4.5

다음은 벡터 vmv에서 누락된 값의 위치(7,8)를 찾기 위한 예제 입니다.

vmv <- c(1:6,NA,NA,9:12)
vmv
##  [1]  1  2  3  4  5  6 NA NA  9 10 11 12

배열에서 누락된 값의 인덱스는 다음과 같이 seq 함수를 사용해 만듭니다.

seq(along = vmv)[is.na(vmv)]
## [1] 7 8

그러나 결과는 다음과 같이 간단하게 which 함수를 사용해서 계산 할 수 있습니다.

which(is.na(vmv))
## [1] 7 8


누락된 값이 0이라면 NA를 0으로 편집 할 수 있다. 이에 대한 첨자를 생성하기 위해서는 is.na함수를 사용합니다.

vmv[is.na(vmv)] <- 0
vmv
##  [1]  1  2  3  4  5  6  0  0  9 10 11 12

또는 다음과 같이 ifelse 함수를 사용합니다.

vmv<-c(1:6,NA,NA,9:12)
ifelse(is.na(vmv), 0, vmv)
##  [1]  1  2  3  4  5  6  0  0  9 10 11 12

대부분의 경우 누락된 값은 진짜 0이 아니기 때문에 이러한 작업을 실핼할 때는 매우 주의 해야 합니다.

예제 1

시장동향에 대한 인덱스 데이터를 입력 하는데, 실수로 2022-03-13 날 인덱스값을 넣었다. 이러한 상황을 아래와 같이 정리 하십시오.

첫번째, 인덱스 값의 변화량(Δ)값을 구하십시오.
두번째, 인덱스 값을 구하고 나면, NA 값과 Inf 값을 필터하십시오.
세번째, NA 값과 Inf 값의 위치를 찾아 보십시오.

데이터를 로딩 합니다.

# 패키지 로딩 
  require(dplyr)
## 필요한 패키지를 로딩중입니다: dplyr
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# 데이터 입력 및 정리 
  date <-c("2022-03-06","2022-03-07","2022-03-08","2022-03-09","2022-03-10",
           "2022-03-11","2022-03-12","2022-03-13","2022-03-14","2022-03-15",
           "2022-03-16","2022-03-17","2022-03-18")
  
  index <-c(2699.2,2680.3,2703.5,2747.1,2713.4,2651.3,2622.4,0,
            2645.7,2621.5,2659.2,2694.5,2707.0)

# tibble로 데이터 프레임 값 만들기 
  df <- tibble(date, index)
  df
## # A tibble: 13 × 2
##    date       index
##    <chr>      <dbl>
##  1 2022-03-06 2699.
##  2 2022-03-07 2680.
##  3 2022-03-08 2704.
##  4 2022-03-09 2747.
##  5 2022-03-10 2713.
##  6 2022-03-11 2651.
##  7 2022-03-12 2622.
##  8 2022-03-13    0 
##  9 2022-03-14 2646.
## 10 2022-03-15 2622.
## 11 2022-03-16 2659.
## 12 2022-03-17 2694.
## 13 2022-03-18 2707

index 변화율을 구하기 위한 공식은 아래와 같습니다.

(Δ)=(t1t0)t0
위 공식에 맞게 아래와 같이 함수를 만들어 줍니다.

# 데이터 차이값 구하기 공식활용 변화율 Δ t2-t1/t1
# change rate 초기화
  change_rate <- NA

# 일자별  인덱스 변화을  구하기 위한 함수 
change_rate_fun <- function(t){

  index_t <- df$index[t]
  index_t_minus <- df$index[t-1]
  
  if(t==1){
    #Not Run
  } else{
    change_rate <- (index_t - index_t_minus)/index_t_minus
  } 
  return(list(change_rate))
}


아래는 sapply() 함수를 이용한 계산 입니다. 같은 것을 계속 반복해서 계산 해야 해야 하는 목적으로 함수를 많이 사용하는데, 아래와 같이 sapply() 함수를 이용하여 계산 합니다.

# sapply를 이용한 데이터 처리  
  n <- 1:nrow(df)
  list <- sapply(n, change_rate_fun) 
  change_rate <-  data.frame(변화율 =do.call(rbind,list)) 
  df1 <- cbind(df, change_rate) %>% 
              mutate(변화율 = round(변화율*100, 2))
  df1
##          date  index  변화율
## 1  2022-03-06 2699.2      NA
## 2  2022-03-07 2680.3   -0.70
## 3  2022-03-08 2703.5    0.87
## 4  2022-03-09 2747.1    1.61
## 5  2022-03-10 2713.4   -1.23
## 6  2022-03-11 2651.3   -2.29
## 7  2022-03-12 2622.4   -1.09
## 8  2022-03-13    0.0 -100.00
## 9  2022-03-14 2645.7     Inf
## 10 2022-03-15 2621.5   -0.91
## 11 2022-03-16 2659.2    1.44
## 12 2022-03-17 2694.5    1.33
## 13 2022-03-18 2707.0    0.46


전체 데이터를 보면 NA와 Inf가 보입니다. Inf 값과 NA 값을 아래와 같이 필터를 사용해서 볼수 있습니다.

# is.infinite를 이용해서 변화율 필터 하기     
   df1 %>%  filter(is.infinite(변화율))  # Inf 값 필터해서 보기  
##         date  index 변화율
## 1 2022-03-14 2645.7    Inf
   df1 %>%  filter(!is.infinite(변화율)) # Inf 값 빼고 보기 
##          date  index  변화율
## 1  2022-03-06 2699.2      NA
## 2  2022-03-07 2680.3   -0.70
## 3  2022-03-08 2703.5    0.87
## 4  2022-03-09 2747.1    1.61
## 5  2022-03-10 2713.4   -1.23
## 6  2022-03-11 2651.3   -2.29
## 7  2022-03-12 2622.4   -1.09
## 8  2022-03-13    0.0 -100.00
## 9  2022-03-15 2621.5   -0.91
## 10 2022-03-16 2659.2    1.44
## 11 2022-03-17 2694.5    1.33
## 12 2022-03-18 2707.0    0.46
# is.na를 이용해서 첫번째 계산 한것 필터하기 
  df1 %>%  filter(is.na(변화율)) #  na 값 필터해서 보기 
##         date  index 변화율
## 1 2022-03-06 2699.2     NA
  df1 %>%  filter(!is.na(변화율)) #  na 값 필터해서 보기 
##          date  index  변화율
## 1  2022-03-07 2680.3   -0.70
## 2  2022-03-08 2703.5    0.87
## 3  2022-03-09 2747.1    1.61
## 4  2022-03-10 2713.4   -1.23
## 5  2022-03-11 2651.3   -2.29
## 6  2022-03-12 2622.4   -1.09
## 7  2022-03-13    0.0 -100.00
## 8  2022-03-14 2645.7     Inf
## 9  2022-03-15 2621.5   -0.91
## 10 2022-03-16 2659.2    1.44
## 11 2022-03-17 2694.5    1.33
## 12 2022-03-18 2707.0    0.46


which 값을 이용해서 결측치나 무한대 값을 찾습니다.

# which 값을 이용하여,  무한대값이나 누락된 값의 인덱스를 찾는다.     
  which(is.na(df1$변화율))
## [1] 1
  which(is.infinite(df1$변화율)) 
## [1] 9

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...