포스팅 목차
[데이터 관리] 11. Aggregating Or Summarizing 데이터
1. Proc SQL
| SAS Programming | 
proc sql;
  create table withmooc as
    select GENDER,
           MEAN(q1) as q1_mean
    from   BACK.mydata
    group by GENDER;
  select * from withmooc;
quit;
| Results | 
 gender      q1_mean
 ------------------
 f                2
 m              4.5
| SAS Programming | 
proc sql;
  create table withmooc as
    select WORKSHOP,
           GENDER,
           MEAN(q1) as q1_mean
    from   BACK.mydata
    group by 1,2;
  select * from withmooc;
quit;
| Results | 
  workshop  gender     q1_mean
 ----------------------------
        1  f              1.5
        1  m              4.5
        2  f              2.5
        2  m              4.5
- Sub-Query를 이용하여 평균을 가로 결합
| SAS Programming | 
proc sql;
  create table withmooc as
    select a.*,b.q1_mean
    from   BACK.mydata a , ( select workshop,gender,
                                    mean(q1) as q1_mean
                             from   BACK.mydata
                             group by workshop,2 ) b
    where  a.workshop = b.workshop
    and    a.gender   = b.gender;
  select * from withmooc;
quit;
| Results | 
id  workshop  gender          q1        q2        q3        q4   q1_mean
------------------------------------------------------------------------
 1         1  f                1         1         5         1       1.5
 2         2  f                2         1         4         1       2.5
 3         1  f                2         2         4         3       1.5
 4         2  f                3         1         .         3       2.5
 5         1  m                4         5         2         4       4.5
 6         2  m                5         4         5         5       4.5
 7         1  m                5         3         4         4       4.5
 8         2  m                4         5         5         5       4.5
2. SAS Programming
- 각 성별에 대한 q1의 평균을 구한다.;
| SAS Programming | 
PROC SUMMARY DATA=BACK.mydata MEAN NWAY;
     CLASS GENDER;
     VAR q1;
     OUTPUT OUT=withmooc;
RUN;
PROC PRINT; RUN;
| Results | 
OBS    gender    _TYPE_    _FREQ_    _STAT_       q1
  1      f          1         4       N        4.00000
  2      f          1         4       MIN      1.00000
  3      f          1         4       MAX      3.00000
  4      f          1         4       MEAN     2.00000
  5      f          1         4       STD      0.81650
  6      m          1         4       N        4.00000
  7      m          1         4       MIN      4.00000
  8      m          1         4       MAX      5.00000
  9      m          1         4       MEAN     4.50000
 10      m          1         4       STD      0.57735
| SAS Programming | 
DATA withmooc;
 SET withmooc;
     WHERE _STAT_='MEAN';
     KEEP gender q1;
RUN;
PROC PRINT; RUN;
| Results | 
OBS    gender     q1
 1       f       2.0
 2       m       4.5
- workshop와 성별을 기준으로 q1의 평균을 구한다.
| SAS Programming | 
PROC SUMMARY DATA=BACK.mydata MEAN NWAY;
     CLASS WORKSHOP GENDER;
     VAR Q1;
     OUTPUT OUT=withmooc;
RUN;
PROC PRINT; RUN;
| Results | 
OBS    workshop    gender    _TYPE_    _FREQ_    _STAT_       q1
  1        1         f          3         2       N        2.00000
  2        1         f          3         2       MIN      1.00000
  3        1         f          3         2       MAX      2.00000
  4        1         f          3         2       MEAN     1.50000
  5        1         f          3         2       STD      0.70711
  6        1         m          3         2       N        2.00000
  7        1         m          3         2       MIN      4.00000
  8        1         m          3         2       MAX      5.00000
  9        1         m          3         2       MEAN     4.50000
 10        1         m          3         2       STD      0.70711
 11        2         f          3         2       N        2.00000
 12        2         f          3         2       MIN      2.00000
 13        2         f          3         2       MAX      3.00000
 14        2         f          3         2       MEAN     2.50000
 15        2         f          3         2       STD      0.70711
 16        2         m          3         2       N        2.00000
 17        2         m          3         2       MIN      4.00000
 18        2         m          3         2       MAX      5.00000
 19        2         m          3         2       MEAN     4.50000
 20        2         m          3         2       STD      0.70711
- 평균을 선택한다.
| SAS Programming | 
DATA withmooc;
 SET withmooc;
     WHERE _STAT_='MEAN';
     KEEP workshop gender q1;
     RENAME q1=meanQ1;
RUN;
PROC PRINT; RUN;
- mydata에 집계된 데이터를 Merge 한다.
| SAS Programming | 
PROC SORT DATA=BACK.mydata out=mydata;
     BY workshop gender;
