ExcelのVBAでニコニコ動画APIを読み込んでみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

ちょっとExcelでニコニコ動画のAPIを読み込みたいと思ったので、試してみました。

まずは、下記のようなシートを用意。
VBA実行前
作りたいのは、A列の2行目以降に動画IDを書いて、その左側にその動画の情報を書き込んでいくというもの。

VBAはほとんど触ったことがないので、Rangeプロパティだとか、Offsetプロパティだとかの概念がよく分かってなかったのですが、なんとか作ることができました。

XPathにはあまりなれてないのですが、属性で判断するカテゴリータグを取得したいということもあり、XPathを利用することに。
19行目で動画情報が取得できたかどうかの可否、25行目でユーザーIDがあるかどうかの可否、28行目でカテゴリータグがあるかどうかの可否を調べて条件分けしてます(動画情報が取得できたどうかは、If文じゃなくて、For Each文を使ってるので、間違ったつかいかたかもしれません)。

というわけで、実行してみました。
VBA実行後
相変わらず、カテゴリーがうまく取得できていないところがありますが、他は問題なくいけたようです。
ありえない動画ID(この例では、sm1とaiueo)は動画情報を取得していませんし、ユーザーIDやカテゴリーも見つからなかったものは飛ばしているよう。数値のみの動画IDの動画情報もうまく取得できました。
今気づいたんですが、カテゴリータグってタグの一番目とは限らないんですね。てっきり、一番目なのかと・・・。ということは、カテゴリーが取得できない場合、一番目のタグを見て判断するという方法は使えないのか・・・。

ところで、自分が使ってるExcelはExcel2010なのですが、Excel2013だとWEBSERVICE関数なんていう便利なものがあるよう(参考:Excel 2013で追加された「WEBSERVICE」関数を使って、マクロを使わずWeb APIを利用する。 | 初心者備忘録)
何これ。すごい便利そう。

自由度調整済み決定係数が小さくなるから、カテゴリー変数はダミー変数化しないほうがいい?

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

最近、Rについてのエントリーが多いことからも察している人も多いと思いますが、最近は仕事でRばっかり使ってます。ある製品群の値段予測システムという社長の案があって、自分はRを用いてその予測価格の算出方法をいろいろ考えているところです。そのデータ自体はデータベースに大量にあるので、それを有効活用しようというわけです。
前々から社長はその案を画策していたそうで、社長から渡された多変量解析の参考書籍には2011年に購入したであろうと思われる栞がはさんでありました。確かあちこちにメモ書きもあったと思うので、社長もよく勉強してるんだと思います。

ところで、解析の対象の項目には、順序があるわけではない、あるカテゴリー変数がありました。隠すことではないのと思うで言ってしまうと、製品の『色』です。ただ、だいたいの人気色というのは予想がつくので、自身でそれぞれの色に数値を割り当てていって精度をあげてほしいということでした。

試しに、下記のニコニコ動画から取得したデータを用いてやってみようと思います。
nico
この場合、ニコ動のカテゴリーがまんまカテゴリー変数ということなります(ややこしいですが)。まずは試しに、再生数とカテゴリーをboxplotで出力してみる。

すると、下記のような図となりました(y軸の制限をなくすと縦に長くなりすぎてわかりづらいので、箱が分かる範囲にしています)。
カテゴリーと再生数のボックスプロット
項目名が書いてないところが多いので分かりにくいですが、左から『R-18』『VOCALOID』『アイドルマスター』『アニメ』『エンターテイメント』『ゲーム』『スポーツ』『その他』『ニコニコインディーズ』『ニコニコ技術部』『ニコニコ手芸部』『ニコニコ動画講座』『ラジオ』『演奏してみた』『音楽』『科学』『歌ってみた』『作ってみた』『自然』『車載動画』『政治』『東方』『動物』『日記』『描いてみた』『踊ってみた』『旅行』『料理』『例のアレ』『歴史』 となっています(項目名を縦にして表示したいのですが、調べても分かりませんでした。改行を入れて対処するという方法もあるんですが、図とかぶってしまうので・・・)。
では、これを参考に数値化しています。とりあえず中心点を基準に上のほうにあるものを大きい数値、下の方にあるものを小さい数値であらわしてみます。

とりあえず下記のような感じにしてみました。

これで重回帰分析できます。試してみましょう。

