[R] 특정 변수값에 맞춰 데이터 분할하기 (feat. MASS, Cars93)

해당 포스트는 MASS패키지의 Cars93 데이터셋을 Origin 변수값에 따라 두 그룹으로 분할하는 방법을 소개합니다.

dataset-split-using-split-or-group-split

INTRO

데이터 분석을 하다보면 'train/test', '합격/불합격', '남자/여자' 등 데이터셋을 분할하는 경우가 많이 발생합니다. 데이터셋을 분할하기 위해서는 기준이 필요한데, 특정 컬럼 또는 데이터에 기준이 있는 경우라면 쉽게 해결이 가능합니다.

아래에서는 MASS 패키지에서 제공되는 Cars93 데이터셋을 이용하여 Origin 컬럼값에 따라 데이터를 분할하는 방법을 설명합니다.

문제 풀이

MASS 패키지에서 제공되는 Cars93 데이터셋을 이용하여 Origin 컬럼값에 따라 데이터를 분할하는 R코드는 다음과 같습니다.

아래 코드는 MASS 패키지를 불러온 후, Cars93 데이터셋을 로드합니다. 그리고 split() 함수를 사용하여 Origin 컬럼값에 따라 데이터를 분할하고, 분할된 데이터는 by_origin 변수에 저장합니다.

# MASS 패키지에서 Cars93 데이터셋 로드하기
library(MASS)
data(Cars93)

# Origin 컬럼값에 따라 데이터 분할하기
by_origin <- split(Cars93, Cars93$Origin)
by_origin
$Asia
   Manufacturer    Model     Type ...  Origin
1         Acura  Integra    Small ...    Asia
2         Acura   Legend  Midsize ...    Asia
3          Audi       90  Compact ...    Asia
4          Audi      100  Midsize ...    Asia
5           BMW     535i  Midsize ...    Asia
...
21   Mitsubishi   Mirage    Small ...    Asia
22       Nissan   Sentra    Small ...    Asia
23       Nissan    Altima  Midsize ...    Asia
24       Nissan   Quest      Van ...    Asia
25       Nissan  Maxima   Midsize ...    Asia
...

$Europe
   Manufacturer        Model     Type ...  Origin
26         Audi          100  Midsize ...  Europe
27          BMW         535i  Midsize ...  Europe
28          BMW        525i   Midsize ...  Europe
29          BMW        318i      Small ...  Europe
30          BMW        320i      Small ...  Europe
...
38        Saab        9000   Midsize ...  Europe
39       Saturn          SL    Small ...  Europe

$USA
   Manufacturer        Model     Type ... Origin
40         Buick     Century    Midsize ...    USA
41         Buick     LeSabre    Large  ...    USA
42         Buick   Roadmaster    Large  ...    USA
43         Buick  Riviera       Midsize ...    USA
44      Cadillac     DeVille    Large  ...    USA
...
91      Plymouth     Laser       Sporty ...    USA
92       Pontiac     LeMans      Small  ...    USA
93       Pontiac     Sunbird     Small  ...    USA
94       Pontiac  Firebird      Sporty ...    USA
95           GMC     Vandura      Van    ...    USA

attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  Origin
1   Asia
2 Europe
3    USA


by_origin 변수를 출력하면, Origin 컬럼값에 따라 분할된 데이터가 리스트(List) 형태로 출력됩니다. 각각의 리스트 항목은 Origin 컬럼값에 해당하는 데이터 프레임(Data Frame)입니다.

위 코드 출력에서 볼 수 있듯이, by_origin 리스트는 Asia, Europe, USA세 가지 항목으로 나뉘어 있으며, 각각의 항목은 해당 국가에서 출시된 차량들의 데이터 프레임(Data Frame)으로 이루어져 있습니다. 리스트(List)의 마지막 부분에는 attr() 함수를 통해 분할된 데이터의 종류가 "data.frame"임을 확인할 수 있습니다.

만약, USA 출신 차량의 데이터만 출력한다면 by_origin$USA와 같이 코드를 입력하면 됩니다. 출력 결과가 길어질 수 있어, 아래에서는 해당 결과의 구조(structure)를 출력해 보겠습니다.

