์ ์ฒด ๊ธ (80) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ ํ์ ํํฐ๋ง(Collaborative Filtering)์ ์ด์ฉํ ์ ๋๋ฉ์ด์ ์ถ์ฒ ์ ์ ์ ์ ๋๋ฉ์ด์ ํ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์ ๋ณธ ์ ๋๋ฉ์ด์ ์ค ์ด๋ค ๊ฒ์ ์ถ์ฒํ ์ง์ ๋ํ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. ์ ๋๋ฉ์ด์ ๋ฐ์ดํฐ๋ ์ฌ๊ธฐ(www.kaggle.com/CooperUnion/anime-recommendations-database)์์ ์ป์๋ค. ํ์ ํํฐ๋ง(Collaborative filtering)์ ๋ํ์ ์ธ 3๊ฐ์ง ๋ฐฉ์์ R๋ก ์ง์ ๊ตฌํํ๊ณ , ์ด๋ฅผ ์ ์ฉํ์ฌ ์ถ์ฒํ์ฌ ๋ณด์. ์ด๋ฅผ ๊ตฌํํ๋๋ฐ ์๋์ Reference์ ๋ ผ๋ฌธ์ ์ฐธ๊ณ ํ์๋ค. 1. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ 2. ํ์ ํํฐ๋ง 2-1. ์ ์ ๊ธฐ๋ฐ ํ์ ํํฐ๋ง 2-2. ์์ดํ ๊ธฐ๋ฐ ํ์ ํํฐ๋ง 2-3. ํ๋ ฌ ์ธ์๋ถํด ํ์ ํํฐ๋ง 3. ์ฑ๋ฅ ๋น๊ต 4. ์ถ์ฒ ๊ฒฐ๊ณผ 1. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ In: library(dplyr) library(tidyr) .. [Level 2] ์กฐ์ด์คํฑ ์ฝ๋ฉํ ์คํธ ์ฐ์ต - ์กฐ์ด์คํฑ ์กฐ์ด์คํฑ์ผ๋ก ์ํ๋ฒณ ์ด๋ฆ์ ์์ฑํ์ธ์. ๋งจ ์ฒ์์ A๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ex) ์์ฑํด์ผ ํ๋ ์ด๋ฆ์ด ์ธ ๊ธ์๋ฉด AAA, ๋ค ๊ธ์๋ฉด AAAA ์กฐ์ด์คํฑ์ ๊ฐ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค. โฒ - ๋ค programmers.co.kr def cnt_up_down(chr): cnt_from_a = abs(ord('A')-ord(chr)) cnt_from_z = abs(ord('Z')-ord(chr)+1) return(min(cnt_from_a, cnt_from_z)) def solution(name): cnt = 0 for i in name: cnt += cnt_up_down(i) lst_name = list(name) len_name = len(lst_name) if ls.. [Level 2] ํฐ ์ ๋ง๋ค๊ธฐ ์ฝ๋ฉํ ์คํธ ์ฐ์ต - ํฐ ์ ๋ง๋ค๊ธฐ programmers.co.kr def solution(num, k): max_num = [] for i, n in enumerate(num): while len(max_num) > 0 and max_num[-1] 0: max_num.pop() k -= 1 if k == 0: max_num += list(num[i:]) break max_num.append(n) max_num = max_num[:-k] if k > 0 else max_num return(''.join(max_num)) โท ์ด ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ํธ๋ ๋ฌธ์ ๋ก, ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ ๋ฒ์งธ ์ซ์๋ถํฐ ์ด์ ์ ์ซ์์ ๋น๊ต๋ฅผ ํตํด ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๋ง๋ค์ด ๋๊ฐ์ผ ํ๋ค. โท ์ ์ฝ๋์.. ๊ธฐ๋ณธ ํจ์ ์ฌ์ฉ๋ฒ R์ ๋ด์ฅ๋ ๊ธฐ๋ณธ ํจ์์ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด์. โก if ( ) { } else if ( ) { } else { } In: char = 'A' if (char == 'B') { print('if') } else if (char == 'C') { print('else if') } else { print('else') } Out: [1] "else" โก for ( ) { } In: for (i in 1:5) { print(i) } Out: [1] 1 [1] 2 [1] 3 [1] 4 [1] 5 โก ifelse In: char = 'A' ifelse(char == 'A', 'char is A', 'char is not A') Out: [1] "char is A" โท ifelse ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์กฐ๊ฑด์ .. ๋ฒ ์ด์ง์ ๋คํธ์ํฌ(Bayesian network)๋ฅผ ํ์ฉํ King County์ ์ง๊ฐ ๋ถ์ ๋ฒ ์ด์ง์ ๋คํธ์ํฌ(Bayesian network)๋ฅผ ํ์ฉํ์ฌ King County์ ์ง๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ ๋ค์ํ ์์์ ์ธ๊ณผ๊ด๊ณ๋ฅผ ํ์ธํ๊ณ , ๋ถ์ํ๋ ๊ฒ์ด ์ด ํ๋ก์ ํธ์ ๋ชฉ์ ์ด๋ค. ๋ฐ์ดํฐ์ ์ถ์ฒ๋ ์ฌ๊ธฐ(www.kaggle.com/harlfoxem/housesalesprediction)์ด๊ณ , ์๋์ ๊ตฌ์ฑ ์์๋๋ก ๋ถ์ ๋ฐ ๋ชจ๋ธ๋ง ๊ณผ์ ์ ์ํํ ๊ฒ์ด๋ค. ๋ชจ๋ ์ฝ๋๋ R๋ก ์์ฑ๋์๋ค. 1. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ 2. ์๊ฐํ ๋ฐ ์๊ด๊ด๊ณ ๋ถ์ 3. ๋ค์คํ๊ท๋ถ์ 4. ๋ฒ ์ด์ง์ ๋คํธ์ํฌ ๋ชจ๋ธ๋ง 1. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ In: # Statistic library(car) # Data manipulation library(dplyr) library(tidyr) # Visualization library(ggplot2) librar.. caret ์ฌ์ฉ๋ฒ caret ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฒ์ ์ ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณด์. In: df_iris = iris str(df_iris) Out: 'data.frame':150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species : Factor w/ 3 levels .. dplyr ์ฌ์ฉ๋ฒ dplyr์ ๋ํ์ ์ธ ํจ์ select, filter, mutate, summarise, group_by, sample_n, sample_frac์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์ ์ฉํ์ฌ ๋ณด์. In: library(dplyr) df_iris = iris str(df_iris) Out: Sepal.Length Sepal.Width Petal.Length Petal.Width Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 Median :5.800 Median :3.000 Median :4.350 Median :1.300 Mean :5.843 Mean :3.057 Mean :3... ๊ฒฐ์ธก์น ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ ๊ฒฐ์ธก์น ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์์๋ณด์. โก ๊ฒฐ์ธก์น ํ์ธ In: library(MASS) df_car = Cars93 df_car %>% sapply(function(x) sum(is.na(x))) Out: Manufacturer Model Type 0 0 0 Min.Price Price Max.Price 0 0 0 MPG.city MPG.highway AirBags 0 0 0 DriveTrain Cylinders EngineSize 0 0 0 Horsepower RPM Rev.per.mile 0 0 0 Man.trans.avail Fuel.tank.capacity Passengers 0 0 0 Length Wheelbase Width 0 0 0 Turn.circle Rear.seat.room Luggag.. CSV ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ CSV ํ์ผ์ ์์ฑํ ๋ค, ์ด๋ฅผ ํน์ ๊ฒฝ๋ก์ ์ฐ๊ณ ์ฝ๊ธฐ๋ฅผ ์ํํ์ฌ ๋ณด์. In: df_car = mtcars df_car %>% head() Out: mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Va.. ๋ฌธ์์ด ๋ฐ์ดํฐ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ R์ ๋ด์ฅ๋์ด ์๋ ํจ์์ stringr ํจํค์ง๋ฅผ ํํ์ฌ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค. โก ๋ฌธ์ ์ด์ด ๋ถ์ด๊ธฐ In: paste('Rooney', 'Song', sep = '_') paste0('Rooney', 'Song') str_c('Rooney', 'Song', sep = '_') Out: [1] "Rooney_Song" [1] "RooneySong" [1] "Rooney_Song" โท paste, paste0 ํจ์๋ ๋ ๋ฌธ์์ด์ ๋ถ์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ ํจ์์ ์ฐจ์ด์ ์ paste0 ํจ์๋ ๋ถ์ผ ๋, ์ฌ์ด์ ๋ฌธ์๋ฅผ ์ฝ์ ํ์ง ์๊ณ , ๋ฐ๋ก ๋ถ์ธ๋ค๋ ๊ฒ์ด๋ค. paste ํจ์์ sep ์ธ์๋ฅผ ํตํด ๋ ๋ฌธ์์ด์ ๋ถ์ผ ๋, ์ฌ์ด์ ๋ค์ด๊ฐ ๋ฌธ์๋ฅผ ์ง์ ํ ์ ์๋ค. โท str_c ํจ์๋ st.. ์๊ณ์ด ๋ฐ์ดํฐ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ R์ ๋ด์ฅ๋์ด ์๋ ํจ์์ lubridate ํจํค์ง๋ฅผ ํ์ฉํ์ฌ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค. โก ๊ธฐ๋ณธ ํจ์๋ฅผ ํ์ฉํ ์๊ณ์ด ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ In: date_form = c('%Y%m%d', '%Y.%m.%d', '%Y~%m~%d', '%Y-%m-%d') date_1 = as.Date('20201019', tryFormats = date_form) date_2 = as.Date('2020.10.19', tryFormats = date_form) date_3 = as.Date('2020~10~19', tryFormats = date_form) print(date_1) print(date_2) print(date_3) print(class(date_1)) print(class(date_2).. tidyr ์ฌ์ฉ๋ฒ tidyr ํจ์บ์ง์ ๋ํ์ ์ธ ํจ์ gather, spread, seperate, unite์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์ ์ฉํ์ฌ ๋ณด์. In: library(dplyr) library(tidyr) df_iris = iris df_iris$id = 1:nrow(df_iris) df_iris = df_iris[, c(6, 1:5)] str(df_iris) Out: 'data.frame':150 obs. of 6 variables: $ id : int 1 2 3 4 5 6 7 8 9 10 ... $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ .. ์ด์ 1 2 3 4 ยทยทยท 7 ๋ค์