おもちゃばこ。

にゃんのひとりごと。マーケティングリサーチ業界で気ままに生きています。

データサイエンス100本ノックをやってみた【その2:R編】

『データサイエンス100本ノック(構造データ加工編)』をやってみた感想記事の2回目、R編です。

 その1:SQL編の感想はこちら。

 

主な内容

JupyterLab上でRコードを実行して問題を解いていきます。環境まわりは前回のSQL編と一緒ですね。SQL編でご紹介したように実質データハンドング100本ノックな内容ですので、問題のほとんどをdplyr, tidyrパッケージの関数群で対応可能です。*1

SONG Jaehyun先生のdplyr入門 (新版)に、解きながらかなりお世話になってます。宇宙本第3章の練習問題みたいな気分で取り組むコンテンツかなと思いました。

また、奇しくもdplyr1.0.0がリリースされた直後でしたので、ネットの偉人の皆様の紹介ブログを参考にしつつ、「この課題、dplyr 1.0.0だとどうなるんだろう? を考えながら取り組んでました。*2

印象に残った設問たち 

基本統計量の算出

S-028: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の中央値を計算し、降順でTOP5を表示せよ。

SQLに比べてシンプルな頭の使い方で基本統計量が算出できるので、「やはりRはデータ分析の言語なんだなあ」を実感しました。それだけです。*3

tidyrでの縦持ち/横持ち変換

S-043: レシート明細データフレーム(df_receipt)と顧客データフレーム(df_customer)を結合し、性別(gender)と年代(ageから計算)ごとに売上金額(amount)を合計した売上サマリデータフレーム(df_sales_summary)を作成せよ。性別は0が男性、1が女性、9が不明を表すものとする。

ただし、項目構成は年代、女性の売上金額、男性の売上金額、性別不明の売上金額の4項目とすること(縦に年代、横に性別のクロス集計)。また、年代は10歳ごとの階級とすること。

こちらもSQLではゴリ押しした設問ですが、Rではtidyrパッケージのpivot_wider()で一発で終了です。

実のところ、gather, spreadの頃は少しとっつきにくく、keyとは?valueとは?というかどっちがどっちだっけ? とよく混乱していたのですが、pivot_longer・pivot_widerだとその心配が一切なさそうです。*4

日付の操作

S-046: 顧客データフレーム(df_customer)の申し込み日(application_date)はYYYYMMDD形式の文字列型でデータを保有している。これを日付型(dateやdatetime)に変換し、顧客ID(customer_id)とともに抽出せよ。データは10件を抽出すれば良い。

 実はあまりRで日付操作をやったことが無かったので、恥ずかしながらlubridateパッケージの存在を100本ノックで初めて知りました。この設問、元のカラムが多少どんな形式で入ってたとしても、lubridate::ymd()だけで拍子抜けするくらいに簡単に解決しちゃいました。

経過月数を算出する別設問では少し悩みましたが、こちらもlubridateパッケージのインターバルの考え方を使ったらうまく行きました。日付周りの処理は面倒なことがいっぱいありますが、他にもlubridateパッケージで解決できることがあったんじゃないのかなーって希望が湧いた設問でした。

ダミー変数を作る

S-058: 顧客データフレーム(df_customer)の性別コード(gender_cd)をダミー変数化し、顧客ID(customer_id)とともに抽出せよ。結果は10件表示させれば良い。

こちらもRであれば caret::dummyVars() というダミー変数化のための関数があったので、SQLに比べて簡単に解決できちゃいました。caretのような機械学習を実装するためのパッケージには、ダミー変数化のように分析に使うことを前提とした前処理もある程度カバーできているの

「やはりRはデータ分析の言語なんだなあ」を実感しました。

データをTrain/Testを分割

S-089: 売上実績のある顧客に対し、予測モデル構築のため学習用データとテスト用データに分割したい。それぞれ8:2の割合でランダムにデータを分割せよ。

この設問もSQLで解いた際には乱数作ってソートして上から●レコードを持ってきて…という力技で押し通してたんですが、rsampleパッケージで簡単に実現できちゃいました。

「やはりRは(以下略

感想

その他、dplyrにwindow関数っぽい機能があったり、for文の中でdplyr::rename()を使う際に変数でカラム名変えたり、monthカラムを作るときの”09”表記の作り方だったり、知らなったけどやってみると便利なテクニックにいっぱい触れられました。*5

ここ数ヶ月のお仕事では Tableau >= SQL > Alteryx >>> R な使用頻度なんですが、100本ノックでSQLやRでの一通りの前処理を経験していると、これまではデータ抽出後にAlteryxやTableauで吸収していた処理が「あれ、これSQLでの抽出段階で解決できるんじゃない?」となったり、「SQLでも頑張ればこの処理できるんだから、Alteryxでもっとシンプルに実現できるんじゃない?」と考えたりする機会が時折あるので、早速何かしら活きてるなという実感はありますね。

 

ということで残るはPython編なんですが、これまであんまりPythonを使った機会があるわけでもなければ、さしあたってPythonを使わなければならない場面に遭遇してないので、終了時期は未定です。

*1:Rstudioで%>%を打つときのCtrl + Shift + Mが使えなくって辛かったです。Jupyterでコレに相当するショートカットキーってあるんですかね…?

*2:summarizeに.groups = "drop_last"を呪文のように添えてエラーメッセージを消したくらいですが

*3:ここから下の感想も、だいたいこの一言で終わります。

*4:白状すると、横持ち→縦持ちに変換しなきゃいけない場面をExcelのTableauアドインで片付けた事案が何度もあります。

*5:このへんを知らないってだけで、ぼくのレベルの底が知れてしまいますね()