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

통계프로그램 비교 시리즈 – [데이터 관리] 1. 변수 변환

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

[데이터 관리] 1. 변수 변환하여 신규 변수 생성하기


1. Proc SQL 

 

SAS Programming
options linesize=150;

proc sql;
  create table withmooc as
    select *,
           q1+q2+q3+q4        as totalq,
           sum(q1,q2,q3,q4)   as totalq1,
           log10(q1+q2+q3+q4) as logtot,
           (q1+q2+q3+q4)/4    as mean1,
           mean(q1,q2,q3,q4)  as mean2
    from   BACK.mydata;

  select * from withmooc;
quit;

 

Results
id  workshop  	gender    q1      q2      q3      q4    totalq   totalq1    logtot     mean1     mean2
----------------------------------------------------------------------------------------------------
 1         1  	f          1       1       5       1         8         8   0.90309         2         2
 2         2  	f          2       1       4       1         8         8   0.90309         2         2
 3         1  	f          2       2       4       3        11        11  1.041393      2.75      2.75
 4         2  	f          3       1       .       3         .         7         .         .  2.333333
 5         1  	m          4       5       2       4        15        15  1.176091      3.75      3.75
 6         2  	m          5       4       5       5        19        19  1.278754      4.75      4.75
 7         1  	m          5       3       4       4        16        16   1.20412         4         4
 8         2  	m          4       5       5       5        19        19  1.278754      4.75      4.75

 

 


2. SAS Programming

  • 변수 연산을 통해서 새로운 변수 생성.;
SAS Programming
DATA withmooc;
 SET BACK.mydata;
     totalq  = (q1+q2+q3+q4);
     totalq1 = sum(of q1-q4);
     totalq2 = sum(q1,q2,q3,q4);
     logtot  = log10(totalq);
     mean1   = (q1+q2+q3+q4)/4;
     mean2   = mean(of q1-q4);
run;

PROC PRINT data=withmooc;
RUN;

 

Results
workshop   	 gender    q1    q2    q3    q4    totalq    totalq1  totalq2    logtot    mean1      mean2
 1        	 f        1     1     5     1       8          8          8      0.90309     2.00    2.00000
 2        	 f        2     1     4     1       8          8          8      0.90309     2.00    2.00000
 1        	 f        2     2     4     3      11         11         11      1.04139     2.75    2.75000
 2        	 f        3     1     .     3       .          7          7       .           .      2.33333
 1        	 m        4     5     2     4      15         15         15      1.17609     3.75    3.75000
 2        	 m        5     4     5     5      19         19         19      1.27875     4.75    4.75000
 1        	 m        5     3     4     4      16         16         16      1.20412     4.00    4.00000
 2        	 m        4     5     5     5      19         19         19      1.27875     4.75    4.75000

 


3. SPSS

 

SPSS Programming
* SPSS Program for Transforming Variables.
GET FILE='C:\mydata.sav'.
COMPUTE Totalq=q1+q2+q3+q4.
COMPUTE Logtot=lg10(totalq).
COMPUTE Mean1=(q1+q2+q3+q4)/4.
COMPUTE Mean2=MEAN(q1 TO q4).
SAVE OUTFILE='C:\mydata.sav'.
LIST.
EXECUTE.

 

 


4. R Programming (R-PROJECT)

 

  • 변수 변환을 위한 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

load(file="C:/work/data/mydata.Rdata")

withmooc = mydata

attach(withmooc) # mydata를 기본 데이터 세트로 지정.

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  5  4  5  5
7        1      m  5  3  4  4
8        2      m  4  5  5  5

 

 

  • q변수의 총합인 totalq 변수 생성.
R Programming
%%R

withmooc$totalq <- withmooc$q1 + withmooc$q2 + withmooc$q3 + withmooc$q4

withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq
1        1      f  1  1  5  1      8
2        2      f  2  1  4  1      8
3        1      f  2  2  4  3     11
4        2      f  3  1 NA  3     NA
5        1      m  4  5  2  4     15
6        2      m  5  4  5  5     19
7        1      m  5  3  4  4     16
8        2      m  4  5  5  5     19

 

 

  • totalq의 LOG값 구하기.
