4

これは文字通りケーキを比較することです。私の友人は、マンハッタンで最高のカップケーキ屋を決定することを目標に、カップケーキ パーティーを開いています。実際には、それよりもはるかに野心的です。読む。

27 のベーカリーがあり、19 人が参加しています (おそらく 1 つまたは 2 つのノーショーがあります)。各ベーカリーから 4 つのカップケーキが用意されます。可能であれば、定番のバニラ、チョコレート、レッド ベルベットを含み、4 つをワイルドカード フレーバーで締めくくります。カップケーキを評価する 4 つの属性があります: 風味、しっとり、プレゼンテーション (かわいさ)、および一般的な良さです。人々は、サンプリングした各カップケーキの属性ごとに 5 段階で評価を提供します。最後に、各カップケーキを 4 つか 5 つに切ることができます。

問題は、各属性および各フレーバー (「ワイルドカード」をフレーバーとして扱う) について、統計的に意味のあるベーカリーのランキングを作成するための手順はどのようなものかということです。具体的には、ベーカリーを 8 回ランク付けしたいと考えています。フレーバーごとにパン屋を良さ (良さは属性の 1 つ) でランク付けし、属性ごとにすべてのフレーバーでベーカリーをランク付けします (つまり、フレーバーとは無関係です)。 、つまり、すべてのフレーバーを集約します)。大賞は、良い属性の最高ランクのベーカリーに贈られます。

もちろん、これを一般化するためのボーナスポイント。

これは約 12 時間後に発生するため、その間に誰も回答がない場合は、最終的に何をしたかを回答として投稿します。

PS: パーティー後のブログ記事はこちら: http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-ever/

4

5 に答える 5

3

これが私たちがやったことです。http://etherpad.com/sugarorgyで全員の評価を収集するための巨大なテーブルを作成し(リビジョン 25、この公開リンクを追加して破壊された場合に備えて)、次の Perl スクリプトを使用してデータを解析してCSV ファイル:

#!/usr/bin/env perl
# Grabs the cupcake data from etherpad and parses it into a CSV file.

use LWP::Simple qw(get);

$content = get("http://etherpad.com/ep/pad/export/sugarorgy/latest?format=txt");
$content =~ s/^.*BEGIN_MAGIC\s*//s;
$content =~ s/END_MAGIC.*$//s;
$bakery = "none";
for $line (split('\n', $content)) {
  next if $line =~ /sar kri and deb/;
  if ($line =~ s/bakery\s+(\w+)//) { $bakery = $1; }
  $line =~ s/\([^\)]*\)//g; # strip out stuff in parens.
  $line =~ s/^\s+(\w)(\w)/$1 $2/;
  $line =~ s/\-/\-1/g;
  $line =~ s/^\s+//;
  $line =~ s/\s+$//;
  $line =~ s/\s+/\,/g;
  print "$bakery,$line\n"; 
}

次に、Mathematica で平均化などを行いました。

data = Import["!~/svn/sugar.pl", "CSV"];

(* return a bakery's list of ratings for the given type of cupcake *)
tratings[bak_, t_] := Select[Drop[First@Select[data, 
                        #[[1]]==bak && #[[2]]==t && #[[3]]=="g" &], 3], #!=-1&]

(* return a bakery's list of ratings for the given cupcake attribute *)
aratings[bak_, a_] := Select[Flatten[Drop[#,3]& /@ 
                        Select[data, #[[1]]==bak && #[[3]]==a&]], #!=-1&]

(* overall rating for a bakery *)
oratings[bak_] := Join @@ (tratings[bak, #] & /@ {"V", "C", "R", "W"})

bakeries = Union@data[[All, 1]]

SortBy[{#, oratings@#, Round[Mean@oratings[#], .01]}& /@ bakeries, -#[[3]]&]

結果はhttp://etherpad.com/sugarorgyの下部にあります。

于 2009-08-03T04:25:43.397 に答える
2

おそらく、投票システムについて読むと役立つでしょう。PS: ウィキペディアに書かれていることを「良い魚」と見なさないでください。そこの高度なトピックで事実上の誤りを見つけました。

于 2009-08-01T07:56:07.287 に答える
1

問題をサブ問題に分割します。

カップケーキの価値は?基本的な考え方は「スコアの平均」です。もう少し確実なアプローチは、「スコアの加重平均」かもしれません。しかし、それ以上の複雑な問題があるかもしれません... 3 つの良さと 3 つのフレーバーを持つカップケーキは、5 つのフレーバーと 1 つの良さを持つカップケーキよりも「良い」かもしれません。効果)。

カップケーキ スコアのサンプルをいくつか作成し (詳細! 通常のシナリオといくつかの奇妙なシナリオをカバーします)、理想的なアルゴリズムを使用した場合に合理的な「全体的な」スコアがどのようになるかを見積もります。次に、そのデータを使用してアルゴリズムをリバース エンジニアリングします。

たとえば、良さ 4、風味 3、見た目 1、しっとり 4 のカップケーキは総合的に 4 に値するかもしれませんが、良さ 4、風味 2、見た目 5、しっとり 4 のカップケーキは 3 しか評価されないかもしれません。

次に、ベーカリーについても同じことを行います。さまざまなスコアを持つカップケーキのセットが与えられた場合、適切な評価はどれでしょうか? 次に、そのデータを提供する関数を見つけます。

「良さ」のランキングは、一般的な評価のように見えるため、少し奇妙に思えます。そのため、そこにすでに総合スコアがあるのに、総合スコアを計算する必要はありません。

これに取り組む時間があれば、生データをキャプチャし、それをベースとして使用してより詳細な分析を行うことを常にお勧めしますが、それはここではあまり関係ないと思います.

于 2009-08-01T07:26:39.343 に答える
1

これは一般的すぎるかもしれませんが、このタイプの問題には、コンジョイント分析 ( link text ) を使用してアプローチできます。これを実現するARパッケージがbayesm( link text )です。

于 2009-08-03T02:10:25.593 に答える
0

SQL を記述できる場合は、小さなデータベースを作成して、いくつかのクエリを記述できます。そんなに難しくないはずです。

例: sum(score) / count(score) を finalscore、bakery、flavor として選択します。

于 2009-08-01T07:00:40.863 に答える