RUN;
PROC SORT DATA=withmooc;
     BY workshop gender;
RUN;
DATA mydata2;
 MERGE mydata withmooc;
     BY workshop gender;
run;
PROC PRINT; RUN;
3. SPSS
- SPSS Program for Aggregating/Summarizing Data.
- Get mean of q1 by gender.
| SPSS Programming | 
GET FILE='C:\mydata.sav'.
AGGREGATE
  /OUTFILE='C:\myAgg.sav'
  /BREAK=gender
  /q1_mean = MEAN(q1).
GET FILE='C:\myAgg.sav'.
LIST.
EXECUTE.
* Get mean of q1 by workshop and gender.
GET FILE='C:\mydata.sav'.
AGGREGATE
  /OUTFILE='C:\myAgg.sav'
  /BREAK=workshop gender
  /q1_mean = MEAN(q1).
GET FILE='C:\myAgg.sav'.
LIST.
EXECUTE.
* Merge aggregated data back into mydata.
GET FILE='C:\mydata.sav'.
SORT CASES BY  workshop (A) gender (A) .
MATCH FILES /FILE=*
 /TABLE='C:\myAgg.sav'
 /BY workshop gender.
SAVE OUTFILE='C:\mydata.sav'.
EXECUTE.
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)
library(psych)
mydata <- read_csv("C:/work/data/mydata.csv", 
  col_types = cols( id       = col_double(),
                    workshop = col_character(),
                    gender   = col_character(),
                    q1       = col_double(),
                    q2       = col_double(),
                    q3       = col_double(),
                    q4       = col_double()
  )
)
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
| Results | 
R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
---------------------------------------
---------------------------------------
    s = ffi.string(c, maxlen).decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 1: invalid start byte
    R[write to console]: The following objects are masked from 'package:ggplot2':
    %+%, alphaPop함수를 이용하여 q3와 q4변수를 삭제.
# A tibble: 8 x 7
     id workshop gender    q1    q2    q3    q4
  <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
1     1 1        f          1     1     5     1
2     2 2        f          2     1     4     1
3     3 1        f          2     2     4     3
4     4 2        f          3     1    NA     3
5     5 1        m          4     5     2     4
6     6 2        m          5     4     5     5
7     7 1        m          5     3     4     4
8     8 2        m          4     5     5     5
- Aggregating / Summarizing 데이터를 위한 R-Project 프로그램.
- [참 고] RESHAPE 라이브러리
- 필요한 패키지 로드. 필요시 사전에 인스톨해야 한다.
| R Programming | 
%%R
library(Hmisc)
library(reshape)
- Aggregate함수는 R-Project에서 만들어진 함수이다.
- Aggregate함수는 변수에 대하여 새 변수명을 생성한다.
- Gender는 단일 오브젝트임에 불구하고 List함수 내에 들어가 있다.
| R Programming | 
%%R
myAgg<-aggregate(q1, by=list(gender), FUN=mean, na.rm=TRUE)
print(myAgg)
| Results | 
  Group.1   x
1       f 2.0
2       m 4.5
- workshop과 gender를 기준으로 집계.
| R Programming | 
%%R
myAgg<-aggregate(q1, by=list(workshop,gender), FUN=mean, na.rm=TRUE)
myAgg
| Results | 
  Group.1 Group.2   x
1       1       f 1.5
2       2       f 2.5
3       1       m 4.5
4       2       m 4.5
- Summarize함수는 Hmisc라이브러리에 존재.
- Summarize함수는 원 변수명을 유지하고, 라벨 존재 시 라벨 역시 유지한다.
- 성별에 대하여.
| R Programming | 
%%R
myAgg<-Hmisc::summarize(q1, by=gender, FUN=mean, na.rm=TRUE)
myAgg
| Results | 
  gender  q1
1      f 2.0
2      m 4.5
- Workshop과 gender에 대하여 Summary
| R Programming | 
%%R
myAgg<-summarize(q1, by=llist(workshop,gender), FUN=mean, na.rm=TRUE)
myAgg
| Results | 
  workshop gender  q1
1        1      f 1.5
2        1      m 4.5
3        2      f 2.5
4        2      m 4.5
- Mydata에 집계된 값을 Merge 한다.
- 먼저, q1변수명을 mean.q1으로 변경.
| R Programming | 
%%R
myAgg<-rename(myAgg, c(q1="mean.q1"))
myAgg
| Results | 
  workshop gender mean.q1
