빅데이터 분석 기사 (빅분기) 실기 작업형 1형에는 전처리 문제들이 나오죠? R 활용 빅데이터 분석에서 전처리 부분을 맡고있는 R dplyr 패키지 함수들 중 꼭 알아야하는 함수들만 모아서 정리해보았습니다.

블로그 글을 작성함에 있어서 최대한 정확한 정보를 제공하고자 노력하고 있습니다만, 간혹 오류가 있을 수 있습니다. 발견시 댓글 달아주시면 정정하겠습니다. 블로그의 링크들을 통하여 구매하시면 소정의 커미션이 슬통에 들어옵니다.

예제 데이터 불러오기

통영시 시립 박물관 외관 모습
실제 통영 시립 박물관 전경 모습. 데이터에는 22년 방문객 정보가 담겨 있습니다.

이번 포스팅에서는 통영시 시립 박물관 방문자 데이터를 사용하여 설명해보겠습니다. R dplyr 패키지는 데이터가 데이터 프레임 (혹은 tibble) 형태로 주어졌을 때, 정보를 편리하게 요약할 수 있는 함수들이 모여있는 패키지입니다. 위 링크를 통해 파일을 다운 받고 따라오세요!

city_museum_2022.csv 파일을 read_csv() 함수를 통하여 불러옵니다. 한글이 섞여있는 데이터는 encoding 정보를 알맞게 설정해 줘야합니다. 제공된 csv 파일의 인코딩 정보를 my_locale 변수에 저장합니다.

library(tidyverse)
city_museum <- read_csv("./data/city_museum2022.csv",
                        locale = locale(encoding = "UTF-8"))
>> Rows: 365 Columns: 11
>> ── Column specification ─────────────────────────────
>> Delimiter: ","
>> chr  (1): 휴관일
>> dbl  (8): 통영_합계, 타지역_합계, 성인_통영, 청소년_통영, 어린이_통영, 성...
>> date (2): 날짜, 데이터기준일자
>> 
>> ℹ Use `spec()` to retrieve the full column specification for this data.
>> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

데이터 구조 파악하기

dplyr 패키지의 glimpse() 함수는 데이터 프레임 (혹은 tibble)의 구조를 한 눈에 파악할 수 있도록 해줍니다.

city_museum |> glimpse()
>> Rows: 365
>> Columns: 11
>> $ 날짜           <date> 2022-01-01, 2022-01-02, 2022-01-03, 2022-01-04, 2022-0…
>> $ 통영_합계      <dbl> 0, 0, 0, 4, 0, 0, 1, 2, 0, 0, 0, 2, 0, 8, 6, 0, 0, 25, …
>> $ 타지역_합계    <dbl> 0, 34, 0, 16, 13, 11, 25, 39, 27, 0, 54, 9, 26, 13, 33,…
>> $ 성인_통영      <dbl> 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 1, 0, 8, 3, 0, 0, 4, 3…
>> $ 청소년_통영    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
>> $ 어린이_통영    <dbl> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 21, …
>> $ 성인_타지역    <dbl> 0, 24, 0, 12, 13, 10, 21, 26, 23, 0, 50, 5, 17, 6, 24, …
>> $ 청소년_타지역  <dbl> 0, 2, 0, 0, 0, 0, 1, 5, 0, 0, 2, 4, 5, 3, 3, 0, 0, 7, 5…
>> $ 어린이_타지역  <dbl> 0, 8, 0, 4, 0, 1, 3, 8, 4, 0, 2, 0, 4, 4, 6, 7, 0, 29, …
>> $ 휴관일         <chr> "Y", "N", "Y", "N", "N", "N", "N", "N", "N", "Y", "N", …
>> $ 데이터기준일자 <date> 2023-01-02, 2023-01-02, 2023-01-02, 2023-01-02, 2023-0…

결과를 보면 전체 365행, 11열로 구성된 데이터이고, 각 날짜에 통영 시민과 타지역 관광객이 얼마나 방문했는지 기록한 데이터 인 것을 확인 할 수 있습니다. 또한, 통영 합계 열이 다른 성인 통영, 청소년 통영, 어린이 통영 열의 합과 같다는 것도 알 수 있네요.

R dplyr 패키지 주요 함수 리스트

r dplyr 함수사용법 정리 - r slice 함수, r select 함수, r mutate 함수, r arrange 함수, r summarize 함수