R Programming
%%R

withmooc$logtot <- log( withmooc$totalq )
withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot
1        1      f  1  1  5  1      8 2.079442
2        2      f  2  1  4  1      8 2.079442
3        1      f  2  2  4  3     11 2.397895
4        2      f  3  1 NA  3     NA       NA
5        1      m  4  5  2  4     15 2.708050
6        2      m  5  4  5  5     19 2.944439
7        1      m  5  3  4  4     16 2.772589
8        2      m  4  5  5  5     19 2.944439

 

 

  • q변수의 평균값을 생성한다.
  • 만약 결측치 존재 시, 결과 역시 결측치.
R Programming
%%R

withmooc$meanq1  <- ( withmooc$q1 + withmooc$q2 + withmooc$q3 + withmooc$q4 )/4

withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot meanq1
1        1      f  1  1  5  1      8 2.079442   2.00
2        2      f  2  1  4  1      8 2.079442   2.00
3        1      f  2  2  4  3     11 2.397895   2.75
4        2      f  3  1 NA  3     NA       NA     NA
5        1      m  4  5  2  4     15 2.708050   3.75
6        2      m  5  4  5  5     19 2.944439   4.75
7        1      m  5  3  4  4     16 2.772589   4.00
8        2      m  4  5  5  5     19 2.944439   4.75

 

 

  • q변수의 평균 구하기.
  • subset함수는 select함수에 선택된 변수를 선택.
R Programming
%%R

myqs <- subset(withmooc,select=c(q1,q2,q3,q4) )
myqs

 

Results
  q1 q2 q3 q4
1  1  1  5  1
2  2  1  4  1
3  2  2  4  3
4  3  1 NA  3
5  4  5  2  4
6  5  4  5  5
7  5  3  4  4
8  4  5  5  5

 

 

  • 결측치를 제외하고, 평균값을 생성한다.
R Programming
%%R

withmooc$mymeanq2 <- rowMeans( myqs, na.rm=TRUE )

withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot meanq1 mymeanq2
1        1      f  1  1  5  1      8 2.079442   2.00 2.000000
2        2      f  2  1  4  1      8 2.079442   2.00 2.000000
3        1      f  2  2  4  3     11 2.397895   2.75 2.750000
4        2      f  3  1 NA  3     NA       NA     NA 2.333333
5        1      m  4  5  2  4     15 2.708050   3.75 3.750000
6        2      m  5  4  5  5     19 2.944439   4.75 4.750000
7        1      m  5  3  4  4     16 2.772589   4.00 4.000000
8        2      m  4  5  5  5     19 2.944439   4.75 4.750000

 

  • transform함수를 이용하여 동시에 다수 변수 생성.
R Programming
%%R

withmooc <- transform(withmooc,
                      sum=q1+q2+q3+q4,
                      mean=(q1+q2+q3+q4)/4)

withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot meanq1 mymeanq2 sum mean
1        1      f  1  1  5  1      8 2.079442   2.00 2.000000   8 2.00
2        2      f  2  1  4  1      8 2.079442   2.00 2.000000   8 2.00
3        1      f  2  2  4  3     11 2.397895   2.75 2.750000  11 2.75
4        2      f  3  1 NA  3     NA       NA     NA 2.333333  NA   NA
5        1      m  4  5  2  4     15 2.708050   3.75 3.750000  15 3.75
6        2      m  5  4  5  5     19 2.944439   4.75 4.750000  19 4.75
7        1      m  5  3  4  4     16 2.772589   4.00 4.000000  16 4.00
8        2      m  4  5  5  5     19 2.944439   4.75 4.750000  19 4.75

 

  • 초기화된 변수를 먼저 생성 후에, 그 변수에 데이터를 대체.
R Programming
%%R

withmooc <- data.frame(cbind(withmooc,sum=0.))

withmooc[11] <- withmooc$q1+withmooc$q2+Mydata$q3+Mydata$q4

