1 pins 팩키지

pins를 통해 데이터를 식별하고, 찾고, 공유할 수 있는 새로운 팩키지다. pins 팩키지에는 다음 중요한 3가지 동사를 활용하여 pins 팩키지가 목표한 목적을 달성할 수 있다.

  • pin() 동사를 사용해서 원격 자원을 로컬로 가져와서 작업할 수 있다.
  • pin_find() 동사를 사용해서 다양한 보드(board)에서 신규 자원을 검색할 수 있다.
  • board_register() 동사를 사용해서 로컬 폴더, GitHub, 캐글, RStudio Connect 에 연결하여 자원을 공유할 수 있다.

pin(), pin_-_get(), pin_find() 동사를 사용해서 로컬 컴퓨터로 가져온 파일은 board_local_storage()를 통해 캐쉬로 저장되어 추후 사용할 수 있게 된다.

# A tibble: 3 x 1
  paths                                                          
  <chr>                                                          
1 /Users/statkclee/Library/Caches/pins/local/data.txt            
2 /Users/statkclee/Library/Caches/pins/local/example_retail_sales
3 /Users/statkclee/Library/Caches/pins/local/sales_by_month      

1.1 pin() 동사

pin() 동사를 사용해서 원격 자원을 고정시키거나, 혹은 로컬 캐쉬로 저장해둬서 추후 재사용하게 된다. 먼저, pin(url)을 통해 원격 파일을 고정시키고 이를 로컬 캐쉬에 저장시켜서 다운로드할 수 있다.

# A tibble: 6 x 2
  ds              y
  <fct>       <int>
1 1992-01-01 146376
2 1992-02-01 147079
3 1992-03-01 159336
4 1992-04-01 163669
5 1992-05-01 170068
6 1992-06-01 168663

pin() 캐쉬 객체를 "sales_by_month"로 저장시켜두고 나서 나중에 필요한 경우 pin_get() 함수로 꺼내 사용한다.

# A tibble: 12 x 2
   month   total
   <ord>   <int>
 1 Jan   6896303
 2 Feb   6890866
 3 Mar   7800074
 4 Apr   7680417
 5 May   8109219
 6 Jun   7451431
 7 Jul   7470947
 8 Aug   7639700
 9 Sep   7130241
10 Oct   7363820
11 Nov   7438702
12 Dec   8656874

1.2 pin_find(): CRAN

pin_find() 동사를 사용해서 CRAN, 캐글, RStudio Connect 에 산재된 자원을 검색할 수 있다. 먼저 packages에 산재된 데이터 중 cars 검색어를 포함된 데이터를 검색해보자.

# A tibble: 38 x 4
   name            description                                 type  board 
   <chr>           <chr>                                       <chr> <chr> 
 1 bestNormalize/… Prices of 6,283 cars listed on Autotrader … table packa…
 2 BSDA/Jdpower    Number of problems reported per 100 cars i… table packa…
 3 BSDA/Marked     Percent of marked cars in 65 police depart… table packa…
 4 BSDA/Supercar   Top speeds attained by five makes of super… table packa…
 5 caret/cars      Kelly Blue Book resale data for 2005 model… table packa…
 6 CornerstoneR/c… Data from carstats from CornerstoneR packa… table packa…
 7 DAAG/Cars93.su… A Summary of the Cars93 Data set from DAAG… table packa…
 8 DAAG/modelcars  Model Car Data from DAAG package.           table packa…
 9 DAAG/toycars    Toy Cars Data from DAAG package.            table packa…
10 dobson/Cars     Cars data from table 8.1 from dobson packa… table packa…
# … with 28 more rows

<소유자>/<명칭> 형태로 데이터가 준비되어 있어 이를 pin_get() 동사를 사용해서 가져온다.

# A tibble: 33 x 4
   Make.model              type       Driver.deaths Other.deaths
   <fct>                   <fct>              <dbl>        <dbl>
 1 Toyota Avalon           large                 40           20
 2 Chrysler Town & Country minivan               31           36
 3 Toyota Camry            midsize               41           29
 4 Volkswagen jetta        subcompact            47           23
 5 Ford Windstar           minivan               37           35
 6 Nissan Maxima           midsize               53           26
 7 Honda Accord            midsize               54           27
 8 Chevrolet Venture       minivan               51           34
 9 Buick Century           midsize               70           23
10 Subura Outback          compact               74           24
# … with 23 more rows

pin_info() 동사를 사용해서 스키마 정보를 가져올 수 있다.

# Source: packages<UsingR/carsafety> [table]
# Description: Fatality information in U.S. for several popular cars from UsingR package.
# Properties:
#   - rows: 33
#   - cols: 4

이번에는 cars 검색어를 던져 CRAN 에서 가져올 수 있는 데이터를 모두 살펴보자.

1.3 pin_find(): 캐글

캐글(Kaggle) 웹사이트에 올라온 데이터를 찾으려고 하면, 캐글(Kaggle) 사용자 정보 하단에 API에서 Create New API Token을 클릭하면 kaggle.json 파일을 다운로드 받게 된다. 이를 board_register_kaggle() 동사에 적용시키게 되면 캐글 데이터를 CRAN과 마찬가지로 검색할 수 있게 된다.

