第1回 Rパッケージのダウンロードランキングを作る|Tech Book Zone Manatee

マナティ

Rではじめよう![モダン]なデータ分析

第1回 Rパッケージのダウンロードランキングを作る

ビッグデータやデータサイエンティストのブームに乗り注目されている「R言語」。8000以上の登録があるRの拡張パッケージがどのぐらいダウンロードされているのかを調査してみます。

はじめに

近年、ビッグデータやデータサイエンティストのブームに乗り、「R言語」が注目されています。

R言語はニュージーランドのオークランド大学のRoss IhakaとRobert Clifford Gentlemanにより作られました。現在はR Development Core teamによりメンテナンスと拡張がなされています。 R自体は無料で配布され、ユーザー数は大きく伸びており、SASやSPSSなどの従来の有償ソフトウェアに迫る勢いです。

Rの大きな特徴として、「パッケージ」による拡張が上げられます。 パッケージとは、複数の関数(Function)をひとまとめにすることができるRの機能です。 これを、CRAN(Comprehensive R Archive Network) に登録することで、世界中のRユーザーに使ってもらうことができます。現在このパッケージ数は8,000以上に上り、世界中のRユーザーに広く利用されています。 パッケージ数は以下のRプログラムにて確認することができます。

また、別のパッケージレポジトリとして、Githubも利用されつつあり、こちらのに登録されているパッケージ数を含めるとより多くのパッケージが公開されています。

# CRANに登録されている最新パッケージ数を取得
paste0(Sys.Date() , "時点")
 
[1] "2016-05-28時点"
 
nrow(available.packages())
 
[1] 8441

今回の目的は、このCRANに登録されているパッケージがどのぐらいダウンロードされているのかを調査します。

1. 今回のゴール

今回のゴールは、パッケージのダウンロード調査です。どのパッケージがどのぐらいダウンロードされているかを可視化することによって、Rでどのようなパッケージが流行しているのかが見えてきます。

また、今回利用するデータには、国別のコードも付与されているため、各国でどのパッケージがダウンロードされているのかが合わせてわかります。国別のダウンロードランキングを見ることで、各国のRの使い方の特色がみられるかもしれません。

つまり、今回作りたいアウトプットとしては、

1. 総パッケージダウンロード数ランキング
2. 国別パッケージダウンロード数ランキング

の2点を可視化していきます。

2. 手順

大まかな手順としては、以下のステップに則って、進めていきます。

3. データソース

今回利用するデータソースは、CRANが公開しているパッケージダウンロードサイトを利用します。

ここでは、毎日のパッケージダウンロード数と、Rのダウンロード数が公開されています。一番古いデータで2012年10から存在しています。また、デイリーで更新されているため、毎日追うことができます。 今回は 「Daily package downloads」の項目を使いましょう。

データダウンロード

幸いなことに、パッケージ数のダウンロード方法も公開してあります。「Downloading from R」を見てみると、以下のようなコードが公開されています。 (ファイルダウンロード、内容確認の部分は追記しています)

  # ほしい期間のデータのはじめと終わりを指定
  start <- as.Date('2016-05-01')
  today <- as.Date('2016-05-01')

  all_days <- seq(start, today, by = 'day')

  # ダウンロードしたい日付のURLを生成
  year <- as.POSIXlt(all_days)$year + 1900
  urls <- paste0('http://cran-logs.rstudio.com/', year, '/', all_days, '.csv.gz')
  # download.fileを使って、ファイルをダウンロード
  download.file(urls, "/Users/user/Desktop/testdl_cranpackage.tsv")

  # 持っていないデータがある場合、以下を実行してみてください。
  missing_days <- setdiff(all_days, tools::file_path_sans_ext(dir(), TRUE))
 
  # ファイルインポート
  check_file <- read.csv("/Users/user/Desktop/testdl_cranpackage.tsv")
  # 10列 29万行のデータ
  dim(check_file)
 
[1] 292464     10
 
  # 先頭10行のデータを取得
  head(check_file)
 
        date     time    size r_version r_arch    r_os    package  version
