2016.07.25
第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万行のデータセットが完成しました。 これを元に集計をして、結果をまとめていきます。