R dplyr 패키지는 R에서 데이터를 처리하고 분석하는 데 사용되는 다양한 함수를 제공합니다. 주요 함수들의 리스트와 간략한 설명은 다음과 같습니다.

  1. slice() – 특정 행을 선택합니다. slice_head(), slice_tail(), slice_min(), slice_max()와 같은 변형 함수들이 있습니다.
  2. filter() – 주어진 조건에 따라 행을 필터링합니다.
  3. select() – 특정 열을 선택합니다.
  4. arrange() – 특정 열의 값에 따라 행을 정렬합니다. desc() 함수와 함께 사용하면 내림차순 정렬이 가능합니다.
  5. mutate() – 새로운 열을 추가하거나 기존 열을 변형합니다.
    • transmute()mutate()와 비슷하나, 결과로 지정된 열들만 반환합니다.
    • rename() – 열의 이름을 변경합니다.
  6. summarize() (또는 summarise()) – 주어진 조건에 따라 데이터를 요약합니다.
    • group_by()와 함께 사용되어 그룹별 요약 정보를 생성합니다.
    • group_by() – 특정 열의 값에 따라 데이터를 그룹화합니다.
    • ungroup()group_by()로 그룹화된 데이터를 해제합니다.
  7. pull() – 특정 열의 데이터를 벡터로 반환합니다.
  8. distinct() – 중복 값을 제거한 데이터를 반환합니다.
  9. count() – 특정 열의 고유한 값별로 데이터의 수를 계산합니다.
    • tally()count()와 유사하지만, group_by()와 함께 사용될 때 유용합니다.
  10. join() 함수군 – 두 데이터 프레임을 합치는 데 사용됩니다.
    • inner_join(), left_join(), right_join(), full_join(), semi_join(), anti_join() 등이 있습니다.

서브 리스트에 위치한 함수들은 상위 리스트의 함수들로 같은 목적을 달성할 수 있는 함수거나 같이 사용되는 함수들입니다. 이번 포스팅에서는 리스트 앞쪽에 위치한 6개 함수들을 다루도록 하겠습니다. 이 함수들을 자유자재로 다룰 수 있어야 빅데이터분석기사 실기 R에서도 전처리 작업을 빠르게 끝낼 수 있습니다.

R slice 함수

R slice 함수는 데이터 프레임의 특정 행을 선택하기 위해 사용되는 편리한 함수입니다. 이 함수는 주어진 행의 인덱스에 따라 데이터를 추출하는데 사용됩니다. 예를 들어, 박물관 방문자 데이터에서 처음 5개의 행만을 선택하려면 다음과 같이 사용할 수 있습니다.

city_museum |> slice(1:5)
>> # A tibble: 5 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-01-01         0           0         0
>> 2 2022-01-02         0          34         0
>> 3 2022-01-03         0           0         0
>> 4 2022-01-04         4          16         3
>> 5 2022-01-05         0          13         0
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>

Slice_head 함수와 slice_tail 함수

slice_head() 함수와 slice_tail() 함수는 데이터 프레임의 처음과 마지막 부분에 있는 행들을 선택할 때 사용됩니다. 기본적으로, 이 함수들은 10행을 반환합니다. 하지만 n 인자를 사용하여 원하는 개수의 행을 선택할 수 있습니다.

예를 들어, 데이터 프레임 city_museum의 마지막 5행만을 선택하려면 다음과 같이 사용할 수 있습니다:

city_museum |> slice_tail(n = 5)
>> # A tibble: 5 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-12-27        15          65        15
>> 2 2022-12-28        35          73        35
>> 3 2022-12-29        12          81         9
>> 4 2022-12-30         9          65         6
>> 5 2022-12-31        29          69        11
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>

또한, 가장 마지막 행을 나타내는 n() 을 이용하면, 다음과 같이 100번째 행부터 마지막 행까지 선택 할 수 있습니다.

city_museum |> slice(100:n())

slice_max 함수와 slice_min 함수

dplyr 패키지는 특정 열을 기준으로 최대값과 최소값을 갖는 행들을 선택하는 slice_max()slice_min() 함수도 제공합니다.

  • slice_max 함수

주어진 열의 최대값을 기반으로 상위 n개의 행을 선택합니다. 다음의 코드는 통영 방문객 수를 기준으로 최대 방문 날짜 5개 행을 반환합니다.

