포스팅 목차
* 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
[ VARIANCE / VAR_SAMP Oracle Function ]
VAR_SAMP 함수는 지정한 인수 expr(Null 값은 제거)의 표본 분산을 계산한다. 집계 함수와 분석 함수를 이용할 수 있다.
- 함수 설명 : VARIANCE 오라클 함수 링크
- 함수 설명 : VAR_SAMP 오라클 함수 링크
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
--------------------------------------------
[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 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크 |
댓글