1        1      f     1.5
2        1      m     4.5
3        2      f     2.5
4        2      m     4.5
- Mydata에 위의 값을 Merge 한다.
| R Programming | 
%%R
withmooc2<-merge(withmooc,myAgg,by=c("workshop","gender") )
withmooc2
| Results | 
  workshop gender id q1 q2 q3 q4 mean.q1
1        1      f  1  1  1  5  1     1.5
2        1      f  3  2  2  4  3     1.5
3        1      m  5  4  5  2  4     4.5
4        1      m  7  5  3  4  4     4.5
5        2      f  2  2  1  4  1     2.5
6        2      f  4  3  1 NA  3     2.5
7        2      m  6  5  4  5  5     4.5
8        2      m  8  4  5  5  5     4.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)
library(psych)
mydata <- read_csv("C:/work/data/mydata.csv", 
  col_types = cols( id       = col_double(),
                    workshop = col_character(),
                    gender   = col_character(),
                    q1       = col_double(),
                    q2       = col_double(),
                    q3       = col_double(),
                    q4       = col_double()
  )
)
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
| Results | 
R[write to console]: The following objects are masked from withmooc (pos = 8):
    gender, id, q1, q2, q3, q4, workshop
# A tibble: 8 x 7
     id workshop gender    q1    q2    q3    q4
  <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
1     1 1        f          1     1     5     1
2     2 2        f          2     1     4     1
3     3 1        f          2     2     4     3
4     4 2        f          3     1    NA     3
5     5 1        m          4     5     2     4
6     6 2        m          5     4     5     5
7     7 1        m          5     3     4     4
8     8 2        m          4     5     5     5
- Aggregate함수는 R-Project에서 만들어진 함수이다.
- Aggregate함수는 변수에 대하여 새 변수명을 생성한다.
- Gender는 단일 오브젝트임에 불구하고 List함수 내에 들어가 있다.
- 성별을 기준으로.
| R Programming | 
%%R
withmooc %>%
  group_by(gender) %>%
  summarise( x=mean(q1))
| Results | 
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 2 x 2
  gender     x
  <chr>  <dbl>
1 f        2  
2 m        4.5
- [참고] 연산 후 group 변수에 대한 처리 방식 지정
| R Programming | 
%%R
withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1)) %>%
  group_vars()
withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1), .groups = "drop_last") %>%
  group_vars()
withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1), .groups = "drop") %>%
  group_vars()
withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1), .groups = "keep") %>%
  group_vars()
# 행 방향 그룹이됩니다. 즉, 각 행이 그룹입니다.
withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1), .groups = "rowwise") %>%
  group_vars()
| Results | 
`summarise()` regrouping output by 'workshop' (override with `.groups` argument)
[1] "workshop" "gender"  
- workshop과 gender를 기준으로 집계.
| R Programming | 
%%R
myAgg <- withmooc %>%
  group_by(workshop,gender) %>%
  summarise( q1=mean(q1), .groups = 'keep') %>%
  ungroup()
myAgg
| Results | 
# A tibble: 4 x 3
  workshop gender    q1
  <chr>    <chr>  <dbl>
1 1        f        1.5
2 1        m        4.5
3 2        f        2.5
4 2        m        4.5
- Mydata에 집계된 값을 Merge 한다.
- 먼저, q1변수명을 mean.q1으로 변경.
| R Programming | 
%%R
myAgg <- myAgg %>%
  dplyr::rename(mean.q1=q1)
myAgg
| Results | 
# A tibble: 4 x 3
  workshop gender mean.q1
  <chr>    <chr>    <dbl>
1 1        f          1.5
2 1        m          4.5
3 2        f          2.5
4 2        m          4.5
- Mydatam 위의 값을 Merge 한다.
| R Programming | 
%%R
withmooc2 <- withmooc %>%
  left_join(myAgg, by=c("workshop","gender")) %>%
  arrange(workshop,gender)
withmooc2
| Results | 
# A tibble: 8 x 8
     id workshop gender    q1    q2    q3    q4 mean.q1
  <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>   <dbl>
1     1 1        f          1     1     5     1     1.5
2     3 1        f          2     2     4     3     1.5
3     5 1        m          4     5     2     4     4.5
4     7 1        m          5     3     4     4     4.5
5     2 2        f          2     1     4     1     2.5
6     4 2        f          3     1    NA     3     2.5
7     6 2        m          5     4     5     5     4.5
8     8 2        m          4     5     5     5     4.5
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
- Aggregating / Summarizing 데이터를 위한 R-Project 프로그램.
- Aggregate함수는 R-Project에서 만들어진 함수이다.
- Aggregate함수는 변수에 대하여 새 변수명을 생성한다.
- Gender는 단일 오브젝트임에 불구하고 List함수 내에 들어가 있다.
| Python Programming | 
withmooc.groupby(['gender'])['q1'].agg([np.mean])
| Results | 
	mean
