Forçando um conjunto de números para uma curva de sino gaussiana

9

( Isso está relacionado à minha pergunta de programação no Stack Overflow : algoritmo gaussiano de curva de Bell (Python e / ou C #) .)

No Answers.com, encontrei este exemplo simples:

  1. Encontre a média aritmética (média) => Soma de todos os valores no conjunto, dividida pelo número de elementos no conjunto
  2. Encontre a soma dos quadrados de todos os valores no conjunto
  3. Divida a saída de (2) pelo número de elementos no conjunto
  4. Subtraia o quadrado da média (1) da saída de (3)
  5. Tire a raiz quadrada do resultado de (4)

Exemplo: conjunto A = {1,3,4,5,7}

  1. (1 + 3 + 4 + 5 + 7) / 5 = 4
  2. (1 * 1 + 3 * 3 + 4 * 4 + 5 * 5 + 7 * 7) = 1 + 9 + 16 + 25 + 49 = 100
  3. 100/5 = 20
  4. 20 - 4 * 4 = 20-16 = 4
  5. SQRT (4) = 2

(Isso vem de uma postagem no wiki.answers.com .)

Agora, considerando tudo isso, como ajustar os dados acima a uma curva de sino (como uma pontuação de crédito) variando de 200 a 800. Obviamente, o número 5 no conjunto acima seria 500. Mas então, qual é a fórmula para determinar o que 3 deve estar na mesma escala. Mesmo que o conjunto original Conjunto A = {1,3,4,5,7} não seja uma curva em sino, quero forçá-lo a uma curva em sino.

Imagine que são dezenas de 5 pessoas. No próximo mês, as pontuações podem mudar da seguinte forma: Set A2={1,2,4,5,9}(um cara perde um ponto e o cara mais alto ganha mais dois pontos - os ricos ficam mais ricos e os pobres mais pobres). Então talvez um novo cara entre no set: set A3={1,2,4,5,8,9}.

NealWalters
fonte
2
Se o seu conjunto muda de tempos em tempos, é impossível ajustá-lo à mesma curva de sino. Suponha que você tenha o conjunto , então 4 deve ser 800, mas se uma nova observação 5 chegar, ela deverá se tornar 800.A={1,2,3,4}
mpiktas
11
Bem-vindo ao CrossValidated, NealWalters. Você pode achar que uma resposta comum a perguntar a um estatístico "Como faço isso" é "Por que você quer fazer isso?"
onestop 31/12/10
@onestop - veja meu link para o post anterior. Na escola, lembro-me de ouvir professores que se classificaram "na curva". Portanto, independentemente da nota obtida em um teste, apenas uma certa porcentagem de pessoas obteria cada nota. Não tenho ideia de como funcionam as pontuações de crédito, mas isso é muito semelhante ao que estou simulando. Dou pontos às pessoas, por exemplo, quando pagam um empréstimo. Mas algumas pessoas pagam dezenas de empréstimos. Eu quero condensar meus pontos selvagens em um conjunto de pontos normalizados.
NealWalters
Ao ler seu último comentário, pergunto-me qual é a melhor abordagem: dê, por exemplo, 1 ponto para cada empréstimo pago, outros pontos para outras coisas, depois tente domar a enorme pontuação no final ou talvez faça algo mais significativo com cada componente que compõe a pontuação final? Por exemplo, se você atribuir pontos para empréstimos pagos, poderá calcular seus pontos LPO (Loans Paid Off) como log (1 + NumberOfLoansPaidOff). Portanto, alguém com zero empréstimos quitados recebe um LPO de 0, alguém com 3 empréstimos quitados recebe um LPO de 1,1, enquanto alguém com 100 empréstimos quitados recebe um LPO de 4,6. Cap LPO às 5.
Wayne

Respostas:

13

Uma faixa escalada , como 200 a 800 (para SATs, por exemplo ), é apenas uma alteração de unidades de medida . (Funciona exatamente como alterar as temperaturas em Fahrenheit e as em Celsius.)

O valor médio de 500 deve corresponder à média dos dados. O intervalo deve corresponder a cerca de 99,7% dos dados quando os dados seguem uma distribuição Normal ("Curva de Bell"). É garantido que inclua 8/9 dos dados ( Desigualdade de Chebyshev ).

Nesse caso, a fórmula 1-5 calcula o desvio padrão dos dados. Esta é simplesmente uma nova unidade de medida para os dados originais. Ele precisa corresponder a 100 unidades na nova escala. Portanto, para converter um valor original em um valor escalado,

  • Subtraia a média.

  • Divida pelo desvio padrão.

  • Multiplique por 100.

  • Adicione 500.

Se o resultado estiver além do intervalo você pode usá-lo como está ou "fixá-lo" ao intervalo, arredondando até 200, até 800.[200,800]

No exemplo , usando dados , a média é e o SD é . Portanto, ao redimensionar, se torna . Todo o conjunto de dados redimensionado, calculado de maneira semelhante, é .{1,3,4,5,7}421(14)/2100+500=350{350,450,500,550,650}

Quando os dados originais são distribuídos de uma maneira distintamente não normal, você precisa de outra abordagem . Você não calcula mais uma média ou SD. Em vez disso, colocar todas as pontuações em ordem, a partir de 1 (menor) até º (maior). Estas são as suas fileiras . Converta qualquer classificação em sua porcentagem . (No exemplo, e os dados já estão na ordem de classificação . Portanto, suas porcentagens são , geralmente escrito de forma equivalente a etc.). Correspondente a qualquer porcentagem (entre e , necessariamente) é umni (i1/2)/nn=5i=1,2,3,4,51/10,3/10,5/10,7/10,9/1010%,30%01quantil normal . É calculado com a função quantil normal , que está intimamente relacionada à função de erro . ( Aproximações numéricas simples são fáceis de codificar.) Seus valores, que normalmente estarão entre -3 e 3, precisam ser redimensionados (como antes) para o intervalo . Faça isso multiplicando primeiro o quantil normal por 100 e adicionando 500.[200,800]

A função quantil normal está disponível em muitas plataformas de computação, incluindo planilhas ( normas do Excel , por exemplo). Por exemplo, os quantis normais (ou "pontuações normais") para os dados são .{ 372 , 448 , 500 , 552 , 628 }{1,3,4,5,7}{372,448,500,552,628}

Essa abordagem de " pontuação normal " sempre fornecerá pontuações entre 200 e 800 quando você tiver 370 ou menos valores. Quando você tem 1111 ou menos valores, todos, exceto os mais altos e os mais baixos, terão pontuações entre 200 e 800.

whuber
fonte
+1, eu apaguei minha resposta, já que a sua era muito melhor e tornava a minha obsoleta :)
mpiktas 31/12/10
Onde você está conseguindo o 5 no 1-5? 4 é a média. Deve ser 1-4? Estou testando hoje com Python, obrigado novamente.
NealWalters
@NealWalters Desculpe, isso foi um deslize do dedo. Corrigi-o agora para que leia (1-4) / 2 * 100 + 500.
whuber
4

Você pode tentar essa abordagem - normalize seu conjunto de dados para variar entre os valores -1 e +1, assim: Isso converterá todos os valores do seu conjunto de dados em um valor entre -1 e +1, com os valores máximo e mínimo reais sendo definidos como +1 e -1, respectivamente, e redefinirá esses valores +1 e -1 para +0,9999 e -0,9999 (necessário para os cálculos a seguir).

(individual_valuemin_of_all_valuesmax_of_all_valuesmin_of-all_values0.5)2.

Em seguida, aplique a Transformação Fisher a cada um dos valores normalizados acima para "forçá-la" a se adaptar aproximadamente a uma distribuição normal e, em seguida, "des-normalizar" cada um desses valores da Transformação Fisher para variar entre 200 e 800, assim: O valor máximo da Transformação Fisher será definido exatamente como 800, o valor mínimo da Transformação Fisher será definido exatamente a 200, e todos os outros valores estarão entre esses dois extremos, de acordo com uma distribuição normal aproximada.

Fish_valuemin_all_Fish_valuesmax_all_Fish_valuesmin_all_Fish_values600+200

Fazendo referência à sua pergunta original sobre SO e à questão da escalabilidade, a vantagem dessa abordagem é que, desde que qualquer novo ponto de dados não seja ele próprio um novo máximo ou mínimo para o conjunto de dados como um todo, você poderá aplicar os cálculos acima ao novo ponto de dados obter sua pontuação entre 200 e 800 sem afetar nenhuma das pontuações existentes do conjunto de dados original. Se um novo ponto de dados for um novo máximo ou mínimo, você precisará recalcular as pontuações para todo o conjunto de dados com esse novo valor máximo ou mínimo "normalizador".

babelproofreader
fonte