doBy package, 데이터 그룹 처리


doBy 패키지에는 summaryBy(), orderBy(), sampleBy()와 같은 특정 값에 따라 데이터를 처리하는 유용한 함수들이 있다.

다음은 이 함수들의 특징을 요약한 것이다.


 함수

특징 

 doBy::summaryBy()

 데이터 프레임을 컬럼 값에 따라 그룹으로 묶은 후 요약 값 계산 

 doBy::orderBy()

 지정된 컬럼 값에 따라 데이터 프레임을 정렬

 doBy::sampleBy()

 데이터 프레임을 특정 컬럼 값에 따라 그룹으로 묶은 후 각 그룹에 샘플 추출



install.packages("doBy")

library(doBy)



▣ summaryBy()


doBy::summaryBy: 포뮬러에 따라 데이터를 그룹으로 묶고 요약한 결과를 반환한다.

formula, #요약을 수행할 포뮬러

data=parent.frame() # 포뮬러를 적용할 데이터


반환 값은 데이터 프레임이다.


저것을 사용하기 위해서 formula 문법에 대해서 알아야 한다.



 연산자

예 

의미 

 Y~X1+X2

 Y를 X1, X2로 모델링, 상수항은 암시적으로 허용 된다. 따라서 선형 회귀에 이 포뮬러를 사용하면 Y=a*X1 + b * X2 + c 를 의미한다.

-

 Y~X1-X2

 Y를 X1로 모델링하되 X2는 제외한다.


특히, 선형 회귀에서 Y ~ X1 + X2 - 1은 Y를 X1과 X2로 모델링하되 상수항은 제외 한다는 의미다. 즉, Y= a*x1 + b * X2를 의미한다.

|

 Y~X1 | X2

 X2의 값에 따라 데이터를 그룹으로 묶은 후 각 그룹별로 Y~X1을 적용한다. 

:

Y ~ X1:X2 

 Y를 X1과 X2의 상호 작용 (interaction)에 따라 모델링 한다. 상호 작용은 Y = a * X1 * X2 + b 와 같이 X1과 X2가 동시에 Y 값에 영향을 주는 상황을 말한다.


특히, 영향을 주는 방식이 (+) 합 연산자의 예제인 Y= A*X1 +b*X2 +c와 같은 형태와는 전적으로 다르다.

*

 Y ~ X1 * X2

 Y ~ X1 + X2 + X1:X2의 충약형 표현이다.



summaryBy는 특정 조건에 따라 컬럼의 값을 요약해서 보여주게 된다.

아래의 경우 Sepal.Length와 Sepal.With를 Species에 따라 출력해서 보는 방식이다.

> summaryBy(Sepal.Width + Sepal.Length ~ Species, iris)
     Species Sepal.Width.mean Sepal.Length.mean
1     setosa            3.428             5.006
2 versicolor            2.770             5.936
3  virginica            2.974             6.588



▣ orderBy


doBy::orderBy: 포뮬러에 따라 데이터를 정렬한다.

formula, # 정렬할 기준을 지정한 포뮬러

# ~의 좌측은 무시하며, ~ 우측에 나열한 이름에 따라 데이터가 정렬된다.

data, # 정렬할 데이터


기본은 ascending 이기 때문에 descending으로 하고 싶을 경우 - (마이너)를 붙인다.

orderBy(~-Mean, dataFrame) 이런 식이다.


# 다음의 코드는 Species, Sepal.Width 순으로 정렬한 예이다.
> orderBy(~Species + Sepal.Width, iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
42           4.5         2.3          1.3         0.3     setosa
9            4.4         2.9          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
13           4.8         3.0          1.4         0.1     setosa
14           4.3         3.0          1.1         0.1     setosa


▣ sampleBy


doBy::sampleBy
formula, # ~우측에 나열한 이름에 따라 데이터가 그룹으로 묶인다.
frac = 0.1 #추출할 샘플의 비율이며 기본값은 10%
replace = FALSE # 복원 추출 여부
data=parent.frame() # 데이터를 추출할 데이터 프레임
systematic=FALSE # 계통 추출 (Systematic Sampling)을 사용할지 여부

반환 값은 데이터 프레임이다.


샘플 함수는 정보를 추출하는 함수이다. 아래와 같다.

10개 중 5개를 랜덤으로 추출한다. replace=TRUE를 설정하면 중복을 허용하는 것이다.

sampleBy과 대응 되므로 같이 알아두면 좋다.

> sample(1:10,5)
[1]  1 10  7  3  8
> sample(1:10,5, replace=TRUE)
[1] 8 8 2 3 6


이러한 샘플링은 주어진 데이터를 Training DataTest Data로 분리하는데 유용하게 사용 할 수 있다.


절적한 모델 테스팅을 위해선 균일한 분푸로 Test Data를 생성하는 것이 좋다. 이럴떄 sampleBy가 유용하게 사용 된다.

다음은 Iris 데이터에서 각 Species 별로 10%의 데이터를 추출한 예이다. sampleBy()에서 Species를 지정했으므로 각 종별로 5개씩 데이터가 정확히 샘플로 추출된 것을 볼 수 있다.

> sampleBy(~Species, fra=0.1, data=iris)
              Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
setosa.13              4.8         3.0          1.4         0.1     setosa
setosa.24              5.1         3.3          1.7         0.5     setosa
setosa.27              5.0         3.4          1.6         0.4     setosa
setosa.35              4.9         3.1          1.5         0.2     setosa
setosa.40              5.1         3.4          1.5         0.2     setosa
versicolor.59          6.6         2.9          4.6         1.3 versicolor
versicolor.64          6.1         2.9          4.7         1.4 versicolor
versicolor.77          6.8         2.8          4.8         1.4 versicolor
versicolor.84          6.0         2.7          5.1         1.6 versicolor
versicolor.89          5.6         3.0          4.1         1.3 versicolor
virginica.102          5.8         2.7          5.1         1.9  virginica
virginica.104          6.3         2.9          5.6         1.8  virginica
virginica.121          6.9         3.2          5.7         2.3  virginica
virginica.132          7.9         3.8          6.4         2.0  virginica
virginica.144          6.8         3.2          5.9         2.3  virginica






+ Recent posts