withmooc

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot meanq1 mymeanq2 sum
1        1      f  1  1  5  1      8 2.079442   2.00 2.000000   8
2        2      f  2  1  4  1      8 2.079442   2.00 2.000000   8
3        1      f  2  2  4  3     11 2.397895   2.75 2.750000  11
4        2      f  3  1 NA  3     NA       NA     NA 2.333333  NA
5        1      m  4  5  2  4     15 2.708050   3.75 3.750000  15
6        2      m  5  4  5  5     19 2.944439   4.75 4.750000  19
7        1      m  5  3  4  4     16 2.772589   4.00 4.000000  16
8        2      m  4  5  5  5     19 2.944439   4.75 4.750000  19

 


5. R - Tidyverse

 

R Programming
%%R

library(tidyverse)

load(file="C:/work/data/mydata.Rdata")
print(mydata)

 

Results
R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --

From cffi callback <function _consolewrite_ex at 0x000001FB64105280>:
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

 

 

  • q변수의 총합인 totalq 변수 생성.
R Programming
%%R

mydata <- mydata %>%
  mutate(totalq = q1 + q2 + q3 + q4)

 

 

  • totalq의 LOG값 구하기.
R Programming
%%R

mydata <- mydata %>%
  mutate(logtot = log(totalq))

mydata

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot
1        1      f  1  1  5  1      8 2.079442
2        2      f  2  1  4  1      8 2.079442
3        1      f  2  2  4  3     11 2.397895
4        2      f  3  1 NA  3     NA       NA
5        1      m  4  5  2  4     15 2.708050
6        2      m  5  4  5  5     19 2.944439
7        1      m  5  3  4  4     16 2.772589
8        2      m  4  5  5  5     19 2.944439

 

 

  • rowMeans 함수

q1~q4 변수의 평균값을 생성한다. 만약 결측치 존재 시, 별도의 옵션이나 함수를 사용하지 않으면 기본적으로 결측값을 반환한다.

R Programming
%%R

myqs <- subset(mydata,select=c(q1,q2,q3,q4) )
myqs

rowMeans( myqs, na.rm=TRUE )

 

Results
       1        2        3        4        5        6        7        8 
2.000000 2.000000 2.750000 2.333333 3.750000 4.750000 4.000000 4.750000 

 

 

R Programming
%%R

mydata <- mydata %>%
  dplyr::mutate(meanq1 = (q1 + q2 + q3 + q4) / 4,
                meanq2 = rowMeans( myqs, na.rm=TRUE),
                sum    = (q1 + q2 + q3 + q4))

mydata

 

Results
  workshop gender q1 q2 q3 q4 totalq   logtot meanq1   meanq2 sum
1        1      f  1  1  5  1      8 2.079442   2.00 2.000000   8
2        2      f  2  1  4  1      8 2.079442   2.00 2.000000   8
3        1      f  2  2  4  3     11 2.397895   2.75 2.750000  11
4        2      f  3  1 NA  3     NA       NA     NA 2.333333  NA
5        1      m  4  5  2  4     15 2.708050   3.75 3.750000  15
6        2      m  5  4  5  5     19 2.944439   4.75 4.750000  19
7        1      m  5  3  4  4     16 2.772589   4.00 4.000000  16
8        2      m  4  5  5  5     19 2.944439   4.75 4.750000  19

 


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)

 

 

  • q변수의 총합인 totalq 변수 생성.
Python Programming
mydata["totalq"] = ( pd.to_numeric(mydata['q1'], errors = 'coerce') + 
                     pd.to_numeric(mydata['q2'], errors = 'coerce') + 
                     pd.to_numeric(mydata['q3'], errors = 'coerce') + 
                     pd.to_numeric(mydata['q4'], errors = 'coerce') )

mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq
0	1	1		f	1	1	5.0	1	8.0
1	2	2		f	2	1	4.0	1	8.0
2	3	1		f	2	2	4.0	3	11.0
3	4	2		f	3	1	NaN	3	NaN
4	5	1		m	4	5	2.0	4	15.0
5	6	2		m	5	4	5.0	5	19.0
6	7	1		m	5	3	4.0	4	16.0
7	8	2		m	4	5	5.0	5	19.0

 

 

  • totalq의 LOG값 구하기.
