Rのダウンロードログがデモ用データセットとしてとても良さそう

R関連の記事を書くときにはなにかしらのデモ用データを使うことが多いと思います。実際のデータに対する作業例を示せばパッケージや関数の使い方をかなりわかりやすく説明することができます。

しかし[こちらの記事](https://qiita.com/ddd_ppp_story/items/7e517c7b878620482a1d)でも指摘されていますが、デモ用に使われるのは大体が`iris`等の組み込みデータセットです。これはコマンドでデータのロードを行える上にヘルプや解説記事における使用例が多いことに起因すると思います。

ただそれらのデータセットだけでは物足りないときもあります。
使いやすさと面白さを兼ね備えた組み込み以外のデータセットがほしい！
今回ずっと探していてやっと一つ見つけたのでご紹介します。



# データの詳細
**CRANのミラーである[http://cran.rstudio.com/](http://cran.rstudio.com/)のダウンロードログ**です。
こちらがダウンロードページです　→　[CRAN package download logs](http://cran-logs.rstudio.com/)
2012年10月から現在までの、R本体とパッケージのダウンロードログが1日毎に記録されています。

これらのデータは上記ページから圧縮されたCSVファイルとしてダウンロードできます。
また[installrパッケージ](https://cran.r-project.org/web/packages/installr/index.html)と[cranlogsパッケージ](https://cran.r-project.org/web/packages/cranlogs/index.html)を使用することで部分的に取得できます。
参考：[Nagoya.R #16 いろいろできるぞinstallrパッケージ](https://www.slideshare.net/kawasaku/nagoyar-16-installr)
     [パッケージのダウンロード数を可視化する "cranlogs" Package の紹介](http://kokiando.hatenablog.com/entry/2019/04/08/124015)


実質的に2つのデータ（R本体とパッケージのログ）の形式は変わらないので、ここではR本体のダウンロードログの方を例に解説します。また今回は上記のパッケージを使わずCSVファイルをダウンロードする形で解説します。

## データの構造
以下は[2019年12月1日のデータの例](http://cran-logs.rstudio.com/2019/2019-12-01-r.csv.gz)です。

```
# A tibble: 3,202 x 7
   date       time       size version      os    country ip_id
   <date>     <time>    <dbl> <chr>        <chr> <chr>   <dbl>
 1 2019-12-01 00'00" 79427827 3.6.1        osx   CN          1
 2 2019-12-01 00'24" 79426526 3.6.1        osx   US          2
 3 2019-12-01 00'16" 84681884 3.6.1        win   CA          3
 4 2019-12-01 01'22" 86494986 3.6.1patched win   US          4
 5 2019-12-01 01'30" 84774790 3.6.1        win   PH          5
 6 2019-12-01 01'54"      537 3.6.1        win   SE          6
 7 2019-12-01 01'55" 74371782 3.3.3        win   US          7
 8 2019-12-01 01'58" 84681888 3.6.1        win   CZ          8
 9 2019-12-01 03'35"   967264 3.1.1        src   CN          9
10 2019-12-01 03'39" 84781903 3.6.1        win   US         10
# … with 3,192 more rows

```
Descriptionがないので半分推測になってしまうのですが、
`date`および`time`：ダウンロード日時
`size`：ダウンロードされたファイルのサイズ
`version`：ダウンロードされたRのバージョン
`os`：ダウンロードしたPCのOS
`country`：ダウンロード先の国名コード
`ip_id`：ダウンロードしたPCのIPアドレスに対する一意的なID
といったデータが格納されています。

# 良い点と惜しい点
以下でこのデータセットの良い点と惜しい点をあげていきたいと思います。
良い点はほとんどそのまま自分がデータセットを選ぶ基準にしていたものです。

## 良い点
### 架空データでなく現実の身近なデータである
架空データの良いところは細かい調整ができるところですが、現実から乖離したデータを触っているとつまらなくなってしまいます（この点は上記記事でも指摘されていました）。
このデータは実際の記録データですので、「このOSのダウンロード数が多いなー」とか「やっぱりこの国でダウンロードが多いのかー」などいろいろな発見もできて楽しいです。
また「Rのダウンロード」というどんな初心者であれRを使っているなら必ずやったことのある作業についてのデータなので、イメージもしやすいです。
![by_os.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/f5186d00-e93c-2560-0b79-441cc16641ce.png)
2019年12月1日のOS別ダウンロード数（IPの重複は削除）
![by_country.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/3bf79459-5f60-03d2-f90a-32cf988437b7.png)
2019年12月1日のダウンロード数上位6カ国（IPの重複は削除）

### 身元がはっきりしている
出典がはっきりしているので安心して使えます。
数日前のログもアップされているので、長期間放置されているわけでもないです。

### 誰でもアクセスできる
リンク先を見ればわかりますがダウンロードに登録はいりません。
またアンケート等に答える必要もありません。

### CSV形式である
上記の条件を満たしつつ、`read.csv`や`read_csv`で直接読み込めるCSVファイルはなかなか見つかりません（自分が探した限りですが）。ほとんどの行政データが脱落するポイントその１です。

このデータはさすがRstudioが提供しているだけあってちゃんとそのままRで読み込めます。

### エンコードがUTF-8である（あるいは日本語が入っていない）
データ構造がしっかりしていてもエンコードがShift-JISだと読み込みがめんどくさいです。また日本語の列名が入っているとスクリプトに日本語を書かざるを得なくなってこれまた面倒です。ほとんどの行政データが脱落するポイントその２です。
（日本語のデータが悪いわけではないのですが、デモ用データとしては現時点では不適かなと思います）

このデータはエンコードがUTF-8なので安心です。

### ダウンロードから読み込みまでをスクリプトに記述できる
`download.file`と`read.csv`や`read_csv`を組み合わせれば、ダウンロードから読み込みまでをスクリプトに記述して完結できます。
例えば例示したデータの場合、以下のスクリプトでオブジェク卜`d`にデータを格納できます：

```R
download.file("http://cran-logs.rstudio.com/2019/2019-12-01-r.csv.gz", destfile = "data.csv.gz")
d <- readr::read_csv("data.csv.gz")
```

これにより他の人にもコードを試してもらいやすくなります。

### 整然データである
１観測１行、１変数１列、1類型1表（1日の連続した観測は1つの表内）、1データ1セルがしっかりしている整然データです。
参考：[整然データとは何か](https://id.fnshr.info/2017/01/09/tidy-data-intro/)

### データが多様である
数値データ、因子データ、日付データ、時刻データが入っています。`iris`とは対象的です。

### データ数が多い
サンプル数が少ないと描画などをした際に傾向がきれいに見えなかったりします。
このデータは一つのCSVファイルに3000行程度のデータが入っていてこれだけでも十分です。ただそれだけではなく、CSVファイル自体が数百個あり記録時間が連続しているため、`download.file`等を使ってダウンロードを自動化し、`rbind`や`bind_rows`を使ってデータを結合すればサンプル数をいくらでも増やせます。

### 他のデータと結合しやすい
日時がきちんと入っているので、これを基準に他のデータと結合させることができます。
また国名は（おそらく）[ISOの国名コード](https://ja.wikipedia.org/wiki/ISO_3166-1)で記録されているので、[countrycodeパッケージ](https://cran.r-project.org/web/packages/countrycode/index.html)を使って国名を変換すれば[gapminderのデータ](https://cran.r-project.org/web/packages/gapminder/index.html)等と容易に結合可能です。またその応用として地理データとも結合できると思います。

```
# A tibble: 83 x 8
   country download country.y          continent  year lifeExp     pop gdpPercap
   <chr>      <int> <fct>              <fct>     <int>   <dbl>   <int>     <dbl>
 1 AL             1 Albania            Europe     2007    76.4  3.60e6     5937.
 2 AR             7 Argentina          Americas   2007    75.3  4.03e7    12779.
 3 AT            16 Austria            Europe     2007    79.8  8.20e6    36126.
 4 AU            35 Australia          Oceania    2007    81.2  2.04e7    34435.
 5 BA             1 Bosnia and Herzeg… Europe     2007    74.9  4.55e6     7446.
 6 BD             1 Bangladesh         Asia       2007    64.1  1.50e8     1391.
 7 BE            11 Belgium            Europe     2007    79.4  1.04e7    33693.
 8 BF             1 Burkina Faso       Africa     2007    52.3  1.43e7     1217.
 9 BG             3 Bulgaria           Europe     2007    73.0  7.32e6    10681.
10 BJ             1 Benin              Africa     2007    56.7  8.08e6     1441.
# … with 73 more rows
```
データの結合例

![life_and_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/9058802d-9fdb-6950-1178-6ad73bc06757.png)

国別の平均余命と2019年12月1日のダウンロード数の散布図（IPの重複は削除）


## 惜しい点
### 数値データがほとんど入っていない
数値データは一応入っていますがダウンロードサイズだけです。また`dplyr::count`でOS別、国別のダウンロード数を出せますが、０以上の離散的な値になってしまします。
よって、数値データを使った統計の解説（特に回帰分析）や描画の解説には少し不向きかもしれません。

### データ数が多すぎる
良い点の裏返しですが、ダウンロード可能なデータ数が多すぎます。よって１年分のデータを全部ロードするのはよほどのスペックがない限り不可能です。全データを用いて年ごとの比較をするのは難しいです。

-----------

といった感じで惜しい点もあるのですが、全般的に見て大変使いやすい良いデータセットです。
これから積極的に使っていきたいと思います！