str(by_origin$USA)
'data.frame':    48 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 4 4 4 4 5 5 6 6 6 6 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 24 54 74 73 35 79 22 30 17 58 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 3 2 2 3 2 3 1 1 5 3 ...
 $ Min.Price         : num  14.2 19.9 22.6 26.3 33 37.5 8.5 11.4 13.4 13.4 ...
 $ Price             : num  15.7 20.8 23.7 26.3 34.7 40.1 13.4 11.4 15.1 15.9 ...
 $ Max.Price         : num  17.3 21.7 24.9 26.3 36.3 42.7 18.3 11.4 16.8 18.4 ...
 $ MPG.city          : int  22 19 16 19 16 16 25 25 19 21 ...
 $ MPG.highway       : int  31 28 25 27 25 25 36 34 28 29 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 2 2 2 2 2 1 3 2 1 3 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 3 2 2 2 2 2 3 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 5 5 2 2 4 2 ...
 $ EngineSize        : num  2.2 3.8 5.7 3.8 4.9 4.6 2.2 2.2 3.4 2.2 ...
 $ Horsepower        : int  110 170 180 170 200 295 110 110 160 110 ...
 $ RPM               : int  5200 4800 4000 4800 4100 6000 5200 5200 4600 5200 ...
 $ Rev.per.mile      : int  2565 1570 1320 1690 1510 1985 2380 2665 1805 2595 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 2 2 2 1 ...
 $ Fuel.tank.capacity: num  16.4 18 23 18.8 18 20 15.2 15.6 15.5 16.5 ...
 $ Passengers        : int  6 6 6 5 6 5 5 5 4 6 ...
 $ Length            : int  189 200 216 198 206 204 182 184 193 198 ...
 $ Wheelbase         : int  105 111 116 108 114 111 101 103 101 108 ...
 $ Width             : int  69 74 78 73 73 74 66 68 74 71 ...
 $ Turn.circle       : int  41 42 45 41 43 44 38 39 43 40 ...
 $ Rear.seat.room    : num  28 30.5 30.5 26.5 35 31 25 26 25 28.5 ...
 $ Luggage.room      : int  16 17 21 14 18 14 13 14 13 16 ...
 $ Weight            : int  2880 3470 4105 3495 3620 3935 2490 2785 3240 3195 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 1 1 1 1 1 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 6 7 9 8 10 11 15 16 13 18 ...

tidyverse 패키지 활용 풀이

다음은 tidyverse 패키지를 이용한 R 코드 풀이입니다. 아래 코드를 실행하면 Origin 컬럼값에 따라 분할된 데이터셋이 출력되며, 분할된 데이터셋은 리스트(List) 형태로 저장되어 있습니다. 리스트의 각 원소는 Origin 컬럼값 하나에 해당하는 데이터 프레임(Data Frame)입니다.

# 패키지 불러오기
library(tidyverse)
library(MASS)

# 데이터 불러오기
data("Cars93", package = "MASS")

# Origin 컬럼값에 따라 분할
cars_split <- Cars93 %>% 
  group_split(Origin)

# 분할된 데이터셋 출력
print(cars_split)
[[1]]
   Manufacturer    Model    Type ... 
1         Acura  Integra   Small ... 
2         Acura   Legend Midsize ...
3          Audi       90 Compact ...
4          Audi      100 Midsize ...
5           BMW     535i Midsize ...
6         Buick  Century Midsize ...
7         Buick   LeSabre   Large ...
8         Buick  Roadmaster   Large ...
9         Buick    Riviera Personal...
10   Chevrolet   Corsica Compact ...
11   Chevrolet    Camaro Sporty ...
12   Chevrolet   Lumina Midsize ...
13   Chevrolet Monte Carlo Personal...

[[2]]
   Manufacturer  Model     Type ... 
1      Cadillac Fleetwood    Large ...
2      Cadillac  DeVille    Large ...
3      Cadillac  Seville Midsize ...
4     Chevrolet Caprice    Large ...
5     Chevrolet Impala    Large ...
6        Pontiac Bonneville Large ...
7        Pontiac Firebird Sporty ...
8        Pontiac Grand Prix Midsize ...

[[3]]
...

마무리

이번 포스트에서는 MASS 패키지에서 제공되는 Cars93 데이터셋을 이용하여 Origin 컬럼값에 따라 데이터를 분할하는 방법을 설명했습니다. 내장 함수 및 tidyverse 패키지를 활용한 풀이에서는 모두 Origin 컬럼값에 따라 데이터를 분할하였고,각 리스트 항목은 Origin 컬럼값에 해당하는 데이터 프레임(Data Frame)으로 저장된 것을 확인하였습니다.
사용자의 분석 환경(내부망, 외부 패키지 사용 불가 등)에 따라 필요한 코드를 참고하여 선택적으로 활용하시면 됩니다.

관련 링크

[1] [R] 데이터 샘플링 (Data Sampling)
[2] [R] R에서 반응 변수 비율에 맞춰 데이터셋 분할하기 (15회 ADP 실기 기출)
[3] MASS 패키지
[4] tidyverse 패키지