Python Programming
mydata["logtot"] = np.log( mydata["totalq"] )
mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot
0	1	1		f	1	1	5.0	1	8.0	2.079442
1	2	2		f	2	1	4.0	1	8.0	2.079442
2	3	1		f	2	2	4.0	3	11.0	2.397895
3	4	2		f	3	1	NaN	3	NaN	NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050
5	6	2		m	5	4	5.0	5	19.0	2.944439
6	7	1		m	5	3	4.0	4	16.0	2.772589
7	8	2		m	4	5	5.0	5	19.0	2.944439

 

 

  • q변수의 평균 생성.
  • 만약 결측치 존재시, 결과 역시 결측치.
Python Programming
mydata["meanq1"]  = ( pd.to_numeric(mydata['q1'], errors = 'coerce') + 
                      pd.to_numeric(mydata['q2'], errors = 'coerce') + 
                      pd.to_numeric(mydata['q3'], errors = 'coerce') + 
                      pd.to_numeric(mydata['q4'], errors = 'coerce') ) / 4
mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot	meanq1
0	1	1		f	1	1	5.0	1	8.0	2.079442	2.00
1	2	2		f	2	1	4.0	1	8.0	2.079442	2.00
2	3	1		f	2	2	4.0	3	11.0	2.397895	2.75
3	4	2		f	3	1	NaN	3	NaN	NaN	NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050	3.75
5	6	2		m	5	4	5.0	5	19.0	2.944439	4.75
6	7	1		m	5	3	4.0	4	16.0	2.772589	4.00
7	8	2		m	4	5	5.0	5	19.0	2.944439	4.75

 

 

  • q변수의 평균 구하기.
  • subset함수는 select함수에 선택된 변수를 선택.
  • 결측치를 제외 하고, 평균을 생성
Python Programming
mydata["meanq2"] = mydata[["q1","q2","q3","q4"]].mean(axis=1,skipna=True)

mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot	meanq1	meanq2
0	1	1		f	1	1	5.0	1	8.0	2.079442	2.00	2.000000
1	2	2		f	2	1	4.0	1	8.0	2.079442	2.00	2.000000
2	3	1		f	2	2	4.0	3	11.0	2.397895	2.75	2.750000
3	4	2		f	3	1	NaN	3	NaN	NaN		NaN	2.333333
4	5	1		m	4	5	2.0	4	15.0	2.708050	3.75	3.750000
5	6	2		m	5	4	5.0	5	19.0	2.944439	4.75	4.750000
6	7	1		m	5	3	4.0	4	16.0	2.772589	4.00	4.000000
7	8	2		m	4	5	5.0	5	19.0	2.944439	4.75	4.750000

 

  • transform함수를 이용하여 동시에 다수 변수 생성.
Python Programming
mydata.assign(sum  = mydata['q1']+mydata['q2']+mydata['q3']+mydata['q4'],
              mean = (mydata['q1']+mydata['q2']+mydata['q3']+mydata['q4'])/4)

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot	meanq1	meanq2	sum	mean
0	1	1		f	1	1	5.0	1	8.0	2.079442	2.00	2.000000	8.0	2.00
1	2	2		f	2	1	4.0	1	8.0	2.079442	2.00	2.000000	8.0	2.00
2	3	1		f	2	2	4.0	3	11.0	2.397895	2.75	2.750000	11.0	2.75
3	4	2		f	3	1	NaN	3	NaN	NaN		NaN	2.333333	NaN	NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050	3.75	3.750000	15.0	3.75
5	6	2		m	5	4	5.0	5	19.0	2.944439	4.75	4.750000	19.0	4.75
6	7	1		m	5	3	4.0	4	16.0	2.772589	4.00	4.000000	16.0	4.00
7	8	2		m	4	5	5.0	5	19.0	2.944439	4.75	4.750000	19.0	4.75

 


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)

