본문 바로가기
통계프로그램 비교 시리즈/오라클함수 비교(R & Python)

VARIANCE / VAR_SAMP 오라클 함수 [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table, DuckDB]

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

포스팅 목차

    * 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크


    [ VARIANCE / VAR_SAMP Oracle Function ]

     


    VAR_SAMP 함수는 지정한 인수 expr(Null 값은 제거)의 표본 분산을 계산한다. 집계 함수와 분석 함수를 이용할 수 있다.

     

     


    1. Oracle(오라클)

     

    1) 집계 함수

     

    • VARIANCE() 함수

    사원 급여의 표본 분산을 계산한다.

     

    Oracle Programming
    SELECT VARIANCE(sal) SAL_VAR
    FROM   emp

     

    Results
    SAL_VAR
    -------------------------------------------
    1398313.87362637362637362637362637362637

     


    2) 분석함수

     

    • VARIANCE() 함수

    분석함수를 사용하여서 개별 부서별 급여의 표본분산을 반환한다.

     

    Oracle Programming
    SELECT DEPTNO, EMPNO, 
           VARIANCE(SAL) OVER (PARTITION BY DEPTNO) AS VARIANCE
    FROM   EMP;

     

    Results
    DEPTNO	EMPNO	VARIANCE
    -------------------------------------------------------
    10	7782	3585833.33333333333333333333333333333334
    10	7934	3585833.33333333333333333333333333333334
    10	7839	3585833.33333333333333333333333333333334
    20	7902	1261875
    20	7788	1261875
    20	7566	1261875
    20	7369	1261875
    20	7876	1261875
    30	7521	446666.666666666666666666666666666666666
    30	7654	446666.666666666666666666666666666666666
    30	7844	446666.666666666666666666666666666666666
    30	7900	446666.666666666666666666666666666666666
    30	7499	446666.666666666666666666666666666666666
    30	7698	446666.666666666666666666666666666666666

     


    2. Python Pandas(파이썬)

     

    1) 집계 함수

     

    • VARIANCE() 함수

    사원 급여의 표본 분산을 반환한다.

     

    Python Programming
    from statistics import variance 
    
    variance(emp['sal'])

     

    Results
    1398313.8736263737

     


    2) 분석함수

     

    • VARIANCE() 함수

    개별 그룹별 사원들의 급여에 대한 표본분산을 계산 후 원본 자료에 추가(Join)하여서 각 관측치에 해당 부서의 급여에 대한 표본분산을 추가한다.

     

    Python Programming
    from statistics import variance
    
    withmooc = emp.copy()
    withmooc['sal_pvar'] = emp.sort_values('sal', ascending=False).groupby('deptno')['sal'].transform(lambda x: variance(x))
    withmooc.sort_values('deptno').head(7)

     

    Results
    	empno	ename	job		mgr	hiredate	sal	comm	deptno	sal_pvar
    6	7782	CLARK	MANAGER		7839.0	1981/01/09	2450	NaN	10	3.585833e+06
    8	7839	KING	PRESIDENT	NaN	1981/11/17	5000	NaN	10	3.585833e+06
    13	7934	MILLER	CLERK		7782.0	1982/01/23	1300	NaN	10	3.585833e+06
    0	7369	SMITH	CLERK		7902.0	1980/12/17	800	NaN	20	1.261875e+06
    3	7566	JONES	MANAGER		7839.0	1981/04/02	2975	NaN	20	1.261875e+06
    7	7788	SCOTT	ANALYST		7566.0	1982/12/09	3000	NaN	20	1.261875e+06
    10	7876	ADAMS	CLERK		7788.0	1983/01/12	1100	NaN	20	1.261875e+06
     

     

     

    3. R Programming (R Package)

     

    1) 집계 함수

     

    • mean() 함수와 length() 함수

    사원 급여의 표본 분산을 계산한다.

     

    R Programming
    %%R
    
    sum((emp$sal - mean(emp$sal))**2) / (length(emp$sal) - 1)

     

    Results
    [1] 1398314

     


    • VAR() 함수
    R Programming
    %%R
    
    var(emp$sal)

     

    Results
    [1] 1398314

     


    2) 분석함수

     

    • VAR() 함수

    개별 그룹별 사원들의 급여에 대한 표본분산을 계산 후 원본 자료에 추가(Join)하여서 각 관측치에 해당 부서의 급여에 대한 표본분산을 추가한다.

     

    R Programming
    %%R
    
    withmooc <- emp
    withmooc['sal_popvar'] = with(withmooc, ave(x = sal, deptno, FUN =function(x) { stats::var(x) }))
    
    withmooc[order(withmooc$deptno),][1:10, ]

     

    Results
    # A tibble: 10 x 9
       empno ename  job         mgr hiredate     sal  comm deptno sal_popvar
       <dbl> <chr>  <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>      <dbl>
     1  7782 CLARK  MANAGER    7839 1981-01-09  2450    NA     10   3585833.
     2  7839 KING   PRESIDENT    NA 1981-11-17  5000    NA     10   3585833.
     3  7934 MILLER CLERK      7782 1982-01-23  1300    NA     10   3585833.
     4  7369 SMITH  CLERK      7902 1980-12-17   800    NA     20   1261875 
     5  7566 JONES  MANAGER    7839 1981-04-02  2975    NA     20   1261875 
     6  7788 SCOTT  ANALYST    7566 1982-12-09  3000    NA     20   1261875 
     7  7876 ADAMS  CLERK      7788 1983-01-12  1100    NA     20   1261875 
     8  7902 FORD   ANALYST    7566 1981-12-03  3000    NA     20   1261875 
     9  7499 ALLEN  SALESMAN   7698 1981-02-20  1600   300     30    446667.
    10  7521 WARD   SALESMAN   7698 1981-02-22  1250   500     30    446667.

     

     

     


    4. R Dplyr Package

     

    1) 집계 함수

    • stats::var() 함수
    R Programming
    %%R
    
    emp %>%
      dplyr::summarize(sal_svar = stats::var(sal) )

     

    Results
    # A tibble: 1 x 1
      sal_svar
         <dbl>
    1 1398314.

     


    2) 분석함수

     

    • stats::var() 함수
    R Programming
    %%R
    
    emp %>%
      dplyr::group_by(deptno) %>%
      dplyr::mutate(sal_svar = stats::var(sal) ) %>%
      dplyr::arrange(deptno) %>%
      head()

     

    Results
    # A tibble: 6 x 9
    # Groups:   deptno [2]
      empno ename  job         mgr hiredate     sal  comm deptno sal_svar
      <dbl> <chr>  <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>    <dbl>
    1  7782 CLARK  MANAGER    7839 1981-01-09  2450    NA     10 3585833.
    2  7839 KING   PRESIDENT    NA 1981-11-17  5000    NA     10 3585833.
    3  7934 MILLER CLERK      7782 1982-01-23  1300    NA     10 3585833.
    4  7369 SMITH  CLERK      7902 1980-12-17   800    NA     20 1261875 
    5  7566 JONES  MANAGER    7839 1981-04-02  2975    NA     20 1261875 
    6  7788 SCOTT  ANALYST    7566 1982-12-09  3000    NA     20 1261875 

     

     

     


    5. R sqldf Package

     

    1) 집계 함수

     

    • var_samp() 함수

    RH2 패키지에서 지원하는 VAR_SAMP() 함수를 사용하여서 사원들의 급여에 대한 표본 분산을 계산한다.

     

    R Programming
    %%R
    library(RH2)
    
    sqldf(" SELECT VAR_SAMP(sal) VAR_SAMP FROM emp ")

     

    Results
      VAR_SAMP
    1  1398314

     


    2) 분석함수

     

    • var_samp() 함수

    개별 그룹별 사원들의 급여에 대한 표본분산을 계산 후 원본 자료에 추가(Join)하여서 각 관측치에 해당 부서의 급여에 대한 표본분산을 추가한다.

     

    R Programming
    %%R
    library(RH2)
    
    sqldf(" select a.*,VAR_SAMP
            from   emp a
                   left join (SELECT deptno,VAR_SAMP(sal) VAR_SAMP FROM emp group by deptno) b
                        on    a.deptno = b.deptno
            order by a.deptno")[1:10, ]

     

    Results
       empno  ename       job  mgr   hiredate  sal comm deptno  VAR_SAMP
    1   7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10 3585833.3
    2   7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10 3585833.3
    3   7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10 3585833.3
    4   7369  SMITH     CLERK 7902 1980-12-17  800   NA     20 1261875.0
    5   7566  JONES   MANAGER 7839 1981-04-02 2975   NA     20 1261875.0
    6   7788  SCOTT   ANALYST 7566 1982-12-09 3000   NA     20 1261875.0
    7   7876  ADAMS     CLERK 7788 1983-01-12 1100   NA     20 1261875.0
    8   7902   FORD   ANALYST 7566 1981-12-03 3000   NA     20 1261875.0
    9   7499  ALLEN  SALESMAN 7698 1981-02-20 1600  300     30  446666.7
    10  7521   WARD  SALESMAN 7698 1981-02-22 1250  500     30  446666.7

     

     

     


    6. Python pandasql Package

     

    1) 집계 함수

    2) 분석함수

     

     


    7. R data.table Package

     

    1) 집계 함수

     

    • stats::var() 함수

    사원 급여에 대한 표본 분산을 계산한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    library(multicon)
    
    DT[, list(sal_svar = stats::var(sal) )]

     

    Results
       sal_svar
    1:  1398314

     


    • stats::var() 함수

    stats::var 함수를 사용하여 부서별 사원 급여에 대한 표본분산을 반환한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    library(sjstats)
    
    DT[, list(sal_svar = stats::var(sal) ), by =deptno]

     

    Results
       deptno  sal_svar
    1:     20 1261875.0
    2:     30  446666.7
    3:     10 3585833.3

     


    2) 분석함수

     

    • stats::var() 함수

    개별 그룹별 사원들의 급여에 대한 표본분산을 계산 후 원본 자료에 추가(Join)하여서 각 관측치에 해당 부서의 급여에 대한 표본분산을 추가한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    DT[, sal_svar := stats::var(sal), by = deptno][order(deptno),][1:10, ]

     

    Results
        empno  ename       job  mgr   hiredate  sal comm deptno  sal_svar
     1:  7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10 3585833.3
     2:  7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10 3585833.3
     3:  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10 3585833.3
     4:  7369  SMITH     CLERK 7902 1980-12-17  800   NA     20 1261875.0
     5:  7566  JONES   MANAGER 7839 1981-04-02 2975   NA     20 1261875.0
     6:  7788  SCOTT   ANALYST 7566 1982-12-09 3000   NA     20 1261875.0
     7:  7876  ADAMS     CLERK 7788 1983-01-12 1100   NA     20 1261875.0
     8:  7902   FORD   ANALYST 7566 1981-12-03 3000   NA     20 1261875.0
     9:  7499  ALLEN  SALESMAN 7698 1981-02-20 1600  300     30  446666.7
    10:  7521   WARD  SALESMAN 7698 1981-02-22 1250  500     30  446666.7

     


    • var() 함수
    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    DT[, `:=` ( sal_svar = var(unlist(.SD)) ), 
         by = deptno,
         .SDcols = c("sal")][order(deptno),][1:10, ]

     

    Results
        empno  ename       job  mgr   hiredate  sal comm deptno  sal_svar
     1:  7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10 3585833.3
     2:  7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10 3585833.3
     3:  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10 3585833.3
     4:  7369  SMITH     CLERK 7902 1980-12-17  800   NA     20 1261875.0
     5:  7566  JONES   MANAGER 7839 1981-04-02 2975   NA     20 1261875.0
     6:  7788  SCOTT   ANALYST 7566 1982-12-09 3000   NA     20 1261875.0
     7:  7876  ADAMS     CLERK 7788 1983-01-12 1100   NA     20 1261875.0
     8:  7902   FORD   ANALYST 7566 1981-12-03 3000   NA     20 1261875.0
     9:  7499  ALLEN  SALESMAN 7698 1981-02-20 1600  300     30  446666.7
    10:  7521   WARD  SALESMAN 7698 1981-02-22 1250  500     30  446666.7

     


    8. Python Duckdb의 SQL

     

    1) 집계함수

     

    Python Programming
    %%sql
      SELECT VARIANCE(sal) as var FROM emp

     

    Python Programming
    duckdb.sql(" SELECT VARIANCE(sal) as var FROM emp ").df()

     

    Results
                var
    0  1.398314e+06

     


     

    Python Programming
    %%sql
      SELECT VAR_SAMP(sal) VAR_SAMP FROM emp

     

    Python Programming
    duckdb.sql(" SELECT VAR_SAMP(sal) VAR_SAMP FROM emp ").df()

     

    Results
           VAR_SAMP
    0  1.398314e+06

     


     

    2) 분석함수

     

    Python Programming
    %%sql
      SELECT DEPTNO, EMPNO,
             VARIANCE(SAL) OVER (PARTITION BY DEPTNO) AS VARIANCE
      FROM   emp
      LIMIT  6

     

    Python Programming
    duckdb.sql(" SELECT DEPTNO, EMPNO,                                             \
                        VARIANCE(SAL) OVER (PARTITION BY DEPTNO) AS VARIANCE       \
                 FROM   emp                                                        \
                 LIMIT  6 ").df()

     

    Results
       deptno  empno       VARIANCE
    0      30   7499  446666.666667
    1      30   7521  446666.666667
    2      30   7654  446666.666667
    3      30   7698  446666.666667
    4      30   7844  446666.666667
    5      30   7900  446666.666667

     


     

    Python Programming
    %%sql
      select a.*,VAR_SAMP
      from   emp a
             left join (SELECT deptno,VAR_SAMP(sal) VAR_SAMP FROM emp group by deptno) b
                  on    a.deptno = b.deptno
      order  by a.deptno
      LIMIT  6

     

    Python Programming
    duckdb.sql(" select a.deptno,a.empno,a.ename,a.sal                                                   \
                        VAR_SAMP                                                                         \
                 from   emp a                                                                            \
                        left join (SELECT deptno,VAR_SAMP(sal) VAR_SAMP FROM emp group by deptno) b      \
                             on    a.deptno = b.deptno                                                   \
                 order  by a.deptno                                                                      \
                 LIMIT  6 ").df()

     

    Results
       deptno  empno   ename  VAR_SAMP
    0      10   7782   CLARK      2450
    1      10   7839    KING      5000
    2      10   7934  MILLER      1300
    3      20   7369   SMITH       800
    4      20   7566   JONES      2975
    5      20   7788   SCOTT      3000

     


    Kopi luwak is one of the most expensive coffees in the world ( https://unsplash.com/photos/hG26UoUfU9s )

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

     

     

    [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크

     

    오라클 SQL 함수(Oracle SQL Function) 목록 리스트 링크

     

    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크
    반응형

    댓글