pin_get() 동사를 통해서 캐글 데이터를 수월하게 얻을 수 있게 된다.

[1] "/Users/statkclee/Library/Caches/pins/kaggle/orgesleka/used-cars-database/autos.csv"                                                 
[2] "/Users/statkclee/Library/Caches/pins/kaggle/orgesleka/used-cars-database/cnt_km_year_powerPS_minPrice_maxPrice_avgPrice_sdPrice.csv"
# A tibble: 354,687 x 20
   dateCrawled         name  seller offerType price abtest vehicleType
   <dttm>              <chr> <chr>  <chr>     <dbl> <chr>  <chr>      
 1 2016-03-24 11:52:17 Golf… privat Angebot     480 test   <NA>       
 2 2016-03-24 10:58:45 A5_S… privat Angebot   18300 test   coupe      
 3 2016-03-14 12:52:21 "Jee… privat Angebot    9800 test   suv        
 4 2016-03-17 16:54:04 "GOL… privat Angebot    1500 test   kleinwagen 
 5 2016-03-31 17:25:20 Skod… privat Angebot    3600 test   kleinwagen 
 6 2016-04-04 17:36:23 BMW_… privat Angebot     650 test   limousine  
 7 2016-04-01 20:48:51 Peug… privat Angebot    2200 test   cabrio     
 8 2016-03-21 18:54:38 VW_D… privat Angebot       0 test   limousine  
 9 2016-04-04 23:42:13 Ford… privat Angebot   14500 contr… bus        
10 2016-03-17 10:53:50 VW_G… privat Angebot     999 test   kleinwagen 
# … with 354,677 more rows, and 13 more variables:
#   yearOfRegistration <dbl>, gearbox <chr>, powerPS <dbl>, model <chr>,
#   kilometer <dbl>, monthOfRegistration <dbl>, fuelType <chr>,
#   brand <chr>, notRepairedDamage <chr>, dateCreated <dttm>,
#   nrOfPictures <dbl>, postalCode <chr>, lastSeen <dttm>

1.4 board_register() 공유

RStudio Team (2019-09-09), “pins: Pin, Discover and Share Resources” 참고한다.

vignette("boards-understanding") 명령어를 참고하여 Azure, GitHub, Google Cloud, Kaggle, RStudio Connect, S3는 물론 데이터베이스와 개인 웹사이트에도 공유를 지원한다.

2 원천데이터 1

빅데이터 시대를 맞이하여 데이터는 도처에 널려있지만, 오랜 세월을 거치면서 데이터는 나름대로 각자의 서식지를 가지고 있다. 데이터분석을 위해서 R로 다양한 원천자료를 가져와하는데 이를 위해서는 우선, 데이터가 서식하고 있는 로컬디스크, 데이터베이스, 웹 인터넷 데이터 출처를 이해하는 것이 필수적이다. 활용도가 높은 R 팩키지를 취사선택하여 데이터 가져오는 프로세스를 정형화해보자.

RStuio 데이터 가져오기

2.1 공공데이터 출처

공공데이터는 과거 로컬디스크에서 . csv, .xlsx, SAS, SPSS, 미니탭 등 형식 파일로 제공되었으나, SQL 데이터베이스에 ODBC, JDBC, DBI 등 인터페이스를 통해 직접 접근하여 데이터를 뽑아올 수도 있고, 인터넷 웹을 통해 XML, JSON 등의 형식으로 받아올 수도 있다.

공공데이터 출처 형식

  • 로컬 디스크: . csv, .xlsx, SAS, SPSS, 미니탭
  • 데이터베이스: SQL
  • 웹 인터넷: XML, JSON

R로 데이터를 불러와야만 자료분석을 시작이 시작된다. 전통적인 방법으로 자료분석(로컬 컴퓨터에 파일형태로 저장된 다양한 파일을 불러오는 방법)을 시작할 수 있는 방법이 statmethods.net 사이트에 소개되어 있다.

  • CSV : .csv 파일
  • Excel : .xlsx 파일
  • 통계 팩키지
    • SPSS : .por 파일
    • SAS : xpt 파일
    • 미니탭 : .mtp 파일

다양한 데이터를 R로 불러와서 작업하는 방법은 Datacamp 블로그r-bloggers에서 확인이 가능하다.

3 로컬 데이터

전통적으로 많이 활용하는 방식으로 . csv, .xlsx, SAS, SPSS, 미니탭 등 다양한 파일 형식에 담긴 정보를 R에서 readr, readxl, haven 팩키지를 활용하여 R에서 분석할 수 있는 R 데이터프레임으로 불러온다.

로컬 디스크 파일 R로 가져오기(Ingest)

  • readr: . csv, .txt, 등 텍스트 파일
  • readxl: .xls, .xlsx 엑셀 파일
  • haven: sas7bdat, .sav SAS, SPSS 파일

3.1 readr 데이터 가져오기 2