city_museum |> slice_max(통영_합계, n = 5)
>> # A tibble: 5 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-03-04       872         371       872
>> 2 2022-03-05       814         176       814
>> 3 2022-05-27       812          21       780
>> 4 2022-05-28       616          64       610
>> 5 2022-06-04       202         293        97
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>

3월과 5월에 방문객 수가 가장 많은 것으로 보아 봄 철, 그리고 소풍에 대한 영향을 받았을 것이라 추측 할 수 있습니다.

  • slice_min 함수

주어진 열의 최대값을 기반으로 하위 n개의 행을 선택합니다. 다음의 코드는 통영 방문객 수를 기준으로 최소 방문 날짜 5개 행을 반환합니다.

city_museum |> slice_min(통영_합계, n = 5)
>> # A tibble: 83 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-01-01         0           0         0
>> 2 2022-01-02         0          34         0
>> 3 2022-01-03         0           0         0
>> 4 2022-01-05         0          13         0
>> 5 2022-01-06         0          11         0
>> 6 2022-01-09         0          27         0
>> 7 2022-01-10         0           0         0
>> 8 2022-01-11         0          54         0
>> 9 2022-01-13         0          26         0
>> 10 2022-01-16         0          28         0
>> # ℹ 73 more rows
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>
>> # ℹ Use `print(n = ...)` to see more rows

결과를 살펴보면 n=5라고 했어도 동점이 발생한 경우 모두 반환이 되는 것을 알 수 있습니다. 총 83개의 행이 반환되었네요.

R filter 함수

앞에서 slice 함수가 인덱스를 사용하여 행들을 걸러냈다면, 조건을 사용해서 행들을 걸러내는 함수가 있는데, 바로 filter 함수입니다. dplyrfilter() 함수는 주어진 조건에 따라 데이터 프레임에서 행을 필터링하거나 선택하는데 사용됩니다. 사용자는 특정 조건에 맞는 데이터만을 쉽게 추출할 수 있게 됩니다.

예를 들어, 박물관 방문자 데이터에서 타지역 방문자 수가 300명 이상인 데이터만을 추출하려면 다음과 같이 사용할 수 있습니다.

city_museum |> filter(타지역_합계 > 300)
>> # A tibble: 2 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-03-04       872         371       872
>> 2 2022-06-05        11         408        11
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>

filter() 함수의 기본 문법은 filter(data, condition)입니다. 여기서 data는 필터링할 데이터 프레임을 나타내며, condition은 필터링 조건을 나타냅니다. 여러 조건을 동시에 적용하려면 조건들을 쉼표로 구분하면 됩니다. 예를 들어, 통영 방문자수와 타지역 방문자 수가 둘 다 150명 이상인 데이터만을 선택하려면 아래와 같이 작성할 수 있습니다.

city_museum |> filter(통영_합계 > 150, 타지역_합계 > 150)
>> # A tibble: 3 × 11
>> 날짜       통영_합계 타지역_합계 성인_통영
>> <date>         <dbl>       <dbl>     <dbl>
>> 1 2022-03-04       872         371       872
>> 2 2022-03-05       814         176       814
>> 3 2022-06-04       202         293        97
>> # ℹ 7 more variables: 청소년_통영 <dbl>,
>> #   어린이_통영 <dbl>, 성인_타지역 <dbl>,
>> #   청소년_타지역 <dbl>, 어린이_타지역 <dbl>,
>> #   휴관일 <chr>, 데이터기준일자 <date>

R select 함수

R select 함수는 R 프로그래밍 언어에서 데이터 프레임의 열을 선택하거나 제거하기 위해 주로 사용되는 함수 중 하나입니다. 이 함수는 주어진 이름 또는 조건에 따라 데이터 프레임의 열을 선택하는 데 사용됩니다.

예제 데이터에 열이 많이 있으므로, 좀 줄여서 데이터를 간단히 만들어 보겠습니다. 예를 들어, 박물관 방문자 데이터에서 날짜, 통영_합계, 타지역_합계, 휴관일 열 만을 추출하여 다시 city_museum에 넣는 전처리 코드를 다음과 같이 작성 할 수 있습니다.

city_museum <- city_museum |> 
    select(날짜, 통영_합계, 타지역_합계, 휴관일)
