19982


直接プログラミングに関係するわけではありませんが、アルゴリズムの話なのでこちらに質問させていただきます。

いま、アプリ一覧を使用頻度の高い順にソートしたいと考えています。  
そこでアプリ起動頻度として、起動と起動のあいだに経過した時間の平均を取るという方法を取っています。  
しかしこの方法では、過去によく使用していたが、いまではほとんど使ってないというものが上位に表示されてしまい利便性に問題があります。

そこで皆様のお知恵をお借りしたいのですが、なんらかのものの使用頻度を一般的に求めるためには、どのようなアルゴリズム、計算方法をとるべきでしょうか？

よろしくお願いします。

**補足**  
回答いただきありがとうございます。  
私が期待しているのは、使用頻度なので、

  * よく利用する（利用する間隔が短い）ものを上位に
  * 昔良く利用していたが今はもう利用していないものは相対的に下位に
  * 利用回数が多いものを上位に

という特徴をもった数値を計算したいと思っています。


CC BY-SA 3.0
2015-12-14T08:39:36.397
19963
2015-12-14T18:53:48.603
2015-12-14T17:01:09.540
10963
10963
question
アルゴリズム sort
使用頻度を計算するには？


一般的というのは、存在しません。

hosiさんが欲しいと思っている使用頻度だけがhosiさんの正しい使用頻度であって、他の見知らぬ人々（一般）が欲しがるものに惑わされる事は不毛だと思います。

「過去に良く使用されていたものが上位に表示されるのは問題がある」という事であれば、  
a) 直近1年とか、直近1か月とかを調査対象期間にする、  
b) （使用回数/アプリが提供されていた期間）で頻度を求める  
などの対策が考えられます。

aは、最近良く使われているアプリが上位に来ますが、昔良く使われていたアプリが顧みられることはありません。昔の名作が、抜け落ちる可能性があるという欠点があります。

bは、リリースから今までの期間の平均を頻度に使いますから、良く使われていた時期のあるアプリはそれなりの順位になります。1年前にリリースされて毎日10回使われてるアプリと、3年前にリリースされて当初1年間は毎日30回使われていたけれど最近はさっぱり使われないアプリが、だいたい同じ順位になる訳です。調査対象期間を変えて順位表を作成し、そのなかでhosiさんの感覚にあう結果となった調査期間を用いると、望んでいる使用頻度に近いものが得られると考えられます。

どんな性質がある使用頻度が欲しいかを補足すると、より良い回答が得られると思いますよ。


CC BY-SA 3.0
2015-12-14T10:27:08.003
19968
2015-12-14T10:27:08.003
217
19963
answer


時系列データに対して、過去n日の動きを知りたい時は[移動平均](https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87)がよく使われます。直近の値を重視し、遠い過去の影響を少なく計算するには、経過日数の逆数で重み付けすればいいわけです。重み付けのやり方は色々ありますが[指数移動平均](https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87#.E6.8C.87.E6.95.B0.E7.A7.BB.E5.8B.95.E5.B9.B3.E5.9D.87)もよく使われています。

例えば１日あたりの起動回数をアプリごとにカウントし、窓の大きさを１ヶ月などとすれば過去１ヶ月の動きが分かります。リリース日からということなら１年とか、長期間になるでしょう。


CC BY-SA 3.0
2015-12-14T18:53:48.603
19982
2015-12-14T18:53:48.603
7837
19963
answer