본문 바로가기
통계프로그램 비교 시리즈/엑셀과 SAS 함수

【엑셀(Excel)과 SAS함수】 MODE 함수

by 기서무나구물 2021. 9. 23.

포스팅 목차

    o MODE 함수

     


    목 적 : 

    MODE 함수는 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다.

     

    문 법

    - 엑 셀 : MODE(number1,[number2],...)

    - SAS  : 
      1) 변수 처리 - PROC UNIVARIATE, PROC SQL
      2) 관측치 처리 - 배열, HASH Object, 전치 후 변수 처리, Proc Iml 방식 등

     

    범 주 : 호환성 함수

     


    관련 함수

     

    함수명 함수내용
    AGGREGATE 목록 또는 데이터베이스에서 집계 값을 반환한다.
    AVERAGE 인수 리스트의 산술 평균을 반환한다.
    COUNT 지정한 인수 목록에서 숫자의 개수를 카운트한다.
    COUNTA 인수 목록에서 공백이 아닌 셀의 개수를 카운트한다.
    COUNTIF
    범위 내에서 주어진 조건과 동일한 셀의 개수를 계산한다.
    LARGE 사용자가 지정한 데이터 집합에서 k번째로 큰 값을 반환한다.
    MAX 인수 목록에서 최대값을 반환한다.
    MEDIAN 주어진 수치 인수 목록에서 중앙값을 반환한다.
    MIN 사용자가 지정한 인수 목록에서 최솟값을 반환한다.
    MODE 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다.
    MODE.MULT 배열이나 데이터 범위에서 빈도수가 가장 높은 값의 세로 배열을 반환한다.
    MODE.SNGL 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다.
    SMALL 데이터 집합에서 첫 번째 인수에서 지정한 k번째로 작은 값을 반환한다.

     


    예 제

    [ 변수 기준 처리]

    다음 예제는 PROC UNIVARIATE와 PROC SQL을 사용하여서 데이터 리스트에서 가장 많이 존재하는 최빈값을 반환한다.

    SAS Program
    DATA MODE;
         INPUT VAR;
    CARDS;
    5.6
    4
    4
    3
    2
    4
    ;

     


    * PROC UNIVARIDTE를 사용하여서 최빈값을 계산;

    SAS Program
    PROC UNIVARIATE DATA=MODE;
         VAR VAR;
    RUN;

     

    Results

     


    * PROC SQL의 HAVING 절을 사용하여서 최빈값을 계산;

    SAS Program
    PROC SQL;
      CREATE TABLE MODE AS
        SELECT *
        FROM ( SELECT VAR,
                       COUNT(*) AS VAL_CNT
                FROM   MODE
                GROUP BY 1       )
        HAVING VAL_CNT=MAX(VAL_CNT);
    QUIT;

     

    Results
    OBS    VAR    VAL_CNT
    
     1      4        3

     


    [ 관측치 처리]

     

    * Mode 함수를 제공하지 않는 관계로 일반적으로는 배열, Hash Object, 전치 후 통계 프로시져 등의 방법으로 최빈값을 구할 수 있고, 아래는 Proc iml의 freq함수와 level함수를 사용하여서 행 단위의 최빈값 계산하여 원 데이터에 결합하는 방식으로 구현.

    SAS Program
    data have;
    infile cards expandtabs;
    input Chrom Pos ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8;
    cards;
    1 8456  0 0 0 0 0 . 1 1
    1 9948  0 0 2 . 1 2 2 2
    1 10058 1 1 1 1 1 1 . 1
    2 6535  0 . 0 0 0 0 1 1
    2 8967  1 1 0 1 1 1 0 .
    2 10234 1 1 1 0 0 1 1 1
    3 1023  0 0 1 2 0 0 0 0
    3 9978  1 2 0 . 2 2 2 2
    3 15032 0 0 0 1 1 2 1 1
    ;
    run;

     


    - 테이블 처리 방식

    SAS Programming
    proc iml;
         CREATE Temp_table VAR{ ROW_MODE};
         use have(keep=ID:);
    
         read all var _all_ into x[c=vname];
         close;
    
         do i=1 to nrow(x);
            row=x[i,];
            call tabulate(level,freq,row);
            ROW_MODE=level[freq[<:>]];
            APPEND;
    
         end;
         close Temp_table;
         
         * 일단 Temp_table 생성 후 처리;
         Temp_table = TableCreateFromDataSet("work", "Temp_table");
         row_mode   = TableGetVarData(Temp_table, "ROW_MODE");     
         
         
         * have 테이블을 행렬로 생성;
         have_table = TableCreateFromDataSet("work", "have");
         
         * 행렬에 변수 추가;
         call TableAddVar(have_table, "row_mode", row_mode);
    
         * 테이블을 SAS 테이블로 변경;
         call TableWriteToDataSet(have_table, "work", "mode_table");
    
    quit;

     

    Results
    OBS    Chrom     Pos     ID1    ID2    ID3    ID4    ID5    ID6    ID7    ID8    row_mode
    
     1       1       8456     0      0      0      0      0      .      1      1         0   
     2       1       9948     0      0      2      .      1      2      2      2         2   
     3       1      10058     1      1      1      1      1      1      .      1         1   
     4       2       6535     0      .      0      0      0      0      1      1         0   
     5       2       8967     1      1      0      1      1      1      0      .         1   
     6       2      10234     1      1      1      0      0      1      1      1         1   
     7       3       1023     0      0      1      2      0      0      0      0         0   
     8       3       9978     1      2      0      .      2      2      2      2         2   
     9       3      15032     0      0      0      1      1      2      1      1         1

     


    - Merge 함수로 빈도값 추가하기

     

    SAS Programming
    proc iml;
         CREATE Temp_table VAR{ ROW_MODE};
         use have(keep=ID:);
         read all var _all_ into x[c=vname];
         close;
    
         do i=1 to nrow(x);
            row=x[i,];
            call tabulate(level,freq,row);
            ROW_MODE=level[freq[<:>]];
            APPEND;
         end;
    quit; 
    
    data new_table;
     merge have Temp_table;
    run;

     

    Results
    OBS    Chrom     Pos     ID1    ID2    ID3    ID4    ID5    ID6    ID7    ID8    ROW_MODE
    
     1       1       8456     0      0      0      0      0      .      1      1         0   
     2       1       9948     0      0      2      .      1      2      2      2         2   
     3       1      10058     1      1      1      1      1      1      .      1         1   
     4       2       6535     0      .      0      0      0      0      1      1         0   
     5       2       8967     1      1      0      1      1      1      0      .         1   
     6       2      10234     1      1      1      0      0      1      1      1         1   
     7       3       1023     0      0      1      2      0      0      0      0         0   
     8       3       9978     1      2      0      .      2      2      2      2         2   
     9       3      15032     0      0      0      1      1      2      1      1         1

     


      --------------------------------------------  

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 함수(SAS Function) 리스트 링크
    반응형

    댓글