city_museum |> slice_head()
>> # A tibble: 1 × 4
>> 날짜       통영_합계 타지역_합계 휴관일
>> <date>         <dbl>       <dbl> <chr> 
>> 1 2022-01-01         0           0 Y

위 코드 처럼 여러 열을 동시에 선택하려면 열 이름들을 쉼표로 구분하면 됩니다. 또한, - 기호를 사용하여 특정 열을 제외할 수도 있습니다. 예를 들어, 휴관일 열을 제외하고 모든 열을 선택하려면 아래와 같이 작성할 수 있습니다.

city_museum |> 
    select(-휴관일) |>
    slice_head()
>> # A tibble: 1 × 3
>>   날짜       통영_합계 타지역_합계
>>   <date>         <dbl>       <dbl>
>> 1 2022-01-01         0           0

R mutate 함수

R mutate 함수는 R에서 데이터 프레임의 열을 추가하거나 변환하기 위해 주로 사용되는 함수입니다. 이 함수는 주어진 표현식을 기반으로 새로운 열을 생성하거나 기존 열을 수정하는 데 사용됩니다.

예를 들어, 박물관 방문자 데이터에서 통영_합계타지역_합계를 합하여 새로운 열 총방문자를 생성하려면 다음과 같이 사용할 수 있습니다.

city_museum |> 
    mutate(총방문자 = 통영_합계 + 타지역_합계) |> 
    head()
>> # A tibble: 6 × 5
>>   날짜       통영_합계 타지역_합계 휴관일 총방문자
>>   <date>         <dbl>       <dbl> <chr>     <dbl>
>> 1 2022-01-01         0           0 Y             0
>> 2 2022-01-02         0          34 N            34
>> 3 2022-01-03         0           0 Y             0
>> 4 2022-01-04         4          16 N            20
>> 5 2022-01-05         0          13 N            13
>> 6 2022-01-06         0          11 N            11

이후 filter() 함수를 사용하여 총 방문자 수가 특정 기준을 초과하는 행만 선택할 수 있습니다. 또한, 여러 열을 동시에 추가하거나 수정하려면 여러 표현식을 쉼표로 구분하여 제공하면 됩니다.

city_museum |>
    mutate(총방문자 = 통영_합계 + 타지역_합계,
           방문자_차이 = 통영_합계 - 타지역_합계) |>
    filter(총방문자 > 100)
>> # A tibble: 6 × 6
>>   날짜       통영_합계 타지역_합계 휴관일 총방문자 방문자_차이
>>   <date>         <dbl>       <dbl> <chr>     <dbl>       <dbl>
>> 1 2022-02-19       156          26 N           182         130
>> 2 2022-03-04       872         371 N          1243         501
>> 3 2022-03-05       814         176 N           990         638
>> 4 2022-03-19        23         101 N           124         -78
>> 5 2022-03-20        26          99 N           125         -73
>> 6 2022-03-25        59          62 N           121          -3

이렇게 mutate() 함수로 데이터를 변환한 후, filter() 함수를 사용하여 특정 조건을 만족하는 행만 선택하는 과정을 연속적으로 수행할 수 있습니다. 파이프 연산자를 활용하면 두 함수를 순차적으로 적용하여 원하는 데이터 처리 작업을 빠르고 효율적으로 수행할 수 있습니다.

R rename 함수

mutate 함수를 사용해서 기존의 열의 이름을 바꿔 줄 수 있지만, 이럴 경우 열의 모든 값을 새로 다 만드는 셈 입니다. 데이터가 큰 경우 이렇게 열의 값을 다 바꿔주는 것도 시간이 걸립니다. rename 함수는 열의 이름만 교체해주는 함수이므로 mutate 함수와 보완 관계의 함수로 알아두시면 좋습니다. 아래 두 코드의 “결과는” 같습니다.

city_museum |> mutate(다른지역_방문자 = 타지역_방문자)
city_museum |> rename(다른지역_방문자 = 타지역_방문자)

R arrange 함수

dplyrarrange() 함수는 R 프로그래밍 언어에서 데이터를 특정 열의 값에 따라 정렬하기 위해 주로 사용되는 함수 중 하나입니다. 이 함수는 주어진 열의 값을 기준으로 데이터 프레임의 행을 오름차순 또는 내림차순으로 정렬하는 데 사용됩니다. 예를 들어, 박물관 방문자 데이터에서 통영_합계를 기준으로 데이터를 오름차순으로 정렬하려면 다음과 같이 사용할 수 있습니다.

