빅데이터 분석 기사 (빅분기) 실기 작업형 1형에는 전처리 문제들이 나오죠? R 활용 빅데이터 분석에서 전처리 부분을 맡고있는 R dplyr 패키지 함수들 중 꼭 알아야하는 함수들만 모아서 정리해보았습니다.
예제 데이터 불러오기
이번 포스팅에서는 통영시 시립 박물관 방문자 데이터를 사용하여 설명해보겠습니다. 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
>> 통영_합계 <dbl> 0, 0, 0, 4, 0, 0, 1, 2, 0, 0, 0, 2, 0, 8, 6, 0, 0, 25, …
>> 성인_통영 <dbl> 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 1, 0, 8, 3, 0, 0, 4, 3…
>> 어린이_통영 <dbl> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 21, …
>> 청소년_타지역 <dbl> 0, 2, 0, 0, 0, 0, 1, 5, 0, 0, 2, 4, 5, 3, 3, 0, 0, 7, 5…
>> 휴관일 <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()
– 특정 행을 선택합니다.slice_head()
,slice_tail()
,slice_min()
,slice_max()
와 같은 변형 함수들이 있습니다.filter()
– 주어진 조건에 따라 행을 필터링합니다.select()
– 특정 열을 선택합니다.arrange()
– 특정 열의 값에 따라 행을 정렬합니다.desc()
함수와 함께 사용하면 내림차순 정렬이 가능합니다.mutate()
– 새로운 열을 추가하거나 기존 열을 변형합니다.transmute()
–mutate()
와 비슷하나, 결과로 지정된 열들만 반환합니다.rename()
– 열의 이름을 변경합니다.
summarize()
(또는summarise()
) – 주어진 조건에 따라 데이터를 요약합니다.group_by()
와 함께 사용되어 그룹별 요약 정보를 생성합니다.group_by()
– 특정 열의 값에 따라 데이터를 그룹화합니다.ungroup()
–group_by()
로 그룹화된 데이터를 해제합니다.
pull()
– 특정 열의 데이터를 벡터로 반환합니다.distinct()
– 중복 값을 제거한 데이터를 반환합니다.count()
– 특정 열의 고유한 값별로 데이터의 수를 계산합니다.tally()
–count()
와 유사하지만,group_by()
와 함께 사용될 때 유용합니다.
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 함수입니다. dplyr
의 filter()
함수는 주어진 조건에 따라 데이터 프레임에서 행을 필터링하거나 선택하는데 사용됩니다. 사용자는 특정 조건에 맞는 데이터만을 쉽게 추출할 수 있게 됩니다.
예를 들어, 박물관 방문자 데이터에서 타지역 방문자 수가 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 함수
dplyr
의 arrange()
함수는 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 함수
dplyr
의 summarize()
함수는 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 패키지의 주요 함수들을 정리해보았습니다. 하루에 한번씩 계속 보시고, 손에서 바로 나올 정도까지 연습하시기 바랍니다.