決定係数(Multiple R-squared)が0.7105、自由度調整済み決定係数(Adjusted R-squared)が0.7104となっています。悪くなさそうです。もう少し微調整したらもっとよくなるかもしれません。

ところで、その時(一ヶ月ほど前ですが)は自分も統計に関しては全くもって無知で「確かに、数値化しないと計算できないしね。なるほどなるほど」なんて思ってやっていたのですが、いろいろ調べてみるとダミー変数化するという方法があるということを知りました。例えば、黒という変数を用意して、黒い製品には1、他は0。また、白という変数を用意して、白色なら1、ほかは0。という具合に、それぞれのカテゴリーごとに変数を作るというものです。これならわざわざ自分で順序を考えなくてもいいですし、楽ができそうです。

ということを社長に話してみると、こう言われました。
「変数が増えると補正R2が小さくなるからそれはやらないほうがいい」(補正R2とは、自由度調整済み決定係数のこと。Excelではこう記される。初めてExcelで調査してたのでこの言葉が社内では一般的)
なんとも腑に落ちない感じがしたのですが、自分も統計学に関しては初心者だったのでなんとも言えませんでした。
確かに、自由度調整済み決定係数は、決定係数や標本数の数が変わらない状況な場合、変数だけ増えると下がる傾向にあります。
ちなみに、変数の数をp、標本数の数をn、決定係数をR2とすると、自由度調整済み決定係数は下記のようになります。

参考:自由度調整済決定係数
上記の重回帰分析の結果を例にもとめてみると、((9000-1)*0.7105-3)/(9000-1-3)となり、確かに結果は0.7104となりました。

ではここで、標本数が20、R2が0.7、変数の数が9と10の場合を考えてみようと思います。
まず、変数の数が9の場合は((20-1)*0.7-10)/(20-1-10)となり、これは0.43になります。10の場合は0.3666666…となりました。確かに変数の数が増えると自由度調整済み決定件数は減るようです(確かあの時社長は、「分母が大きくなるから小さくなる」みたいなことを言っていたような気がするのですが・・・。記憶違いかもしれない。さすがに自分より一年以上も多く統計の勉強をしていた社長がそんな間違いをするとは思えないし)。

なお、上記のニコ動の例をダミー変数化すると下記のような結果に(指数表記をなくしてます)。

自由度調整済み決定係数が、増えてるという・・・。

さて、例がものすっごい悪かったのですが、実は業務で使っていた解析では数値を調整することにより、自由度調整済み決定係数がダミー変数化する場合より大きくなりました。
ところで、ダミー変数を使うということは変数の値は1か0かということになります。ということは、ダミー変数を使って出てきた係数を使って数値化し、1という数値のほうを係数と考えてもいいんじゃないか。と思ったわけです。
例えば、以下の様な感じ。

思った通り、係数は1となり、自由度調整済みも大きくなりました。もし、自由度調整済み係数をもとめられているけれども、ダミー変数化すると自由度調整済み係数が下がってしまう場合は、上記のようにして求めた自由度調整済み係数を報告すればいいかもしれませんね(自分はそうしてます)。

ということはですよ。ということは、今、上記の解析では『コメントの係数*コメント数+マイリストの係数*マイリスト数+ダミー変数の係数+切片』という式になっているわけですが、そもそも『コメントの係数*コメント数+マイリストの係数*マイリスト数+ダミー変数の係数』の部分を一つの変数と考えたらいいんじゃね? と。そしたら、変数の数は1つだけになり、自由度調整済み決定係数の値も大きくなるはず。
やってみましょう。

はい。確かに自由度調整済み決定係数が大きくなり、表示の上では決定係数と同じになりました(計算してみたら分かりますが、全く同じではありません。決定係数よりは小さくなります)。

自由度調整済み決定係数は違いますが、上記3つ(決定係数が0.7591となってる解析)は、どれも同じ予測値を算出します。だからといって参考にならないかというとそういうわけではないのですが、あまりアテにするのもよくないような気がします。少なくとも、サンプル数がかなり多ければ(別にどれぐらいの数以上かを想定してるわけではないです)、決定係数だけを見てもいいんじゃないかと。まあ、変数を一つ増やすか増やさないかの参考なら使えるかもしれませんが。

最後にもう一度言っておきますが、自分は統計学を勉強して1ヶ月程度しかたってない初心者の中の初心者です。もしかしたら盛大な勘違いをしているかもしれません。もし、おかしなことを書いてるなら指摘してください。

