class: ftitle-slide --- class: title-color1 layout: false <br> #### 자료 링크 ##### <https://mrchypark.github.io/r-api-with-plumber/> #### pdf 버전 다운로드 ##### <https://raw.githubusercontent.com/mrchypark/r-api-with-plumber/master/docs/r-api-with-plumber.pdf> --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- ## 목차 .pull-left[ - 발표자 소개 - 데이터 과학자 - 데이터 과학자란 - 데이터 과학자가 하는 일 - R 과 생태계 소개 - 커뮤니케이션 - 휴먼 리더블한 R 도구 - 머신 리더블한 api 서버 ] .pull-right[ - plumber 소개 - 함수 정의 방식의 api 작성 - Serializers - 테스트 방법 - 배포 방법 - 머신러닝 서비스를 위해 - 고려해야 할 점 - 지속적 학습을 위한 구조 - 마치며 ] --- class: split-40 # 발표자 소개 .column[ .content.right[ <br> <br> <br> <br> <br> ![](https://avatars2.githubusercontent.com/u/6179259?v=4&s=300) ]] .column[ .content[ <br> <br> ### 박찬엽 - .yellow[(현)]코빗 재무팀 데이터 담당자 * 재무DB 구축/관리 및 자동화 - .gray[(전)]서울도시가스 선행연구팀 연구원 * 챗봇 엔진 개발 및 서버 구축 - .gray[(전)]2017년 패스트 캠퍼스 데이터 분석 R 강의 * [데이터 분석을 위한 중급 R 프로그래밍](http://www.fastcampus.co.kr/data_camp_dabrp/) - N사 뉴스 크롤러 [N2H4](https://github.com/forkonlp/N2H4), D사 뉴스 크롤러 [DNH4](https://github.com/forkonlp/DNH4) 관리자 * [ForkonLP](https://forkonlp.github.io/) 프로젝트 - .blue[**FACEBOOK**]@[mrchypark](https://www.facebook.com/mrchypark) - .gray[**GITHUB**]@[mrchypark](https://github.com/mrchypark) ]] --- class: title-color1 layout: false ### 오늘 하고 싶은 이야기는 <U>plumber 패키지 소개</U> --- class: title-color1 layout: false # 데이터 과학자 --- class: title-color2 layout: false # 데이터 과학자란 --- layout: false .pull-center[.set[ ![](http://t1.daumcdn.net/brunch/service/user/NjN/image/uZgY-zp5iTAgUNoqGWmbYfLxE2k.png) ]] --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 데이터 과학자란 <br> ![](http://t1.daumcdn.net/brunch/service/user/NjN/image/Zh5hsVBBSpDgD7EPlzr4V3W5Nmw.jpg) .footer[출처 : <https://brunch.co.kr/@hero4earth/3>] --- # 데이터 과학자란 <br> ![](https://user-images.githubusercontent.com/6179259/48439784-79f04680-e7ca-11e8-8271-14353eefba5b.png) --- class: title-color3 layout: false ### 연구를 통하여 과학 지식을 탐구하기 위해 ### <U>통계 지식이 필요</U>합니다. --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 데이터 과학자란 .pull-left[ ### 과학자 데이터 확보가 어려움 - 실험 - 설문 ] .pull-right[ ### 데이터 과학자 디지털화된 데이터를 확보 - A/B 테스트 - 사용자 로그 ] --- class: title-color1 layout: false ### 이제, 연구를 통하여 과학 지식을 탐구하기 위해 ### <U>개발 지식이 필요</U>합니다. --- class: title-color2 layout: false # 데이터 과학자가 하는 일 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 데이터 과학자가 하는 일 <br> <br> <br> <br> <br> .content.center[ ![](https://r4ds.had.co.nz/diagrams/data-science.png) ] <br> <br> .footer[출처 : <https://r4ds.had.co.nz/introduction.html#what-you-will-learn>] --- class: title-color2 layout: false # R 과 생태계 소개 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # R 과 생태계 소개 .content.center[ <br> <br> <br> <br> ## R
<i class="fas fa-heart faa-bounce animated " style=" color:red;"></i>
Human ] --- # R 과 생태계 소개 ## 강점 1 . 인덱트가 1로 시작함 ```r num <- 1:10 num[3] ``` ``` ## [1] 3 ``` --- # R 과 생태계 소개 ## 강점 2 . 패키지 시스템이 단순함 - 콘솔에서 설치 - 글로벌 설치가 기본값 ```r install.packages("tidyverse") ``` --- # R 과 생태계 소개 ## 강점 3 . 문서등을 사전 검수하는 공식 패키지 저장소 cran - 등록하는 모든 패키지를 사전 검수함 - 마이너 버전 호환을 보장하며, 판올림 마다 각 패키지 테스트가 깨지면 알림 - **?함수명**으로 동작하는 개별 함수 설명서 필수 / 동작 예시 코드 제공 - 패키지에 따라 비네트(vignettes)라는 이름의 튜토리얼, 워크플로우 설명을 제공 --- class: title-color1 layout: false ### R은 <U>사용자 친화적</U>이다. --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # R 과 생태계 소개 .content.center[ ## R
<i class="fas fa-heart faa-bounce animated " style=" color:red;"></i>
Local files ## R
<i class="fas fa-heart faa-bounce animated " style=" color:red;"></i>
Web data ## R
<i class="fas fa-heart faa-bounce animated " style=" color:red;"></i>
Database ] --- # R 과 생태계 소개 <img src = "https://github.com/leeper/rio/raw/master/man/figures/logo.png" align="right" width = 20%/> ## Local files ```r library(rio) dat <- import("path/what/you/read") ``` csv, xlsx, sav 등 대부분의 입출력을 바로 지원 [writexl](https://github.com/ropensci/writexl) 패키지는 안정적인 엑셀 형식 파일 저장 기능을 제공 --- # R 과 생태계 소개 ## Web data [httr](https://github.com/r-lib/httr) - GET, POST, PUT 등 http 명세에 맞는 요청을 지원 [rvest](https://github.com/hadley/rvest) - xml을 **%>%** 이용해 쉽게 처리할 수 있는 함수를 제공 [RSelenium](https://github.com/ropensci/RSelenium) - Selenium을 R에서 사용할 수 있게 작성 --- # R 과 생태계 소개 .pull-left[ ### .small[driver list] .tiny[(DBI supported)] - SQLite - MySQL(+MariaDB) - bigquery - Oracle - ... ###.small[\+ noDBI] .tiny[supported] - MongoDB - Redis - CouchDB - Elasticsearch - etcd - ... ] .pull-right[ ###.small[\+ sergeant] .tiny[(with Apache Drill)] - HBase - MapR-DB - HDFS - MapR-FS - Amazon S3 - ... ###.small[\+ JDBC & ODBC] ] --- # R 과 생태계 소개 .content.center[ <br> <br> <br> <br> ## R
<i class="fas fa-heart faa-bounce animated " style=" color:red;"></i>
table ] --- # R 과 생태계 소개 .content.center[ <br> <br> <br> <br> ![](https://avatars1.githubusercontent.com/u/22032646?s=200&v=4) ] --- # R 과 생태계 소개 ### 파이프 연산자(%>%) 함수를 중첩해서 사용할 일이 점점 빈번해 짐 ```{} plot(diff(log(sample(rnorm(10000,mean=10,sd=1),size=100,replace=FALSE))) ,col="red",type="l") ``` ### %>%를 사용하면 .pull-left[ 1. 생각의 순서대로 함수를 작성할 수 있음 1. 중간 변수 저장을 할 필요가 없음 1. 순서가 읽이 용이하여 기억하기 좋음 ] .pull-right[ ```{} rnorm(10000,mean=10,sd=1) %>% sample(size=100,replace=FALSE) %>% log %>% diff %>% plot(col="red",type="l") ``` ] --- # R 과 생태계 소개 .content.center[ <br> <br> <br> <br> ![](https://github.com/tidyverse/dplyr/raw/master/man/figures/logo.png) ] --- # R 과 생태계 소개 ### 데이터를 다루는 7가지 동작 ![](https://raw.githubusercontent.com/mrchypark/dabrp_classnote3/master/docs/img/dplyr.png) --- # R 과 생태계 소개 ### 코드 품질 읽기 쉬운 코드가 좋은 코드 ```r popular_dests %>% filter(arr_delay > 0) %>% mutate(prop_delay = arr_delay / sum(arr_delay)) %>% select(year:day, dest, arr_delay, prop_delay) ``` --- class: title-color1 layout: false # 커뮤니케이션 --- class: title-color2 layout: false # 휴먼 리더블한 R 도구 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 휴먼 리더블한 R 도구 <img src = "https://github.com/tidyverse/ggplot2/raw/master/man/figures/logo.png" align="right" width = 20% /> ### 차트 색상 팔레트, 테마, autoplot를 지원하는 방대한 생태계 / publish quality .pull-left[ ```r library(ggplot2) ggplot(mpg, aes(displ, hwy, colour = class) ) + geom_point() ``` ] .pull-right[ ![](index_files/figure-html/unnamed-chunk-2-1.png)<!-- --> ] --- # 휴먼 리더블한 R 도구 <img src = "https://user-images.githubusercontent.com/6179259/48444652-db6ae200-e7d7-11e8-867b-98594162a81d.png" align="right" width = 20% /> ### MS office Presentation as Code R code로 Word와 Power Point 결과물을 작성 --- # 휴먼 리더블한 R 도구 <img src = "https://user-images.githubusercontent.com/6179259/48445348-b37c7e00-e7d9-11e8-903b-1b3b22d3c880.png" align="right" width = 50%/> ### rmd 기반 문서 Rmd를 기반으로 출판 저작물 작성 publish as Code 논문([rticles](https://github.com/rstudio/rticles)) 책([bookdown](https://github.com/rstudio/bookdown)) 블로그([blogdown](https://github.com/rstudio/blogdown), [radix](https://github.com/rstudio/radix)) 등 --- # 휴먼 리더블한 R 도구 ### as Code Publish Quality Chart 패키지를 활용하여 출판과 보고서를 code로 관리하면 분석 결과와 발표 자료를 통일 시킬 수 있음. code를 수정해야 하는 소스로, .docx / .pptx / .xlsx / .html 등의 rendering 결과물은 손을 대지 않는 습관을 들이는 것이 중요함. --- class: title-color2 layout: false # 머신 리더블한 api 서버 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 머신 리더블한 api 서버 ### web api - json, xml 등 code에서 처리하기 좋은 포멧의 데이터로 통신 - gRPC, http 명세 등 통신 프로토콜 정의 .content.center[ ![](http://thefoxlab.com/upload/technology_icon/API-Development.png) ] --- class: title-color3 layout: false ### R의 결과물로 <U>api 서버</U>를 만들 수는 없을까 --- class: title-color1 layout: false # plumber 소개 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- <br> <br> ![](https://user-images.githubusercontent.com/6179259/48446703-48cd4180-e7dd-11e8-847e-c39a8ca31936.png) ```r #* Echo back the input #* @param msg The message to echo #* @get /echo function(msg=""){ list(msg = paste0("The message is: '", msg, "'")) } ``` --- class: title-color2 layout: false # 함수 정의 방식의 api 작성 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 함수 정의 방식의 api 작성 ### 함수 정의와 같은 문법 패키지 작성시 사용하는 roxygen 패키지 문법을 사용하여 코드내 문서화 ```r #' Return the sum of two numbers # endpoint 설명 #' @param a The first number to add # params 이름과 설명 #' @param b The second number to add # endpoint 정의 #' @post /sum # 함수 작성 sum_api <- function(a, b){ as.numeric(a) + as.numeric(b) } ``` --- # 함수 정의 방식의 api 작성 ### 실행방법 ```r library(plumber) plumb("plumber.R")$run() ``` --- # 함수 정의 방식의 api 작성 ### 실행방법2 ![](https://user-images.githubusercontent.com/6179259/48447367-0e64a400-e7df-11e8-9e11-cd8d026c786b.png) --- # 함수 정의 방식의 api 작성 .content.center[ ![](https://user-images.githubusercontent.com/6179259/48447464-4e2b8b80-e7df-11e8-880a-889f8ac150f9.png) ] --- # 함수 정의 방식의 api 작성 ### swagger 지원 ![](https://user-images.githubusercontent.com/6179259/48447538-8337de00-e7df-11e8-92b8-95abefa46003.png) --- # 함수 정의 방식의 api 작성 ### swagger 내 문서화 및 테스트 ![](https://user-images.githubusercontent.com/6179259/48447637-cb570080-e7df-11e8-982e-6e8eb80faedb.png) --- # 막간 기능 ### 다이나믹 라우트 **<id:int>** 로 작성하여 타입을 지정할 수 있음. 지정하지 않으면 모두 글자이며, bool, numeric, int 등 지원 ```r #' Lookup a user #' @get /users/<id> function(id){ subset(users, uid==id) } ``` --- class: title-color2 layout: false # Serializers --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # Serializers ### 다양한 방식을 지원 서버에서 지원하기를 기대하는 동작들을 거의 지원함. 1. 텍스트 1. 이미지(jpg, png) 1. htmlwidget --- # Serializers ### 이미지 브라우저를 통해 이미지 결과물을 전송 ```r #* Plot a histogram #* @png #* @get /plot function() { rand <- rnorm(100) hist(rand) } ``` --- # Serializers ### htmlwidget R에 htmlwidget을 이용해 동적 문서 작성 패키지의 결과물을 전송할 수 있음. ```r library(dygraphs) #' @get /spots/<from>/<to>/graph #' @serializer htmlwidget function(from, to){ dygraph(datasets::sunspots, main = "썬스팟 데이터 셋") %>% dyRangeSelector(dateWindow = c( paste0(from, "-01-01"), paste0(to, "-12-31") )) } ``` --- class: title-color2 layout: false # 테스트 방법 ## 테스트를 추가해 봅시다. --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 테스트 방법 ### 테스트를 위한 프로젝트 구조 예시 ![](https://user-images.githubusercontent.com/6179259/48448786-74ebc100-e7e3-11e8-8dc2-44ba05837a75.png) --- # 테스트 방법 ### 함수 이름을 작성 ![](https://user-images.githubusercontent.com/6179259/48449933-8cc54400-e7e7-11e8-8c92-f77f8f84926d.png) --- # 테스트 방법 ### 테스트 환경 설정 ![](https://user-images.githubusercontent.com/6179259/48448976-0f4c0480-e7e4-11e8-8c38-37a2a1438f09.png) --- # 테스트 방법 ### 테스트 케이스 작성 ![](https://user-images.githubusercontent.com/6179259/48449028-3f93a300-e7e4-11e8-87d5-5defa85b8056.png) --- # 테스트 방법 ### 함수로 작성된 파일들을 실행할 스크립트 ![](https://user-images.githubusercontent.com/6179259/48449049-5639fa00-e7e4-11e8-8d2a-558212e49e35.png) --- # 테스트 방법 ### DESCRIPTION DESCRIPTION 파일은 프로젝트가 패키지임을 인식하기 위해 꼭 필요하기 때문에 error가 발생하지 않을 최소한의 가짜 정보를 입력 ```sh Package: arbitrary Title: Does not matter. Version: 0.0.1 ``` --- # 테스트 방법 ### Build 패널 ![](https://user-images.githubusercontent.com/6179259/48449171-d3fe0580-e7e4-11e8-8185-d2a748ccb473.png) --- # 테스트 방법 ### 테스트 결과 ![](https://user-images.githubusercontent.com/6179259/48449206-f98b0f00-e7e4-11e8-8a02-713bc39f0425.png) --- # 테스트 방법 ### CI에 올리기 R은 travis-ci, gitlab appveyor 등의 CI를 지원함. 배포를 다양한 환경에 할 것이 아니라면 각 상황에 맞는 툴을 사용할 것. ![](https://user-images.githubusercontent.com/6179259/48450283-001b8580-e7e9-11e8-8ec5-aabe9f06f830.png) --- class: title-color2 layout: false # 배포 방법 ## 역시 환경 격리에는 docker 입니다. --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 배포 방법 ### 환경 격리 ![](https://cdn-images-1.medium.com/max/1000/1*6dNQ6368kw6bZlG_mtAxgg.png) --- # 배포 방법 <img src = "https://github.com/o2r-project/containerit/raw/master/inst/logo.png" align="right" width = 20% /> ### containerit [containerit](https://github.com/o2r-project/containerit)은 [sysreqs](https://sysreqs.r-hub.io/) 프로젝트에 기반하고 있음. [rocker](https://hub.docker.com/r/rocker/rstudio/)는 r-base의 안정 버전 docker 이미지를 제공하는 프로젝트. debian 기반의 이미지로 환경이 통일되어 있으므로 각 패키지의 시스템 수준 의존성 정보 제공 프로젝트인 [sysreqs](https://sysreqs.r-hub.io/)가 가능해짐. [containerit](https://github.com/o2r-project/containerit)은 연구재현성을 위해 개발 중 --- # 배포 방법 ### rocker ![](https://user-images.githubusercontent.com/6179259/48450847-28a47f00-e7eb-11e8-885e-8c88540ff86f.png) --- # 배포 방법 ### sysreqs ![](https://user-images.githubusercontent.com/6179259/48451662-bc2b7f00-e7ee-11e8-8e50-a10ac21df467.png) --- # 배포 방법 ### Dockerfile ![](https://user-images.githubusercontent.com/6179259/48450723-b0d65480-e7ea-11e8-8912-a05cf6bdd8ce.png) --- class: title-color3 layout: false ### 이걸로 끝이라고는... ### 상황에 맞게 <U>수정</U>해서 사용해야 합니다. --- class: title-color1 layout: false # 머신러닝 서비스를 위해 ## --- class: title-color2 layout: false # 고려해야 할 점 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 고려해야 할 점 ### 팀의 크기 머신러닝 서비스를 위해 최소 3인(도메인 전문가, 머신러닝 엔지니어, 소프트웨어 엔지니어)이 필요함 언제나처럼 제한된 자원 내에서 혼자 진행해야 할 수도 있음 -- 상황에 따라 데이터 과학자에 해당하는 사람이 얼마나 알고 있어야 하는가? 혹은 자신에게 부족한 부분에서 어떻게 조직내 협업을 이끌어 낼 것인가? --- # 고려해야 할 점 ### 얼마나 자주 변경해야 하는가 머신러닝의 성능은 학습 데이터에 의존적임 데이터의 유효기간이 지나거나, 새로운 고객군이 기존 고객군과 성격이 달라질 수 있음. -- 얼마나 자주 학습해야 할까? 테스트는 어떻게 진행해야 할까? --- # 고려해야 할 점 ### 사람의 개입 머신러닝 프로젝트는 완전 자동화를 목표로 하는 것은 위험함 특히 새로운 변수를 발굴하거나, 알고리즘을 바꾸는 등의 상황은 전부 사람이 판단해야 함 -- 어떤 작업을 사람이 판단해야 안전한가? 사람의 작업이 어떻게 설계되어야 scale up에 유리한가? --- class: title-color2 layout: false # 지속적 학습을 위한 구조 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 지속적 학습을 위한 구조 ### 지속적 학습에 대해 고려해야 할 사항 데이터 확보: 보통 지도 학습 모델을 많이 사용하기 때문에 확보 비용이 매우 높음 학습: 데이터 상황에 맞는 알고리즘 및 변수 선택 등 배포: 테스트 케이스나 정확도를 기준으로 배포 모델을 결정 --- # 지속적 학습을 위한 구조 ### 수동 학습과 수동 배포 서비스 초기에는 모두 수동 작업이 필요함 ![](https://user-images.githubusercontent.com/6179259/48452423-6d7fe400-e7f2-11e8-8b6e-d8216dd84cb7.png) --- # 지속적 학습을 위한 구조 ### 지속적 데이터 확보 사용자 이벤트를 기반으로 지도학습용 데이터 파이프라인 구축. 가능한한 사람 손을 타지 않거나, 타는 것이 필수인 구조인 것이 좋음 ![](https://user-images.githubusercontent.com/6179259/48452574-0d3d7200-e7f3-11e8-8370-3815298eb94b.png) --- class: title-color1 layout: false # 마치며 --- layout: true background-image: url(https://user-images.githubusercontent.com/6179259/48409183-7b941d00-e77e-11e8-81c8-9bf0a8e68792.png) background-size: cover --- # 마치며 ### plumber는 어느 위치에 있는가 R의 위치와 함께 plumber는 빠르게 프로토 타이핑이 가능 빠르게 변하고 리소스가 부족한 경우 적합할 수 있음 회사내 튜터가 있다면 도메인 전문가가 도전해 볼만함 -- 물론 배포 등은 엔지니어의 도움을 받아야 --- class: title-color1 layout: false ### Q&A