R) EDA - 변수 속성 확인

R) EDA - 변수 속성 확인

객체 및 해당 객체의 변수 속성을 간단한 함수 부터 고급 응용까지 알아보자.

기본

첫 번째 데이터는 iris 데이터이다. 데이터를 확인해보자.

1
2
3
4
5
6
7
8
9
df1 = iris
head(df1)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa

객체 속성을 확인하는 함수는 class(). 역시 데이터프레임인 것을 바로 알 수 있다.

1
2
class(df1)
## [1] "data.frame"

속성 확인 관련해서는 typeof()라는 함수도 있는데 보다 깊숙한 정보를 알려준다고 보면 되겠다. 사실 데이터프레임은 list의 일종이다.

1
2
typeof(df1)
## [1] "list"

그럼 이제 객체 말고 각 변수의 속성을 알아보자. 가장 쉬운 방법은 아무래도 객체 구조를 보는 str() 함수가 적절하다. 하지만 부가적으로 출력되는 정보가 너무 많다.

1
2
3
4
5
6
7
str(df1)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

물론 for 반복문으로 보는 방법도 있지만 생략한다.


중급

각 row 또는 column 방향으로 일괄 연산하는 apply() 함수를 사용하면 다음과 같다.

1
2
3
apply(df1, MARGIN = 2, FUN = "class")
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## "character" "character" "character" "character" "character"

Species 변수가 factor지만 어쩐 일인지 모든 변수가 문자형(character)으로 표출된다. 이 때는 다음과 같이 Simplified Apply Function인 sapply() 함수 사용을 권장한다. 다음과 같이 개별 변수 속성을 잘 확인할 수 있다.

1
2
3
sapply(df1, FUN = "class")
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## "numeric" "numeric" "numeric" "numeric" "factor"

apply() 함수와 sapply() 함수가 내부 연산 코드가 살짝 달라서 나타나는 문제이고 보통 수치연산에서는 문제될 일이 없다고 보면 된다.


고급

앞서 소개한 iris의 경우 각 변수당 지정된 속성이 하나인 경우는 괜찮지만, 두 개 이상인 경우는 어떨까? ggplot2 패키지의 diamonds 데이터로 실습을 해보자.

1
2
3
4
5
6
7
8
9
10
library("ggplot2")
df2 = as.data.frame(diamonds)
head(df2)
## carat cut color clarity depth table price x y z
## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
## 4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48

cut, color, clarity를 제외한 나머지 변수는 수치형으로 보인다. 그럼 이제 sapply()로 확실하게 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
sapply(df2, FUN = "class")
## $carat
## [1] "numeric"
##
## $cut
## [1] "ordered" "factor"
##
## $color
## [1] "ordered" "factor"
##
## $clarity
## [1] "ordered" "factor"
##
## $depth
## [1] "numeric"
##
## $table
## [1] "numeric"
##
## $price
## [1] "integer"
##
## $x
## [1] "numeric"
##
## $y
## [1] "numeric"
##
## $z
## [1] "numeric"

cut, color, clarity 변수의 속성이 순서형 변수로 factor와 ordered를 동시에 가지고 있고 ordered가 우선시(앞에 위치)되는 것을 알 수 있다.

마지막으로 가장 어려운 코드를 작성하기 전에 특정 list에서 첫 번째 원소를 뽑아내는 코드를 살펴보자.

1
2
3
4
5
list_classes = sapply(df2, FUN = "class")
list_classes[[2]]
## [1] "ordered" "factor"
list_classes[[2]][1]
## [1] "ordered"

대괄호 2개로 하위 list에 접근하고 [1]을 사용하여 해당 list의 첫 번째 원소에 접근하는 코드를 작성할 수 있다. 이 코드를 list 객체의 각 하위 list에 일괄 적용할 예정이기 때문에 list객체 전용 함수인 lapply()를 사용할 수 있다. 그리고 출력물이 list가 되면 아래로 길게 늘어져서 보기가 번거로우니 list구조를 풀어주는 unlist() 함수 까지 같이 적용하면 다음과 같다.

1
2
3
unlist(lapply(sapply(df2, FUN = "class"), FUN = "[", 1))
## carat cut color clarity depth table price x y z
## "numeric" "ordered" "ordered" "ordered" "numeric" "numeric" "integer" "numeric" "numeric" "numeric"

보통 특정 변수에 할당된 속성이 여러개일지라도 첫 번째 원소의 것만 보면 대충 어떤 속성인지 알기에 이정도만 해도 만족하는 분이 있고, 그래도 전체 속성을 다 가져와서 보길 원하는 사람도 있다. 그렇다면 paste() 함수를 활용해서 각 원소를 이어붙여보자.

1
2
3
4
5
6
7
unlist(lapply(sapply(df2, FUN = "class"), FUN = "paste", collapse = "_"))
## carat cut color clarity
## "numeric" "ordered_factor" "ordered_factor" "ordered_factor"
## depth table price x
## "numeric" "numeric" "integer" "numeric"
## y z
## "numeric" "numeric"

이 경우에는 원소를 이어붙일 때 sep 인자가 동작하지 않기 때문에 collapse를 활용하여 언더바(_)로 각 값을 이어주었다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×