문제

이것은 말 그대로 케이크를 비교하는 것입니다.내 친구는 맨해튼 최고의 컵케이크 가게를 결정한다는 목표로 컵케이크 파티를 열고 있습니다.실제로는 그보다 훨씬 더 야심찬 일입니다.읽어.

27개의 빵집이 있고 19명의 사람들이 참석하고 있습니다(1~2명의 노쇼도 있을 수 있습니다).가능한 경우 스테이플(바닐라, 초콜릿, 레드 벨벳)을 포함하고 와일드카드 맛으로 4개를 마무리하는 등 각 베이커리에는 4개의 컵케이크가 있습니다.컵케이크를 평가하는 데는 4가지 속성이 있습니다.향미, 촉촉함, 표현력(예쁨), 전반적으로 좋음.사람들은 샘플링한 각 컵케이크의 각 속성에 대해 5점 척도로 평가를 제공합니다.마지막으로 각 컵케이크를 4~5개 조각으로자를 수 있습니다.

질문은 ~이야:각 속성 및 각 맛("와일드카드"를 맛으로 처리)에 대해 통계적으로 의미 있는 빵집 순위를 도출하는 절차는 무엇입니까?구체적으로 우리는 빵집 순위를 8번 지정하려고 합니다.각 맛에 대해 우리는 좋음을 기준으로 빵집의 순위를 매기려고 하며(좋음은 속성 중 하나임), 각 속성에 대해 모든 맛에 걸쳐 빵집의 순위를 매기고 싶습니다(즉, 맛과 무관함, 즉 모든 맛에 대해 집계).최우수상은 좋음 속성이 가장 높은 빵집에 돌아갑니다.

물론 이것을 일반화하면 보너스 포인트가 됩니다.

이 작업은 약 12시간 후에 발생하므로 그 동안 아무도 답변하지 않으면 어떻게 되었는지 답변으로 게시하겠습니다.

추신:이에 대한 파티 후 블로그 게시물은 다음과 같습니다. http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-ever/

도움이 되었습니까?

해결책

우리가 한 일은 다음과 같습니다.모든 사람의 평가를 수집하기 위해 거대한 테이블을 만들었습니다. 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.

다른 팁

아마도 읽는 중일 것입니다. 투표 시스템 도움이 될 것입니다.추신:Wikipedia에 "좋은 물고기"라고 쓰여 있는 것을 받아들이지 마십시오.나는 그곳의 고급 주제에서 사실적 오류를 발견했습니다.

문제를 하위 문제로 나눕니다.

컵케이크의 가치는 얼마인가요?기본적인 접근법은 "점수의 평균"입니다. 약간 더 강력한 접근 방식은 "점수의 가중 평균"일 수 있습니다. 그러나 그 이상의 합병증이있을 수 있습니다 ...맛과 맛의 가중치가 같더라도 3가지 맛과 3가지 맛이 있는 컵케이크는 5가지 맛과 1가지 맛이 있는 컵케이크보다 '더 좋을' 수 있습니다(IOW, 낮은 점수는 불균형한 영향을 미칠 수 있음).

샘플 컵케이크 점수를 만들어 보세요(구체적인 내용!일반적인 시나리오와 몇 가지 이상한 시나리오를 다루고, 이상적인 알고리즘이 있을 경우 합리적인 "전체" 점수가 얼마라고 생각하는지 추정해 보세요.그런 다음 해당 데이터를 사용하여 알고리즘을 리버스 엔지니어링합니다.

예를 들어, 좋음 4, 맛 3, 표현 1, 촉촉함 4를 가진 컵케이크는 전체적으로 4점을 받을 수 있는 반면, 좋음 4, 맛 2, 표현 5, 촉촉함 4를 가진 컵케이크는 3점만 평가할 수 있습니다.

다음으로 빵집에서도 같은 일을 하세요.다양한 점수의 컵케이크 세트가 주어졌을 때 적절한 등급은 무엇입니까?그런 다음 해당 데이터를 제공하는 함수를 알아보세요.

'좋음' 순위는 일반 평점인 것 같아서 좀 이상해 보이는데, 거기에 포함하면 이미 전체 점수가 있는데 왜 전체 점수를 계산합니까?

이 작업을 할 시간이 있다면 항상 원시 데이터를 캡처하고 이를 기초로 사용하여 보다 자세한 분석을 수행할 것을 제안하지만 여기서는 실제로 관련성이 없다고 생각합니다.

어쩌면 이것은 너무 일반적인 것일 수도 있지만 이러한 유형의 문제는 Conjoint Analysis(링크 텍스트).이를 구현하기 위한 R 패키지는 bayesm(링크 텍스트).

SQL을 작성할 수 있다면 작은 데이터베이스를 만들고 쿼리를 작성할 수 있습니다.그렇게 어렵지는 않습니다.

예를 들어베이커리, 맛별로 그룹화된 테이블에서 합계(점수) / 개수(점수)를 최종 점수, 빵집, 맛으로 선택합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top