gender	
f	2.0
m	4.5
- workshop과 gender를 기준으로 집계.
| Python Programming | 
withmooc.groupby(['workshop','gender'])['q1'].mean()
withmooc.groupby(['workshop','gender'])['q1'].agg([np.mean])
| Results | 
		mean
workshop	gender	
1	f	1.5
	m	4.5
2	f	2.5
	m	4.5
| Python Programming | 
myAgg = withmooc.groupby(['workshop','gender'])['q1'].mean().reset_index()
myAgg
| Results | 
	workshop	gender	q1
0	1		f	1.5
1	1		m	4.5
2	2		f	2.5
3	2		m	4.5
- withmooc에 집계된 값을 Merge 한다.
- 먼저, q1변수명을 mean.q1으로 변경.
| Python Programming | 
myAgg = myAgg.rename(columns = {'q1' : 'mean.q1'})
myAgg
| Results | 
	workshop	gender	mean.q1
0	1		f	1.5
1	1		m	4.5
2	2		f	2.5
3	2		m	4.5
- Mydata에 위의 값을 Merge 한다.
| Python Programming | 
pd.merge(withmooc, myAgg, on=['workshop','gender'])
| Results | 
	id	workshop	gender	q1	q2	q3	q4	mean.q1
0	1	1		f	1	1	5.0	1	1.5
1	3	1		f	2	2	4.0	3	1.5
2	2	2		f	2	1	4.0	1	2.5
3	4	2		f	3	1	NaN	3	2.5
4	5	1		m	4	5	2.0	4	4.5
5	7	1		m	5	3	4.0	4	4.5
6	6	2		m	5	4	5.0	5	4.5
7	8	2		m	4	5	5.0	5	4.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
- Aggregate함수는 R-Project에서 만들어진 함수이다.
- Aggregate함수는 변수에 대하여 새 변수명을 생성한다.
- Gender는 단일 오브젝트임에 불구하고 List함수 내에 들어가 있다.
- 성별에 대하여.
| Python Programming | 
withmooc >> \
  group_by(X.gender) >> \
  summarise( x=mean(X.q1))
| Results | 
	gender	x
0	f	2.0
1	m	4.5
- workshop과 gender를 기준으로 집계.
| Python Programming | 
myAgg = withmooc >> \
  group_by(X.workshop,X.gender) >> \
  summarise( q1=mean(X.q1))
myAgg
| Results | 
	gender	workshop	q1
0		f	1	1.5
1		m	1	4.5
2		f	2	2.5
3		m	2	4.5
- Mydata에 집계된 값을 Merge 한다.
- 먼저, q1변수명을 mean.q1으로 변경.
| Python Programming | 
myAgg = myAgg >> \
  rename(mean_q1=X.q1)
myAgg
| Results | 
	gender	workshop	mean_q1
0		f	1	1.5
1		m	1	4.5
2		f	2	2.5
3		m	2	4.5
- withmooc에 위의 값을 Merge 한다.
| Python Programming | 
withmooc2 = withmooc >> \
  left_join(myAgg,left_on  = ["workshop","gender"],
                  right_on = ["workshop","gender"]) >> \
  arrange(X.workshop,X.gender)
withmooc2
| Results | 
	id	workshop	gender	q1	q2	q3	q4	mean_q1
0	1	1		f	1	1	5.0	1	1.5
2	3	1		f	2	2	4.0	3	1.5
4	5	1		m	4	5	2.0	4	4.5
6	7	1		m	5	3	4.0	4	4.5
1	2	2		f	2	1	4.0	1	2.5
3	4	2		f	3	1	NaN	3	2.5
5	6	2		m	5	4	5.0	5	4.5
7	8	2		m	4	5	5.0	5	4.5
| 통계프로그램 비교 목록(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 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 | 
반응형
    
    
    
  '통계프로그램 비교 시리즈 > 데이터 전처리 비교' 카테고리의 다른 글
| 통계프로그램 비교 시리즈 - 13. 데이터 프레임 정렬과 중복제거-Sorting & duplicate (0) | 2022.01.15 | 
|---|---|
| [데이터 관리] 12. 변수를 관측치로 전치후 원상태로 복구 (0) | 2022.01.15 | 
| [데이터 관리] 10. Joining & Merging 데이터 프레임 (0) | 2022.01.14 | 
| [데이터 관리] 9. Stacking & Concatenating & Adding Data Sets (0) | 2022.01.14 | 
| [데이터 관리] 8. By 또는 Split 파일 프로세싱 (0) | 2022.01.11 | 
 
 
 
 
댓글