Pergunta

Trata -se literalmente de comparar bolos. Meu amigo está dando uma festa de cupcake com o objetivo de determinar a melhor cupcakery em Manhattan. Na verdade, é muito mais ambicioso do que isso. Leia.

Existem 27 padarias e 19 pessoas presentes (com talvez um ou dois não shows). Haverá 4 cupcakes de cada padaria, se possível, incluindo os grampos - baunilha, chocolate e veludo vermelho - e completando os 4 com sabores curinga. Existem 4 atributos nos quais avaliar os cupcakes: sabor, umidade, apresentação (beleza) e bondade geral. As pessoas fornecerão classificações em uma escala de 5 pontos para cada atributo para cada cupcake que amostrar. Finalmente, cada cupcake pode ser cortado em 4 ou 5 pedaços.

A questão é: o que é um procedimento para criar um ranking estatisticamente significativo das padarias para cada atributo e para cada sabor (tratando o "curinga" como um sabor)? Especificamente, queremos classificar as padarias 8 vezes: para cada sabor que queremos classificar as padarias por bondade (sendo a bondade um dos atributos) e para cada atributo que queremos classificar as padarias em todos os sabores (ou seja, independentemente do sabor , ou seja, agregando todos os sabores). O Grande Prêmio vai para a padaria mais bem classificada para o atributo de bondade.

Pontos de bônus para generalizar isso, é claro.

Isso está acontecendo em cerca de 12 horas, então postarei como resposta o que acabamos fazendo se ninguém responder enquanto isso.

PS: Aqui está o post do blog pós-partia sobre isso: http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-wer/

Foi útil?

Solução

Aqui está o que acabamos fazendo. Fiz uma mesa enorme para coletar as classificações de todos em http://etherpad.com/sugarorgy (Revisão 25, caso seja vandalizado comigo adicionando esse link público) e depois use o seguinte script Perl para analisar os dados em um arquivo 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"; 
}

Então eu fiz a média e outros enfeites em 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]]&]

Os resultados estão no fundo de http://etherpad.com/sugarorgy.

Outras dicas

Talvez lendo sobre sistemas de votação será útil. PS: Não leve o que está escrito na Wikipedia como "bom peixe". Eu encontrei erros factuais em tópicos avançados lá.

Quebre o problema em subproblemas.

Qual é o valor de um cupcake? Uma abordagem básica é "a média das pontuações". Uma abordagem um pouco mais robusta pode ser "a média ponderada das pontuações". Mas pode haver complicações além disso ... um cupcake com 3 bondade e 3 sabor pode ser 'melhor' do que um com 5 sabores e 1 bondade, mesmo que o sabor e a bondade tenham peso igual (IOW, uma pontuação baixa pode ter um desproporcional efeito).

Compõe algumas pontuações de cupcakes de amostra (detalhes específicos! Cubra os cenários normais e alguns estranhos) e estimar o que você acha que uma pontuação "geral" razoável seria se você tivesse um algoritmo ideal. Em seguida, use esses dados para reverter o engenheiro do algoritmo.

Por exemplo, um cupcake com bondade 4, sabor 3, apresentação 1 e umidade 4 podem merecer um 4 no geral, enquanto um com bondade 4, sabor 2, apresentação 5 e umidade 4 podem classificar apenas 3.

Em seguida, faça a mesma coisa para a padaria. Dado um conjunto de cupcakes com uma variedade de pontuações, qual seria uma classificação apropriada? Em seguida, descubra a função que fornecerá esses dados.

A classificação "bondade" parece um pouco estranha, pois parece que é uma classificação geral e, portanto, tê -lo já existe a pontuação geral, então por que calcular uma pontuação geral?

Se você tivesse tempo de trabalhar com isso, eu sempre sugiro capturar os dados brutos e usá -los como base para fazer uma análise mais detalhada, mas não acho que isso seja realmente relevante aqui.

Talvez isso seja geral demais para você, mas esse tipo de problema pode ser abordado usando análise conjunta (Texto do link). Pacote AR para implementar isso é Bayesm (Texto do link).

Se você pode escrever SQL, poderá fazer um pouco de banco de dados e escrever algumas consultas. Não deve ser tão difícil.

Por exemplo, selecione Sum (Score) / Count (Score) como Finalscore, Padaria, Sabor de Tabelas onde Grupo por padaria, Sabor

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top