๋ฐ์ดํฐ ์ฌ์ด์ธ์ค 100๋ฒ์ ๋ ธํฌ(๊ตฌ์กฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌํธ) โ R Part 4 (Q61 to Q80)์ ํด์ค์ ๋๋ค.
ย
์ฐธ๊ณ (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-061: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ํฉ์ฐํ๊ณ , ๋งค์ถ ๊ธ์ก ํฉ๊ณ๋ฅผ ์์ ๋์ํ(ํ๋จ 10)ํ์ฌ ๊ณ ๊ฐ ID, ๋งค์ถ ๊ธ์ก ํฉ๊ณ์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
df_receipt %>%
filter(!grepl("^Z", customer_id)) %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(log_amount = log((sum_amount + 0.5), base = 10)) %>%
slice(1:10)
customer_id | sum_amount | log_amount |
---|---|---|
<chr> | <int> | <dbl> |
CS001113000004 | 1298 | 3.113442 |
CS001114000005 | 626 | 2.796921 |
CS001115000010 | 3044 | 3.483516 |
CS001205000004 | 1988 | 3.298526 |
CS001205000006 | 3337 | 3.523421 |
CS001211000025 | 456 | 2.659441 |
CS001212000027 | 448 | 2.651762 |
CS001212000031 | 296 | 2.472025 |
CS001212000046 | 228 | 2.358886 |
CS001212000070 | 456 | 2.659441 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
filter ํจ์๋ฅผ ์ฌ์ฉํ์ฌ customer_id๊ฐ "Z"๋ก ์์ํ๋ ํ์ ํํฐ๋งํฉ๋๋ค.
group_by ํจ์๋ฅผ ์ฌ์ฉํ์ฌ customer_id๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค.
summarise ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํฉ๊ณ๋ฅผ ์ทจํ์ฌ ๊ฐ ๊ณ ๊ฐ ID์ ๊ธ์ก ์ด์ ์์ฝํ๋ค.
.groups = "drop" ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ 2๋จ๊ณ์์ ์์ฑํ ๊ทธ๋ฃน์ ์ญ์ ํ๋ค.
sum_amount์ ๋ก๊ทธ์ 0.5๋ฅผ ๋ํ ๊ฐ์ 10์ง์๋ก ํํํ log_amount๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๋ค.
slice ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํฉ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ์ด ๊ธ์ก์ ๋์๋ฅผ ๊ฐ์ง ์๋ก์ด ์ด์ ์์ฑํ๋ฉฐ, ์ด๋ ์๊ณก๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋๋ ๋ณํ์ ๋๋ค.
R-062: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ๊ธ์ก(amount)์ ๊ณ ๊ฐID(customer_id)๋ณ๋ก ํฉ์ฐํ๊ณ , ๋งค์ถ๊ธ์ก ํฉ๊ณ๋ฅผ ์์ฐ๋์ํ(ํ๋จ e)ํ์ฌ ๊ณ ๊ฐID, ๋งค์ถ๊ธ์ก ํฉ๊ณ์ ํจ๊ป 10๊ฑด์ฉ ํ์ํ๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
df_receipt %>%
filter(!grepl("^Z", customer_id)) %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(log_amount = log(sum_amount + 0.5)) %>%
slice(1:10)
customer_id | sum_amount | log_amount |
---|---|---|
<chr> | <int> | <dbl> |
CS001113000004 | 1298 | 7.168965 |
CS001114000005 | 626 | 6.440149 |
CS001115000010 | 3044 | 8.021092 |
CS001205000004 | 1988 | 7.595136 |
CS001205000006 | 3337 | 8.112977 |
CS001211000025 | 456 | 6.123589 |
CS001212000027 | 448 | 6.105909 |
CS001212000031 | 296 | 5.692047 |
CS001212000046 | 228 | 5.431536 |
CS001212000070 | 456 | 6.123589 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ๋ฆฌํ๋ค. ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
customer_id๊ฐ "Z"๋ก ์์ํ๋ ํ์ ํํฐ๋งํฉ๋๋ค. ์ด๋ dplyr ํจํค์ง์ filter() ํจ์์ ์กฐ๊ฑด์ผ๋ก grepl() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํํฉ๋๋ค.
dplyr ํจํค์ง์ group_by() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋๋จธ์ง ํ์ customer_id๋ก ๊ทธ๋ฃนํํฉ๋๋ค.
๊ธ์ก ์ด์ sum() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ตฌ๋งค ๊ธ์ก ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ dplyr ํจํค์ง์ summarise() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํํฉ๋๋ค.
sum_amount ์ด์ ์์ฐ๋์์ 0.5๋ฅผ ๋ํ log_amount๋ผ๋ ์๋ก์ด ์ด์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ dplyr ํจํค์ง์ mutate() ํจ์์ ๋ฒ ์ด์ค R์ log() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ๋ค.
๋ง์ง๋ง์ผ๋ก dplyr ํจํค์ง์ slice() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
R-063: ์ํ ๋ฐ์ดํฐ(df_product)์ ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)๋ก๋ถํฐ ๊ฐ ์ํ์ ์ด์ต์ก์ ์ฐ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ 10๊ฑด ํ์ํ์์ค.
df_product %>%
mutate(unit_profit = unit_price - unit_cost) %>%
slice(1:10)
product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | unit_profit |
---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <chr> | <int> | <int> | <int> |
P040101001 | 04 | 0401 | 040101 | 198 | 149 | 49 |
P040101002 | 04 | 0401 | 040101 | 218 | 164 | 54 |
P040101003 | 04 | 0401 | 040101 | 230 | 173 | 57 |
P040101004 | 04 | 0401 | 040101 | 248 | 186 | 62 |
P040101005 | 04 | 0401 | 040101 | 268 | 201 | 67 |
P040101006 | 04 | 0401 | 040101 | 298 | 224 | 74 |
P040101007 | 04 | 0401 | 040101 | 338 | 254 | 84 |
P040101008 | 04 | 0401 | 040101 | 420 | 315 | 105 |
P040101009 | 04 | 0401 | 040101 | 498 | 374 | 124 |
P040101010 | 04 | 0401 | 040101 | 580 | 435 | 145 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ฐ์ดํฐ ํ๋ ์ df_product๋ฅผ ๋ฐ์ mutate() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ด unit_profit์ ์์ฑํ๊ณ , unit_profit ์ด์ df_product์ ๊ธฐ์กด ์ด์ธ unit_price์ unit_cost์ ์ฐจ์ด๋ก ๊ณ์ฐ๋ฉ๋๋ค. ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ slice() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด unit_profit ์ด์ ํฌํจํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํฉ๋๋ค.
R-064: ์ํ ๋ฐ์ดํฐ(df_product)์ ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์์ ๊ฐ ์ํ์ ์ ์ฒด ํ๊ท ์์ต๋ฅ ์ ๊ณ์ฐํ์์ค. ๋จ, ๋จ๊ฐ์ ์๊ฐ์๋ ๊ฒฐ์์ด ๋ฐ์ํ๋ค๋ ์ ์ ์ ์ํ๋ผ.
df_product %>%
mutate(unit_profit_rate = (unit_price - unit_cost) / unit_price) %>%
summarise(total_mean = mean(unit_profit_rate, na.rm = TRUE))
total_mean |
---|
<dbl> |
0.2491139 |
์ค๋ช :
์ด ์ฝ๋๋ df_product๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ํด ๋ช ๊ฐ์ง ๊ณ์ฐ์ ์ํํ๊ณ ์๋ค.
mutate๋ unit_profit_rate๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ์๋ค. ์ด ์ด์ ๋จ๊ฐ์์ ๋จ๊ฐ๋ฅผ ๋นผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ฐ๋ก ๋๋์ด ๊ณ์ฐ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ summarise ํจ์๋ฅผ ์ฌ์ฉํ์ฌ unit_profit_rate ์ด์ ํ๊ท ์ ๊ณ์ฐํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ total_mean์ด๋ผ๋ ์๋ก์ด ์ด์ ํ ๋น๋ฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_product์์ ํ๋งค๋ ์ ํ์ ๊ฐ ๋จ์๋น ํ๊ท ์์ต๋ฅ ์ ๊ณ์ฐํ๊ณ ์๋ ์ ์ด๋ค.
ย
R-065: ์ํ ๋ฐ์ดํฐ(df_product)์ ๊ฐ ์ํ์ ๋ํด ์์ต๋ฅ ์ด 30%๊ฐ ๋๋ ์๋ก์ด ๋จ๊ฐ๋ฅผ ๊ตฌํ์์ค. ๋จ, 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค. ๊ทธ๋ฆฌ๊ณ 10๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ณ , ์์ต๋ฅ ์ด ๋๋ต 30% ์ ๋์ธ ๊ฒ์ ํ์ธํ๋ผ. ๋จ, ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์๋ ์ ์๊ฐ ๋ฐ์ํ๋ค๋ ์ ์ ์ ์ํ๋ผ.
df_product[c("product_cd", "unit_price", "unit_cost")] %>%
mutate(new_price = trunc(unit_cost / 0.7)) %>%
mutate(new_profit_rate = (new_price - unit_cost)/ new_price) %>% slice(1:10)
product_cd | unit_price | unit_cost | new_price | new_profit_rate |
---|---|---|---|---|
<chr> | <int> | <int> | <dbl> | <dbl> |
P040101001 | 198 | 149 | 212 | 0.2971698 |
P040101002 | 218 | 164 | 234 | 0.2991453 |
P040101003 | 230 | 173 | 247 | 0.2995951 |
P040101004 | 248 | 186 | 265 | 0.2981132 |
P040101005 | 268 | 201 | 287 | 0.2996516 |
P040101006 | 298 | 224 | 320 | 0.3000000 |
P040101007 | 338 | 254 | 362 | 0.2983425 |
P040101008 | 420 | 315 | 450 | 0.3000000 |
P040101009 | 498 | 374 | 534 | 0.2996255 |
P040101010 | 580 | 435 | 621 | 0.2995169 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์ ๋จ๊ณ๋ฅผ ์ํํ๋ค.
๋ฐ์ดํฐ ํ๋ ์ "df_product"์์ "product_cd", "unit_price", "unit_cost" ์ด๋ง ์ ํํ๋ค.
๋จ๊ฐ๋ฅผ 0.7๋ก ๋๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํ์ฌ 'new_price'๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๋ค. ์ด๋ ์ํ ๊ฐ๊ฒฉ์ ์ผ์ ๋น์จ๋ก ๋ฎ์ถ๊ธฐ ์ํ ์์์ ๊ณ์ฐ์ด๋ค.
์ ๊ฐ๊ฒฉ์์ ๋จ๊ฐ๋ฅผ ๋นผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฐ๊ฒฉ์ผ๋ก ๋๋์ด 'new_profit_rate'๋ผ๋ ๋ ๋ค๋ฅธ ์ ์ด์ ์์ฑํ๋ค. ์ด๊ฒ์ ์๋ก์ด ๊ฐ๊ฒฉ์ ์ด์ต๋ฅ ์ ๊ณ์ฐํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
R-066: ์ํ ๋ฐ์ดํฐ(df_product)์ ๊ฐ ์ํ์ ๋ํด ์์ต๋ฅ ์ด 30%๊ฐ ๋๋ ์๋ก์ด ๋จ๊ฐ๋ฅผ ๊ตฌํ์์ค. ์ด๋ฒ์๋ 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค(๋ฐ์ฌ๋ฆผ ๋๋ ์ง์๋ก ๋ฐ์ฌ๋ฆผํด๋ ๋ฌด๋ฐฉํ๋ค). ๊ทธ๋ฆฌ๊ณ 10๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ฒ ํ๊ณ , ์์ต๋ฅ ์ด ๋๋ต 30% ์ ๋์ธ ๊ฒ์ ํ์ธํ๋ผ. ๋จ, ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์๋ ๊ฒฐ์์ด ๋ฐ์ํ๋ค๋ ์ ์ ์ ์ํ๋ค.
df_product[c("product_cd", "unit_price", "unit_cost")] %>%
mutate(new_price = round(unit_cost / 0.7)) %>%
mutate(new_profit_rate = (new_price - unit_cost) / new_price) %>%
slice(1:10)
product_cd | unit_price | unit_cost | new_price | new_profit_rate |
---|---|---|---|---|
<chr> | <int> | <int> | <dbl> | <dbl> |
P040101001 | 198 | 149 | 213 | 0.3004695 |
P040101002 | 218 | 164 | 234 | 0.2991453 |
P040101003 | 230 | 173 | 247 | 0.2995951 |
P040101004 | 248 | 186 | 266 | 0.3007519 |
P040101005 | 268 | 201 | 287 | 0.2996516 |
P040101006 | 298 | 224 | 320 | 0.3000000 |
P040101007 | 338 | 254 | 363 | 0.3002755 |
P040101008 | 420 | 315 | 450 | 0.3000000 |
P040101009 | 498 | 374 | 534 | 0.2996255 |
P040101010 | 580 | 435 | 621 | 0.2995169 |
์ค๋ช :
์ด ์ฝ๋๋ ์ํ ๋ฐ์ดํฐ ํ๋ ์(df_product)์ ๋ํด ๋ช ๊ฐ์ง ๊ณ์ฐ์ ์ํํ๋ค.
๋จผ์ "product_cd", "unit_price", "unit_cost" ์ธ ๊ฐ์ ์ปฌ๋ผ์ ์ ํํฉ๋๋ค.
์ด๋ "unit_cost"๋ฅผ 0.7๋ก ๋๋ ํ(์ฆ, 30% ๋น์ฉ ์ ๊ฐ), round() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํ์ฌ ๊ณ์ฐํฉ๋๋ค.
๋ค์์ผ๋ก 'new_profit_rate'๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๋ค. ์ด๋ 'new_price'์์ 'unit_cost'๋ฅผ ๋นผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ 'new_price'๋ก ๋๋์ด ๊ณ์ฐํ๋ค.
๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ์ฌ ํ์ํฉ๋๋ค.
์ด ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐ ๋น์ฉ์ 30% ์ ๊ฐํ์ ๋ ๊ฐ ์ ํ์ ์๋ก์ด ๊ฐ๊ฒฉ๊ณผ ์์ต๋ฅ ์ ๊ณ์ฐํ๋ค.
R-067: ์ํ ๋ฐ์ดํฐ(df_product)์ ๊ฐ ์ํ์ ๋ํด ์์ต๋ฅ ์ด 30%๊ฐ ๋๋ ์๋ก์ด ๋จ๊ฐ๋ฅผ ๊ตฌํ์์ค. ์ด๋ฒ์๋ 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค. ๊ทธ๋ฆฌ๊ณ 10๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ณ , ์์ต๋ฅ ์ด ๋๋ต 30% ์ ๋์ธ ๊ฒ์ ํ์ธํ๋ผ. ๋จ, ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์๋ ์ ์๊ฐ ๋ฐ์ํ๊ณ ์๋ค๋ ์ ์ ์ ์ํ๋ผ.
df_product[c("product_cd", "unit_price", "unit_cost")] %>%
mutate(new_price = ceiling(unit_cost / 0.7)) %>%
mutate(new_profit_rate = (new_price - unit_cost) / new_price) %>%
slice(1:10)
product_cd | unit_price | unit_cost | new_price | new_profit_rate |
---|---|---|---|---|
<chr> | <int> | <int> | <dbl> | <dbl> |
P040101001 | 198 | 149 | 213 | 0.3004695 |
P040101002 | 218 | 164 | 235 | 0.3021277 |
P040101003 | 230 | 173 | 248 | 0.3024194 |
P040101004 | 248 | 186 | 266 | 0.3007519 |
P040101005 | 268 | 201 | 288 | 0.3020833 |
P040101006 | 298 | 224 | 320 | 0.3000000 |
P040101007 | 338 | 254 | 363 | 0.3002755 |
P040101008 | 420 | 315 | 451 | 0.3015521 |
P040101009 | 498 | 374 | 535 | 0.3009346 |
P040101010 | 580 | 435 | 622 | 0.3006431 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ ๊ฐ์ ์๋ก์ด ๋ณ์ new_price์ new_profit_rate๋ฅผ ์ถ๊ฐํ์ฌ df_product ๋ฐ์ดํฐ ํ๋ ์์ ์กฐ์ํ๋ค.
mutate(new_price = ceiling(unit_cost / 0.7))์ ceiling(unit_cost / 0.7)์ด๋ผ๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ ์๋ก์ด ์ด new_price๋ฅผ ์์ฑํ๊ณ , ceiling() ํจ์๋ unit_cost / 0.7์ด๋ผ๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋จ๊ฐ๋ณด๋ค 30% ๋ ๋์ ์๋ก์ด ๊ฐ๊ฒฉ์ด ๋ฉ๋๋ค.
mutate(new_profit_rate = (new_price - unit_cost) / new_price)๋ ์๋ก์ด ์ด new_profit_rate๋ฅผ ์์ฑํ๊ณ (new_price - unit_cost) / new_price๋ผ๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด ์์ ์๋ก์ด ๊ฐ๊ฒฉ์์ ์ด์ต์ด ์ฐจ์งํ๋ ๋น์จ์ธ ์ ์์ต๋ฅ ์ ๊ณ์ฐํ๋ค. ์ด๋ ์ ๊ฐ๊ฒฉ๊ณผ ๋จ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ฐ๊ฒฉ์ผ๋ก ๋๋ ๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ค.
slice(1:10) ํจ์๋ ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
R-068: ์ํ ๋ฐ์ดํฐ(df_product)์ ๊ฐ ์ํ์ ๋ํด ์๋น์ธ์จ 10%์ ๋ถ๊ฐ์ธ ํฌํจ ๊ธ์ก์ ๊ตฌํ๊ณ , 1์ ๋ฏธ๋ง์ ๋จ์๋ ์ ์ฌํ์ฌ 10๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ์์ค. ๋จ, ๋จ๊ฐ(unit_price)์๋ ๊ฒฐ์์ด ๋ฐ์ํ๋ค๋ ์ ์ ์ ์ํ๋ผ.
head(cbind(product_cd = df_product$product_cd,
df_product$unit_price,
tax_price = trunc(df_product$unit_price * 1.1)), 10)
product_cd | unit_price | tax_price |
---|---|---|
P040101001 | 198 | 217 |
P040101002 | 218 | 239 |
P040101003 | 230 | 253 |
P040101004 | 248 | 272 |
P040101005 | 268 | 294 |
P040101006 | 298 | 327 |
P040101007 | 338 | 371 |
P040101008 | 420 | 462 |
P040101009 | 498 | 547 |
P040101010 | 580 | 638 |
์ค๋ช :
์ด ์ฝ๋์์๋ cbind ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_product ๋ฐ์ดํฐ ํ๋ ์์ 3๊ฐ ์ด, ์ฆ product_cd, unit_price, tax_price๋ฅผ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๊ฒฐํฉํ๋ค. ๊ทธ๋ฐ ๋ค์ head ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์ฒซ 10๊ฐ์ ํ์ ํ์ํ๋ค.
์ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒซ ๋ฒ์งธ ์ด์ product_cd๋ก ํ์๋๋ฉฐ, df_product์ product_cd ์ด์ ๊ฐ์ ํฌํจํ๊ณ , ๋ ๋ฒ์งธ ์ด์ df_product$unit_price๋ก ํ์๋๋ฉฐ, df_product์ unit_price ์ด์ ๊ฐ์ด ์ ์ฅ๋์ด ์์ต๋๋ค. ์ ์ฅ๋์ด ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์ด์ tax_price๋ผ๋ ๋ ์ด๋ธ๋ก, unit_price ์ด์ ๊ฐ ๊ฐ์ 1.1์ ๊ณฑํ ๊ฒฐ๊ณผ์ trunc ํจ์๋ฅผ ์ ์ฉํ์ฌ ๋ง๋ค์ด์ก๋ค. ์ด๋ 10%์ ์ธ๊ธ์ด ํฌํจ๋ ์ ํ ๊ฐ๊ฒฉ์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
cbind ํจ์๊ฐ ์ด๋ฏธ df_product์์ unit_price ์ด์ ์ถ์ถํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ์งธ ์ด ์ด๋ฆ์ df_product$๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค.
R-069: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ์ํ ๋ฐ์ดํฐ(df_product)๋ฅผ ๊ฒฐํฉํ์ฌ ๊ณ ๊ฐ๋ณ ์ ์ฒด ์ํ ํ๋งค๊ธ์ก ํฉ๊ณ์ ์นดํ ๊ณ ๋ฆฌ ๋๋ถ๋ฅ ์ฝ๋(category_major_cd)๊ฐ โ07โ(๋ณ์กฐ๋ฆผ ํต์กฐ๋ฆผ)์ธ ์ํ์ ํ๋งค๊ธ์ก ํฉ๊ณ๋ฅผ ๊ณ์ฐํ ํ, ์์์ ๋น์จ์ ๊ตฌํ์์ค. ์ถ์ถ ๋์์ ์นดํ ๊ณ ๋ฆฌ ๋๋ถ๋ฅ ์ฝ๋ โ07โ(๋ณ์กฐ๋ฆผ ํต์กฐ๋ฆผ)์ ํ๋งค ์ค์ ์ด ์๋ ๊ณ ๊ฐ์ผ๋ก ํ์ ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ 10๊ฑด๋ง ํ์ํ๋ค.
# ์ฝ๋ ์์ 1
df_tmp_1 <- df_receipt %>%
group_by(customer_id) %>%
summarise(sum_all=sum(amount))
df_tmp_2 <- inner_join(df_receipt, df_product[c("product_cd","category_major_cd")], by="product_cd") %>%
filter(category_major_cd == "07") %>% group_by(customer_id) %>%
summarise(sum_07 = sum(amount), .groups = "drop")
inner_join(df_tmp_1, df_tmp_2, by = "customer_id") %>%
mutate(sales_rate = sum_07 / sum_all) %>%
slice(1:10)
customer_id | sum_all | sum_07 | sales_rate |
---|---|---|---|
<chr> | <int> | <int> | <dbl> |
CS001113000004 | 1298 | 1298 | 1.0000000 |
CS001114000005 | 626 | 486 | 0.7763578 |
CS001115000010 | 3044 | 2694 | 0.8850197 |
CS001205000004 | 1988 | 346 | 0.1740443 |
CS001205000006 | 3337 | 2004 | 0.6005394 |
CS001212000027 | 448 | 200 | 0.4464286 |
CS001212000031 | 296 | 296 | 1.0000000 |
CS001212000046 | 228 | 108 | 0.4736842 |
CS001212000070 | 456 | 308 | 0.6754386 |
CS001213000018 | 243 | 145 | 0.5967078 |
ํด์ค:
# ์ฝ๋ ์์ 2
๋ณธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ฌ df_tmp_1์ ์ ์ฅํ๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์๊ณผ df_product ๋ฐ์ดํฐ ํ๋ ์์ product_cd๋ก ๊ฒฐํฉํ์ฌ category_major_cd๊ฐ '07'์ธ ํ๋ง ํํฐ๋งํ๋ค.
ํํฐ๋ง๋ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ๊ณ ๊ฐ๋ณ ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ฌ df_tmp_2์ ์ ์ฅํ๋ค.
df_tmp_1๊ณผ df_tmp_2 ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ฒฐํฉํ๋ค.
๊ฐ ๊ณ ๊ฐ์ ๋ฉ์ด์ ์ฝ๋ "07"์ ํ๋งค์จ์ ๊ณ์ฐํ์ฌ sales_rate๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์ ์ฅํ๋ค.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฌ๋ผ์ด์คํ์ฌ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๋ค.
inner_join ํจ์๋ ๊ณตํต ๋ณ์๋ก ๋ฐ์ดํฐ ํ๋ ์์ ๊ฒฐํฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, mutate ํจ์๋ ๊ธฐ์กด ์ด์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ ์๋ก์ด ์ด์ ๋ฐ์ดํฐ ํ๋ ์์ ์ถ๊ฐํ๊ณ , slice ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์์ ํ์ ํ์ ์งํฉ์ ์ถ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
ย
# ์ฝ๋ ์์ 2 (%>%๋ก ๋ชจ๋ ์ฒ๋ฆฌ ์ฐ๊ฒฐ)
inner_join(df_receipt, df_product[c("product_cd","category_major_cd")], by="product_cd") %>% filter(category_major_cd == "07") %>%
group_by(customer_id) %>%
summarise(sum_07 = sum(amount), .groups = "drop") %>%
inner_join(df_receipt, by="customer_id") %>%
group_by(customer_id) %>%
summarise(sum_all=sum(amount), sum_07=max(sum_07), .groups = "drop") %>%
mutate(sales_rate = sum_07 / sum_all) %>%
slice(1:10)
customer_id | sum_all | sum_07 | sales_rate |
---|---|---|---|
<chr> | <int> | <int> | <dbl> |
CS001113000004 | 1298 | 1298 | 1.0000000 |
CS001114000005 | 626 | 486 | 0.7763578 |
CS001115000010 | 3044 | 2694 | 0.8850197 |
CS001205000004 | 1988 | 346 | 0.1740443 |
CS001205000006 | 3337 | 2004 | 0.6005394 |
CS001212000027 | 448 | 200 | 0.4464286 |
CS001212000031 | 296 | 296 | 1.0000000 |
CS001212000046 | 228 | 108 | 0.4736842 |
CS001212000070 | 456 | 308 | 0.6754386 |
CS001213000018 | 243 | 145 | 0.5967078 |
์ค๋ช :
์ด ์ฝ๋๋ ์นดํ ๊ณ ๋ฆฌ 07์ ์ํ์ ๋ํด ํด๋น ์ํ์ ๊ฐ์ฅ ๋ง์ด ๊ตฌ๋งคํ ์์ 10๋ช ์ ๊ณ ๊ฐ์ ๋ํ ํ๋งค์จ์ ๊ณ์ฐํฉ๋๋ค. ๊ฐ ํ์ด ๋ฌด์์ ํ๋์ง ๊ทธ ๋ด์ญ์ ์ค๋ช ํฉ๋๋ค.
inner_join(df_receipt, df_product[c("product_cd", "category_major_cd")], by="product_cd"): df_receipt์ df_product์ ๋ฐ์ดํฐ ํ๋ ์์ product_cd ์ด์ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉํฉ๋๋ค. cd ์ด์ ๊ธฐ์ค์ผ๋ก df_product์ product_cd์ category_major_cd ์ด๋ง ์ ์งํ๋ค. ๊ทธ ๊ฒฐ๊ณผ, df_receipt์์ ๊ตฌ๋งคํ ๊ฐ ์ํ์ ๋ํ ์นดํ ๊ณ ๋ฆฌ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋๋ค.
filter(category_major_cd == "07"): 1๋จ๊ณ์ ๊ฒฐํฉ ๋ฐ์ดํฐ ํ๋ ์์ ํํฐ๋งํ์ฌ category_major_cd ์ปฌ๋ผ์ด "07"๊ณผ ๊ฐ์ ํ๋ง ์ ์งํ๋๋ก ํ๋ค.
group_by(customer_id) %>% summarise(sum_07 = sum(amount), .groups = "drop"): 2๋จ๊ณ์์ ํํฐ๋ง๋ ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ฐ ๊ณ ๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ 07์ ์ ํ์ ์ง์ถํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์ป์ ์ ์๋ค.
inner_join(df_receipt, by="customer_id"): customer_id ์ด์ ๊ธฐ์ค์ผ๋ก 3๋จ๊ณ์ ๋ฐ์ดํฐ ํ๋ ์๊ณผ ์๋์ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๊ฒฐํฉํ๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ฐ ๊ณ ๊ฐ์ด ๋ชจ๋ ์ํ์ ๋ํด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋ฉ๋๋ค.
group_by(customer_id) %>% summarise(sum_all=sum(amount), sum_07=max(sum_07), .groups = "drop"): ์ด๋ 4๋จ๊ณ์์ ๊ฒฐํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ทธ๋ฃนํ ํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ amount ์ด์ ํฉ๊ณ์ ๊ฐ ๊ทธ๋ฃน์ sum_07 ์ด์ ์ต๋๊ฐ์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ ๊ณ ๊ฐ์ด ์ ์ฒด ์ํ์ ์ง์ถํ ๊ธ์ก์ ํฉ๊ณ์ ๊ฐ ๊ณ ๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ 07์ ์ํ์ ์ง์ถํ ๊ธ์ก์ ์ต๋๊ฐ์ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ด ๋ง๋ค์ด์ง๋๋ค.
mutate(sales_rate = sum_07 / sum_all): ์นดํ ๊ณ ๋ฆฌ 07 ์ํ์ ๋ํ ์ต๋ ๊ตฌ๋งค ๊ธ์ก(sum_07)์ ์ ์ฒด ์ํ์ ๋ํ ์ด ๊ธ์ก(sum_all)์ผ๋ก ๋๋์ด ๊ฐ ๊ณ ๊ฐ์ ํ๋งค์จ์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค.
%>% slice(1:10) : ํ๋งค์จ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ํ๋ ์์ ์์ 10๊ฐ ํ๋ง ์ ์งํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์นดํ ๊ณ ๋ฆฌ 07 ์ ํ ํ๋งค์จ์ด ๊ฐ์ฅ ๋์ ์์ 10๋ช ์ ๊ณ ๊ฐ๊ณผ ์ ์ฒด ์ ํ์ ์ง์ถํ ์ด ๊ธ์ก, ์นดํ ๊ณ ๋ฆฌ 07 ์ ํ์ ์ง์ถํ ์ต๋ ๊ธ์ก์ด ํ์๋๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋ฉ๋๋ค.
R-070: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(sales_ymd)์ ๋ํด ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ํ์๊ฐ์ ์ผ(application_date)๋ก๋ถํฐ์ ๊ฒฝ๊ณผ์ผ์๋ฅผ ๊ณ์ฐํ์ฌ ๊ณ ๊ฐ ID(customer_id), ๋งค์ถ์ผ, ํ์๊ฐ์ ์ผ๊ณผ ํจ๊ป 10๊ฑด์ ํ์ํ๋ผ(sales_ymd๋ ์์น, application_date๋ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๋ ์ ์ ์ ์).
df_receipt[c("customer_id", "sales_ymd")] %>%
distinct(.,.keep_all=TRUE) %>% inner_join(df_customer[c("customer_id","application_date")], by="customer_id") %>% mutate(elapsed_days = as.integer( strptime(as.character(sales_ymd), "%Y%m%d") - strptime(application_date, "%Y%m%d"))) %>%
select(customer_id, sales_ymd, application_date, elapsed_days) %>%
slice(1:10)
customer_id | sales_ymd | application_date | elapsed_days |
---|---|---|---|
<chr> | <int> | <chr> | <int> |
CS006214000001 | 20181103 | 20150201 | 1371 |
CS008415000097 | 20181118 | 20150322 | 1337 |
CS028414000014 | 20170712 | 20150711 | 732 |
CS025415000050 | 20180821 | 20160131 | 933 |
CS003515000195 | 20190605 | 20150306 | 1552 |
CS024514000042 | 20181205 | 20151010 | 1152 |
CS040415000178 | 20190922 | 20150627 | 1548 |
CS027514000015 | 20191010 | 20151101 | 1439 |
CS025415000134 | 20190918 | 20150720 | 1521 |
CS021515000126 | 20171010 | 20150508 | 886 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
'df_receipt' ๋ฐ์ดํฐ ํ๋ ์์์ 'customer_id'์ 'sales_ymd' ์ปฌ๋ผ์ ์ ํํฉ๋๋ค.
๋ชจ๋ ์ปฌ๋ผ์ ์ ์งํ ์ฑ ์ค๋ณต๋ ํ์ ์ญ์ ํ๋ค('distinct').
์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์๊ณผ 'df_customer' ๋ฐ์ดํฐ ํ๋ ์์ 'customer_id'๋ก ๊ฒฐํฉํ๋ค.
'elapsed_days' ์ปฌ๋ผ์ ์๋ก ์ถ๊ฐํ๋ค. ์ด๋ 'sales_ymd' ์ปฌ๋ผ๊ณผ 'application_date' ์ปฌ๋ผ ์ฌ์ด์ ์ผ์ ์ฐจ์ด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ ์๋ก ๋ณํ๋๋ค.
'customer_id', 'sales_ymd', 'application_date', 'elapsed_days' ์ปฌ๋ผ๋ง ์ ํํ๋ค.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10์ค์ ๋ฐํํ๋ค.
์ฝ๋์ ๋ด๋ถ ๋์์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ๋๋ ์ ์๋ค.
# df_receipt์์ customer_id์ sales_ymd ์ปฌ๋ผ ์ ํ df1 <- df_receipt[c("customer_id", "sales_ymd")] # ๋ชจ๋ ์ปฌ๋ผ์ ์ ์งํ ์ฑ ์ค๋ณต๋ ํ ์ญ์ df2 <- distinct(df1, . keep_all = TRUE) # ๊ณ ๊ฐ ID๋ก df_customer์ ๊ฒฐํฉ df3 <- inner_join(df2, df_customer[c("customer_id", "application_date")], by = "customer_id") # ๊ฒฝ๊ณผ์ผ์ ์ ์ด ์ถ๊ฐ df4 <- inner_join(df2, . ์ถ๊ฐ df4 <- mutate(df3, elapsed_days = as. integer(strptime(as.character(sales_ymd), "%Y%m%d") - strptime(application_date, "%Y%m%d")))) # ์ด์ ์ ํํ๊ณ ์ฒ์ 10ํ ๋ฐํ df5 <- select(df4, customer_id, sales_ymd, application_date, elapsed_days) slice(df5, 1:10)
์ด ์ฝ๋์์๋ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์กฐ์์ ์ํํ๋๋ฐ, distinct ํจ์๋ ๋ชจ๋ ์ด์ ๊ธฐ์ค์ผ๋ก ์ค๋ณต๋ ํ์ ์ญ์ ํ๊ณ , inner_join ํจ์๋ ๊ณตํต๋ ์ด์ ๊ธฐ์ค์ผ๋ก ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฒฐํฉํ๊ณ , mutate ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด์ ์์ฑํ๊ณ , select ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ก์ด ์ด์ ์์ฑํ๊ณ , select ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์์ ํน์ ์ด์ ์ ํํ๋ค. ๋ง์ง๋ง์ผ๋ก slice ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์์ ํ์ ํ์ ์งํฉ์ ๋ฐํํ๋ค.
R-071: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(sales_ymd)์ ๋ํด ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ํ์๊ฐ์ ์ผ(application_date)๋ก๋ถํฐ์ ๊ฒฝ๊ณผ ๊ฐ์ ์๋ฅผ ๊ณ์ฐํ์ฌ ๊ณ ๊ฐ ID(customer_id), ๋งค์ถ์ผ, ํ์๊ฐ์ ์ผ๊ณผ ํจ๊ป 10๊ฑด ํ์ (sales_ymd๋ ์ซ์, application_date๋ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ์ ์ ์ ์) 1๊ฐ์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค.
df_receipt[c("customer_id", "sales_ymd")] %>%
distinct(., .keep_all = TRUE) %>%
inner_join(df_customer[c("customer_id", "application_date")], by = "customer_id") %>% mutate(elapsed_months = trunc(time_length( interval( strptime(application_date, "%Y%m%d"), strptime(as.character(sales_ymd), "%Y%m%d") ), "month"))) %>%
select(customer_id, sales_ymd, application_date, elapsed_months) %>%
slice(1:10)
customer_id | sales_ymd | application_date | elapsed_months |
---|---|---|---|
<chr> | <int> | <chr> | <dbl> |
CS006214000001 | 20181103 | 20150201 | 45 |
CS008415000097 | 20181118 | 20150322 | 43 |
CS028414000014 | 20170712 | 20150711 | 24 |
CS025415000050 | 20180821 | 20160131 | 30 |
CS003515000195 | 20190605 | 20150306 | 50 |
CS024514000042 | 20181205 | 20151010 | 37 |
CS040415000178 | 20190922 | 20150627 | 50 |
CS027514000015 | 20191010 | 20151101 | 47 |
CS025415000134 | 20190918 | 20150720 | 49 |
CS021515000126 | 20171010 | 20150508 | 29 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
df_receipt[c("customer_id", "sales_ymd")] df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ customer_id์ sales_ymd ์ด๋ง ์ ํํฉ๋๋ค.
distinct(. , .keep_all = TRUE)๋ ๋ชจ๋ ์ด์ ์ ์งํ ์ฑ ์ค๋ณต๋ ํ์ ์ญ์ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด customer_id์ sales_ymd์ ๊ณ ์ ํ ์กฐํฉ์ ๋ํด ํ๋์ ํ๋ง ์กด์ฌํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
inner_join(df_customer[c("customer_id", "application_date")], by = "customer_id") ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ์ df_customer ๋ฐ์ดํฐ ํ๋ ์์ customer_id ์ปฌ๋ผ์ผ๋ก ๊ฒฐํฉํ๊ณ df_ customer์์ customer_id์ application_date ์ด๋ง ์ ํํ๋ค.
mutate(elapsed_months = trunc(time_length( interval( strptime(application_date, "%Y%m%d"), strptime(as.character(sales_ymd), "%Y%m%d") ), " month")) application_date์ sales_ymd ์ฌ์ด์ ๊ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ ์๋ก์ด ์ด elapsed_months๋ฅผ ์์ฑํ๋ค. strptime์ ์ฌ์ฉํ์ฌ ๋ ์ง๋ฅผ ์ ์ ํ ํ์์ผ๋ก ๋ณํํ๊ณ , interval ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๊ณ , time_length๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์๋ฅผ ๊ณ์ฐํ๊ณ , trunc ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํฉ๋๋ค.
select(customer_id, sales_ymd, application_date, elapsed_months) customer_id, sales_ymd, application_date, elapsed_months ์ด๋ง ์ ํํ๋ค.
slice(1:10)์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ๋ง ์ ํํ๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ๊ฐ ๊ณ ๊ฐ์ ๊ตฌ๋งค ๋ด์ญ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฒญ์ผ๊ณผ ํ๋งค์ผ ์ฌ์ด์ ๊ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
R-072: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(df_customer)์ ๋ํด ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ํ์๊ฐ์ ์ ์ฒญ์ผ(application_date)๋ก๋ถํฐ์ ๊ฒฝ๊ณผ๋ ์๋ฅผ ๊ณ์ฐํ์ฌ ๊ณ ๊ฐ ID(customer_id), ๋งค์ถ์ผ, ํ์๊ฐ์ ์ ์ฒญ์ผ๊ณผ ํจ๊ป 10๊ฑด (sales_ymd๋ ์์น, application_date๋ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๋ ์ ์ ์ ์) 1๋ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค.
df_receipt[c("customer_id", "sales_ymd")] %>%
distinct(., .keep_all = TRUE) %>%
inner_join(df_customer[c("customer_id", "application_date")], by = "customer_id") %>% mutate(elapsed_years = trunc(time_length(interval( strptime(application_date, "%Y%m%d"), strptime(as.character(sales_ymd), "%Y%m%d")), "year")))%>%
select(customer_id, sales_ymd, application_date, elapsed_years) %>%
slice(1:10)
customer_id | sales_ymd | application_date | elapsed_years |
---|---|---|---|
<chr> | <int> | <chr> | <dbl> |
CS006214000001 | 20181103 | 20150201 | 3 |
CS008415000097 | 20181118 | 20150322 | 3 |
CS028414000014 | 20170712 | 20150711 | 2 |
CS025415000050 | 20180821 | 20160131 | 2 |
CS003515000195 | 20190605 | 20150306 | 4 |
CS024514000042 | 20181205 | 20151010 | 3 |
CS040415000178 | 20190922 | 20150627 | 4 |
CS027514000015 | 20191010 | 20151101 | 3 |
CS025415000134 | 20190918 | 20150720 | 4 |
CS021515000126 | 20171010 | 20150508 | 2 |
์ค๋ช :
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ customer_id์ sales_ymd ๋ ๊ฐ์ ์ด์ ์ถ์ถํ๋ค.
์ ๋ ์ด์ ์ค๋ณต๋ ํ์ ์ญ์ ํ๊ณ customer_id์ sales_ymd์ ๊ฐ ๊ณ ์ ์์ ์ฒซ ๋ฒ์งธ ์ถํ๋ถ๋ง ์ ์งํ๋ค.
์ป์ ๋ฐ์ดํฐ ํ๋ ์์ df_customer ๋ฐ์ดํฐ ํ๋ ์๊ณผ customer_id ์ปฌ๋ผ์ผ๋ก ๊ฒฐํฉํ๋ค.
interval ํจ์๋ก ๊ตฌ๊ฐ์ ๋ง๋ค๊ณ time_length ํจ์๋ก ์ฐ์๋ฅผ ์ถ์ถํ์ฌ ๊ฐ ๊ณ ๊ฐ์ application_date์ sales_ymd ์ฌ์ด์ ๊ฒฝ๊ณผ ์ฐ์๋ฅผ ๊ณ์ฐํ๊ณ , trunc ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ๊ฐ์ผ๋ก ์๋ฅธ๋ค.
customer_id, sales_ymd, application_date, elapsed_years ์ด์ ์ ํํ๋ค.
๋ง์ง๋ง์ผ๋ก slice ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ ๊ณ ๊ฐ์ application_date์ sales_ymd ๋ ์ง ์ฌ์ด์ ๊ฒฝ๊ณผ ๋ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
R-073: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(sales_ymd)์ ๋ํด ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ํ์๊ฐ์ ์ผ(application_date)๋ก๋ถํฐ์ ์ํฌํฌ ์ด ๋จ์์ ๊ฒฝ๊ณผ ์๊ฐ์ ๊ณ์ฐํ์ฌ ๊ณ ๊ฐ ID(customer_id), ๋งค์ถ์ผ, ํ์๊ฐ์ ์ผ๊ณผ ํจ๊ป 10๊ฑด์ ํ์ํ๋ค. ๊ณผ ํจ๊ป 10๊ฑด์ ํ์ํ๋ผ(๋จ, sales_ymd๋ ์์น, application_date๋ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค๋ ์ ์ ์ ์). ๋จ, ์๊ฐ ์ ๋ณด๋ ๋ณด์ ํ์ง ์์ผ๋ฏ๋ก ๊ฐ ๋ ์ง๋ 0์ 0๋ถ 0์ด๋ก ํ์ํ๋ค.
df_receipt[c("customer_id", "sales_ymd")] %>%
distinct(., .keep_all = TRUE) %>% inner_join(df_customer[c("customer_id","application_date")], by="customer_id") %>% mutate(elapsed_epoch = as.numeric(strptime(as.character(sales_ymd), "%Y%m%d")) - as.numeric(strptime(application_date, "%Y%m%d"))) %>%
select(customer_id, sales_ymd, application_date, elapsed_epoch) %>%
slice(1:10)
customer_id | sales_ymd | application_date | elapsed_epoch |
---|---|---|---|
<chr> | <int> | <chr> | <dbl> |
CS006214000001 | 20181103 | 20150201 | 118454400 |
CS008415000097 | 20181118 | 20150322 | 115516800 |
CS028414000014 | 20170712 | 20150711 | 63244800 |
CS025415000050 | 20180821 | 20160131 | 80611200 |
CS003515000195 | 20190605 | 20150306 | 134092800 |
CS024514000042 | 20181205 | 20151010 | 99532800 |
CS040415000178 | 20190922 | 20150627 | 133747200 |
CS027514000015 | 20191010 | 20151101 | 124329600 |
CS025415000134 | 20190918 | 20150720 | 131414400 |
CS021515000126 | 20171010 | 20150508 | 76550400 |
์ค๋ช :
์ด ์ฝ๋๋ ๊ณ ๊ฐ ๋ฐ ๊ตฌ๋งค ๋ด์ญ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
df_receipt[c("customer_id", "sales_ymd")]: "df_receipt" ๋ฐ์ดํฐ ํ๋ ์์์ "customer_id"์ "sales_ymd" ์ด์ ์ ํํฉ๋๋ค.
distinct(. , .keep_all = TRUE): ๋ชจ๋ ์ปฌ๋ผ์ ์ ์งํ ์ฑ ์ค๋ณต๋ ํ์ ์ญ์ ํ๋ค.
inner_join(df_customer[c("customer_id", "application_date")], by="customer_id"): "df_customer" ๋ฐ์ดํฐ ํ๋ ์์ "customer_id" ์ด์ ์ฌ์ฉํ์ฌ ์ฐธ์ฌํ๋ค.
mutate(elapsed_epoch = as.numeric(strptime(as.character(sales_ymd), "%Y%m%d")) - as.numeric(strptime(application_date, "%Y%m%d")): "sales _ymd" ์ด๊ณผ "application_date" ์ด ์ฌ์ด์ ์ด๋ฅผ ๊ณ์ฐํ๋ "elapsed_epoch" ์ด์ ์๋ก ์์ฑํ๋ค.
select(customer_id, sales_ymd, application_date, elapsed_epoch): ๊ฒฐํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์์ "customer_id", "sales_ymd", "application_date", "elapsed_epoch" ์ด์ ์ ํํฉ๋๋ค. epoch" ์ปฌ๋ผ์ ์ ํํฉ๋๋ค.
slice(1:10): ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ค.
ย
R-074: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ์ผ(sales_ymd)์ ๋ํด ํด๋น ์ฃผ ์์์ผ๋ถํฐ์ ๊ฒฝ๊ณผ์ผ์๋ฅผ ๊ณ์ฐํ์ฌ ๋งค์ถ์ผ, ์ง์ ์์์ผ๊น์ง 10๊ฑด์ฉ ํ์ํ๋ผ(sales_ymd๋ ์์น๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๋ ์ ์ ์ ์).
df_receipt["sales_ymd"] %>%
# ์๋์์๋ ์์์ผ์ด ์ผ์์ผ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฃจ ์ ์ผ๋ก ์ํํธํ์ฌ ์ผ์์ผ์ ์ ์ฃผ ๋ง์ง๋ง ๋ ๋ก ๋ณํํ๊ณ ์๋ค.
# ๊ทธ ์ํ์์ floor_date๋ฅผ ํ๋ฉด ํ ์ฃผ์ ์์์ผ๋ก ์ ์ฃผ ์ผ์์ผ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค,
# ์์์ผ์ ์์์ผ๋ก ๋ง๋ค๊ธฐ ์ํด 1์ ๋ํ๊ณ ์๋ค.
mutate(monday = as.Date(floor_date( strptime(as.character(sales_ymd), "%Y%m%d") - 1 , unit = "week")) + 1) %>%
mutate(elapsed_days = as.integer( as.Date( strptime(as.character(sales_ymd), "%Y%m%d")) - monday)) %>%
select(sales_ymd, elapsed_days, monday) %>%
slice(1:10)
sales_ymd | elapsed_days | monday |
---|---|---|
<int> | <int> | <date> |
20181103 | 5 | 2018-10-29 |
20181118 | 6 | 2018-11-12 |
20170712 | 2 | 2017-07-10 |
20190205 | 1 | 2019-02-04 |
20180821 | 1 | 2018-08-20 |
20190605 | 2 | 2019-06-03 |
20181205 | 2 | 2018-12-03 |
20190922 | 6 | 2019-09-16 |
20170504 | 3 | 2017-05-01 |
20191010 | 3 | 2019-10-07 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ํ๋งค์ผ์ ๋ํด ์ฃผ์ด(์์์ผ)๋ถํฐ์ ๊ฒฝ๊ณผ ์ผ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์๋๋ ์ฝ๋์ ๋ด์ฉ์ ๋๋ค.
df_receipt["sales_ymd"]: df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ sales_ymd ์ปฌ๋ผ์ ์ ํํ๋ค.
%>%: ์ด์ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์์ ์ผ๋ก ์ ๋ฌํ๋ ํ์ดํ ์ฐ์ฐ์์ด๋ค.
mutate(monday = as.Date(floor_date( strptime(as.character(sales_ymd), "%Y%m%d") - 1 , unit = "week")) + 1): ๊ฐ ํ๋งค์ผ์ ์ฃผ ์์์ผ์ ๋ํ๋ด๋ monday๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํ๋ค. ๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํฉ๋๋ค. ์ด๋ sales_ymd ์ปฌ๋ผ์ ๋ ์ง ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ์ด์ ์ฃผ์์ ํ๋ฃจ๋ฅผ ๋นผ๊ณ (์ผ์์ผ์ด ์ฃผ ๋), ํ๋ฃจ๋ฅผ ๋ํ์ฌ ์ฃผ ์์(์์์ผ)์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
%>%: ๋ ๋ค๋ฅธ ํ์ดํ ์ฐ์ฐ์.
mutate(elapsed_days = as.integer( as.Date( strptime(as.character(sales_ymd), "%Y%m%d")) - Monday)): elapsed_days๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํ๊ณ , ๊ฐ ํ๋งค์ผ์ ์ฃผ ์์(์์์ผ) ์์(์์์ผ)๋ถํฐ ๊ฒฝ๊ณผํ ์ผ์๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ sales_ymd ์ปฌ๋ผ์ ๋ ์ง ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , (monday ์ปฌ๋ผ์์) ํด๋น ์ฃผ์ ์์์ผ์ ๋บ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์๋ก ๋ณํํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
%>%: ๋ ๋ค๋ฅธ ํ์ดํ ์ฐ์ฐ์.
select(sales_ymd, elapsed_days, monday): sales_ymd, elapsed_days, monday ์ด์ ์ ํํ๋ค.
%>%: ๋ ๋ค๋ฅธ ํ์ดํ ์ฐ์ฐ์.
slice(1:10). ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฒ์ 10๊ฐ์ ํ์ ์ ํํฉ๋๋ค.
ย
R-075: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์์ ๋ฌด์์๋ก 1%์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋งจ ์๋ถํฐ 10๊ฐ๋ฅผ ํ์ํ๋ผ.
head(sample_frac(tbl = df_customer, size = 0.01), 10)
ย | customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd |
---|---|---|---|---|---|---|---|---|---|---|---|
ย | <chr> | <chr> | <chr> | <chr> | <date> | <int> | <chr> | <chr> | <chr> | <chr> | <chr> |
1 | CS001612000311 | ๅฒกๆฌ ็พไฝณ | 1 | ๅฅณๆง | 1951-03-21 | 68 | 211-0015 | ็ฅๅฅๅท็ๅทๅดๅธไธญๅๅบๅ่ฐท็บ********** | S13001 | 20171118 | 0-00000000-0 |
2 | CS018415000209 | ่ฅฟๆ ็ฑ็พๅญ | 1 | ๅฅณๆง | 1974-11-26 | 44 | 203-0051 | ๆฑไบฌ้ฝๆฑไน ็็ฑณๅธๅฐๅฑฑ********** | S13018 | 20151001 | C-20101026-D |
3 | CS020415000109 | ๅฒกๆ ้ๅฅ | 1 | ๅฅณๆง | 1969-02-02 | 50 | 173-0001 | ๆฑไบฌ้ฝๆฟๆฉๅบๆฌ็บ********** | S13020 | 20150207 | A-20100922-D |
4 | CS040403000046 | ่พป ็ ็ซฅ | 0 | ็ทๆง | 1977-01-23 | 42 | 226-0016 | ็ฅๅฅๅท็ๆจชๆตๅธ็ทๅบ้งใไธ********** | S14040 | 20150813 | 0-00000000-0 |
5 | CS044313000008 | ๆฒณๅ ่ฒๅญ | 1 | ๅฅณๆง | 1985-06-03 | 33 | 144-0056 | ๆฑไบฌ้ฝๅคง็ฐๅบ่ฅฟๅ ญ้ท********** | S13044 | 20161204 | 0-00000000-0 |
6 | CS038502000025 | ๅฐๆณ ใฑใณใคใ | 0 | ็ทๆง | 1963-06-01 | 55 | 134-0015 | ๆฑไบฌ้ฝๆฑๆธๅทๅบ่ฅฟ็ๆฑ********** | S13038 | 20151214 | 0-00000000-0 |
7 | CS034402000064 | ๅท่ถ ๆ | 0 | ็ทๆง | 1972-11-27 | 46 | 213-0031 | ็ฅๅฅๅท็ๅทๅดๅธ้ซๆดฅๅบๅฎๅฅๆ น********** | S14034 | 20170913 | 0-00000000-0 |
8 | CS015303000005 | ๅฏบ่ฅฟ ไธๅพณ | 0 | ็ทๆง | 1987-01-16 | 32 | 135-0016 | ๆฑไบฌ้ฝๆฑๆฑๅบๆฑ้ฝ********** | S13015 | 20150223 | 0-00000000-0 |
9 | CS029411000007 | ๆฃฎๆฐธ ็ๅญ | 1 | ๅฅณๆง | 1976-12-01 | 42 | 134-0085 | ๆฑไบฌ้ฝๆฑๆธๅทๅบๅ่่ฅฟ********** | S12029 | 20150709 | 5-20101007-9 |
10 | CS048612000001 | ๅๅฃ ๆตๅญ | 1 | ๅฅณๆง | 1956-01-11 | 63 | 224-0053 | ็ฅๅฅๅท็ๆจชๆตๅธ้ฝ็ญๅบๆฑ ่พบ็บ********** | S14048 | 20170920 | 0-00000000-0 |
์ค๋ช :
์ด ์ฝ๋๋ dplyr ํจํค์ง์ sample_frac() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_customer ๋ฐ์ดํฐ ํ๋ ์์์ 1%์ ํ์ ๋ฌด์์๋ก ์ ํํ๊ณ head() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํฉ๋๋ค.
sample_frac() ํจ์๋ ๋ฐ์ดํฐ ํ๋ ์์์ ์ผ๋ถ ํ์ ๋ฌด์์๋ก ์ํ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ tbl ์ธ์๋ ์ํ๋งํ ๋ฐ์ดํฐ ํ๋ ์์ ์ง์ ํ๊ณ , size ์ธ์๋ ์ํ๋งํ ํ์ ๋น์จ(0.01, ์ฆ 1%)์ ์ง์ ํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ head() ํจ์์ ์ ๋ฌ๋์ด ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค.
R-076: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์์ ์ฑ๋ณ ์ฝ๋(gender_cd)์ ๋น์จ์ ๋ฐ๋ผ ๋ฌด์์๋ก 10%์ ๋ฐ์ดํฐ๋ฅผ ์ธตํ ์ถ์ถํ๊ณ , ์ฑ๋ณ ์ฝ๋๋ณ๋ก ๊ฑด์๋ฅผ ์ง๊ณํ๋ผ.
set.seed(71) df_customer %>%
group_by(gender_cd) %>%
sample_frac(0.1) %>%
summarise(customer_num = n(), .groups = "drop")
gender_cd | customer_num |
---|---|
<chr> | <int> |
0 | 298 |
1 | 1792 |
9 | 107 |
์ค๋ช :
์ด ์ฝ๋๋ dplyr ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ฑ๋ณ ๊ทธ๋ฃน์์ ๊ณ ๊ฐ์ 10%๋ฅผ ๋ฌด์์๋ก ์ํ๋งํ๊ณ ๊ฐ ์ํ์ ๊ณ ๊ฐ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
set.seed(71)๋ ์ํ๋ง์ ์ฌํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋์ ์์ฑ๊ธฐ์ ์ข ์ ์ค์ ํ๋ค.
df_customer %>%๋ df_customer ๋ฐ์ดํฐ ํ๋ ์์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ํ์ดํ ์ฐ์ฐ์ %>%๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ฒ๋ฆฌ๋ก ์ ๋ฌํ๋ค.
group_by(gender_cd) ์ฑ๋ณ ์ฝ๋ ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค.
sample_frac(0.1)์ ๊ฐ ์ฑ๋ณ ๊ทธ๋ฃน์์ ๊ณ ๊ฐ์ 10%๋ฅผ ์ํ๋งํ๋ฉฐ, sample_frac() ํจ์๋ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ํ๋ ์์์ ํ์ ์ผ๋ถ๋ฅผ ๋ฌด์์๋ก ์ํ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ธ์ 0.1์ ์ํ๋งํ ๋น์จ์ ์ง์ ํ๋ค.
summarise(customer_num = n(), .groups = "drop")์ ๊ฐ ์ฑ๋ณ ๊ทธ๋ฃน์ ๊ณ ๊ฐ ์๋ฅผ ๊ณ์ฐํ๋ค. n() ํจ์๋ ๊ฐ ๊ทธ๋ฃน์ ํ ์๋ฅผ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ ์ด์ ์ด๋ฆ์ customer_num์ผ๋ก ๋ณ๊ฒฝํ๋ค. .groups ์ธ์๋ฅผ "drop"์ผ๋ก ์ค์ ํ๋ฉด ์ถ๋ ฅ์์ ๊ทธ๋ฃนํ ์ ๋ณด๊ฐ ์ญ์ ๋๋ค.
์ต์ข ์ถ๋ ฅ์ gender_cd์ customer_num ๋ ๊ฐ์ ์ด์ด ์๋ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก, gender_cd ์ด์ ์ฑ๋ณ ์ฝ๋๋ฅผ ์ง์ ํ๊ณ customer_num ์ด์ ๊ฐ ์ฑ๋ณ ๊ทธ๋ฃน์์ ์ํ๋ง๋ ๊ณ ๊ฐ ์๋ฅผ ์ง์ ํ๋ค.
R-077: ์์์ฆ ๋ช ์ธ์ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก์ ๊ณ ๊ฐ ๋จ์๋ก ํฉ์ฐํ๊ณ , ํฉ์ฐํ ๋งค์ถ ๊ธ์ก์ ํธ์ฐจ๋ฅผ ์ถ์ถํ๋ผ. ๋จ, ์ด์๊ฐ์ ๋งค์ถ๊ธ์ก ํฉ๊ณ๋ฅผ ๋ก๊ทธํํ ํ ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ๊ทธ ํ๊ท ์์ 3ฯ ์ด์ ๋ฒ์ด๋ ๊ฒ์ผ๋ก ํ๋ค(์์ฐ๋์, ์์ฉ๋์ ๋ชจ๋ ๊ฐ๋ฅ). ๊ฒฐ๊ณผ๋ 10๊ฑด ํ์ํ๋ผ.
df_receipt %>%
group_by(customer_id) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
mutate(log_sum_amount = log(sum_amount + 0.5)) %>%
filter(abs(log_sum_amount - mean(log_sum_amount)) / sd(log_sum_amount) > 3) %>% slice(1:10)
customer_id | sum_amount | log_sum_amount |
---|---|---|
<chr> | <int> | <dbl> |
ZZ000000000000 | 12395003 | 16.3328 |
์ค๋ช :
์ด ์ฝ๋๋ df_receipt๋ผ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ๋ฆฌํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
group_by ํจ์๋ฅผ ์ฌ์ฉํ์ฌ customer_id๋ก ๋ฐ์ดํฐ ํ๋ ์์ ๊ทธ๋ฃนํํ๋ค.
summarise ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ธ์ก ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ฌ sum_amount๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์ ์ฅํ๋ค.
sum_amount ์ด์ ๋์๋ฅผ ์ทจํ์ฌ log_sum_amount๋ผ๋ ์๋ก์ด ์ด์ ์ ์ฅํ๋ค.
๊ฐ ๊ฐ์์ log_sum_amount์ ํ๊ท ๊ฐ์ ๋นผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ log_sum_amount์ ํ์คํธ์ฐจ๋ก ๋๋์ด log_sum_amount์ z-score๋ฅผ ๊ณ์ฐํ๋ค.
log_sum_amount์ z-score๊ฐ 3๋ณด๋ค ํฐ ๊ณ ๊ฐ(์ฆ, log_sum_amount๊ฐ ํ๊ท ๊ฐ์์ ํ์คํธ์ฐจ๋ก 3 ์ด์ ๋จ์ด์ ธ ์๋ ๊ณ ๊ฐ)์ ํํฐ๋งํ๋ค.
slice ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ 10 ์ค์ ์ ํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ Z์ ์๋ฅผ ๊ณ์ฐํ๊ณ Z์ ์๊ฐ ํน์ ์๊ณ์น๋ฅผ ์ด๊ณผํ๋ ๊ณ ๊ฐ์ ํํฐ๋งํ์ฌ ์ด ์ง์ถ์ก์ด ํ๊ท ๋ณด๋ค ํจ์ฌ ๋๊ฑฐ๋ ๋ฎ์ ๊ณ ๊ฐ์ ์๋ณํ๋ค.
ย
R-078: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๊ณ ๊ฐ ๋จ์๋ก ํฉ์ฐํ๊ณ , ํฉ์ฐ๋ ๋งค์ถ ๊ธ์ก์ ์ธ๊ณฝ๊ฐ์ ์ถ์ถํ๋ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค. ์ฌ๊ธฐ์ ์ด์๊ฐ์ 1์ฌ๋ถ์์ 3์ฌ๋ถ์์ ์ฐจ์ด์ธ IQR์ ์ด์ฉํ์ฌ โ1์ฌ๋ถ์์ -1.5รIQRโ ์ดํ ๋๋ โ3์ฌ๋ถ์์+1.5รIQRโ์ ์ด๊ณผํ๋ ๊ฒ์ผ๋ก ํ๋ค. ๊ฒฐ๊ณผ๋ 10๊ฑด ํ์ํ๋ค.
df_receipt %>%
group_by(customer_id) %>%
filter(!grepl("^Z", customer_id)) %>%
summarise(sum_amount = sum(amount), .groups = "drop") %>%
filter( sum_amount < quantile(sum_amount)[2] - 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2]) | sum_amount > quantile(sum_amount)[4] + 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2]) ) %>%
slice(1:10)
customer_id | sum_amount |
---|---|
<chr> | <int> |
CS001414000048 | 8584 |
CS001605000009 | 18925 |
CS002415000594 | 9568 |
CS004414000181 | 9584 |
CS005415000137 | 8734 |
CS006414000001 | 9156 |
CS006414000029 | 9179 |
CS006415000105 | 10042 |
CS006415000147 | 12723 |
CS006415000157 | 10648 |
์ค๋ช :
๋ณธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ทธ๋ฃนํํ๋ค.
customer_id๊ฐ "Z"๋ก ์์ํ๋ ๋ชจ๋ ํ์ ํํฐ๋งํ๋ค.
๊ฐ customer_id์ ๊ธ์ก์ ํฉ์ฐํ๋ค.
์ฌ๋ถ์์ ๋ฒ์(IQR) ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ sum_amount ๊ฐ์ ์์์ ํ์ 1.5%๋ฅผ ํํฐ๋งํ๋ค.
์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒซ 10๊ฐ์ ํ์ ์ ํํ๋ค.
IQR ๋ฐฉ๋ฒ์ ์ฌ๋ถ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ์ธํธ์์ ์ด์๊ฐ์ ๊ฐ์งํ๊ณ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ, ์ํ๊ณผ ํํ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋๋ค.
์๊ณ: quantile(sum_amount)[4] + 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2])
ํํ : quantile(sum_amount)[2] - 1.5 * (quantile(sum_amount)[4] - quantile(sum_amount)[2])
์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ sum_amount ๊ฐ์ ํํฐ๋ง๋๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์๋ ํํฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒ์ 10๊ฐ์ ๊ณ ๊ฐ_id์ sum_amount๊ฐ ํฌํจ๋๋ค.
R-079: ์ํ ๋ฐ์ดํฐ(df_product)์ ๊ฐ ํญ๋ชฉ์ ๋ํด ๊ฒฐ์ ์๋ฅผ ํ์ธํ๋ผ.
sapply(df_product, function(x) sum(is.na(x)))
product_cd
0
category_major_cd
0
category_medium_cd
0
category_small_cd
0
unit_price
7
unit_cost
7
ย
์ค๋ช :
์ด ์ฝ๋๋ sapply() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_product ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ์ด์ ๊ฒฐ์๊ฐ ์๋ฅผ ๊ณ์ฐํ๋ค.
sapply()๋ df_product ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ ์ด์ ํจ์๋ฅผ ์ ์ฉํ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ ํจ์๋ function(x) sum(is.na(x))๋ก ์ ๋ ฅ ์ด x์ ๊ฒฐ์๊ฐ(NA) ์๋ฅผ ๊ณ์ฐํ๋ค. is.na()๋ ์ ๋ ฅ ๋ฒกํฐ์ ๊ฐ์ ๊ธธ์ด์ ๋ ผ๋ฆฌ ๋ฒกํฐ๋ฅผ ๋ฐํํ๊ณ , ๊ฒฐ์๊ฐ(NA)์ด ์์ผ๋ฉด TRUE, ์์ผ๋ฉด FALSE๋ฅผ ๋ฐํํ๊ณ , sum()์ ๋ ผ๋ฆฌ ๋ฒกํฐ์ TRUE ๊ฐ์ ํฉ์ฐํ์ฌ ์ด์์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ์๋ฅผ ์ ๊ณตํ๋ค.
์ด ์ฝ๋์ ์ถ๋ ฅ์ df_product์ ์ด ์ด๋ฆ์ ์ด๋ฆ์ผ๋ก, ํด๋น ๊ฒฐ์๊ฐ์ ๊ฐ์๋ฅผ ๊ฐ์ผ๋ก ํ๋ ๋ช ๋ช ๋ ๋ฒกํฐ์ด๋ค.
R-080: ์ํ ๋ฐ์ดํฐ(df_product) ์ค ์ด๋ ํ ํญ๋ชฉ์ ๊ฒฐ์์ด ๋ฐ์ํ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ญ์ ํ ์๋ก์ด ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ๋ํ, ์ญ์ ์ ํ์ ๊ฑด์๋ฅผ ํ์ํ๊ณ , 079์์ ํ์ธํ ๊ฑด์๋งํผ ๊ฐ์ํ ๊ฒ๋ ํ์ธํด์ผ ํ๋ค.
df_product_1 <- na.omit(df_product) paste("ๅ้คๅ:", nrow(df_product)) paste("ๅ้คๅพ:", nrow(df_product_1))
'์ญ์ ์ : 10030'
'์ญ์ ํ: 10023'
์ค๋ช :
์ฒซ ๋ฒ์งธ ์ฝ๋์์๋ na.omit() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ๋ฐ์ดํฐ ํ๋ ์ df_product์์ ๊ฒฐ์๊ฐ(NA)์ด ์๋ ๋ชจ๋ ํ์ ์ ๊ฑฐํ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_product_1์ ์์ฑํ๊ณ ์๋ค.
๋ ๋ฒ์งธ ์ฝ๋์์๋ paste() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ NA๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ ๊ณผ ์ ๊ฑฐํ ํ์ df_product์ ํ ์๋ฅผ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก nrow(df_product)๋ df_product์ ํ ์๋ฅผ ๋ฐํํ๊ณ , ์ฒซ ๋ฒ์งธ paste() ํธ์ถ์ ์ด ์ซ์์ '์ญ์ ์ :' ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๊ณ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก nrow(df_product_1)๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_product_1์ ํ ์๋ฅผ ๋ฐํํ๊ณ , ๋ ๋ฒ์งธ paste() ํธ์ถ์ ์ด ์ซ์์ "After deletion:"์ด๋ผ๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ค.
์ด ์ฝ๋๋ ๋ฐ์ดํฐ ํ๋ ์์ ๊ด์ธก์น ์์ ๋ํ NA ์ญ์ ํจ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Comment