city_museum |> arrange(통영_합계) |> head()
>> # A tibble: 6 × 4
>>   날짜       통영_합계 타지역_합계 휴관일
>>   <date>         <dbl>       <dbl> <chr> 
>> 1 2022-01-01         0           0 Y     
>> 2 2022-01-02         0          34 N     
>> 3 2022-01-03         0           0 Y     
>> 4 2022-01-05         0          13 N     
>> 5 2022-01-06         0          11 N     
>> 6 2022-01-09         0          27 N

내림차순으로 정렬하려면 desc() 함수를 사용합니다. 예를 들어, 타지역_합계를 기준으로 데이터를 내림차순으로 정렬하려면 아래와 같이 작성할 수 있습니다.

city_museum |> arrange(desc(통영_합계)) |> head()
>> # A tibble: 6 × 4
>>   날짜       통영_합계 타지역_합계 휴관일
>>   <date>         <dbl>       <dbl> <chr> 
>> 1 2022-03-04       872         371 N     
>> 2 2022-03-05       814         176 N     
>> 3 2022-05-27       812          21 N     
>> 4 2022-05-28       616          64 N     
>> 5 2022-06-04       202         293 N     
>> 6 2022-02-19       156          26 N

R summarize 함수

dplyrsummarize() 함수는 R 프로그래밍 언어에서 데이터의 집계나 요약을 수행하기 위한 주요 함수입니다. 이 함수를 사용하여 특정 열의 평균, 합계, 최대값, 최소값 등의 통계적 요약 값을 계산할 수 있습니다.

예를 들어, 박물관 방문자 데이터에서 통영 방문자의 총 방문자 수를 계산하려면 다음과 같이 사용할 수 있습니다.

city_museum |> 
    summarize(통영_총합계 = sum(통영_합계))
>> # A tibble: 1 × 1
>>   통영_총합계
>>         <dbl>
>> 1        9720

22년 1년간 통영시 총 방문객 수는 9천 720명이라는 것을 알 수 있습니다.

R group_by 함수

summarize() 함수는 종종 group_by() 함수와 함께 사용됩니다. 이를 통해 데이터를 특정 열의 값별로 그룹화한 후 그룹별 요약 값을 계산할 수 있습니다. 예를 들어, 통영 방문자의 월별 총 방문자 수를 계산하려면 다음과 같이 작성할 수 있습니다.

city_museum |> 
    mutate(월 = lubridate::month(날짜)) |> 
    group_by(월) |> 
    summarize(통영_월별합계 = sum(통영_합계))
>> # A tibble: 12 × 2
>>       월 통영_월별합계
>>    <dbl>         <dbl>
>>  1     1           117
>>  2     2           270
>>  3     3          2166
>>  4     4           972
>>  5     5          2236
>>  6     6           614
>>  7     7           357
>>  8     8           411
>>  9     9           606
>> 10    10           939
>> 11    11           566
>> 12    12           466

위 코드에서 날짜 칼럼에서 월 정보만을 빼오기 위해서 날짜 전처리 패키지인 lubridate의 month 함수를 사용했습니다.

dplyr의 최신 버전에서 summarize() 함수는 .by 인수를 통해 직접 그룹화를 수행할 수 있습니다. 이렇게 함으로써 group_by() 함수를 별도로 사용하지 않고도 데이터를 그룹화하고 요약할 수 있습니다. .by 옵션을 사용하면, group_by() 함수 없이도 동일한 결과를 얻을 수 있습니다.

city_museum |> 
    mutate(월 = lubridate::month(날짜)) |>
    summarize(통영_월별방문자 = sum(통영_방문자), .by = 월)

.by 옵션은 코드를 더 간결하게 만들어주며, 특히 작은 변환 작업이나 간단한 분석에서 유용하게 사용될 수 있습니다. summarize() 함수는 데이터의 통계적 요약 정보를 쉽게 얻기 위한 필수 도구입니다. 다양한 요약 통계와 함께 사용하면 데이터의 전반적인 특성을 빠르게 파악하는 데 도움이 됩니다.

이것으로 dplyr 패키지의 주요 함수들을 정리해보았습니다. 하루에 한번씩 계속 보시고, 손에서 바로 나올 정도까지 연습하시기 바랍니다.

Similar Posts