【R言語】友達に漫画をおススメするときに利用するレコメンドアルゴリズムについて

 岩波データサイエンスVol.5に行列分解を利用したレコメンドについて記事があったので、雰囲気だけでも理解しようと簡単な例を作成してみました。売れ筋の漫画10タイトルの購入の有無を7人について調査し、ある人(小林さん)がまだ購入してない漫画のうち、どの漫画をレコメンドしたらいいのかについてです。売れ筋漫画についてはジュンク堂書店ランキング(漫画・コミックのジュンク堂書店書店ランキング - hontoベストセラー)の上位10タイトルの漫画(2017年6月18日現在)を利用しました。今回取り上げるレコメンドアルゴリズム協調フィルタリング(ユーザベースド、アイテムベースド)、特異値分解(SVD)、非負値行列因子分解(NMF)についてです。

目次

  • データセットの作成
  • 使用するパッケージ
  • 協調フィルタリング
    • 類似度を計算する関数
    • ユーザベースド
    • 類似度の算出
    • 小林さんが購入していない漫画をレコメンド
  • アイテムベースド
    • データの分割
    • 類似度の算出
    • 小林さんが購入していない漫画をレコメンド
  • 特異値分解(SVD)
  • 非負値行列因子分解(NMF)
    • おわりに


続きを読む

【R言語】政府統計を用いた階層的クラスタリングの実践例

クラスター分析の復習の記事では、食品ごとのたんぱく質摂取量のパターンにもとづいて欧州25ヵ国をグルーピングしており、地理的に近い地域の国でクラスタを形成しているならば、日々の食事習慣みも似通ってくるのではないかと推測していました。なので、ここではクラスタ分析の使い方を覚えることを主眼に置きつつ、都道府県の主要な食品の消費データを利用して、地理的に近い県で似通った食品の消費傾向を示すクラスタが形成されるかを検証してみます。

続きを読む

【R言語】階層的クラスタリング結果の可視化及び客観的なクラスタ数の決定方法について

教師なし学習の代表的な手法の1つであるクラスタ分析について個人的な論点整理を兼ねてZumel氏とMount氏共著の"Practical Data Science with R"の第8章をまとめてみます(端折ったり本文にないコードを追加したりしてます)。
ちなみに、第8章は以下の出版社サイトからFREEで入手可能です。

Manning | Practical Data Science with R

続きを読む

【R言語】プロ野球データを例にして試みるコレスポンデンス分析の解釈の仕方ーデータ収集から視覚化までー

コレスポンデンス分析(Correspondence Analysis)とは、クロス集計表の表頭項目(列)と表側項目(行)の関係性を視覚的に表現する手法だそうです。クロス集計表を視覚化できるのは便利そうだと思ったのですが、列項目と行項目の両方をプロットした図(同時布置図)の解釈について色々と判断に迷うところがあったので、備忘録を兼ねてまとめておこうと思います。

続きを読む

【因子分析, R言語, スクレイピング】プロ野球選手の打撃成績を「長打力」「打撃技術」「走力」に要約すると上位の選手は誰になるのか!?

因子分析の練習としてどのような分析を行おうかと考えていたところ、以下のブログに面白そうな記事を発見しました。

nijyester.blog.fc2.com
nijyester.blog.fc2.com


 この記事では過去10年間におけるパリーグの打者(規定打席到達に限る)の打撃成績から「長打力」「打撃技術」「走力」といった3つの共通因子を抽出し、それぞれの因子得点が上位の打者を紹介していました。残念ながらコードが記載されていませんでしたので、本記事では2011年から20016年の6年間におけるセパ両リーグの打者(規定打席の1/2以上)の打撃成績にデータを拡張して上記ブログの分析を再現してみます。

続きを読む

Rによる簡単な組合せシミュレーション

 以下の組合せの確率をシミュレーションで求めてみたいです。

 R小学校の6年1組は遠足で京都に行くことになりました。クラスの総数は30人であり、そこからくじ引き(無作為)に5人選んで6つの班を作ります。Aくんが同じクラスのBさんと同じ班になる確率はいくつでしょうか。

コード

simulation <- function(nreps) {
    team_info <- list()
    team_info$count_same_team <- 0
    for (rep in 1:nreps) {
        team_info$num_class <- 1:30
        team_info$chosen <- 0
        team_info <- choose_team(team_info, 5)
        if (team_info$chosen > 0) next
        team_info <- choose_team(team_info, 5)
        if (team_info$chosen > 0) next
        team_info <- choose_team(team_info, 5)
        if (team_info$chosen > 0) next
         team_info <- choose_team(team_info, 5)
        if (team_info$chosen > 0) next
        team_info <- choose_team(team_info, 5)
        if (team_info$chosen > 0) next
        team_info <- choose_team(team_info, 5)     
    }
    print(team_info$count_same_team / nreps)
}
        
choose_team <- function(han, size){
    team <- sample(han$num_class, size)
    han$chosen <- length(intersect(1:2, team))
    if (han$chosen == 2)
        han$count_same_team <- han$count_same_team + 1
    han$num_class <- setdiff(han$num_class, team)
    return(han)
}
> simulation(100)
 [1] 0.14

【参考文献】
『アート・オブ・Rプログラミング』8.6.3 応用例:組合せシミュレーション(PP.203-204)