Rではてなブックマークの件数を取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またまたRネタ(ところで、Rってものすごい検索に引っかかりにくいような。R言語と書くべきだったか)。

ここのところニコニコ動画のAPIを使ったXMLの解析がつづいたので、今回ははてなブックマークの件数を取得するjsonの解析。Rにはrjsonというjsonを取得してR用に変換してくれるライブラリがあるようなので、今回はそれを利用。
参考:はてなブックマーク件数取得API – Hatena Developer Center
参考:CRAN – Package rjson

とりあえず、複数のURLを取得できるようなので、そのAPIを利用することに(調べてみたら、つい先日リリースされたばかりらしい。参考:(開発者向け情報)はてなブックマーク件数取得APIで複数のURLのブックマーク数をより簡単に取得出来るようになりました – はてなブックマーク開発ブログ)。

これで、jsonが利用できるようになったはずなので、試してみる。

本当なら、”://”のところを”%3A%2F%2F”という具合にURLエンコードしたかったのですが、RのURLencodeメソッドでは:や/はエンコードしてくれないようなので、わざとエンコードせず。

と思ったけど、第二引数をTRUEにしたらできた。

まあ、エンコードせずとも通ったみたいなので、まあいっか。

というわけで、前回作成したニコニコ動画のデータフレームに、はてなブックマークの件数を追加することに。
nicoFrame3.txt
上記ファイル内を全て選択してコピーしたら以下のように記述。

:や/が.に変換されてしまったという。後、データは順番に入っているわけではないっぽい。どういう順番なんだろう? data.frameメソッドを使った時に、何か影響した可能性もありそうだけど。
さて、これをいつもどおりテキストファイルに出力しようと思ったものの、以下の様なエラーが。

うーん・・・さっぱり分からない・・・。

とりあえず検索したら、r – Error writing to csv – Stack Overflowというページが引っかかったので、苦手な英語は読まずに(というより読めない)、なんとか下記のようにしたらうまく出力できた。

結果:nicoFrame4

うーん。Rのリストという概念がよく分からない。apply系のメソッドもよく分かってないし、もうちょっと勉強する必要がありそう。

Rで、ニコ動のタグやカテゴリを取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またまたRとニコニコ動画ネタ。というより、前回のつづき。
前回、タグがうまく取得できなかったので、今回はタグやカテゴリタグの取得に挑戦。
ちなみに、自分はRを使うのに、RStudioを利用しています。

前回は簡易的にXMLをデータフレーム化するxmlToDataFrameという関数を利用しましたが、どうやらXMLをDOMにパースするxmlParseというものがあるよう。

文字化けしてますが、このまま続けます。ところで、純正のRの開発環境で試すと、XMLのコードが表示されなかった。また、このnicoという変数は、externalptr(外部ポインターオブジェクト)という型になっているよう。このあたりはよく分かってません。

とりあえず、XPathが使えるgetNodeSetという関数があるようなので、それを使ってタグを取得してみることに。

ありゃ。文字化けしてない。よく分からない仕様だなぁ・・・。これはlistという型になっているようなので、また違うのかもしれない。
とりあえずこの値を取得したい場合は、xmlValueという関数をつかえばいいらしい。

正直、Rはまだまだ分からないことだらけなので、どうしてこうなるのかわからないのですが、とりあえずタグの値は取得できたので目標達成です。

さてじゃあ次にカテゴリタグを取得・・・。ってよく見たらsm9にはカテゴリがないようです(カテゴリ化してる、ゲームタグも音楽タグもあるというのに)。とりあえず、sm1097445(【初音ミク】みくみくにしてあげる♪【してやんよ】)で試すことに。

というわけで、前回作成したデータフレーム(nicoFrame2.txt)にカテゴリーを追加してみる。
まず、上記ファイル内を全て選択してコピーし、Rに読み込むことに。

これでできたファイルが以下。
nicoFrame3

な・・・。カテゴリーがうまく取得できてない動画がやけに多い・・・。
さっきはカテゴリーを取得できたみくみくにしてあげるも、『カテゴリーなし』に・・・。
カテゴリー取得してやりたいことあったけど、これは困った。ロックしてるタグの一番始めが、カテゴリーにある名前かどうかを見ていくという手法でなんとかなりそうではあるけれども・・・(多分、カテゴリータグの仕様はそれであってる)。
なんでこんなに、カテゴリーかどれかという情報がとれたりとれなかったりするのやら・・・。