1 2016-05-01 14:48:19   36521     3.2.4 x86_64 mingw32     bitops    1.0-6
2 2016-05-01 14:48:22 4299738     3.2.4 x86_64 mingw32        XML 3.98-1.4
3 2016-05-01 14:48:22  123143              stringdist  0.9.4.1
4 2016-05-01 14:48:21   31760     3.2.3 x86_64 mingw32    Metrics    0.1.1
5 2016-05-01 14:48:24  112286                 packrat  0.4.7-1
6 2016-05-01 14:48:15  257109                 foreign   0.8-66
  country ip_id
1      US     1
2      US     1
3      NL     2
4      GB     3
5      US     4
6      ID     5

1日分で10列 × 29万行、ファイルサイズ4MBとなりました。 これを1ヶ月分取得しようとすると、

# 行数
  formatC(nrow(check_file) * 30 , format="d" , big.mark = ',')
 
[1] "8,773,920"
 
# ファイルサイズ(MB)(4MBを30日分)
  4 * 30
 
[1] 120

となり、とても大きなファイルサイズになりそうです。 最近のPCではメモリを多く積んでいるため、メモリで制約をうけるRではあまり影響はなさそうですが、 集計値など、複数のオブジェクトを利用する場合もあるため、扱うデータサイズを小さくしていくことも必要です。

そこで、長期間データを取得する際には、集計値、項目を減らし、扱うデータを小さくしていきます。 また、一日ずつダウンロードしていくのも非効率なため、for文を使って期間分のファイルをダウンロードするようにします。

4. 加工

1ヶ月分のデータを取得すると、とても大きなサイズになるため、データをためていく段階で加工も一緒に行います。 データ加工にはdplyrパッケージを利用します。

install.packages("dplyr")
 
The downloaded binary packages are in
    /var/folders/p6/mc4kcw3120b0s1khmp5g31x40000gn/T//Rtmpi0pNzl/downloaded_packages
 
library(dplyr)
 
Attaching package: 'dplyr'
 
 以下のオブジェクトは 'package:stats' からマスクされています:

     filter, lag
 
 以下のオブジェクトは 'package:base' からマスクされています:

     intersect, setdiff, setequal, union

項目は以下に絞り、これらの件数をダウンロード数としてカウントします。

  • date (日付 UTC)
  • r_arch (アーキテクチャ)
  • r_os (OS)
  • package (パッケージ名)
  • country (国名 ISO country codeに準拠)
  • パッケージダウンロード数(カウント)
# ダウンロードしたい期間を指定
start <- as.Date('2016-04-01')
today <- as.Date('2016-04-30')

all_days <- seq(start, today, by = 'day')

year <- as.POSIXlt(all_days)$year + 1900
urls <- paste0('http://cran-logs.rstudio.com/', year, '/', all_days, '.csv.gz')

# データを加工&まとめる
for(i in 1:length(urls)){
  tmp <- tempfile()
  download.file(urls[[i]], tmp)
  d <- read.csv(gzfile(tmp) , as.is = TRUE)
  d <- d %>% group_by(date  , r_arch , r_os , package  , country) %>% summarise(dlc_cnt = n())
  if (i == 1){dd <- d} else {dd <- rbind(dd , d)}
  rm(tmp)
  rm(d)
}

# 集計したデータ
glimpse(dd)
 
Observations: 3,408,577
Variables: 6
$ date    (chr) "2016-04-01", "2016-04-01", "2016-04-01", "2016-04-01"...
$ r_arch  (chr) "arm", "arm", "arm", "arm", "armv7l", "armv7l", "i386"...
$ r_os    (chr) "linux-gnueabihf", "linux-gnueabihf", "linux-gnueabihf...
$ package (chr) "ENiRG", "gtable", "lazyeval", "rstudioapi", "R.utils"...
$ country (chr) "IN", "VN", "AU", "BY", "CA", "DE", "US", "US", "IN", ...
$ dlc_cnt (int) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...

6列、行数340万行のデータセットが完成しました。 これを元に集計をして、結果をまとめていきます。

著者プロフィール

簑田高志(著者)
ヤフー株式会社に所属。インターネット業界で十年以上に渡りネット広告関連の企画・分析業務に携わる。最近ではEコマース関連の分析に軸足を移し、広告・CRM・サイト分析など事業を幅広くカバーする業務を行う。
匿名知的集団ホクソエム(著者)
ホクソエム (hoxo_m) は架空のデータ分析者であり、日本の若手のデータ分析者集団のペンネームである。当初このデータ分析者集団は秘密結社として活動し、ホクソエムを一個人として活動させ続けた。