๋ฐ์ดํฐ ์ฌ์ด์ธ์ค 100๋ฒ์ ๋ ธํฌ(๊ตฌ์กฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌํธ) โ R Part 3 (Q41 to Q60)์ ํด์ค์ ๋๋ค.
ย
์ฐธ๊ณ (Reference) : ใ๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ ํํ ์คํฌ ์ ์ ์์ใ์ ใ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค 100๋ฒ์ ๋ ธํฌ(๊ตฌ์กฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌํธ)ใ์ ๋๋ค.
์ฒ์์
- ๋จผ์ ๋ค์ ์ ์ ์คํํฉ๋๋ค.
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค(PostgreSQL).
- ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ ์ ์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ฌ์ฉํ๋ ค๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ install.packages()๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ๊ฒ ์ค์นํฉ๋๋ค.
- ์ด๋ฆ, ์ฃผ์ ๋ฑ์ ๋๋ฏธ ๋ฐ์ดํฐ์ด๋ฉฐ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋๋๋ค.
require("RPostgreSQL")
require("tidyr")
require("dplyr")
require("stringr")
require("caret")
require("lubridate")
require("rsample")
require("recipes")
require("themis")
host <- "db"
port <- Sys.getenv()["PG_PORT"]
dbname <- Sys.getenv()["PG_DATABASE"]
user <- Sys.getenv()["PG_USER"]
password <- Sys.getenv()["PG_PASSWORD"]
con <- dbConnect(PostgreSQL(), host=host, port=port, dbname=dbname, user=user, password=password)
df_customer <- dbGetQuery(con,"SELECT * FROM customer")
df_category <- dbGetQuery(con,"SELECT * FROM category")
df_product <- dbGetQuery(con,"SELECT * FROM product")
df_receipt <- dbGetQuery(con,"SELECT * FROM receipt")
df_store <- dbGetQuery(con,"SELECT * FROM store")
df_geocode <- dbGetQuery(con,"SELECT * FROM geocode")
Loading required package: RPostgreSQL Loading required package: DBI Loading required package: tidyr Loading required package: dplyr Attaching package: โdplyrโ The following objects are masked from โpackage:statsโ: filter, lag The following objects are masked from โpackage:baseโ: intersect, setdiff, setequal, union Loading required package: stringr Loading required package: caret Loading required package: ggplot2 Loading required package: lattice Loading required package: lubridate Attaching package: โlubridateโ The following objects are masked from โpackage:baseโ: date, intersect, setdiff, union Loading required package: rsample Loading required package: recipes Attaching package: โrecipesโ The following object is masked from โpackage:stringrโ: fixed The following object is masked from โpackage:statsโ: step Loading required package: themis Registered S3 methods overwritten by 'themis': method from bake.step_downsample recipes bake.step_upsample recipes prep.step_downsample recipes prep.step_upsample recipes tidy.step_downsample recipes tidy.step_upsample recipes tunable.step_downsample recipes tunable.step_upsample recipes Attaching package: โthemisโ The following objects are masked from โpackage:recipesโ: step_downsample, step_upsample
ย
์ฐ์ต๋ฌธ์
R-041: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๋ ์ง(sales_ymd)๋ณ๋ก ์ง๊ณํ์ฌ, ์ง๋๋ฒ ๋งค์ถ์ด ์์๋ ๋ ๋ก๋ถํฐ์ ๋งค์ถ ๊ธ์ก ์ฆ๊ฐ์ ๊ณ์ฐํ๋ผ. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ 10๊ฑด ํ์ํ๋ผ.
df_receipt %>%
group_by(sales_ymd) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(lag_ymd = lag(sales_ymd), lag_amount = lag(sum_amount), diff_amount = sum_amount - lag_amount) %>%
slice(1:10)
sales_ymd | sum_amount | lag_ymd | lag_amount | diff_amount |
---|---|---|---|---|
<int> | <int> | <int> | <int> | <int> |
20170101 | 33723 | NA | NA | NA |
20170102 | 24165 | 20170101 | 33723 | -9558 |
20170103 | 27503 | 20170102 | 24165 | 3338 |
20170104 | 36165 | 20170103 | 27503 | 8662 |
20170105 | 37830 | 20170104 | 36165 | 1665 |
20170106 | 32387 | 20170105 | 37830 | -5443 |
20170107 | 23415 | 20170106 | 32387 | -8972 |
20170108 | 24737 | 20170107 | 23415 | 1322 |
20170109 | 26718 | 20170108 | 24737 | 1981 |
20170110 | 20143 | 20170109 | 26718 | -6575 |
์ค๋ช :
์ด ์ฝ๋๋ R์ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ df_receipt๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์กฐ์ํ๊ณ ์๋ค. ์๋๋ ์ด ์ฝ๋๊ฐ ์ํํ๋ ์์ ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ค.
df_receipt %>% - R์ ํ์ดํ ์ฐ์ฐ์๋ก df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ํ์ดํ ๋ผ์ธ์ ๋ค์ ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ค.
group_by(sales_ymd) %>% - sales_ymd ์ปฌ๋ผ์ผ๋ก ๋ฐ์ดํฐ ํ๋ ์์ ๊ทธ๋ฃนํํ๋ค(๋ ์ง ๋๋ ๋ ์ง ์๊ฐ ๋ฐ์ดํฐ ํฌํจ). ์ฐ์ฐ์ %>%๋ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํ์ดํ๋ผ์ธ์ ๋ค์ ํจ์๋ก ๋ณด๋ ๋๋ค.
summarise(sum_amount = sum(amount), .groups = "drop") %>% - ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์์ฝํ๊ณ ๊ณ ์ ํ sales_ymd ๊ทธ๋ฃน๋ณ๋ก ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์๋ sales_ymd์ sum_amount ๋ ๊ฐ์ ์ด์ด ์๋ค. .groups = "drop" ์ธ์๋ group_by์์ ์ถ๊ฐํ ๊ทธ๋ฃนํ ์ ๋ณด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ญ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ์ฐ์ %>%๋ ์ด ์์ฝ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํ์ดํ๋ผ์ธ์ ๋ค์ ํจ์๋ก ๋ค์ ํ์ดํํ๋ค.
mutate(lag_ymd = lag(sales_ymd), lag_amount = lag(sum_amount), diff_amount = sum_amount - lag_amount) %>% - ์์ฝ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด 3๊ฐ์ ์ด์ ์ถ๊ฐํ๋ค. ์ฒ์ ๋ ์ด์ธ lag_ymd์ lag_amount๋ ๊ฐ๊ฐ sales_ymd์ sum_amount ์ด์ ์ง์ฐ ๊ฐ์ ํฌํจํ๊ณ , ์ธ ๋ฒ์งธ ์ด์ธ diff_amount๋ sum_amount์ lag_amount ์ด์ ์ฐจ์ด๋ฅผ ์ ์ฅํ๋ค. ์ฐ์ฐ์ %>%๋ ์ด ์์ ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํ์ดํ๋ผ์ธ์ ๋ค์ ํจ์๋ก ๋ณด๋ธ๋ค.
slice(1:10) - ์์ ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ sales_ymd, sum_amount, lag_ymd, lag_amount, diff_amount ์ด์ ๊ฐ์ง๋ฉฐ, ์๋์ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๊ทธ๋ฃนํ, ์์ฝ ๋ฐ ์์ ํ ํ ์ฒ์ 10๊ฐ์ ํ์ ํฌํจํ๊ฒ ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ๋งค์ถ ๋ฐ์ดํฐ์ ๋ํด ์ผ์ข ์ ์๊ณ์ด ๋ถ์์ ์ํํ์ฌ ๊ฐ ๋ ์ง์ ๋งค์ถ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ ๊ฐ ๋ ์ง์ ๋งค์ถ๊ณผ ์ ๋ ์ ๋งค์ถ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ผ์ผ ๋งค์ถ์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ถ์ธ๋ฅผ ํ์ ํ ์ ์์ด์ผ ํ๋ค.
R-042: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๋ ์ง(sales_ymd)๋ณ๋ก ์ง๊ณํ๊ณ , ๊ฐ ๋ ์ง์ ๋ฐ์ดํฐ์ ๋ํด ์ด์ , ์ ์ , 3ํ ์ ์ ๋งค์ถ์ด ์์๋ ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ๋ผ. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ 10๊ฑด ํ์ํ๋ผ.
# ์ฝ๋ ์์ 1: ์ธ๋กํ ์ผ์ด์ค
df_sum <-df_receipt %>%
group_by(sales_ymd) %>%
summarise(sum_amount = sum(amount), .groups = "drop")
for (i in 1:3) {
df_tmp <- df_sum %>%
mutate(lag_ymd = lag(sales_ymd, n = i),
lag_amount = lag(sum_amount, n = i))
if (i == 1) {
df_lag <- df_tmp
}
else {
df_lag <- rbind(df_lag, df_tmp)
}
}
df_lag %>%
drop_na(everything()) %>%
arrange(sales_ymd, lag_ymd) %>%
slice(1:10)
sales_ymd | sum_amount | lag_ymd | lag_amount |
---|---|---|---|
<int> | <int> | <int> | <int> |
20170102 | 24165 | 20170101 | 33723 |
20170103 | 27503 | 20170101 | 33723 |
20170103 | 27503 | 20170102 | 24165 |
20170104 | 36165 | 20170101 | 33723 |
20170104 | 36165 | 20170102 | 24165 |
20170104 | 36165 | 20170103 | 27503 |
20170105 | 37830 | 20170102 | 24165 |
20170105 | 37830 | 20170103 | 27503 |
20170105 | 37830 | 20170104 | 36165 |
20170106 | 32387 | 20170103 | 27503 |
์ค๋ช :
์ด ์ฝ๋๋ R์ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ df_receipt๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์กฐ์ํ๋ ์ฝ๋์ ๋๋ค.
df_sum <-df_receipt %>% group_by(sales_ymd) %>% summarise(sum_amount = sum(amount), .groups = "drop") - ์์ ์์ ์ฝ๋์ ์ฒซ ๋ฒ์งธ ์ค๊ณผ ์ ์ฌํ๋ฉฐ, df_receipt ๋ฐ์ดํฐ ํ๋ ์ ๋ฅผ sales_ymd ์ด๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ณ ์ ํ sales_ymd ๊ทธ๋ฃน๋ณ๋ก ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ df_sum์ด๋ผ๋ ์๋ก์ด ๋ณ์์ ์ ์ฅํฉ๋๋ค.
for (i in 1:3) { - 3์ฐจ๋ก ๋ฐ๋ณต๋๋ for ๋ฃจํ๋ฅผ ์์ํฉ๋๋ค.
df_tmp <- df_sum %>% mutate(lag_ymd = lag(sales_ymd, n = i), lag_amount = lag(sum_amount, n = i)) - df_sum ๋ฐ์ดํฐ ํ๋ ์์ sales_ymd์ sum_amount ์ด์ dplyr์ lag()๋ฅผ ์ฌ์ฉํ์ฌ i์ผ๊ฐ ์ง์ฐ์ํจ ์๋ก์ด ์์ ๋ฐ์ดํฐ ํ๋ ์ df_tmp๋ฅผ ์์ฑํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ sales_ymd, sum_amount, lag_ymd, lag_amount์ ์ธ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๊ฒ ๋๋ค.
if (i == 1) { df_lag <- df_tmp }. - ์ด๊ฒ์ด ๋ฃจํ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ธ ๊ฒฝ์ฐ, df_lag ๋ฐ์ดํฐ ํ๋ ์์ df_tmp์ ๋์ผํ๊ฒ ์ค์ ๋๋ค.
else { df_lag <- rbind(df_lag, df_tmp) }. - ๋ฃจํ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ด ์๋ ๊ฒฝ์ฐ df_tmp๋ dplyr์ rbind() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด df_lag ๋ฐ์ดํฐ ํ๋ ์์ ์ถ๊ฐ๋๋ค.
} - for ๋ฃจํ๋ ์ฌ๊ธฐ์ ์ข ๋ฃ๋๋ค.
df_lag %>% drop_na(everything()) %>% arrange(sales_ymd, lag_ymd) %>% slice(1:10) - ๋ฃจํ ๋ด์์ ์์ฑ๋ df_lag ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐ์ drop_na()๋ก ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ํ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. ์ ๊ฑฐํ๊ณ , arrange()๋ก sales_ymd์ lag_ymd๋ก ํ์ ์ ๋ ฌํ๊ณ , slice()๋ก ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒซ 10๊ฐ์ ํ์ ์ ํํ๋ค.
์ด ์ฝ๋์ ๋ชฉ์ ์ ์ง๋ 3์ผ๊ฐ์ sales_ymd์ sum_amount ์ด์ ์ง์ฐ ๊ฐ์ ํฌํจํ๋ df_lag๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ฐ์ดํฐ ํ๋ ์์ ์ง๋ 3์ผ๊ฐ์ ๋งค์ถ ์ถ์ธ๋ฅผ ์กฐ์ฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํฅํ ๋งค์ถ์ ์์ธกํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ง์ง๋ง ์ฝ๋๋ ํ์ ๋ฐ ์ถ๊ฐ ๋ถ์์ ์ํด ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ ์ฝ๋์ ๋๋ค.
# ์ฝ๋ ์์ 2: ๊ฐ๋กํ ์ผ์ด์ค
df_sum <-df_receipt %>%
group_by(sales_ymd) %>%
summarise(sum_amount = sum(amount), .groups = "drop")
for (i in 1:3) {
col_name_1 <- paste("lag_ymd_", i , sep="_")
col_name_2 <- paste("lag_amount", i , sep="_")
df_tmp <- df_sum %>%
mutate(!!col_name_1 := lag(sales_ymd, nใ=ใi),
!!col_name_2 := lag(sum_amount, nใ=ใi))
if (i == 1)ใ{
df_lag <- df_tmp
}
else {
df_lag <- cbind(df_lag, df_tmp[c(col_name_1, col_name_2)])
}
}
df_lag %>%
drop_na(everything()) %>%
arrange(sales_ymd) %>%
slice(1:10)
sales_ymd | sum_amount | lag_ymd__1 | lag_amount_1 | lag_ymd__2 | lag_amount_2 | lag_ymd__3 | lag_amount_3 |
---|---|---|---|---|---|---|---|
<int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> |
20170104 | 36165 | 20170103 | 27503 | 20170102 | 24165 | 20170101 | 33723 |
20170105 | 37830 | 20170104 | 36165 | 20170103 | 27503 | 20170102 | 24165 |
20170106 | 32387 | 20170105 | 37830 | 20170104 | 36165 | 20170103 | 27503 |
20170107 | 23415 | 20170106 | 32387 | 20170105 | 37830 | 20170104 | 36165 |
20170108 | 24737 | 20170107 | 23415 | 20170106 | 32387 | 20170105 | 37830 |
20170109 | 26718 | 20170108 | 24737 | 20170107 | 23415 | 20170106 | 32387 |
20170110 | 20143 | 20170109 | 26718 | 20170108 | 24737 | 20170107 | 23415 |
20170111 | 24287 | 20170110 | 20143 | 20170109 | 26718 | 20170108 | 24737 |
20170112 | 23526 | 20170111 | 24287 | 20170110 | 20143 | 20170109 | 26718 |
20170113 | 28004 | 20170112 | 23526 | 20170111 | 24287 | 20170110 | 20143 |
์ค๋ช :
์ด ์ฝ๋๋ R์ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ df_receipt๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์กฐ์ํ๋ ์ฝ๋์ ๋๋ค.a
df_sum <-df_receipt %>% group_by(sales_ymd) %>% summarise(sum_amount = sum(amount), .groups = "drop") - ์์ ์์ ์ฝ๋์ ์ฒซ ๋ฒ์งธ ์ค๊ณผ ์ ์ฌํ๋ฉฐ, df_receipt ๋ฐ์ดํฐ ํ๋ ์ ๋ฅผ sales_ymd ์ด๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ณ ์ ํ sales_ymd ๊ทธ๋ฃน๋ณ๋ก ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ df_sum์ด๋ผ๋ ์๋ก์ด ๋ณ์์ ์ ์ฅํฉ๋๋ค.
for (i in 1:3) { - 3์ฐจ๋ก ๋ฐ๋ณต ์คํํ๋ for ๋ฃจํ๋ฅผ ์์ํฉ๋๋ค.
col_name_1 <- paste("lag_ymd_", i , sep="_") - ์ ๋์ฌ "lag_ymd_"์ ํ์ฌ i์ ๊ฐ์ ์ฐ๊ฒฐํ col_name_1์ด๋ผ๋ ์๋ก์ด ๋ฌธ์์ด ๋ณ์๋ฅผ ์์ฑํ๋ค.
col_name_2 <- paste("lag_amount", i , sep="_") - ์ ๋์ฌ "lag_amount_"์ ํ์ฌ i์ ๊ฐ์ ์ฐ๊ฒฐํ col_name_2๋ผ๋ ์๋ก์ด ๋ฌธ์์ด ๋ณ์๋ฅผ ์์ฑํ๋ค.
df_tmp <- df_sum %>% mutate(! !col_name_1 := lag(sales_ymd, n = i), ! col_name_2 := lag(sum_amount, n = i)) - df_sum ๋ฐ์ดํฐ ํ๋ ์์ sales_ymd์ sum_amount ์ปฌ๋ผ์ dplyr์ lag() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ i์ผ ์ง์ฐ์์ผ ์์ฑํ ์๋ก์ด ์์ ๋ฐ์ดํฐ ํ๋ ์์ df_tmp๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑํ๋ค. ๋ฐ์ดํฐ์ ๋๋ค. ํ์ง๋ง ์์ ์์์ฒ๋ผ ์ ์ ์ธ ์ด๋ฆ์ผ๋ก ์๋ก์ด ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ, ์ด ์ฝ๋์์๋ 3๊ณผ 4๋จ๊ณ์์ ์์ฑํ ๋ฌธ์์ด ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ด๋ฆ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ์์ต๋๋ค. ๋ณ์ ์ด๋ฆ์ด ์ด ์ด๋ฆ์ผ๋ก ํ๊ฐ๋ ์ ์๋๋ก !!! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํ๋ฅผ ํด์ ํ๊ณ ์์ต๋๋ค.
if (i == 1) { df_lag <- df_tmp }. - ์ด๊ฒ์ด ๋ฃจํ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ธ ๊ฒฝ์ฐ df_lag ๋ฐ์ดํฐ ํ๋ ์์ df_tmp์ ๋์ผํ๊ฒ ์ค์ ๋๋ค.
else { df_lag <- cbind(df_lag, df_tmp[c(col_name_1, col_name_2)]) } - ๋ฃจํ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ด ์๋ ๊ฒฝ์ฐ, df_tmp ๋ฐ์ดํฐ ํ๋ ์์ cbind()๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด df_lag ๋ฐ์ดํฐ ํ๋ ์์ ์ถ๊ฐ๋๋ค. ํ์ง๋ง ์ด ์ฝ๋์์๋ ์์ ์์ฒ๋ผ ํน์ ์ด์ ์ ํํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ฆ์ด col_name_1๊ณผ col_name_2์ ๊ฐ๊ณผ ์ผ์นํ๋ ์ด์ ๋์ ์ผ๋ก ์ ํํ๋ค.
} - ์ฌ๊ธฐ์ for ๋ฃจํ๊ฐ ์ข ๋ฃ๋๋ค.
df_lag %>% drop_na(everything()) %>% arrange(sales_ymd) %>% slice(1:10) - ๋ฃจํ ๋ด์์ ์์ฑ๋ df_lag ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐ์ drop_na()๋ก ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ํ์ ์ญ์ ํ๊ณ , arrange ()๋ก sales_ymd์์ ํ์ ์ ๋ ฌํ๊ณ , slice()๋ก ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
์ด ์ฝ๋์ ๋ชฉ์ ์ df_lag๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๊ณ sales_ymd์ sum_amount ์ด์ ์ง๋ 3์ผ๊ฐ์ ๊ฐ ์ง์ฐ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด ์ฝ๋์์๋ ์ปฌ๋ผ ์ด๋ฆ์ ํ๋์ฝ๋ฉํ๋ ๋์ ์ปฌ๋ผ ์ด๋ฆ์ ๋์ ์ผ๋ก ์์ฑํ๋ค.
R-043: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)๋ฅผ ๊ฒฐํฉํ์ฌ ์ฑ๋ณ ์ฝ๋(gender_cd)์ ์ฐ๋ น(age์์ ๊ณ์ฐ)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ํฉ์ฐํ ๋งค์ถ ์์ฝ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ์ฑ๋ณ ์ฝ๋๋ 0์ ๋จ์ฑ, 1์ ์ฌ์ฑ, 9๋ ์ ์ ์์์ ๋ํ๋ธ๋ค.
๋จ, ํญ๋ชฉ ๊ตฌ์ฑ์ ์ฐ๋ น, ์ฌ์ฑ ๋งค์ถ๊ธ์ก, ๋จ์ฑ ๋งค์ถ๊ธ์ก, ๋จ์ฑ ๋งค์ถ๊ธ์ก, ์ฑ๋ณ ๋ฏธ์ ๋งค์ถ๊ธ์ก์ 4๊ฐ ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑํ๋ค(์ธ๋ก๋ก ์ฐ๋ น, ๊ฐ๋ก๋ก ์ฑ๋ณ ๊ต์ฐจ ์ง๊ณ). ๋ํ ์ฐ๋ น์ 10์ธ ๋จ์์ ๊ณ๊ธ์ผ๋ก ํ๋ค.
df_sales_summary <- df_customer[c("customer_id", "gender_cd", "age")] %>%
mutate(era = trunc(age / 10) * 10) %>%
inner_join(df_receipt, by = "customer_id") %>%
group_by(gender_cd, era) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
spread( gender_cd, sum_amount, fill = 0) %>%
rename(male = "0", female = "1", unknown = "9")
df_sales_summary
era | male | female | unknown |
---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> |
10 | 1591 | 149836 | 4317 |
20 | 72940 | 1363724 | 44328 |
30 | 177322 | 693047 | 50441 |
40 | 19355 | 9320791 | 483512 |
50 | 54320 | 6685192 | 342923 |
60 | 272469 | 987741 | 71418 |
70 | 13435 | 29764 | 2427 |
80 | 46360 | 262923 | 5111 |
90 | 0 | 6260 | 0 |
์ค๋ช :
์ด ์ฝ๋๋ df_customer์ df_receipt ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ๊ฐ์ ์ฑ๋ณ๊ณผ ์ฐ๋ น๋(์ฆ, 10์ธ)๋ณ ํ๋งค ๊ธ์ก ์์ฝ์ ์์ฑํ๋ค.
๋จผ์ df_customer์์ 3๊ฐ์ ์ด(customer_id, gender_cd, age)์ ์ ํํ๊ณ , age๋ฅผ ์ต๊ทผ 10๋ ์ผ๋ก ๋ฐ์ฌ๋ฆผํ์ฌ ์๋ก์ด ๋ณ์ era๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฐ ๋ค์ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ฒฐํฉํ์ฌ ๊ณ ๊ฐ์ ์ฑ๋ณ, ์ฐ๋ น, ํ๋งค ๊ธ์ก์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ค.
๊ทธ๋ฐ ๋ค์ ์ด ๋ฐ์ดํฐ๋ฅผ gender_cd์ era๋ก ๊ทธ๋ฃนํํ๊ณ summarise()๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋งค์ถ์ก์ ๊ณ์ฐํ๋ค.
spread()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒํ์ฌ ๊ฐ ์๋๋ณ๋ก ํ ์ค์ฉ, ๊ฐ ์ฑ๋ณ์ ๋งค์ถ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๋ํ๋ด๋ ์ด์ ์์ฑํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก rename()์ ์ฌ์ฉํ์ฌ ๋จ์ฑ, ์ฌ์ฑ, ์ฑ๋ณ ๋ฏธ์ง์ ์ ๋ํ๋ด๋ ์ด์ ์ข ๋ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ๋ถ์ธ๋ค.
๊ทธ ๊ฒฐ๊ณผ df_sales_summary๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋์ด ์ฑ๋ณ๊ณผ ์๋๋ณ ์ด ํ๋งค์ก์ ์์ฝํ ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋์์ต๋๋ค.
ย
R-044: 043์์ ๋ง๋ ๋งค์ถ ์์ฝ ๋ฐ์ดํฐ(df_sales_summary)๋ ์ฑ๋ณ ๋งค์ถ์ ๊ฐ๋ก๋ก ๋์ดํ ๋ฐ์ดํฐ์๋ค. ์ด ๋ฐ์ดํฐ์์ ์ฑ๋ณ์ ์ธ๋ก๋ก ๊ฐ์ ธ์์ ์ฐ๋ น, ์ฑ๋ณ ์ฝ๋, ๋งค์ถ ๊ธ์ก์ ์ธ ๊ฐ์ง ํญ๋ชฉ์ผ๋ก ๋ณํํ๋ผ. ๋จ, ์ฑ๋ณ ์ฝ๋๋ ๋จ์ฑ์ โ00โ, ์ฌ์ฑ์ โ01โ, ์ ์ ์์์ โ99โ๋ก ํ๋ค.
df_sales_summaryใ%>%
gather(key = gender_cd, value = sum_amount, male, female, unknown) %>%
mutate(gender_cd = case_when(
gender_cd == "male" ~ "00",
gender_cd == "female" ~ "01",
gender_cd == "unknown" ~ "99",
))
era | gender_cd | sum_amount |
---|---|---|
<dbl> | <chr> | <dbl> |
10 | 00 | 1591 |
20 | 00 | 72940 |
30 | 00 | 177322 |
40 | 00 | 19355 |
50 | 00 | 54320 |
60 | 00 | 272469 |
70 | 00 | 13435 |
80 | 00 | 46360 |
90 | 00 | 0 |
10 | 01 | 149836 |
20 | 01 | 1363724 |
30 | 01 | 693047 |
40 | 01 | 9320791 |
50 | 01 | 6685192 |
60 | 01 | 987741 |
70 | 01 | 29764 |
80 | 01 | 262923 |
90 | 01 | 6260 |
10 | 99 | 4317 |
20 | 99 | 44328 |
30 | 99 | 50441 |
40 | 99 | 483512 |
50 | 99 | 342923 |
60 | 99 | 71418 |
70 | 99 | 2427 |
80 | 99 | 5111 |
90 | 99 | 0 |
์ค๋ช :
์ด ์ฝ๋๋ ์ด์ ์ฝ๋ ๋ธ๋ก์์ ์์ฑ๋ df_sales_summary ๋ฐ์ดํฐ ํ๋ ์์ ์์ ํ๋ค.
gather() ํจ์๋ male, female, unknown ์ด์ sum_amount๋ผ๋ ํ๋์ ์ด๋ก ์ค์ฒฉํ์ฌ gender_cd๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๊ณ ์ด์ ์ด ์ด๋ฆ(male, female, unknown)์ ์ ์ฅํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ ํฌ๋งท์์ ๋กฑ ํฌ๋งท์ผ๋ก ๋ณํ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
mutate() ํจ์๋ gender_cd ์ปฌ๋ผ์ ๊ฐ์ ๋ค์ ์ฝ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด๋ case_when() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฐ์ ๊ฐ์ง ์๋ก์ด ์ด์ ์์ฑํ๋ค. "00"์ ๋จ์ฑ, "01"์ ์ฌ์ฑ, "99"๋ ์ฑ๋ณ์ ์ ์ ์๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ df_sales_summary ๋ฐ์ดํฐ ํ๋ ์์ ๊ธด ํ์์ผ๋ก ํฌ๋งทํ๊ณ ์ฑ๋ณ ๊ฐ์ ํ์ค ํ์์ผ๋ก ๋ค์ ์ฝ๋ฉํ์ฌ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ ์๊ณผ ๋ณํฉํ ์ค๋น๋ฅผ ํ๊ณ ์๋ค.
R-045: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์๋ ์์ผ(birth_day)์ ๋ ์งํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค. ์ด๋ฅผ YYYYMMDD ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๊ณ ๊ฐ ID(customer_id)์ ํจ๊ป 10๊ฑด ํ์ํ๋ผ.
df_tmp <- cbind(df_customer["customer_id"],
strftime(
df_customer$birth_day,
format = "%Y%m%d" ))
colnames(df_tmp) <- c("customer_id", "birth_day")
head(df_tmp,10)
ย | customer_id | birth_day |
---|---|---|
ย | <chr> | <chr> |
1 | CS021313000114 | 19810429 |
2 | CS037613000071 | 19520401 |
3 | CS031415000172 | 19761004 |
4 | CS028811000001 | 19330327 |
5 | CS001215000145 | 19950329 |
6 | CS020401000016 | 19740915 |
7 | CS015414000103 | 19770809 |
8 | CS029403000008 | 19730817 |
9 | CS015804000004 | 19310502 |
10 | CS033513000180 | 19620711 |
์ค๋ช :
์ด ์ฝ๋๋ df_customer ๋ฐ์ดํฐ ํ๋ ์์์ customer_id์ birth_day ์ด์ ์ ํํ์ฌ df_tmp๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํฉ๋๋ค.
df_customer["customer_id"] ๊ตฌ๋ฌธ์ customer_id ์ด์ ๋ฒกํฐ๊ฐ ์๋ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ์ ํํ๋๋ฐ, ์ด๋ cbind()๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด๊ณผ ๊ฒฐํฉํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
strftime() ํจ์๋ birth_day ์ด์ %Y%m%d ํ์์ ๋ฌธ์์ด๋ก ํฌ๋งทํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
connames() ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด ์ด๋ฆ์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด ์ด๋ฆ์ "customer_id"์ "birth_day"์ด๋ค.
๋ง์ง๋ง์ผ๋ก head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_tmp ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10์ค์ ํ์ํฉ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ๊ณ ๊ฐ ID์ ์์ผ์ ๊ธฐ์ค์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ ์๊ณผ ๋ณํฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ ๊ฐ์ ์ด์ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๊ณ ์์ต๋๋ค.
ย
R-046: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ ์ฒญ์ผ(application_date)์ YYYYMMDD ํ์์ ๋ฌธ์์ด ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค. ์ด๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ ๊ณ ๊ฐ ID(customer_id)์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ผ.
df_tmp <- cbind(df_customer["customer_id"],
strptime(df_customer$application_date, "%Y%m%d"))
colnames(df_tmp) <- c("customer_id", "application_date")
head(df_tmp, 10)
ย | customer_id | application_date |
---|---|---|
ย | <chr> | <dttm> |
1 | CS021313000114 | 2015-09-05 |
2 | CS037613000071 | 2015-04-14 |
3 | CS031415000172 | 2015-05-29 |
4 | CS028811000001 | 2016-01-15 |
5 | CS001215000145 | 2017-06-05 |
6 | CS020401000016 | 2015-02-25 |
7 | CS015414000103 | 2015-07-22 |
8 | CS029403000008 | 2015-05-15 |
9 | CS015804000004 | 2015-06-07 |
10 | CS033513000180 | 2015-07-28 |
์ค๋ช :
์ด ์ฝ๋๋ df_customer ๋ฐ์ดํฐ ํ๋ ์์์ customer_id์ application_date ์ด์ ์ ํํ์ฌ df_tmp๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ค.
df_customer["customer_id"] ๊ตฌ๋ฌธ์ customer_id ์ด์ ๋ฒกํฐ๊ฐ ์๋ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ์ ํํ๋ค.
strptime() ํจ์๋ application_date ์ด์ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, application_date ์ด์ ์ฐ, ์, ์ผ์ 8์๋ฆฌ ์ซ์๋ก ํํํ๋ %Y%m%d ํ์์ ๋ฌธ์์ด์ R์์ ๋ ์ง์ ์๊ฐ์ ํํํ๋ POSIXlt ํด๋์ค ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
connames() ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด ์ด๋ฆ์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด ์ด๋ฆ์ 'customer_id'์ 'application_date'๋ก ์ง์ ํ๋ค.
๋ง์ง๋ง์ผ๋ก head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_tmp ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10์ค์ ํ์ํ๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ๋ ๊ฐ์ ์ด์ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๊ณ ๊ณ ๊ฐ ID์ ์ ์ฒญ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ ์๊ณผ ๊ฒฐํฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค.
R-047: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(sales_ymd)์ YYYYMMDD ํ์์ ์ซ์ํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค. ์ด๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ ์์์ฆ ๋ฒํธ(receipt_no), ์์์ฆ ํ์๋ฒํธ(receipt_sub_no)์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ผ.
df_tmp <- cbind(df_receipt[c("receipt_no", "receipt_sub_no")], strptime(as.character(df_receipt$sales_ymd), "%Y%m%d"))
colnames(df_tmp) <- c("receipt_no", "receipt_sub_no", "sales_ymd")
head(df_tmp, 10)
ย | receipt_no | receipt_sub_no | sales_ymd |
---|---|---|---|
ย | <int> | <int> | <dttm> |
1 | 112 | 1 | 2018-11-03 |
2 | 1132 | 2 | 2018-11-18 |
3 | 1102 | 1 | 2017-07-12 |
4 | 1132 | 1 | 2019-02-05 |
5 | 1102 | 2 | 2018-08-21 |
6 | 1112 | 1 | 2019-06-05 |
7 | 1102 | 2 | 2018-12-05 |
8 | 1102 | 1 | 2019-09-22 |
9 | 1112 | 2 | 2017-05-04 |
10 | 1102 | 1 | 2019-10-10 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ receipt_no, receipt_sub_no, sales_ymd ์ด์ ์ ํํ๊ณ , sales_ymd ์ด์ yyyymmdd ํ์์ ์ ์์์ R์ ๋ ์ง์ ์๊ฐ์ ๋ํ๋ด๋ POSIXlt ํด๋์ค ๊ฐ์ฒด๋ก ๋ณํํ์ฌ df_tmp ๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํฉ๋๋ค.
df_receipt[c("receipt_no", "receipt_sub_no")] ๊ตฌ๋ฌธ์ cbind()์์ ๋ค๋ฅธ ์ด๊ณผ ๊ฒฐํฉํ๊ธฐ ์ํด ํ์ํ receipt_no์ receipt_sub_no ์ด์ ๋ฒกํฐ๊ฐ ์๋ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ์ ํํฉ๋๋ค. ์ ๋๋ค.
as.character()๋ strptime() ํจ์์ ์ ๋ฌํ๊ธฐ ์ ์ sales_ymd ์ปฌ๋ผ์ ์ ์์์ ๋ฌธ์ ๋ฒกํฐ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
strptime() ํจ์๋ ๋ฌธ์ ๋ฒกํฐ sales_ymd๋ฅผ R์ ๋ ์ง์ ์๊ฐ์ ๋ํ๋ด๋ POSIXlt ํด๋์ค ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
colnames() ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด ์ด๋ฆ์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด ์ด๋ฆ์ "receive_no", "receipt_sub_no", "sales_ymd"๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_tmp ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10์ค์ ํ์ํ๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ์์์ฆ ๋ฒํธ, ์์์ฆ ํ์ ๋ฒํธ ๋๋ ํ๋งค ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ ์๊ณผ ๋ณํฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ 3๊ฐ์ ์ด์ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ค.
R-048: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ์ํฌํฌ ์ด(sales_epoch)๋ ์ซ์ํ UNIX ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค. ์ด๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ ์์์ฆ ๋ฒํธ(receipt_no), ์์์ฆ ์๋ธ๋ฒํธ(receipt_sub_no)์ ํจ๊ป 10๊ฑด์ ํ์ํ๋ผ.
df_tmp <- cbind(df_receipt[c("receipt_no", "receipt_sub_no")], as.POSIXct(df_receipt$sales_epoch, origin="1970-01-01"))
colnames(df_tmp) <- c("receipt_no", "receipt_sub_no", "sales_ymd")
head(df_tmp, 10)
ย | receipt_no | receipt_sub_no | sales_ymd |
---|---|---|---|
ย | <int> | <int> | <dttm> |
1 | 112 | 1 | 2018-11-03 |
2 | 1132 | 2 | 2018-11-18 |
3 | 1102 | 1 | 2017-07-12 |
4 | 1132 | 1 | 2019-02-05 |
5 | 1102 | 2 | 2018-08-21 |
6 | 1112 | 1 | 2019-06-05 |
7 | 1102 | 2 | 2018-12-05 |
8 | 1102 | 1 | 2019-09-22 |
9 | 1112 | 2 | 2017-05-04 |
10 | 1102 | 1 | 2019-10-10 |
์ค๋ช :
์ด ์ฝ๋๋ ์๋ณธ ๋ฐ์ดํฐ ํ๋ ์ df_receipt์์ ์ ํํ ์ด์ ๊ฒฐํฉํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_tmp๋ฅผ ์์ฑํ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก df_receipt์์ "receive_no", "receipt_sub_no", "sales_epoch" ์ด์ ์ ํํ๊ณ cbind()๋ผ๋ ํจ์๋ก ๊ฒฐํฉํ๊ณ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์ด์ธ "sales_epoch"์๋ ์ ๋์ค์ ์ํฌํฌ๋ก ์๋ ค์ง 1970๋ 1์ 1์ผ๋ถํฐ์ ์ด ๋จ์๊ฐ ์ ์ฅ๋์ด ์๋ค. ๋ค์์ผ๋ก as.POSIXct() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์น๋ฅผ R์ ๋ ์ง์ ์๊ฐ์ ๋ํ๋ด๋ POSIXct ๊ฐ์ฒด๋ก ๋ณํํ๋ค. ์ธ์์ origin์๋ ์ํฌํฌ๊ฐ 1970๋ 1์ 1์ผ 0์๋ถํฐ ์์๋จ์ ๋ํ๋ด๋ '1970-01-01'์ด ์ค์ ๋์ด ์๋ค.
๋ง์ง๋ง์ผ๋ก colnames() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_tmp์ ์ด ์ด๋ฆ์ ๊ฐ๊ฐ "receive_no", "receipt_sub_no", "sales_ymd"๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ ๊ฒฐ๊ณผ, df_tmp์ ๋ฐ์ดํฐ ํ๋ ์์๋ df_receipt์ ๋์ผํ ๋ ๊ฐ์ ์ด("receive_no", "receive_sub_no")๊ณผ "sales_epoch"์์ ๋ณํํ ๋ ์ง์ ์๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ก์ด ์ด "sales_ymd"๊ฐ ํฌํจ๋์ด ์๋ค. tmp์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๊ธฐ ์ํด head() ํจ์๊ฐ ์ฌ์ฉ๋์๋ค.
R-049: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ์ํฌํฌ ์ด(sales_epoch)๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ โ์ฐ๋โ๋ง ์ถ์ถํ์ฌ ์์์ฆ ๋ฒํธ(receipt_no), ์์์ฆ ํ์ ๋ฒํธ(receipt_sub_no)์ ํจ๊ป 10๊ฑด ํ์ํ๋ผ.
df_tmp <- cbind(df_receipt[c("receipt_no", "receipt_sub_no")], substring(as.POSIXct(df_receipt$sales_epoch, origin = "1970-01-01"), 1, 4))
colnames(df_tmp) <- c("receipt_no", "receipt_sub_no", "sales_year")
head(df_tmp, 10)
ย | receipt_no | receipt_sub_no | sales_year |
---|---|---|---|
ย | <int> | <int> | <chr> |
1 | 112 | 1 | 2018 |
2 | 1132 | 2 | 2018 |
3 | 1102 | 1 | 2017 |
4 | 1132 | 1 | 2019 |
5 | 1102 | 2 | 2018 |
6 | 1112 | 1 | 2019 |
7 | 1102 | 2 | 2018 |
8 | 1102 | 1 | 2019 |
9 | 1112 | 2 | 2017 |
10 | 1102 | 1 | 2019 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ ์ธ ๊ฐ์ ์ด์ ๊ฒฐํฉํ์ฌ df_tmp๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ค. ์ฒ์ ๋ ์ด์ธ receive_no์ receive_sub_no๋ df_receipt์์ ์ง์ ์ ํ๋ฉ๋๋ค.
์ธ ๋ฒ์งธ ์ด์ธ sales_year๋ sales_epoch ์ด์ ๋ ์ง/์๊ฐ ํ์์ผ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ as.POSIXct()์ ์ถ๋ ฅ์์ ์ฒ์ 4๊ธ์๋ฅผ ์ถ์ถํ๋ substring() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ค.
as.POSIXct() ํจ์๋ origin ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋์ค ์ํฝ ์๊ฐ(1970-01-01)์ ๊ธฐ์ค์ ์ผ๋ก ์ฌ์ฉํ๋๋ก ์ง์ ํ๋ค. ๋ค์์ผ๋ก substring() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ ์ง/์๊ฐ ํ์์์ ์ฐ๋๋ฅผ ์ถ์ถํ๊ณ ์๋ค.
๋ง์ง๋ง์ผ๋ก colnames()๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ํด๋น ์ด์ "receive_no", "receipt_sub_no", "sales_year"๋ผ๋ ์ด ์ด๋ฆ์ ํ ๋นํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒซ 10๊ฐ์ ํ์ ํ์ํฉ๋๋ค.
R-050: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ์ํฌํฌ ์ด(sales_epoch)๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ โ์โ๋ง ์ถ์ถํ์ฌ ์์์ฆ ๋ฒํธ(receipt_no), ์์์ฆ ํ์ ๋ฒํธ(receipt_sub_no)์ ํจ๊ป 10๊ฑด์ ํ์ํ๋ค. ๋จ, โ์โ์ 0์ผ๋ก ์ฑ์์ง 2์๋ฆฌ๋ก ์ถ์ถํ๋ค.
df_tmp <- cbind(df_receipt[c("receipt_no", "receipt_sub_no")], substring(as.POSIXct(df_receipt$sales_epoch, origin = "1970-01-01"), 6, 7))
colnames(df_tmp) <- c("receipt_no", "receipt_sub_no", "sales_ymd")
head(df_tmp, 10)
ย | receipt_no | receipt_sub_no | sales_ymd |
---|---|---|---|
ย | <int> | <int> | <chr> |
1 | 112 | 1 | 11 |
2 | 1132 | 2 | 11 |
3 | 1102 | 1 | 07 |
4 | 1132 | 1 | 02 |
5 | 1102 | 2 | 08 |
6 | 1112 | 1 | 06 |
7 | 1102 | 2 | 12 |
8 | 1102 | 1 | 09 |
9 | 1112 | 2 | 05 |
10 | 1102 | 1 | 10 |
์ค๋ช :
์ด ์ฝ๋์์๋ "receive_no", "receipt_sub_no", "sales_ymd" ์ด์ ํฌํจํ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_tmp๋ฅผ ์์ฑํ๋ฉฐ, "sales_ymd" ์ด์ df_receipt์ "sales_epoch" ์ด์์ ํ์๋ ๊ฒ์ด๋ค.
๊ตฌ์ฒด์ ์ผ๋ก substring() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์น๋ฅผ 6(์ ์ฑ๋ถ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ํด๋น), ๋ ์์น๋ฅผ 7(์ ์ฑ๋ถ์ ๋ง์ง๋ง ๋ฌธ์์ ํด๋น)๋ก ์ค์ ํ์ฌ "sales_epoch" ์ปฌ๋ผ์์ ์ ์ฑ๋ถ์ ์ถ์ถํ๋ค. ์ด ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ํ๋งค์ผ ์์ ๋ํ๋ธ๋ค.
์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_tmp๋ df_receipt์์ ์ ํํ ์ด์ cbind() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ถํ ์ ์ฑ๋ถ๊ณผ ๊ฒฐํฉํ์ฌ ์์ฑ๋๋ค. ๋ง์ง๋ง์ผ๋ก df_tmp์ ์ปฌ๋ผ ์ด๋ฆ์ด "receive_no", "receipt_sub_no", "sales_ymd"๋ก ๊ฐฑ์ ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ df_receipt์ "sales_epoch" ์ด์์ ๊ฐ ํ๋งค์ผ์ ์์ ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_tmp์ "sales_ymd"๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ์ด๋ก ์ถ๊ฐํ๋ค.
ย
R-051: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ์ํฌํฌ ์ด๋ฅผ ๋ ์งํ์ผ๋ก ๋ณํํ์ฌ โ์ผโ๋ง ์ถ์ถํ์ฌ ์์์ฆ ๋ฒํธ(receipt_no), ์์์ฆ ํ์ ๋ฒํธ(receipt_sub_no)์ ํจ๊ป 10๊ฑด ํ์ํ๋ค. ๋จ, โ์ผโ์ 0์ผ๋ก ์ฑ์์ง 2์๋ฆฌ๋ก ์ถ์ถํ๋ค.
df_tmp <- cbind(df_receipt[c("receipt_no", "receipt_sub_no")], substring(as.POSIXct(df_receipt$sales_epoch, origin = "1970-01-01"), 9, 10))
colnames(df_tmp) <- c("receipt_no", "receipt_sub_no", "sales_day")
head(df_tmp, 10)
ย | receipt_no | receipt_sub_no | sales_day |
---|---|---|---|
ย | <int> | <int> | <chr> |
1 | 112 | 1 | 03 |
2 | 1132 | 2 | 18 |
3 | 1102 | 1 | 12 |
4 | 1132 | 1 | 05 |
5 | 1102 | 2 | 21 |
6 | 1112 | 1 | 05 |
7 | 1102 | 2 | 05 |
8 | 1102 | 1 | 22 |
9 | 1112 | 2 | 04 |
10 | 1102 | 1 | 10 |
์ค๋ช :
์ด ์ฝ๋์์๋ "receive_no", "receive_sub_no", "sales_day"๋ผ๋ ์ธ ๊ฐ์ ์ด์ ๊ฐ์ง df_tmp๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๊ณ , "receive_no"์ "receive_sub_no" ์ด์ "df_receipt" ๋ฐ์ดํฐ ํ๋ ์์์ ๋ณต์ฌํ ๊ฒ์ ๋๋ค. receipt" ๋ฐ์ดํฐ ํ๋ ์์์ ๋ณต์ฌํ ๊ฒ์ด๋ฉฐ, sales_day ์ปฌ๋ผ์ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ sales_epoch ์ปฌ๋ผ์์ ๋ ์ง๋ฅผ ์ถ์ถํ์ฌ ์์ฑํ๋ค.
sales_epoch" ์ปฌ๋ผ์ ๋จผ์ as.POSIXct ํจ์๋ฅผ ์ฌ์ฉํ์ฌ POSIXct ๊ฐ์ฒด๋ก ๋ณํํ๊ณ ์์ ์ "1970-01-01"๋ก ์ค์ ํ๋ค. ์ด๋ ์ ๋์ค ํ์์คํฌํ(1970๋ 1์ 1์ผ๋ถํฐ์ ์ด ๋จ์)๋ฅผ R์ datetime ํ์์ผ๋ก ๋ณํํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋ฐ ๋ค์ substring ํจ์๋ฅผ ์ฌ์ฉํ์ฌ datetime ๊ฐ์ฒด์ day ๋ถ๋ถ์ ์ถ์ถํฉ๋๋ค. substring ํจ์๋ ์ ๋ ฅ ๋ฌธ์์ด, ๋ถ๋ถ ๋ฌธ์์ด์ ์์ ์์น, ๋ถ๋ถ ๋ฌธ์์ด์ ๋ ์์น๋ผ๋ ์ธ ๊ฐ์ง ์ธ์๋ฅผ ์ทจํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ถ๋ถ ๋ฌธ์์ด์ 9๋ฒ ์์น(datetime ๋ฌธ์์ด์ ์์ผ ๋ถ๋ถ)์์ ์์ํ์ฌ 10๋ฒ ์์น์์ ๋๋๋ค.
๋ง์ง๋ง์ผ๋ก colnames ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ด๋ฆ์ 'recipate_no', 'recipate_sub_no', 'sales_day'๋ก ์ ๋ฐ์ดํธํ๊ณ ์๋ค. ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์ df_tmp์๋ ์ฒ์ 10ํ์ ๋ฐ์ดํฐ ์ค "receive_no", "receipt_sub_no", "sales_day" ์ด์ด ํ์๋์ด ์๋ค.
R-052: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ํฉ์ฐํ ํ, ๋งค์ถ ๊ธ์ก ์ดํฉ์ ๋ํด 2,000์ ์ดํ๋ฅผ 0, 2,000์๋ณด๋ค ํฐ ๊ธ์ก์ 1๋ก ์ด๋ถํํ์ฌ ๊ณ ๊ฐ ID, ๋งค์ถ ๊ธ์ก ์ดํฉ๊ณผ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
df_receipt %>%
filter(!grepl("^Z", customer_id)) %>%
group_by(customer_id) %>%
summarise(sum_amount=sum(amount), .groups = "drop") %>%
mutate(sales_flg = ifelse(sum_amount > 2000, 1, 0))ใ%>%
slice(1:10)
customer_id | sum_amount | sales_flg |
---|---|---|
<chr> | <int> | <dbl> |
CS001113000004 | 1298 | 0 |
CS001114000005 | 626 | 0 |
CS001115000010 | 3044 | 1 |
CS001205000004 | 1988 | 0 |
CS001205000006 | 3337 | 1 |
CS001211000025 | 456 | 0 |
CS001212000027 | 448 | 0 |
CS001212000031 | 296 | 0 |
CS001212000046 | 228 | 0 |
CS001212000070 | 456 | 0 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
customer_id ์ปฌ๋ผ์ด "Z"๋ก ์์ํ๋ ๋ชจ๋ ํ์ ํํฐ๋งํฉ๋๋ค.
๋๋จธ์ง ํ์ customer_id๋ก ๊ฒ์ํฉ๋๋ค.
๊ฐ customer_id์ ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค.
๊ธ์ก ์ด์ ํฉ๊ณ๊ฐ 2000๋ณด๋ค ํฌ๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ผ๋ก ์ค์ ๋๋ ์๋ก์ด ์ด sales_flg๋ฅผ ์์ฑํ๋ค.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํฉ๋๋ค.
์ฐ์ฐ์ '%>%'๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ฅผ ์ฐ์์ ์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์์ต๋๋ค.
์๋์์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
filter(!grepl("^Z", customer_id)): filter() ํจ์๋ customer_id ์ด์ด "Z"๋ก ์์ํ๋ ๋ชจ๋ ํ์ ์ญ์ ํ๊ณ grepl() ํจ์๋ customer_id ์ด์ ๊ฐ ์์๊ฐ ^Z ํจํด๊ณผ ์ผ์นํ์ง ์๋์ง(์ฆ, "Z"๋ก ์์ํ์ง ์๋์ง)๋ฅผ ๋ํ๋ด๋ ๋ ผ๋ฆฌ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. Z'๋ก ์์ํ์ง ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ ผ๋ฆฌ ๋ฒกํฐ๋ฅผ ๋ฐํํ๋ค. ์ฐ์ฐ์ ! ์ฐ์ฐ์๋ ๋ ผ๋ฆฌ ๋ฒกํฐ๋ฅผ ๋ถ์ ํ๋ฏ๋ก filter()๋ ๋ฒกํฐ๊ฐ TRUE์ธ ํ๋ง ์ ์งํ๋ค.
group_by(customer_id): group_by() ํจ์๋ ๋๋จธ์ง ํ์ customer_id๋ก ๊ทธ๋ฃนํํ๋ค.
summarise(sum_amount=sum(๊ธ์ก), .groups = "drop"): summarise() ํจ์๋ ๊ฐ ๊ณ ๊ฐ ID์ amount ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ sum_amount๋ผ๋ ์๋ก์ด ์ด์ ์ ์ฅํ๋ค. .groups = "drop" ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ฝํ ํ ๊ทธ๋ฃนํ ๊ตฌ์กฐ๋ฅผ ์ญ์ ํ๋๋ก summarise()์ ์ง์ํ๋ค.
mutate(sales_flg = ifelse(sum_amount > 2000, 1, 0)): mutate() ํจ์๋ sales_flg๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๊ณ sum_amount ์ด์ด 2000๋ณด๋ค ํฌ๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ผ๋ก ์ค์ ํ๋ค. ํ์ค if.... .else ๋ฌธ์ฅ์ ๋ฒกํฐํ ๋ฒ์ ์ผ๋ก, ์กฐ๊ฑด ๋ฒกํฐ์ ๋์ผํ ๊ธธ์ด์ ๋ฒกํฐ๋ฅผ ๋ฐํํ๋ฉฐ, ์กฐ๊ฑด ๋ฒกํฐ์ ์์๊ฐ TRUE์ธ์ง FALSE์ธ์ง์ ๋ฐ๋ผ yes ๋๋ no ๋ฒกํฐ ์ค ํ๋์ ์์๊ฐ ์ ํ๋๋ค.
slice(1:10) : slice() ํจ์๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
ย
R-053: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ฐํธ๋ฒํธ(postal_cd)์ ๋ํด ๋์ฟ(์ 3์๋ฆฌ๊ฐ 100~209์ธ ๊ฒ)๋ฅผ 1, ๊ทธ ์ธ์ ๊ฒ์ 0์ผ๋ก ์ด์งํํ๋ผ. ๋ํ ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๊ฒฐํฉํ์ฌ ์ ์ฒด ๊ธฐ๊ฐ ๋์ ๋งค์ถ ์ค์ ์ด ์๋ ๊ณ ๊ฐ ์๋ฅผ ์์ฑํ ์ดํญ๋์๋ณ๋ก ๊ณ์ฐํ๋ผ.
df_customer[c("customer_id", "postal_cd")] %>%
mutate(postal_flg =
ifelse(100 <= as.integer(str_sub(postal_cd, start = 1, end = 3))
& as.integer(str_sub(postal_cd, start = 1, end = 3)) <= 209, 1, 0)) %>% inner_join(df_receipt, by = "customer_id") %>%
group_by(postal_flg) %>%
summarise(customer_cnt = n_distinct(customer_id), .groups = "drop")
postal_flg | customer_cnt |
---|---|
<dbl> | <int> |
0 | 3906 |
1 | 4400 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
๋ฐ์ดํฐ ํ๋ ์ df_customer์์ "customer_id"์ "postal_cd" ์ด์ ์ ํํ๋ค.
"postal_cd"์ ์ฒซ 3๊ธ์๊ฐ 100์์ 209 ์ฌ์ด์ ์ฐํธ๋ฒํธ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ 1, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ผ๋ก ์ค์ ๋๋ ์๋ก์ด ์ด "postal_flg"๋ฅผ ์์ฑํ๋ค. ์ด ๊ฒ์ฌ์๋ ifelse ํจ์๊ฐ ์ฌ์ฉ๋๋ค.
์์ ๋ df_customer ๋ฐ์ดํฐ ํ๋ ์๊ณผ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ "customer_id" ์ด๋ก ๊ฒฐํฉํ๋ค.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ "postal_flg" ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ๋ค.
n_distinct ํจ์๋ฅผ ์ฌ์ฉํ์ฌ "postal_flg"์ ๊ฐ ๊ฐ์ ๋ํ ๊ณ ์ ํ ๊ณ ๊ฐ ID ์๋ฅผ ๊ณ์ฐํ๋ค.
์ธ์ ".groups = 'drop'"์ผ๋ก ๊ทธ๋ฃนํ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ค.
postal_flg"์ "customer_cnt" ์ด์ด ์๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐํํ๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ df_receipt์ ํฌํจ๋ ์ฐํธ๋ฒํธ๊ฐ 100~209 ๋ฒ์์ ์๋ ๊ณ ๊ฐ ์๋ฅผ ํด๋น ๋ฒ์์ ์ฐํธ๋ฒํธ๊ฐ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๊ทธ๋ฃนํํ์ฌ ๊ณ์ฐํ๋ค.
R-054: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ฃผ์(address)๋ ์ฌ์ดํ๋งํ, ์ง๋ฐํ, ๋์ฟ๋, ๊ฐ๋๊ฐ์ํ ์ค ํ๋์ด๋ค. ๋๋๋ถํ๋ณ๋ก ์ฝ๋ ๊ฐ์ ์์ฑํ์ฌ ๊ณ ๊ฐ ID, ์ฃผ์์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ผ. ๊ฐ์ ์ฌ์ดํ๋งํ์ 11, ์ง๋ฐํ์ 12, ๋์ฟ๋๋ฅผ 13, ๊ฐ๋๊ฐ์ํ์ 14๋ก ํ๋ค.
# ์ฝ๋ ์์ 1 (๊ณ ์ ์ผ๋ก ์๋ผ๋ด๊ธฐ)
df_customer %>%
mutate(prefecture_cd =
case_when(
str_sub(address, start = 1, end = 3) == "ๅผ็็" ~ "11",
str_sub(address, start = 1, end = 3) == "ๅ่็" ~ "12",
str_sub(address, start = 1, end = 3) == "ๆฑไบฌ้ฝ" ~ "13",
str_sub(address, start = 1, end = 3) == "็ฅๅฅๅท" ~ "14")) %>% select(customer_id, address, prefecture_cd) %>%
slice(1:10)
customer_id | address | prefecture_cd |
---|---|---|
<chr> | <chr> | <chr> |
CS021313000114 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | 14 |
CS037613000071 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS031415000172 | ๆฑไบฌ้ฝๆธ่ฐทๅบไปฃใ ๆจ********** | 13 |
CS028811000001 | ็ฅๅฅๅท็ๆจชๆตๅธๆณๅบๅๆณ็บ********** | 14 |
CS001215000145 | ๆฑไบฌ้ฝๅคง็ฐๅบไปฒๅ ญ้ท********** | 13 |
CS020401000016 | ๆฑไบฌ้ฝๆฟๆฉๅบ่ฅๆจ********** | 13 |
CS015414000103 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS029403000008 | ๅ่็ๆตฆๅฎๅธๆตทๆฅฝ********** | 12 |
CS015804000004 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS033513000180 | ็ฅๅฅๅท็ๆจชๆตๅธๆญๅบๅ้จ็บ********** | 14 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ํํฉ๋๋ค.
๋ฐ์ดํฐ ํ๋ ์ df_customer๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.
df_customer ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด prefecture_cd๋ฅผ ์์ฑํ๋ค.
prefecture_cd ์ด์ ๊ฐ์ address ์ด์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
์ฃผ์๋์ ์ฒซ 3๊ธ์๊ฐ "์ฌ์ดํ๋งํ"์ด๋ผ๋ฉด prefecture_cd ์ด์ ๊ฐ์ "11"๋ก ์ค์ ๋๋ค.
์ฃผ์๋์ ์ฒซ 3๊ธ์๊ฐ "์น๋ฐํ"์ธ ๊ฒฝ์ฐ, prefecture_cd๋์ ๊ฐ์ "12"๋ก ์ค์ ๋๋ค.
์ฃผ์๋์ ์ฒซ 3๊ธ์๊ฐ "๋์ฟ๋"์ธ ๊ฒฝ์ฐ, prefecture_cd๋์ ๊ฐ์ "13"์ผ๋ก ์ค์ ๋๋ค.
์ฃผ์ ์ปฌ๋ผ์ ์ฒซ 3๊ธ์๊ฐ "๊ฐ๋๊ฐ์"์ธ ๊ฒฝ์ฐ, prefecture_cd ์ปฌ๋ผ์ ๊ฐ์ "14"๋ก ์ค์ ๋๋ค.
customer_id, address, prefecture_cd์ ๊ฐ ์ปฌ๋ผ์ด ์ถ๋ ฅ ๋์์ผ๋ก ์ ํ๋๋ค.
slice(1:10) ํจ์๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
ย
# ์ฝ๋ ์์ 2 (์ ๊ท ํํ์ ์ฌ์ฉ)
df_customer %>%
mutate(prefecture_cd =
case_when(
str_extract(address, pattern = "^.*?[้ฝ้ๅบ็]") == "ๅผ็็" ~ "11",
str_extract(address, pattern = "^.*?[้ฝ้ๅบ็]") == "ๅ่็" ~ "12",
str_extract(address, pattern = "^.*?[้ฝ้ๅบ็]") == "ๆฑไบฌ้ฝ" ~ "13",
str_extract(address, pattern = "^.*?[้ฝ้ๅบ็]") == "็ฅๅฅๅท็" ~ "14")) %>% select(customer_id, address, prefecture_cd) %>%
slice(1:10)
customer_id | address | prefecture_cd |
---|---|---|
<chr> | <chr> | <chr> |
CS021313000114 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | 14 |
CS037613000071 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS031415000172 | ๆฑไบฌ้ฝๆธ่ฐทๅบไปฃใ ๆจ********** | 13 |
CS028811000001 | ็ฅๅฅๅท็ๆจชๆตๅธๆณๅบๅๆณ็บ********** | 14 |
CS001215000145 | ๆฑไบฌ้ฝๅคง็ฐๅบไปฒๅ ญ้ท********** | 13 |
CS020401000016 | ๆฑไบฌ้ฝๆฟๆฉๅบ่ฅๆจ********** | 13 |
CS015414000103 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS029403000008 | ๅ่็ๆตฆๅฎๅธๆตทๆฅฝ********** | 12 |
CS015804000004 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | 13 |
CS033513000180 | ็ฅๅฅๅท็ๆจชๆตๅธๆญๅบๅ้จ็บ********** | 14 |
์ค๋ช :
์ด ์ฝ๋๋ R์ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ df_customer ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด prefecture_cd๋ฅผ ์์ฑํ๊ณ , ์ผ๋ณธ ๋๋๋ถํ์ ํ์ ์งํฉ์ ๋ํด ๋๋๋ถํ ์ด๋ฆ๊ณผ ๋๋๋ถํ ์ฝ๋๋ฅผ ๋์์ํจ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ปฌ๋ผ์ ์ถ๊ฐํ๋ mutate() ํจ์์ ์ ๊ท ํํ์ ํจํด ๋งค์นญ์ ๋ฐ๋ผ ๋๋๋ถํ ์ด๋ฆ๊ณผ ์ฝ๋๋ฅผ ๋์์ํค๋ case_when() ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ค์์ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ค๋ช ํฉ๋๋ค.
df_customer %>% df_customer ๋ฐ์ดํฐ ํ๋ ์์ ์ ๋ ฅ์ผ๋ก ํ์ดํ๋ผ์ธ์ ์์ํฉ๋๋ค.
mutate(prefecture_cd = ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด prefecture_cd๋ฅผ ์์ฑํฉ๋๋ค.
case_when( ๋๋๋ถํ ์ด๋ฆ๊ณผ ์ฝ๋๋ฅผ ๋์์ํค๊ธฐ ์ํ ์ผ๋ จ์ ์กฐ๊ฑด์ ์์ํฉ๋๋ค.
str_extract(address, pattern = "^. *? [้ฝ้ๅบ็]") == "ๅผ็็" ~ "11", ์ ๊ท ํํ์ ํจํด "^. *? [๋๋๋ถํ]"์ ๋งค์นญํ์ฌ ์ฃผ์์ด์์ ๋๋๋ถํ ์ด๋ฆ์ ์ถ์ถํ๊ณ , "์ฌ์ดํ๋งํ"์ "11"์ ๋์์ํจ๋ค.
str_extract(address, pattern = "^. *? [็ธฃ]") == "์น๋ฐํ" ~ "12", "์น๋ฐํ"์ ๋ํด์๋ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ "12"์ ๋งคํํ๋ค.
str_extract(address, pattern = "^. *? [๋๋๋ถํ]") == "๋์ฟ๋" ~ "13", "๋์ฟ๋"์ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ์ฌ "13"์ ๋์์ํจ๋ค.
str_extract(address, pattern = "^. *? [้ฝ้ๅบ็]") == "๊ฐ๋๊ฐ์ํ" ~ "14"))๋ "๊ฐ๋๊ฐ์ํ"๊ณผ ๋์ผํ๊ฒ "14"์ ๋์์ํค๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
select(customer_id, address, prefecture_cd)๋ ๋ฐ์ดํฐ ํ๋ ์์์ customer_id, address, prefecture_cd ์ด๋ง ์ ํํ๋ค.
slice(1:10)์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10ํ๋ง ์ ํํ๋ค.
R-055: ์์์ฆ ๋ช ์ธ์(df_receipt) ๋ฐ์ดํฐ์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ํฉ์ฐํ๊ณ , ๊ทธ ํฉ์ฐ ๊ธ์ก์ ์ฌ๋ถ์์๋ฅผ ๊ตฌํ์์ค. ๊ทธ ํ, ๊ณ ๊ฐ๋ณ ๋งค์ถ๊ธ์ก ํฉ๊ณ์ ๋ํด ์๋ ๊ธฐ์ค์ผ๋ก ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ ์์ฑํ์ฌ ๊ณ ๊ฐ ID, ๋งค์ถ๊ธ์ก ํฉ๊ณ์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ผ. ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ ์์๋๋ก 1~4๋ก ํ๋ค.
- ์ต์๊ฐ ์ด์ 1์ฌ๋ถ์์ ๋ฏธ๋ง ใปใปใป 1์ ๋ถ์ฌ
- 1์ฌ๋ถ์ ์ด์ 2์ฌ๋ถ์ ๋ฏธ๋ง ใปใปใป 2๋ฅผ ๋ถ์ฌ
- 2์ฌ๋ถ์ ์ด์ 3์ฌ๋ถ์ ๋ฏธ๋ง ใปใปใป 3์ ๋ถ์ฌ
- 3์ฌ๋ถ์ ์ด์ ใปใปใป 4์ ๋ถ์ฌ
df_receipt %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(pct_group = case_when(
sum_amount < quantile(sum_amount)[2] ~ "1",
sum_amount < quantile(sum_amount)[3] ~ "2",
sum_amount < quantile(sum_amount)[4] ~ "3",
quantile(sum_amount)[4] <= sum_amount ~ "4"
)) %>%
slice(1:10)
customer_id | sum_amount | pct_group |
---|---|---|
<chr> | <int> | <chr> |
CS001113000004 | 1298 | 2 |
CS001114000005 | 626 | 2 |
CS001115000010 | 3044 | 3 |
CS001205000004 | 1988 | 3 |
CS001205000006 | 3337 | 3 |
CS001211000025 | 456 | 1 |
CS001212000027 | 448 | 1 |
CS001212000031 | 296 | 1 |
CS001212000046 | 228 | 1 |
CS001212000070 | 456 | 1 |
์ค๋ช :
๋ณธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๋ฐ์ดํฐ ํ๋ ์ df_receipt๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
df_receipt์ ํ์ customer_id๋ก ๊ทธ๋ฃนํํฉ๋๋ค.
๋์ผํ customer_id๋ฅผ ๊ฐ์ง ๊ฐ ํ ๊ทธ๋ฃน์ ๋ํด sum() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ sum_amount๋ผ๋ ์ ์ด์ ์ ์ฅํ๋ค.
.groups = "drop"์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃนํ ๊ตฌ์กฐ๋ฅผ ์ญ์ ํ๋ค.
case_when() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ด pct_group์ ์์ฑํ๊ณ sum_amount ์ด์ ๊ฐ์ ๋ฐ๋ผ ๊ฐ ํ์ ์ฌ๋ถ์์(quintile number)์ ํ ๋นํ๋ค. ์ฌ๋ถ์ ์๋ quantile() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ์ฌ df_tmp๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์ ์ฅํ๋ค.
์๋ฅผ ๋ค์ด, quantile(sum_amount)์ด [100, 200, 300, 400]์ ๋ฐํํ๋ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ pct_group ์ด์ sum_amount๊ฐ 200 ๋ฏธ๋ง์ธ ํ์ '1', 200์์ 299๊น์ง์ ํ์ '2', 300์์ 399๊น์ง์ ํ์ '3', 400 ์ด์์ ํ์ '4'๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค. ์๋ '4'๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
R-056: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ๋์ด(age)๋ฅผ ๊ธฐ์ค์ผ๋ก 10์ธ ๋จ์๋ก ์ฐ๋ น์ ๊ณ์ฐํ์ฌ ๊ณ ๊ฐ ID(customer_id), ์๋ ์์ผ(birth_day)๊ณผ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ค. ๋จ, 60์ธ ์ด์์ ๋ชจ๋ 60๋ ์ด์์ผ๋ก ํ๋ค. ์ฐ๋ น์ ๋ํ๋ด๋ ์นดํ ๊ณ ๋ฆฌ ๋ช ์นญ์ ์์๋๋ก ํ๋ค.
# ์ฝ๋ ์์ 1
df_customer[c("customer_id", "birth_day", "age")] %>%
mutate(era = trunc(age / 10) * 10) %>%
mutate(era = case_when( era < 60 ~ era, era >= 60 ~ใ60 )) %>%
slice(1:10)
customer_id | birth_day | age | era |
---|---|---|---|
<chr> | <date> | <int> | <dbl> |
CS021313000114 | 1981-04-29 | 37 | 30 |
CS037613000071 | 1952-04-01 | 66 | 60 |
CS031415000172 | 1976-10-04 | 42 | 40 |
CS028811000001 | 1933-03-27 | 86 | 60 |
CS001215000145 | 1995-03-29 | 24 | 20 |
CS020401000016 | 1974-09-15 | 44 | 40 |
CS015414000103 | 1977-08-09 | 41 | 40 |
CS029403000008 | 1973-08-17 | 45 | 40 |
CS015804000004 | 1931-05-02 | 87 | 60 |
CS033513000180 | 1962-07-11 | 56 | 50 |
์ค๋ช :
์ด ์ฝ๋๋ ๊ณ ๊ฐ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ํ๋ ์ df_customer๋ฅผ ์กฐ์ํ๋ค. ์ด ์ฝ๋์์๋ customer_id, birth_day, age์ ์ธ ๊ฐ์ง ์ด์ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ ๊ณ ๊ฐ์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ค.
์ฒซ ๋ฒ์งธ mutate ํจ์๋ ๊ฐ ๊ณ ๊ฐ์ ๋์ด๋ฅผ 10์ผ๋ก ๋๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํ๊ณ ๊ทธ ์ ์์ 10์ ๊ณฑํ์ฌ ๋์ด๋ฅผ ๊ณ์ฐํ๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ค ๊ณ ๊ฐ์ ๋์ด๊ฐ 43์ธ๋ผ๋ฉด 40์ธ๊ฐ ๋๊ณ , 25์ธ์ธ ๊ณ ๊ฐ์ ๋์ด๋ 20์ธ๊ฐ ๋๋ค.
๋ ๋ฒ์งธ mutate ํจ์๋ 60 ์ด์์ era ๊ฐ์ 60์ผ๋ก ๋ฐ๊พผ๋ค. ์ด๋ 60์ธ ์ด์์ ๋ชจ๋ ๊ณ ๊ฐ์ ํ๋์ ์๋ ๋ฒ์ฃผ๋ก ๋ฌถ๊ธฐ ์ํด ์ํ๋ฉ๋๋ค.
์ด ๋ฐ์ดํฐ ํ๋ ์์๋ ๊ฐ ๊ณ ๊ฐ์ ๊ณ ๊ฐ ID, ์๋ ์์ผ, ์ฐ๋ น ๋ฐ ๊ณ์ฐ๋ ์ฐ๋ น์ด ํฌํจ๋์ด ์์ต๋๋ค.
# ์ฝ๋ ์์ 2(min ์ฌ์ฉ ์)
df_customer[c("customer_id", "birth_day","age")] %>%
mutate(era = sapply(1:nrow(df_customer),
function(x){
return (min(trunc(.[x, 3] / 10) * 10, 60))
})) %>%
slice(1:10)
customer_id | birth_day | age | era |
---|---|---|---|
<chr> | <date> | <int> | <dbl> |
CS021313000114 | 1981-04-29 | 37 | 30 |
CS037613000071 | 1952-04-01 | 66 | 60 |
CS031415000172 | 1976-10-04 | 42 | 40 |
CS028811000001 | 1933-03-27 | 86 | 60 |
CS001215000145 | 1995-03-29 | 24 | 20 |
CS020401000016 | 1974-09-15 | 44 | 40 |
CS015414000103 | 1977-08-09 | 41 | 40 |
CS029403000008 | 1973-08-17 | 45 | 40 |
CS015804000004 | 1931-05-02 | 87 | 60 |
CS033513000180 | 1962-07-11 | 56 | 50 |
์ค๋ช :
์ด ์ฝ๋๋ ์๋ ์์ผ๋ก๋ถํฐ ๊ฐ ๊ณ ๊ฐ์ '๋์ด'๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋๋ ๊ฐ ํ์ ์ฒ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
df_customer ๋ฐ์ดํฐ ํ๋ ์์์ "customer_id", "birth_day", "age" ์ปฌ๋ผ๋ง ์ ํํ๋ค.
mutate ํจ์๋ฅผ ์ฌ์ฉํ์ฌ "era"๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์ถ๊ฐํ๋ค. ์ด ์ปฌ๋ผ์ ๊ฐ์ "age"์ปฌ๋ผ์ 10์ผ๋ก ๋๋์ด ๊ณ์๋ฅผ ์ทจํ ํ (์ฆ, ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผ) 10์ ๊ณฑํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๋ น์ด ํจ๊ณผ์ ์ผ๋ก 10์ ๋ฐฐ์๋ก ๋ฐ์ฌ๋ฆผ๋์ด ๊ฐ ๊ณ ๊ฐ์ ๋๋ต์ ์ธ "๋์ด"๋ฅผ ๋ํ๋ ๋๋ค.
๋ค์ 'mutate' ํจ์๋ฅผ ์ฌ์ฉํ์ฌ era์ ๊ฐ์ ์กฐ์ ํฉ๋๋ค. era๊ฐ 60๋ณด๋ค ์์ผ๋ฉด ๊ทธ๋๋ก ๋๊ณ , 60๋ณด๋ค ํฌ๋ฉด 60์ผ๋ก ์ค์ ํฉ๋๋ค.
slice ํจ์๋ก ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10์ค์ ์ ํํ๋ค.
์ด ์ฝ๋์์๋ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ํ์ ๊ณ์ฐ์ ์ ์ฉํ๊ธฐ ์ํด "apply" ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ์ด ๋ฐฉ๋ฒ์ ํจ๊ณผ์ ์ด์ง๋ง ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฒฝ์ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค. ๋ณด๋ค ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋์ ๋ฒกํฐํ ๋ ์์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
R-057: 056์ ์ถ์ถ ๊ฒฐ๊ณผ์ ์ฑ๋ณ ์ฝ๋(gender_cd)์ ๋ฐ๋ผ ์ฑ๋ณร์ฐ๋ น์ ์กฐํฉ์ ๋ํ๋ด๋ ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ง๋ค์ด 10๊ฐ๋ฅผ ํ์ํ๋ผ. ์กฐํฉ์ ๋ํ๋ด๋ ์นดํ ๊ณ ๋ฆฌ์ ๊ฐ์ ์์๋ก ์ ํ๋ค.
# ์ฑ๋ณ ์ฝ๋ 1์๋ฆฌ์ ์ฐ๋ ์ฝ๋ 2์๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ ์ฑ์ฐ๋ น ์ฝ๋๋ฅผ ์์ฑํ๋ค.
df_customer[c("customer_id", "gender_cd", "birth_day", "age")] %>%
mutate(era = trunc(age / 10) * 10) %>%
mutate(era = case_when( era < 60 ~ formatC(era, width = 2,flag = "0"),
era >= 60 ~ใformatC(60, width = 2,flag = "0"))) %>%
mutate(gender_era = paste(gender_cd, era, sep = "")) %>%
slice(1:10)
customer_id | gender_cd | birth_day | age | era | gender_era |
---|---|---|---|---|---|
<chr> | <chr> | <date> | <int> | <chr> | <chr> |
CS021313000114 | 1 | 1981-04-29 | 37 | 30 | 130 |
CS037613000071 | 9 | 1952-04-01 | 66 | 60 | 960 |
CS031415000172 | 1 | 1976-10-04 | 42 | 40 | 140 |
CS028811000001 | 1 | 1933-03-27 | 86 | 60 | 160 |
CS001215000145 | 1 | 1995-03-29 | 24 | 20 | 120 |
CS020401000016 | 0 | 1974-09-15 | 44 | 40 | 040 |
CS015414000103 | 1 | 1977-08-09 | 41 | 40 | 140 |
CS029403000008 | 0 | 1973-08-17 | 45 | 40 | 040 |
CS015804000004 | 0 | 1931-05-02 | 87 | 60 | 060 |
CS033513000180 | 1 | 1962-07-11 | 56 | 50 | 150 |
์ค๋ช :
์ด ์ฝ๋๋ df_customer๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์กฐ์ํ๋ ์ฝ๋์ด๋ฉฐ, ์๋ง๋ ๊ณ ๊ฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ค์์ ๊ฐ ํ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_customer[c("customer_id", "gender_cd", "birth_day", "age")]: df_customer[c("customer_id", "gender_cd", "birth_day", "age")]: ๋ฐ์ดํฐ ํ๋ ์ df_customer customer์์ "customer_id", "gender_cd", "birth_day", "age" ์ด์ ์ ํํฉ๋๋ค.
%>%: ๋ฐ์ดํฐ ํ๋ ์์ ๋ค์ ์ฐ์ฐ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ์ดํ ์ฐ์ฐ์์ด๋ค.
mutate(era = trunc(age / 10) * 10). ์ด ์ด์ ๊ฐ ๊ณ ๊ฐ์ ๋์ด๋ฅผ 10์ผ๋ก ๋๋์ด ์์์ ์ดํ๋ฅผ ์๋ฅด๊ณ 10์ ๊ณฑํ์ฌ ๊ณ์ฐํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ ๊ฐ์ 10์ธ ๋ฒ์๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
mutate(era = case_when( era < 60 ~ formatC(era, width = 2,flag = "0"), era >= 60 ~ formatC(60, width = 2,flag = "0")))): case_when ๋ฌธ์ฅ์ ์ ์ฉํ์ฌ 'era' ์ปฌ๋ผ์ ๋ณ๊ฒฝํ์ฌ 60 ๋ฏธ๋ง์ 'era' ๊ฐ์ era' ๊ฐ์ ์์ 0์ด ํฌํจ๋ 2์๋ฆฌ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ (์: 10~19์ธ๋ '10'), 60 ์ด์์ 'era' ๊ฐ์ '60'์ผ๋ก ์ค์ ํฉ๋๋ค.
mutate(gender_era = paste(gender_cd, era, sep = "")): ๋ฐ์ดํฐ ํ๋ ์์ "gender_era"๋ผ๋ ์๋ก์ด ์ด์ ์ถ๊ฐํ๋ค." "gender_cd"์ "era" ์ด์ paste ํจ์๋ก ์ฐ๊ฒฐํ์ฌ ์์ฑํ๋ค. sep = "" ์ธ์๋ ๋ ๊ฐ ์ฌ์ด์ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์์ ์ง์ ํ๋ค.
slice(1:10) : ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
R-058: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ฑ๋ณ ์ฝ๋(gender_cd)๋ฅผ ๋๋ฏธ ๋ณ์๋ก ๋ง๋ค์ด ๊ณ ๊ฐ ID(customer_id)์ ํจ๊ป 10๊ฑด ํ์ํ๋ผ.
# ์ฝ๋ ์์ 1 (๋ชจ๋ ์ฝ๋ ๊ฐ์ ํญ๋ชฉํ)
dummy_gender_model <- dummyVars(~gender_cd, data = df_customer, fullRank = FALSE)
dummy_gender <- predict(dummy_gender_model, df_customer)
head(cbind(df_customer["customer_id"], dummy_gender), 10)
ย | customer_id | gender_cd0 | gender_cd1 | gender_cd9 |
---|---|---|---|---|
ย | <chr> | <dbl> | <dbl> | <dbl> |
1 | CS021313000114 | 0 | 1 | 0 |
2 | CS037613000071 | 0 | 0 | 1 |
3 | CS031415000172 | 0 | 1 | 0 |
4 | CS028811000001 | 0 | 1 | 0 |
5 | CS001215000145 | 0 | 1 | 0 |
6 | CS020401000016 | 1 | 0 | 0 |
7 | CS015414000103 | 0 | 1 | 0 |
8 | CS029403000008 | 1 | 0 | 0 |
9 | CS015804000004 | 1 | 0 | 0 |
10 | CS033513000180 | 0 | 1 | 0 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ฐ์ดํฐ ํ๋ ์ df_customer์ ์นดํ ๊ณ ๋ฆฌ ๋ณ์ "gender_cd"์ ๋ํด ๋๋ฏธ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. ๋จผ์ "care" ํจํค์ง์ dummyVars ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , fullRank ์ธ์๋ฅผ FALSE๋ก ์ค์ ํ์ฌ ๋ฒ์ฃผ ๋ณ์์ ์ฒซ ๋ฒ์งธ ์์ค(๋ค๋ฅธ ์์ค์์ ์ถ๋ก ํ ์ ์๋ ์์ค)์ ์ ๊ฑฐํฉ๋๋ค.
๋ ๋ฒ์งธ ์ค์ ์๋ณธ ๋ฐ์ดํฐ ํ๋ ์ df_customer์ ๋ชจ๋ธ์ ์ ์ฉํ์ฌ ๋๋ฏธ ๋ณ์๊ฐ ์๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์์ dummy_gender_model, ๋ ๋ฒ์งธ ์ธ์์ df_customer๋ฅผ ๊ฐ์ง predict ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ชจ๋ธ์ ์ ์ฉํ์ฌ ๋๋ฏธ ๋ณ์๋ฅผ ์์ฑํ๋ค.
๋ง์ง๋ง์ผ๋ก cbind ํจ์๋ก df_customer์ customer_id ์ด์ ๋๋ฏธ ๋ณ์์ ๊ฒฐํฉํ๊ณ head()๋ก ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๋ค.
ย
# ์ฝ๋ ์์ 2 (fullRank=TRUE๋ก ์ค์ ํ์ฌ ํญ๋ชฉ์ ํ๋ ๊น์ ์ ์์)
dummy_gender_model <- dummyVars(~gender_cd, data = df_customer, fullRank = TRUE)
dummy_gender <- predict(dummy_gender_model, df_customer)
head(cbind(df_customer["customer_id"], dummy_gender), 3)
ย | customer_id | gender_cd1 | gender_cd9 |
---|---|---|---|
ย | <chr> | <dbl> | <dbl> |
1 | CS021313000114 | 1 | 0 |
2 | CS037613000071 | 0 | 1 |
3 | CS031415000172 | 1 | 0 |
์ค๋ช :
์ด ์ฝ๋๋ care ํจํค์ง์ dummyVars() ๋ฐ predict() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_customer dataframe์ gender_cd ์ด์ ๋ํ ์์ท ์ธ์ฝ๋ฉ์ ์ํํ๋ค.
dummyVars() ํจ์๋ ์์์ผ๋ก ์ง์ ๋ ์นดํ ๊ณ ๋ฆฌ ๋ณ์์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋๋ฏธ ๋ณ์ ์ธํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ~gender_cd ์์ ๋๋ฏธ ๋ณ์๋ฅผ ์์ฑํ๊ธฐ ์ํด gender_cd ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ํฉ๋๋ค. ์ธ์ fullRank = TRUE๋ ๋๋ฏธ ๋ณ์์ ์ธ์ฝ๋ฉ์ ์ฐธ์กฐ ๋ ๋ฒจ์ ํฌํจํ๋๋ก ์ง์ ํ๋ค.
๊ทธ๋ฐ ๋ค์ predict() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ df_customer ๋ฐ์ดํฐ ํ๋ ์์ ์ธ์ฝ๋ฉ์ ์ ์ฉํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ dummy_gender ๋ณ์์ ์ ์ฅ๋๋ค.
๋ง์ง๋ง์ผ๋ก head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ dummy_gender ๋ฐ์ดํฐํ๋ ์์ ์ฒ์ ์ธ ์ค๊ณผ cbind()๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ ์๋ df_customer ๋ฐ์ดํฐํ๋ ์์ customer_id ์ปฌ๋ผ์ ํ์ํ๋ค. ์ด๋ฅผ ํตํด ์ฒ์ ๋ช ๋ช ์ ๊ณ ๊ฐ์ ๋ํ ์ธ์ฝ๋ฉ์ ํ์ธํ ์ ์์ต๋๋ค. ๊ฐ ๊ณ ๊ฐ์ ๋๋ฏธ ๋ณ์์ ์ธ์ฝ๋ฉ์ ํด๋น ์ฑ๋ณ์ ํด๋นํ๋ ์ด์ 1๊ณผ ๋ค๋ฅธ ์ฑ๋ณ์ ํด๋นํ๋ ์ด์ 0์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
R-059: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ํฉ์ฐํ๊ณ , ๋งค์ถ ๊ธ์ก ํฉ๊ณ๋ฅผ ํ๊ท 0, ํ์คํธ์ฐจ 1๋ก ํ์คํํ์ฌ ๊ณ ๊ฐ ID, ๋งค์ถ ๊ธ์ก ํฉ๊ณ์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ผ. ํ์คํ์ ์ฌ์ฉํ๋ ํ์คํธ์ฐจ๋ ๋ถ์ฐ ์ ๊ณฑ๊ทผ ๋๋ ๋ถ๊ท ํ ๋ถ์ฐ ์ ๊ณฑ๊ทผ ์ค ์ด๋ ๊ฒ์ด๋ ์๊ด์๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
# R์ scale์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ถ๊ท ๋ฑ๋ถ์ฐ์ ์ ๊ณฑ๊ทผ์ ์ํ ํ์คํธ์ฐจ๋ก ํ์คํ๋จ
df_receipt %>%
filter(!grepl("^Z", customer_id)) %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(std_amount = scale(sum_amount, center = TRUE, scale = TRUE)) %>%
slice(1:10)
customer_id | sum_amount | std_amount |
---|---|---|
<chr> | <int> | <dbl[,1]> |
CS001113000004 | 1298 | -0.4593502 |
CS001114000005 | 626 | -0.7063478 |
CS001115000010 | 3044 | 0.1824025 |
CS001205000004 | 1988 | -0.2057366 |
CS001205000006 | 3337 | 0.2900964 |
CS001211000025 | 456 | -0.7688324 |
CS001212000027 | 448 | -0.7717728 |
CS001212000031 | 296 | -0.8276413 |
CS001212000046 | 228 | -0.8526351 |
CS001212000070 | 456 | -0.7688324 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ customer_id ์ด์ด "Z"๋ก ์์ํ์ง ์๋ ํ์ ํํฐ๋งํฉ๋๋ค. ์ด๋ dplyr ํจํค์ง์ filter ํจ์์ customer_id ์ด์ ์ ๊ท์ ํจํด์ ์ผ์น์ํค๋ grepl ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
group_by ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ํ์ customer_id๋ก ๊ทธ๋ฃนํํ๋ค.
dplyr์ summarise ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ทธ๋ฃน์ ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค.
std_amount๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ธ์ก์ ํ์คํ ๋ ํฉ๊ณ๋ฅผ ์ ์ฅํฉ๋๋ค. scale ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ๊ท ๊ฐ์ผ๋ก ์ค์ฌ์ ์ก๊ณ (center = TRUE), ํ์ค ํธ์ฐจ๊ฐ 1์ด ๋๋๋ก ์ค์ผ์ผ๋งํ์ฌ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ํ์คํํฉ๋๋ค(scale = TRUE). ).
๋ง์ง๋ง์ผ๋ก slice ํจ์๋ฅผ ์ฌ์ฉํ์ฌ customer_id์ std_amount ์ด์ ํฌํจํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
R-060: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ํฉ์ฐํ์ฌ ๋งค์ถ ๊ธ์ก ํฉ๊ณ๋ฅผ ์ต์๊ฐ 0, ์ต๋๊ฐ 1๋ก ์ ๊ทํํ์ฌ ๊ณ ๊ฐ ID, ๋งค์ถ ๊ธ์ก ํฉ๊ณ์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
df_receipt %>% filter(!grepl("^Z", customer_id)) %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate( scale_amount = scale(sum_amount, center = min(sum_amount), scale = max(sum_amount) - min(sum_amount)))%>%
slice(1:10)
customer_id | sum_amount | scale_amount |
---|---|---|
<chr> | <int> | <dbl[,1]> |
CS001113000004 | 1298 | 0.053354188 |
CS001114000005 | 626 | 0.024157108 |
CS001115000010 | 3044 | 0.129214460 |
CS001205000004 | 1988 | 0.083333333 |
CS001205000006 | 3337 | 0.141944734 |
CS001211000025 | 456 | 0.016770942 |
CS001212000027 | 448 | 0.016423358 |
CS001212000031 | 296 | 0.009819256 |
CS001212000046 | 228 | 0.006864790 |
CS001212000070 | 456 | 0.016770942 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
customer_id๊ฐ "Z"๋ก ์์ํ๋ ํ์ ํํฐ๋งํ๋ค.
๋๋จธ์ง ํ์ customer_id๋ก ๊ทธ๋ฃนํํ๋ค.
customer_id์ ๊ฐ ๊ทธ๋ฃน๋ณ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค.
์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ณ์ด์์ผ sum_amount์ ์ค์ผ์ผ๋ง ๋ฒ์ ์ธ ์๋ก์ด ์ด scale_amount๋ฅผ ์ถ๊ฐํ๋ค. scale ํจ์๋ sum_amount์ ์ต์๊ฐ์ด 0, ์ต๋๊ฐ์ด 1์ด ๋๋๋ก ์ค์ผ์ผ๋งํ๋ค.
์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฌ๋ผ์ด์คํ์ฌ ์ฒ์ 10๊ฐ์ ํ๋ง ๋จ๊น๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_receipt์ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ์ต์๊ฐ์ 0, ์ต๋๊ฐ์ 1์ด ๋๋๋ก ์ค์ผ์ผ๋งํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ scale_amount ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ณ ๊ฐ์ ์๋์ ์ธ ์ง์ถ ํจํด์ ๋น๊ตํ๊ณ ์ถ์ ๋์ ๊ฐ์ ํน์ ๋ถ์์ ์ ์ฉํ๋ค.
ย
ย
Comment