본문 바로가기
통계프로그램 비교 시리즈/데이터 전처리 비교

통계프로그램 비교 시리즈 – [데이터 관리] 3. 결측값 할당을 위한 조건 변환

by 기서무나구물 2022. 1. 10.

포스팅 목차

    [데이터 관리] 3. 결측값 할당을 위한 조건 변환


    1. Proc SQL

     

    SAS Programming
    proc sql;
      select id,
             workshop,
             gender,
             case when q1=5 then .
             else q1 end "q1",
    
             case when q2=5 then .
             else q2 end "q2",
    
             case when q3=5 then .
             else q3 end "q3",
    
             case when q4=5 then .
             else q4 end "q4"
    
      from   BACK.mydata;
    
    quit;

     

    Results
    id  workshop  gender          q1        q2        q3        q4
    --------------------------------------------------------------
     1         1  f                1         1         .         1
     2         2  f                2         1         4         1
     3         1  f                2         2         4         3
     4         2  f                3         1         .         3
     5         1  m                4         .         2         4
     6         2  m                .         4         .         .
     7         1  m                .         3         4         4
     8         2  m                4         .         .         .

     

     

    SAS Programming
    proc sql;
      select id,
             workshop,
             gender,
             ifn(q1=5,.,q1)"q1",
             ifn(q2=5,.,q2)"q2",
             ifn(q3=5,.,q3)"q3",
             ifn(q4=5,.,q4)"q4"
      from   BACK.mydata;
    quit;

     

    Results
    id  workshop  gender          q1        q2        q3        q4
    --------------------------------------------------------------
     1         1  f                1         1         .         1
     2         2  f                2         1         4         1
     3         1  f                2         2         4         3
     4         2  f                3         1         .         3
     5         1  m                4         .         2         4
     6         2  m                .         4         .         .
     7         1  m                .         3         4         4
     8         2  m                4         .         .         .

     


    2. SAS Programming

     

    SAS Programming
    data withmooc;
     set BACK.mydata;
         * 관측값 5를 결측치로 전환.;
         if q1=5 then q1=.;
         if q2=5 then q2=.;
         if q3=5 then q3=.;
         if q4=5 then q4=.;
    run;
    
    proc print;run;
    
    
    data withmooc;
     set BACK.mydata;
         * 배열을 사용하여서 한번에 결측치로 변환.;
         array q q1-q4;
    
         do over q;
            if q=5 then q=.;
         end;
    run;
    
    proc print;run;

     


    3. SPSS

     

    SPSS Programming
    * SPSS Program to Assign Missing Values.
    
    GET FILE=("c:\mydata.sav")
    MISSING q1 TO q4 (9).
    SAVE OUTFILE=("c:\mydata.sav")

     


    4. R Programming (R-PROJECT)

     

    R Programming
    from rpy2.robjects import r
    %load_ext rpy2.ipython

     

    Results
    The rpy2.ipython extension is already loaded. To reload it, use:
      %reload_ext rpy2.ipython

     

     

    R Programming
    %%R
    library(tidyverse)
    load(file="C:/work/data/mydata.Rdata")
    
    withmooc = mydata
    attach(withmooc) # mydata를 기본 데이터 세트로 지정.
    
    withmooc

     

    Results
    R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
    
    From cffi callback <function _consolewrite_ex at 0x0000021561EFE4C0>:
    Traceback (most recent call last):
      File "C:\Users\BACK\anaconda3\lib\site-packages\rpy2\rinterface_lib\callbacks.py", line 131, in _consolewrite_ex
        s = conversion._cchar_to_str_with_maxlen(buf, maxlen=n)
      File "C:\Users\BACK\anaconda3\lib\site-packages\rpy2\rinterface_lib\conversion.py", line 130, in _cchar_to_str_with_maxlen
        s = ffi.string(c, maxlen).decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 0: invalid start byte
    R[write to console]: -- Conflicts ------------------------------------------ tidyverse_conflicts() --
    x dplyr::filter() masks stats::filter()
    x dplyr::lag()    masks stats::lag()
    
    
    
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m  5  4  5  5
    7        1      m  5  3  4  4
    8        2      m  4  5  5  5

     


    • 결측치 값 할당을 위한 R-Project 프로그램.
    • 직접 데이터 수정. 데이터 에디터 화면에서 데이터 수정.
    R Programming
    %%R
    
    fix(withmooc)

     

     

    • 변수 q1이 5인 값에 대하여 세 번째 변수(q1)의 값을 결측치로 변경.
    R Programming
    %%R
    
    withmooc[q1==5,3] <- NA
    
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     


    • 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc[q1==5,"q1"] <- NA
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     


    • ifelsem함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc$q1 <- ifelse( q1 == 5, NA, withmooc$q1)
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     


    • mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.
    한 번에
    %%R
    
    withmooc = mydata
    
    withmooc[withmooc==5] <- NA
    withmooc

     

     
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     


    많은 변수를 변경하는 예제.

     

    • 5의 값을 관측치로 변경하는 함수 생성.
    R Programming
    %%R
    
    My5isNA <- function(x) {x[x==5] <- NA; x}

     

     

    • 단일 변수에 대하여 함수를 적용.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc$q1 <- My5isNA(q1)
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     

     

    • 변수 리스트에 대하여 결측치 값을 할당.
    • Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc[c("q1","q2","q3","q4")] <- lapply(withmooc[c("q1","q2","q3","q4")], My5isNA)
    
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     


    • 변수명 지정 없이 연속적인 변수를 적용.
    • 변수명 대신에 열 번호를 사용.
    • q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc[ 3:6 ] <- lapply( withmooc[ 3:6 ], My5isNA)
    
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     


    • 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
    • Which함수는 각 변수명의 열 번호를 발견.
    R Programming
    %%R
    
    withmooc = mydata
    
    A <- which( names(mydata)=="q1" )
    
    Z <- which( names(mydata)=="q4" )
    
    withmooc[ A:Z ] <- lapply( withmooc[ A:Z ], My5isNA)
    
    withmooc

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     

     

    • 관측값 대체
    • 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc[is.na(withmooc$q3),"q3"] <- mean(withmooc$q3,na.rm=TRUE)
    
    withmooc

     

    Results
      workshop gender q1 q2       q3 q4
    1        1      f  1  1 5.000000  1
    2        2      f  2  1 4.000000  1
    3        1      f  2  2 4.000000  3
    4        2      f  3  1 4.142857  3
    5        1      m  4  5 2.000000  4
    6        2      m  5  4 5.000000  5
    7        1      m  5  3 4.000000  4
    8        2      m  4  5 5.000000  5

     


    5. R - Tidyverse

     

    R Programming
    from rpy2.robjects import r
    %load_ext rpy2.ipython

     

    Results
    The rpy2.ipython extension is already loaded. To reload it, use:
      %reload_ext rpy2.ipython

     

     

    R Programming
    %%R
    
    library(tidyverse)
    attach(mydata) # mydata를 기본 데이터 세트로 지정.
    load(file="C:/work/data/mydata.Rdata")
    
    withmooc = mydata
    
    attach(withmooc) # mydata를 기본 데이터 세트로 지정.
    
    withmooc

     

    Results
    R[write to console]: The following objects are masked from withmooc:
    
        gender, q1, q2, q3, q4, workshop
    
    
    R[write to console]: The following objects are masked from withmooc (pos = 4):
    
        gender, q1, q2, q3, q4, workshop
    
    
    
    
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m  5  4  5  5
    7        1      m  5  3  4  4
    8        2      m  4  5  5  5

     

     

    • 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
    한 번에
    %%R
    
    withmooc %>%
      dplyr::mutate(q1 = ifelse(q1==5,NA,q1))

     

     
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     


    많은 변수를 변경하는 예제.

     

    • 5의 값을 관측치로 변경하는 함수 생성.
    R Programming
    %%R
    
    My5isNA <- function(x) {x[x==5] <- NA; x}

     

     

    • 단일 변수에 대하여 함수를 적용.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>%
      dplyr::mutate(q1 = My5isNA(q1))

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1  5  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4  5  2  4
    6        2      m NA  4  5  5
    7        1      m NA  3  4  4
    8        2      m  4  5  5  5

     

     

    • 변수 리스트에 대하여 결측치 값을 할당.
    • Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_if(is.numeric, funs(My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     

     

    • map : 각 변수 별로 함수 적용 후 하나의 테이블로 재구성됨.
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>%
      map(~ transmute(withmooc, {{.x}} := My5isNA(.))) %>%
      as_tibble()

     

    Results
    # A tibble: 8 x 6
      workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
             <int> <chr>       <int>  <int>  <int>  <int>
    1            1 f               1      1     NA      1
    2            2 f               2      1      4      1
    3            1 f               2      2      4      3
    4            2 f               3      1     NA      3
    5            1 m               4     NA      2      4
    6            2 m              NA      4     NA     NA
    7            1 m              NA      3      4      4
    8            2 m               4     NA     NA     NA

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>%
      select(q1,q2,q3,q4) %>%
      purrr::map_df(My5isNA)

     

    Results
    # A tibble: 8 x 4
         q1    q2    q3    q4
      <int> <int> <int> <int>
    1     1     1    NA     1
    2     2     1     4     1
    3     2     2     4     3
    4     3     1    NA     3
    5     4    NA     2     4
    6    NA     4    NA    NA
    7    NA     3     4     4
    8     4    NA    NA    NA

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      purrr::keep(.p = is.numeric) %>% # 숫자형 데이터만 남기기
      purrr::map_df(.x = .,
                    .f = My5isNA)

     

    Results
    # A tibble: 8 x 5
      workshop    q1    q2    q3    q4
         <int> <int> <int> <int> <int>
    1        1     1     1    NA     1
    2        2     2     1     4     1
    3        1     2     2     4     3
    4        2     3     1    NA     3
    5        1     4    NA     2     4
    6        2    NA     4    NA    NA
    7        1    NA     3     4     4
    8        2     4    NA    NA    NA

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      purrr::map_if(is.numeric, My5isNA) %>%
      as_tibble()

     

    Results
    # A tibble: 8 x 6
      workshop gender    q1    q2    q3    q4
         <int> <chr>  <int> <int> <int> <int>
    1        1 f          1     1    NA     1
    2        2 f          2     1     4     1
    3        1 f          2     2     4     3
    4        2 f          3     1    NA     3
    5        1 m          4    NA     2     4
    6        2 m         NA     4    NA    NA
    7        1 m         NA     3     4     4
    8        2 m          4    NA    NA    NA

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_if(is.numeric, funs(My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     


    • 변수명 지정 없이 연속적인 변수를 적용.
    • 변수명 대신에 열 번호를 사용.
    • q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.

     

    R Programming
    %%R
    
    withmooc %>%
      map(~ transmute(mydata[3:6], {{.x}} := My5isNA(.))) %>%
      as_tibble()

     

    Results
    # A tibble: 8 x 6
      workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
             <int> <chr>       <int>  <int>  <int>  <int>
    1            1 f               1      1     NA      1
    2            2 f               2      1      4      1
    3            1 f               2      2      4      3
    4            2 f               3      1     NA      3
    5            1 m               4     NA      2      4
    6            2 m              NA      4     NA     NA
    7            1 m              NA      3      4      4
    8            2 m               4     NA     NA     NA

     

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>%
      select(3:6) %>%
      purrr::map_df(My5isNA)

     

    Results
    # A tibble: 8 x 4
         q1    q2    q3    q4
      <int> <int> <int> <int>
    1     1     1    NA     1
    2     2     1     4     1
    3     2     2     4     3
    4     3     1    NA     3
    5     4    NA     2     4
    6    NA     4    NA    NA
    7    NA     3     4     4
    8     4    NA    NA    NA

     

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_at(3:6, funs(My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     

     

    • 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
    • Which함수는 각 변수명의 열 번호를 발견.
    R Programming
    %%R
    
    withmooc = mydata
    
    A <- which( names(mydata)=="q1" )
    Z <- which( names(mydata)=="q4" )
    
    withmooc %>%
      map(~ transmute(mydata[A:Z], {{.x}} := My5isNA(.))) %>%
      as_tibble()

     

    Results
    # A tibble: 8 x 6
      workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
             <int> <chr>       <int>  <int>  <int>  <int>
    1            1 f               1      1     NA      1
    2            2 f               2      1      4      1
    3            1 f               2      2      4      3
    4            2 f               3      1     NA      3
    5            1 m               4     NA      2      4
    6            2 m              NA      4     NA     NA
    7            1 m              NA      3      4      4
    8            2 m               4     NA     NA     NA

     

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_at(A:Z, funs(My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4
    1        1      f  1  1 NA  1
    2        2      f  2  1  4  1
    3        1      f  2  2  4  3
    4        2      f  3  1 NA  3
    5        1      m  4 NA  2  4
    6        2      m NA  4 NA NA
    7        1      m NA  3  4  4
    8        2      m  4 NA NA NA

     

     

     

    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_at(A:Z, funs(var = My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4 q1_var q2_var q3_var q4_var
    1        1      f  1  1  5  1      1      1     NA      1
    2        2      f  2  1  4  1      2      1      4      1
    3        1      f  2  2  4  3      2      2      4      3
    4        2      f  3  1 NA  3      3      1     NA      3
    5        1      m  4  5  2  4      4     NA      2      4
    6        2      m  5  4  5  5     NA      4     NA     NA
    7        1      m  5  3  4  4     NA      3      4      4
    8        2      m  4  5  5  5      4     NA     NA     NA

     

     

    • 관측값 대체
    • 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
    • q3의 관측치 처리
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>%
      dplyr::mutate(q3 = ifelse( is.na(q3) ,
                                  mean(q3,na.rm=TRUE),
                                  q3 )
      )

     

    Results
      workshop gender q1 q2       q3 q4
    1        1      f  1  1 5.000000  1
    2        2      f  2  1 4.000000  1
    3        1      f  2  2 4.000000  3
    4        2      f  3  1 4.142857  3
    5        1      m  4  5 2.000000  4
    6        2      m  5  4 5.000000  5
    7        1      m  5  3 4.000000  4
    8        2      m  4  5 5.000000  5

     

     

    • [참고] 접미어(_var)를 추가하여서 새로운 변수 생성
    R Programming
    %%R
    
    withmooc = mydata
    
    withmooc %>% 
      mutate_at(A:Z, funs(var = My5isNA(.)))

     

    Results
      workshop gender q1 q2 q3 q4 q1_var q2_var q3_var q4_var
    1        1      f  1  1  5  1      1      1     NA      1
    2        2      f  2  1  4  1      2      1      4      1
    3        1      f  2  2  4  3      2      2      4      3
    4        2      f  3  1 NA  3      3      1     NA      3
    5        1      m  4  5  2  4      4     NA      2      4
    6        2      m  5  4  5  5     NA      4     NA     NA
    7        1      m  5  3  4  4     NA      3      4      4
    8        2      m  4  5  5  5      4     NA     NA     NA

     


    6. Python - Pandas

     

    Python Programming
    import pandas as pd
    import numpy as np
    import sweetviz as sv
    
    mydata   = pd.read_csv("C:/work/data/mydata.csv",sep=",",
                           dtype={'id':object,'workshop':object,
                                  'q1':int, 'q2':int, 'q3':float, 'q4':int},
                           na_values=['NaN'],skipinitialspace =True)
    
    withmooc= mydata.copy()
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5
     
     
    • 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
    Python Programming
    withmooc.iloc[:,3] = withmooc['q1'].replace(5, np.nan)
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     
     
    • 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.
    Python Programming
    withmooc.loc[:,'q1'] = np.where(withmooc['q1'] == 5, np.nan, withmooc['q1'])
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     
     
    • np.where 함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.
    Python Programming
    withmooc.loc[:,'q1'] = np.where(withmooc['q1'] == 5, np.nan, withmooc['q1'])
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5

     

     

    • apply() 함수와 IF()
    Python Programming
    withmooc= mydata.copy()
    
    withmooc['q1'] = withmooc['q1'].apply(lambda x: np.NaN if (x==5) else x)
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     

     

     

    • map() 함수와 IF()
    Python Programming
    withmooc= mydata.copy()
    
    withmooc['q1'] = withmooc['q1'].map(lambda x: np.NaN if (x==5) else x)
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     

    • apply() 함수, 사용자 함수 - IF()
    Python Programming
    withmooc= mydata.copy()
    
    def replace_5(x):
        if x == 5:
            return np.NaN
        else:
            return x
    
    withmooc['q1'] = withmooc['q1'].apply(lambda x:replace_5(x))
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     

    • [참고] Map
    Python Programming
    withmooc= mydata.copy()
    
    mapper = {True:'True',False:'False'}
    
    (withmooc['q1']==5).map(mapper)

     

    Results
    0    False
    1    False
    2    False
    3    False
    4    False
    5     True
    6     True
    7    False
    Name: q1, dtype: object

     


    • mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.
    Python Programming
    withmooc.replace(5, np.nan)

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     

     

    • np.NaN
    Python Programming
    withmooc[mydata==5] = np.NaN
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     

    한번에 다수의 변수를 함께 변경하는 예제.

     

    • 5의 값을 관측치로 변경하는 함수 생성.
    Python Programming
    withmooc= mydata.copy()
    
    def replace_5(x):
        if x == 5:
            return np.NaN
        else:
            return x
    
    withmooc['q1'] = withmooc['q1'].apply(lambda x:replace_5(x))
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     
     
    • 변수 리스트에 대하여 결측치 값을 할당.
    • Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
    Python Programming
    withmooc= mydata.copy()
    
    def replace_5(x):
        if x == 5:
            return np.NaN
        else:
            return x
    
    withmooc[['q1','q2','q3','q4']] = withmooc[['q1','q2','q3','q4']].applymap(lambda x:replace_5(x))
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     
     
     
    • 변수명 지정 없이 연속적인 변수를 적용.
    • 변수명 대신에 열 번호를 사용.
    • q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
    Python Programming
    withmooc= mydata.copy()
    
    def replace_5(x):
        if x == 5:
            return np.NaN
        else:
            return x
    
    withmooc.iloc[:,3:7] = withmooc.iloc[:,3:7].applymap(lambda x:replace_5(x))
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     
     
    • 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
    • Which함수는 각 변수명의 열 번호를 발견.
    Python Programming
    withmooc= mydata.copy()
    
    mylist = list(withmooc.columns)
    myA = mylist.index("q1")
    print(myA)
    myZ = mylist.index("q4")
    print(myZ)
    
    withmooc.iloc[:,myA:myZ + 1] = withmooc.iloc[:,myA:myZ + 1].applymap(lambda x:replace_5(x))
    
    withmooc

     

    Results
    3
    6

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     
     
     
    • 관측값 대체
    • 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
    Python Programming
    withmooc= mydata.copy()
    
    withmooc.where(pd.notnull(withmooc), withmooc.mean(), axis='columns')

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.000000	1
    1	2	2		f	2	1	4.000000	1
    2	3	1		f	2	2	4.000000	3
    3	4	2		f	3	1	4.142857	3
    4	5	1		m	4	5	2.000000	4
    5	6	2		m	5	4	5.000000	5
    6	7	1		m	5	3	4.000000	4
    7	8	2		m	4	5	5.000000	5
     

     

     

     

    Python Programming
    withmooc= mydata.copy()
    
    withmooc.fillna(withmooc.mean()['q3'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.000000	1
    1	2	2		f	2	1	4.000000	1
    2	3	1		f	2	2	4.000000	3
    3	4	2		f	3	1	4.142857	3
    4	5	1		m	4	5	2.000000	4
    5	6	2		m	5	4	5.000000	5
    6	7	1		m	5	3	4.000000	4
    7	8	2		m	4	5	5.000000	5
     

    7. Python - dfply

     

    Python Programming
    import pandas as pd
    from dfply import *
    
    mydata   = pd.read_csv("c:/work/data/mydata.csv",sep=",",
                           dtype={'id':object,'workshop':object,
                                  'q1':int, 'q2':int, 'q3':float, 'q4':int},
                           na_values=['NaN'],skipinitialspace =True)
    
    withmooc= mydata.copy()
    
    # 모든 변수 선택하기.
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5
     
     
     
    • 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
    한 번에
    withmooc >> mutate(q1=make_symbolic(np.where)( (X.q1 == 5) ,np.nan,X.q1))

     

     
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1	5.0	1
    1	2	2		f	2.0	1	4.0	1
    2	3	1		f	2.0	2	4.0	3
    3	4	2		f	3.0	1	NaN	3
    4	5	1		m	4.0	5	2.0	4
    5	6	2		m	NaN	4	5.0	5
    6	7	1		m	NaN	3	4.0	4
    7	8	2		m	4.0	5	5.0	5
     

    많은 변수를 변경하는 예제.

     

    • 5의 값을 관측치로 변경하는 함수 생성.
    Python Programming
    @make_symbolic
    def My5isNA(x):
        return np.where(x == 5,np.NaN,x)
    
    withmooc >> mutate(q1 = My5isNA(X.q1))
    
    withmooc  >> mutate(mf=[My5isNA(x) for x in withmooc.q1])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4	mf
    0	1	1		f	1	1	5.0	1	1.0
    1	2	2		f	2	1	4.0	1	2.0
    2	3	1		f	2	2	4.0	3	2.0
    3	4	2		f	3	1	NaN	3	3.0
    4	5	1		m	4	5	2.0	4	4.0
    5	6	2		m	5	4	5.0	5	nan
    6	7	1		m	5	3	4.0	4	nan
    7	8	2		m	4	5	5.0	5	4.0
     
     
    • 변수 리스트에 대하여 결측치 값을 할당.
    • Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
    Python Programming
    # 수치형 변수에 대한 자동 포맷팅
    
    @make_symbolic
    def My5isNA(x):
        return np.where(x == 5,np.NaN,x)
    
    withmooc >> mutate(**{
      **{f"{x}": X[x].apply(My5isNA) for x in withmooc.select_dtypes([int,float]).columns}
      })

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     

    • [참고]
    Python Programming
    withmooc >> filter_by(~X[['workshop', 'gender']].duplicated())

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
     
     
     
    • [참고] 수치형 변수 선택
    Python Programming
    print( withmooc.select_dtypes(include=np.number).columns.tolist() )
    
    print( [ col for col in withmooc.columns if withmooc[col].dtypes != "object"] )

     

    Results
    ['q1', 'q2', 'q3', 'q4']
    ['q1', 'q2', 'q3', 'q4']

     

     

    Python Programming
    @make_symbolic
    def My5isNA(x):
        return np.where(x == 5,np.NaN,x)
    
    # https://blog.amedama.jp/entry/dfply#Intention
    
    @pipe
    @symbolic_evaluation()
    def symbolic_double(df, serieses):
        for series in serieses:
            df[series.name] = My5isNA(series)
        return df
    
    withmooc >> symbolic_double([X.q1, X.q2, X.q3, X.q4])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN
     
     
    Python Programming
    @pipe
    @symbolic_evaluation()
    def symbolic_double(df, *serieses):
        for series in serieses:
            df[series.name] = series * 2
        return df
    
    diamonds >> symbolic_double(X.carat, X.price) >> head()

     

    Results
    	carat	cut	color	clarity	depth	table	price	x	y	z
    0	0.46	Ideal	E	SI2	61.5	55.0	652	3.95	3.98	2.43
    1	0.42	Premium	E	SI1	59.8	61.0	652	3.89	3.84	2.31
    2	0.46	Good	E	VS1	56.9	65.0	654	4.05	4.07	2.31
    3	0.58	Premium	I	VS2	62.4	58.0	668	4.20	4.23	2.63
    4	0.62	Good	J	SI2	63.3	58.0	670	4.34	4.35	2.75
     
     
    Python Programming
    @pipe
    @symbolic_evaluation()
    def symbolic_multiply(df, n, serieses):
        for series in serieses:
            df[series.name] = series * n
        return df
    
    diamonds >> symbolic_multiply(3, [X.carat, X.price]) >> head()

     

    Results
    	carat	cut	color	clarity	depth	table	price	x	y	z
    0	0.69	Ideal	E	SI2	61.5	55.0	978	3.95	3.98	2.43
    1	0.63	Premium	E	SI1	59.8	61.0	978	3.89	3.84	2.31
    2	0.69	Good	E	VS1	56.9	65.0	981	4.05	4.07	2.31
    3	0.87	Premium	I	VS2	62.4	58.0	1002	4.20	4.23	2.63
    4	0.93	Good	J	SI2	63.3	58.0	1005	4.34	4.35	2.75
     
     
    • [참고] 통계량 계산
    Python Programming
    withmooc >> summarize(**{
      **{f"{x}_mean": X[x].mean() for x in mydata.select_dtypes(int).columns},
      **{f"{x}_std" : X[x].std() for x in mydata.select_dtypes(int).columns}
      })

     

    Results
    	q1_mean	q2_mean	q4_mean		q1_std		q2_std		q4_std
    0	3.25	2.75	3.25		1.488048	1.752549	1.581139
     
     
    • [참고] int -> float 으로 데이터 형식 변경
    Python Programming
    @dfpipe
    def ints_to_floats(df):
        return df.assign(**{x[0]: x[1] for x in df.select_dtypes(int).astype(float).items()})
    
    withmooc >> ints_to_floats()

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	5.0	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	5.0	2.0	4.0
    5	6	2		m	5.0	4.0	5.0	5.0
    6	7	1		m	5.0	3.0	4.0	4.0
    7	8	2		m	4.0	5.0	5.0	5.0
     
     
    • [참고 : 일괄 통계량 산출]
    Python Programming
    withmooc >> summarize(**{
      **{f"{x}_mean": X[x].mean() for x in withmooc.select_dtypes(int).columns},
      **{f"{x}_std" : X[x].std()  for x in withmooc.select_dtypes(int).columns}
      })

     

    Results
    	q1_mean	q2_mean	q4_mean		q1_std		q2_std		q4_std
    0	3.25	2.75	3.25		1.488048	1.752549	1.581139
     
     
    • [참고]
    Python Programming
    @dfpipe
    def ints_to_floats(df):
        return df.assign(**{x[0]: x[1] + 100   for x in withmooc.select_dtypes(int).items()})
    
    withmooc >> ints_to_floats()

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	101	101	5.0	101
    1	2	2		f	102	101	4.0	101
    2	3	1		f	102	102	4.0	103
    3	4	2		f	103	101	NaN	103
    4	5	1		m	104	105	2.0	104
    5	6	2		m	105	104	5.0	105
    6	7	1		m	105	103	4.0	104
    7	8	2		m	104	105	5.0	105
     
     
    • 변수명 지정 없이 연속적인 변수를 적용.
    • 변수명 대신에 열 번호를 사용.
    • q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
    Python Programming
    @make_symbolic
    def My5isNA(x):
        return np.where(x == 5,np.NaN,x)
    
    
    ## 일단 우격 다짐.
    withmooc >> mutate_if(lambda col : True, lambda row : My5isNA(row))

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1.0	1.0	NaN	1.0
    1	2	2		f	2.0	1.0	4.0	1.0
    2	3	1		f	2.0	2.0	4.0	3.0
    3	4	2		f	3.0	1.0	NaN	3.0
    4	5	1		m	4.0	NaN	2.0	4.0
    5	6	2		m	NaN	4.0	NaN	NaN
    6	7	1		m	NaN	3.0	4.0	4.0
    7	8	2		m	4.0	NaN	NaN	NaN

     

     

     


     

    통계프로그램 비교 목록(Proc sql, SAS, SPSS, R 프로그래밍, R Tidyverse, Python Pandas, Python Dfply)
    [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크
    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]
    SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크
    반응형

    댓글