# 모든 변수 선택하기.
mydata

 

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

 

  • q변수의 총합인 totalq 변수 생성.
Python Programming
mydata = mydata >> mutate(totalq = X.q1 + X.q2 + X.q3 + X.q4)
mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq
0	1	1		f	1	1	5.0	1	8.0
1	2	2		f	2	1	4.0	1	8.0
2	3	1		f	2	2	4.0	3	11.0
3	4	2		f	3	1	NaN	3	NaN
4	5	1		m	4	5	2.0	4	15.0
5	6	2		m	5	4	5.0	5	19.0
6	7	1		m	5	3	4.0	4	16.0
7	8	2		m	4	5	5.0	5	19.0

 

  • totalq의 LOG값 구하기.
Python Programming
mydata = mydata >> mutate(logtot = np.log(mydata['totalq']))
mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot
0	1	1		f	1	1	5.0	1	8.0	2.079442
1	2	2		f	2	1	4.0	1	8.0	2.079442
2	3	1		f	2	2	4.0	3	11.0	2.397895
3	4	2		f	3	1	NaN	3	NaN	NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050
5	6	2		m	5	4	5.0	5	19.0	2.944439
6	7	1		m	5	3	4.0	4	16.0	2.772589
7	8	2		m	4	5	5.0	5	19.0	2.944439

 

Python Programming
@make_symbolic
def log(series):
    return np.log(series)

mydata >> mutate(y_log = log(X.totalq))

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot	y_log
0	1	1		f	1	1	5.0	1	8.0	2.079442	2.079442
1	2	2		f	2	1	4.0	1	8.0	2.079442	2.079442
2	3	1		f	2	2	4.0	3	11.0	2.397895	2.397895
3	4	2		f	3	1	NaN	3	NaN	NaN		NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050	2.708050
5	6	2		m	5	4	5.0	5	19.0	2.944439	2.944439
6	7	1		m	5	3	4.0	4	16.0	2.772589	2.772589
7	8	2		m	4	5	5.0	5	19.0	2.944439	2.944439

 

  • q변수의 평균 생성.
  • 만약 결측치 존재시, 결과 역시 결측치.
Python Programming
myqs = mydata >> select([X.q1,X.q2,X.q3,X.q4])
print(myqs)

myqs.mean(axis=1)
myqs.agg([np.mean],axis=1)

 

Results
   q1  q2   q3  q4
0   1   1  5.0   1
1   2   1  4.0   1
2   2   2  4.0   3
3   3   1  NaN   3
4   4   5  2.0   4
5   5   4  5.0   5
6   5   3  4.0   4
7   4   5  5.0   5
	mean
0	2.000000
1	2.000000
2	2.750000
3	2.333333
4	3.750000
5	4.750000
6	4.000000
7	4.750000

 

Python Programming
mydata = mydata >> mutate(meanq1 = (X.q1+X.q2+X.q3+X.q4) / 4 ,meanq2 = X.mean(axis=1), sum = (X.q1+X.q2+X.q3+X.q4))

mydata

 

Results
	id	workshop	gender	q1	q2	q3	q4	totalq	logtot	meanq1	meanq2	sum
0	1	1		f	1	1	5.0	1	8.0	2.079442	2.00	3.013240	8.0
1	2	2		f	2	1	4.0	1	8.0	2.079442	2.00	3.013240	8.0
2	3	1		f	2	2	4.0	3	11.0	2.397895	2.75	4.066316	11.0
3	4	2		f	3	1	NaN	3	NaN	NaN		NaN	2.333333	NaN
4	5	1		m	4	5	2.0	4	15.0	2.708050	3.75	5.451342	15.0
5	6	2		m	5	4	5.0	5	19.0	2.944439	4.75	6.824073	19.0
6	7	1		m	5	3	4.0	4	16.0	2.772589	4.00	5.795431	16.0
7	8	2		m	4	5	5.0	5	19.0	2.944439	4.75	6.824073	19.0
 

 

 


 

통계프로그램 비교 목록(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 예제로 만나는 테이블 데이터 처리 방법 리스트 링크
반응형

댓글