readr에는 다양한 데이터 가져오기 기능이 제공된다. 다음과 같은 형태의 데이터프레임을 생성하는 것이 목표다. 하지만, 원본 데이터를 살펴보니 탭구분자로 나눠져있고, 칼럼명은 존재하지 않고 첫줄부터 바로 데이터가 들어 있는 형태다. 데이터의 일부를 텍스트 벡터로 불러온다.

spec_tsv 함수를 통해 파일에 포함된 데이터 자료구조에 대해서 확인이 가능하다. col_names = FALSE 명령어로 첫행부터 데이터가 시작된다고 일러준다. 그리고, na = c("", "NA", "null")을 통해 결측값에 대해서도 확인한다.

professor department age tenure gender salary
Prof B 19 18 Male 139750
Prof B 20 16 Male 173200
AsstProf B 4 3 Male 79750
Prof B 45 39 Male 115000
Prof B 40 41 Male 141500
AssocProf B 6 6 Male 97000
cols(
  X1 = col_character(),
  X2 = col_character(),
  X3 = col_double(),
  X4 = col_character(),
  X5 = col_character(),
  X6 = col_double()
)

spec_tsv를 통해 제시된 칼럼형식이 맞는지 점검하고 이를 복사해서 read_tsv 파일로 불러 읽어온다. 마지막으로 칼럼명을 names 함수를 사용해서 부여하면 칼럼명 없이 탭구분자로 구분된 파일을 데이터프레임으로 가져오게 된다.

탭구분자를 갖는 read_tsv 파일 대신에 콤마 구분자를 갖는 경우 read_csv가 되고, spec_csv 로 칼럼 데이터형을 유추하는 함수명만 달라질 뿐 파일데이터를 데이터프레임으로 불러오는 과정은 동일하다.

3.2 데이터베이스(SQL)

데이터베이스에서 R로 데이터를 불러오는 방식은 기본적으로 DBI, RODBC 등 팩키지를 불러와서 적재한다. 목표 데이터베이스에 연결하고, SQL 쿼리를 데이터베이스에 던져 결과를 얻어와서 데이터프레임에 저장한다. 데이터 정합성 검사를 하고 모든 것이 정상적이면 데이터베이스 연결을 끊어 자원을 반납한다.

3.4 rstats-db

GitHub에 rstats-db 저장소에는 MySQL, Postgres, SQLite 등 다양한 데이터베이스에 연결해서 R로 데이터를 가져오는 팩키지가 개발되고 있다. library 함수보다 devtools 함수를 사용해서 연관된 팩키지를 설치하여 데이터를 가져올 필요가 있다.

4 웹 인터넷 데이터

최근에 많은 공공데이터가 웹인터넷을 통해 배포되고 있다. XML, JSON이 많이 사용되고 있다. 특히, XML, JSON은 API를 통해 제공되는 정형화된 데이터로 통용되며, 그렇지 않고 데이터가 제공되는 경우 HTML 페이지를 웹스크래핑해서 데이터를 퍼온다.

XML libxml2에 대응되는 xml2 팩키지를 사용하고, JSON의 경우, jsonlite 팩키지를 사용한다. API를 통해 데이터가 제공되지 않는 경우, rvest 팩키지를 통해 HTML 페이지 데이터를 긁어온다.

4 웹 인터넷 R 팩키지

  • XML : library(xml2), 활성도가 높지 않는 rjson, RJSONIO는 권장하지 않는다.
  • JSON: library(jsonlite), 과거 XML 팩키지에 대한 대안
  • HTML: library(rvest), rvest는 파이썬 뷰티풀숩(Beautiful Soup)에 해당

4.1 JSON 데이터 가져오기

JSON 팩키지에는 다양한 팩키지가 존재한다. 역시 R이 발전한 이유인 다양성과 유연성이 JSON에도 존재하는 것이 확인된다. jsonlite 최근에 업데이트되어 사용하는 것도 좋을 듯 하다.

JSON 데이터를 R로 불러오는 경우 JSON 파일 형식에 특별히 신경을 써야한다. 우선 JSON 로그 데이터가 많은 경우 쉘에서 전처리 작업을 통해 sample.json 파일 형식으로 JSON 데이터를 준비한 후, fromJSON 함수로 불러오면 R에서 작업할 수 있는 데이터프레임으로 변환된다.

  • jsonlite: RJSONIO를 포크해서 시작했으나 완전히 새롭게 작성됨.
  • RJSONIO: 저자 Duncan Temple Lang
  • rjson
  • tidyjson : JSON을 깔끔한 tidy 형식으로 변환.
    Name Age Occupation
1  Mario  32    Plumber
2  Peach  21   Princess
3   <NA>  NA       <NA>
4 Bowser  NA      Koopa

JSON 쉘관련 전처리 작업에 유용하게 사용되는 명령어를 정리하면 다음과 같다.

sample-file.json 파일에 행바뀜 마지막에 ,를 추가하는 명령어는 sed -i ':a;N;$!ba;s/\n/,\n/g'이고, 첫줄에 [, 마지막 줄에 ]을 넣어 위와 같이 sample.json 파일이 되도록 JSON 파일을 준비한다.