Rでニコニコ動画APIを取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またRとニコニコ動画ネタ。様々なデータを取得しやすいのでRの勉強するには、ニコニコ動画のデータを使うのはよさそうです(ただたんに、よく利用しているサイトということもありますが)。

 
まず、ニコニコ動画には、動画情報を取得できるAPIがあります。
参考:ニコニコ動画APIとは (ニコニコドウガエーピーアイとは) [単語記事] – ニコニコ大百科
また、RにはXMLを解析する『XML』という名前そのままなパッケージがあります。
参考:XMLデータの扱い方

今回はそれらを利用してRでニコニコ動画のAPIを取得してみます。

まずは、RでXMLのパッケージのインストール

こんな感じになったら、とりあえずparseXMLを使ってニコニコ動画APIを取得。今回は定番のsm9(新・豪血寺一族 -煩悩解放 – レッツゴー!陰陽師)を使用

分かりにくいですが、どうも取得できたみたいです。タグが連結されてしまってますが、他は問題なさそう。

ところで、ニコニコ動画のAPIの動画情報は動画一つ一つでしか取得できないようです。でも、2つ以上の動画情報をデータフレームにしたいということもあるので、その方法を考えてみました。

まずは、取得した動画IDの取得。今回は、カテゴリ合算の総合ランキングの合計ランキングにあるトップ100の動画の情報を取得してみることに。
まずはその習得手順。ウェブ開発者ツールを開いて、コンソール画面を開き、以下のスクリプトを実行。

そうすると、メニューバーの下に動画IDと宣伝ポイントがカンマ区切りで書かれたテキストエリアが表示されると思うので、それを全て選択してコピーします(ChromeやFirebugを使っている場合は、12行目を『copy(txtVideoInfo);』してもOK)。なんだかムダなことをやっていると思われるかもしれませんが、AutoPage系の拡張機能や、先日紹介したGETパラメータを削除するユーザースクリプト(ニコニコ動画のGETパラメータ付きリンクを取り除くユーザースクリプト書いた | while(isプログラマ))を使ってる場合を考慮して書いています。if文は必要なさそうだったのですが、copyメソッドを使う場合は最後に空白行を追加してしまうという問題があったため、if文で最後の行だけ”\n”を追加しないようにしています。ニコニ広告のポイント数は必要ありませんが、後でつかおうと思ったため取得しました。

とりあえず、上記で取得したテキストをRに取り込み。

うまく取得できてるよう。

というわけで早速、この取得した動画IDのAPIを取得して、結合したデータフレームを作ってみたいと思います。

4行目の[-19]というのは、19列目を除くという意味です。公式動画だと19番目のuser_idがないことがあるそうなので、19番目をはぶくことにしました。
これでうまくいくはず(API自体をうまく取得できなかった場合や、削除となっている動画用のXMLが取得されてしまった場合の対処はしてません)。

そしてこれを、

として、得たテキストファイルが以下。
nicoFrame

うまく取得できてるようです。

ところで、APIの動画情報にはニコニ広告のポイントは書いてありません。ニコニ広告自体が途中からでてきたサービスだからなのかもしれませんが、とりあえず今回はニコニ広告のポイントをすでに取得してあるので、それを結合してみることに。今回は動画ID,タイトル,再生数,コメント数,マイリスト数,ニコニ広告ポイント数のみのデータフレームを作成することに。

できたファイル:nicoFrame2

これもうまくいきました。
ところで、今回ニコニ広告のポイント数をブラウザからとることができましたが、普通にソースをとってきてもわからないよう。どうも、ソースを読み込んだ後にJavaScriptでニコニ広告のポイント表示をしているようなのですが、調べてみてもその仕組みが分からず(ranking.jsというファイルで何かやってそうなのですが・・・)。

最後に、動画がない場合の対策。動画がない(例えば、sm1)が含まれている可能性がある場合は、ncolで列数を調べ、18の場合のみデータフレームに追加するという作業を行うといいかもしれないです。
試しに、sm1~sm100の動画情報を取得した場合は以下のように。

sm1~sm100までは23の動画が残っているということがわかります。

タグがうまく取得できない問題は今後の課題に(これができなきゃカテゴリーすら分からない)。XMLライブラリをもう少し勉強すれば分かるような気はするのですが・・・。
ニコニ広告の自動取得は難しそう。ニコニ広告の動画ページ(sm9の場合)のソースを見れば分かるには分かるのですが・・・。