Como encontrar os pontos da amostra que possuem grandes proporções outlier estatisticamente significativas entre dois valores do ponto?


12

Como um aplicativo de exemplo, considere seguir duas propriedades dos usuários do Stack Overflow: contagem de visualizações de reputação e perfil .

Espera-se que, para a maioria dos usuários, esses dois valores sejam proporcionais: os usuários com alta reputação atraem mais atenção e, portanto, obtêm mais visualizações de perfil.

Portanto, é interessante procurar usuários que tenham muitas visualizações de perfil em comparação com sua reputação total.

Isso pode indicar que esse usuário tem uma fonte externa de fama. Ou talvez apenas porque eles têm nomes e fotos de perfil peculiares interessantes.

Mais matematicamente, cada ponto de amostra bidimensional é um usuário e cada usuário tem dois valores integrais que variam de 0 a + infinito:

  • reputação
  • número de visualizações de perfil

Espera-se que esses dois parâmetros sejam linearmente dependentes, e gostaríamos de encontrar pontos de amostra que são os maiores outliers para essa suposição.

A solução ingênua seria, obviamente, apenas obter visualizações de perfil, dividir por reputação e classificar.

No entanto, isso daria resultados que não são estatisticamente significativos. Por exemplo, se um usuário respondesse à pergunta, obtivesse 1 voto positivo e, por algum motivo, tivesse 10 visualizações de perfil, o que é fácil de falsificar, esse usuário apareceria na frente de um candidato muito mais interessante que possui 1000 votações positivas e 5000 visualizações de perfil .

Em um caso de uso mais "real", poderíamos tentar responder, por exemplo, "quais startups são os unicórnios mais significativos?". Por exemplo, se você investir 1 dólar com patrimônio líquido minúsculo, crie um unicórnio: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656

Dados concretos limpos e fáceis de usar do mundo real

Para testar sua solução para esse problema, você pode apenas usar este pequeno arquivo pré-processado (75 milhões de usuários, ~ 10 milhões de usuários) extraído do dump de dados Stack Overflow de 2019-03 :

wget https://github.com/cirosantilli/media/raw/master/stack-overflow-data-dump/2019-03/users_rep_view.dat.7z
7z x users_rep_view.dat.7z

que produz o arquivo codificado em UTF-8 users_rep_view.datque possui um formato separado de espaço de texto sem formatação muito simples:

Id Reputation Views DisplayName
-1 1 649 Community
1 45742 454747 Jeff_Atwood
2 3582 24787 Geoff_Dalgas
3 13591 24985 Jarrod_Dixon
4 29230 75102 Joel_Spolsky
5 39973 12147 Jon_Galloway
8 942 6661 Eggs_McLaren
9 15163 5215 Kevin_Dente
10 101 3862 Sneakers_O'Toole

É assim que os dados se parecem em uma escala de log:

insira a descrição da imagem aqui

script gnuplot .

Seria interessante ver se sua solução realmente nos ajuda a descobrir novos usuários peculiares desconhecidos!

Os dados iniciais foram obtidos no despejo de dados de 2019-03 da seguinte maneira:

wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z

# Produces Users.xml
7z x stackoverflow.com-Users.7z

# Preprocess data to minimize it.
./users_xml_to_rep_view_dat.py Users.xml > users_rep_view.dat
7z a users_rep_view.dat.7z users_rep_view.dat

sha256sum stackoverflow.com-Users.7z users_rep_view.dat.7z > checksums

Fonte parausers_xml_to_rep_view_dat.py .

Depois de selecionar os valores discrepantes reordenando users_rep_view.dat, você pode obter uma lista HTML com hiperlinks para visualizar rapidamente as principais opções com:

./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html

Fonte parausers_rep_view_dat_to_html.py .

Esse script também pode servir como uma referência rápida de como ler os dados no Python.

Análise manual de dados

Imediatamente, olhando para o gráfico gnuplot, vemos isso como esperado:

  • os dados são aproximadamente proporcionais, com maiores variações para usuários com baixa repetição ou baixa contagem de visualizações
  • os usuários com baixa reputação ou baixa contagem de visualizações são mais claros, o que significa que eles têm IDs de conta mais altos, o que significa que suas contas são mais novas

Para ter alguma intuição sobre os dados, eu queria detalhar alguns pontos mais avançados em algum software de plotagem interativo.

O Gnuplot e o Matplotlib não conseguiram lidar com um conjunto de dados tão grande, então dei uma chance ao VisIt pela primeira vez e funcionou. Aqui está uma visão geral detalhada de todos os softwares de plotagem que eu tentei: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461

OMG que foi difícil de executar. Eu precisei:

  • baixar o executável manualmente, não há pacote Ubuntu
  • converta os dados para CSV cortando users_xml_to_rep_view_dat.pyrapidamente porque não consegui encontrar facilmente como alimentá-los com arquivos separados por espaço (lição aprendida, da próxima vez vou direto para o CSV)
  • lute por 3 horas com a interface do usuário
    • o tamanho padrão do ponto é um pixel, que é confundido com a poeira na minha tela. Mover para 10 esferas de pixel
    • havia um usuário com 0 visualizações de perfil e o VisIt recusou-se corretamente a fazer o gráfico do logaritmo; portanto, usei limites de dados para nos livrar desse ponto. Isso me lembrou que o gnuplot é muito permissivo e alegremente traçará tudo o que você jogar nele.
    • adicione títulos de eixos, remova nome de usuário e outras coisas em "Controles"> "Anotações"

Veja como era minha janela do VisIt depois que me cansei deste trabalho manual:

insira a descrição da imagem aqui

As Cartas são pontos que eu selecionei manualmente com o incrível recurso Escolhas:

  • você pode ver o ID exato de cada ponto aumentando a precisão do ponto flutuante na janela Escolhas> "Formato flutuante" para %.10g
  • você pode despejar todos os pontos escolhidos a dedo em um arquivo txt com "Save Picks as". Isso nos permite produzir uma lista clicável de URLs de perfil interessantes com algum processamento básico de texto

TODOs, saiba como:

  • veja as sequências de nome do perfil, elas são convertidas em 0 por padrão. Acabei de colar os IDs de perfil no navegador
  • escolha todos os pontos em um retângulo de uma só vez

E, finalmente, aqui estão alguns usuários que provavelmente devem aparecer no alto do seu pedido:

Soluções possíveis

Eu já ouvi sobre o intervalo de confiança de pontuação Wilson de https://www.evanmiller.org/how-not-to-sort-by-average-rating.html que "equilíbrio [s] a proporção de classificações positivas com a incerteza de um pequeno número de observações ", mas não sei como mapear isso para esse problema.

Na publicação do blog, o autor recomenda esse algoritmo para encontrar itens com muito mais votos positivos do que negativos, mas não tenho certeza se a mesma idéia se aplica ao problema de visualização de votos positivos / perfil. Eu estava pensando em tomar:

  • visualizações de perfil == votos positivos lá
  • upvotes aqui == downvotes lá (ambos "ruins")

mas não tenho certeza se faz sentido, porque no problema de up / downvote, cada item classificado tem N 0/1 votação de eventos. Mas no meu problema, cada item tem dois eventos associados: obter o voto positivo e obter a visualização do perfil.

Existe um algoritmo conhecido que fornece bons resultados para esse tipo de problema? Mesmo saber o nome exato do problema me ajudaria a encontrar a literatura existente.

Bibliografia

Testado no Ubuntu 18.10, VisIt 2.13.3.


11
Eu sou novo nisso, portanto, fique à vontade para editar o título / pergunta para tornar a terminologia mais correta. Obrigado.
Ciro Santilli escreveu

parece que você está procurando discrepantes. Eu usaria uma técnica neste espaço
probabilityislogic

11
@probabilityislogic btw, atualizei a pergunta com alguns dados concretos fáceis de usar.
Ciro Santilli escreveu:

11
Gostaria apenas de dizer que esta não é apenas uma pergunta interessante, mas também muito concreta e bem formatada. Um exemplo para admirar. Bom trabalho @Ciro!
Julio Cezar Silva

11
@JulioCezarSilva thanks !! Desta vez, eu não esperava aprender sobre plotagem interativa de alto desempenho, mas aprendi. Clássico.
Ciro Santilli foi lançado

Respostas:


4

Acho que o intervalo de confiança da pontuação de Wilson pode ser aplicado diretamente ao seu problema. A pontuação usada no blog foi um limite inferior do intervalo de confiança, em vez de um valor esperado.

Outro método para esse problema é corrigir (viés) nossa estimativa em relação a algum conhecimento prévio que possuímos, por exemplo, a relação geral de visualização / repetição.

vN(μ,σ)μ

μp(μ)

Na prática, essa é essencialmente uma média ponderada da taxa de visualização / repetição geral e da taxa de visualização / repetição do usuário, que é o número de representantes que um usuário possui, é uma constante, é a proporção de exibição / repetição do usuário e a proporção geral de exibição / repetição.

μMAP=nμMLE+cμ0n+c
ncμMLEμ0


Para comparar os dois métodos (limite inferior do intervalo de confiança de Wilson e MAP), os dois fornecem uma estimativa precisa quando há dados suficientes (repetições), quando o número de repetições é pequeno, o método de limite inferior de Wilson será direcionado para zero e o MAP será viés em relação à média.


11
Obrigado pela sua resposta! Atualizei a pergunta com alguns dados concretos e fáceis de usar. Vamos ver se alguém consegue fazer algumas descobertas divertidas.
Ciro Santilli escreveu:

11
@CiroSantilli job 改造 中心 996ICU 六四 job good job!
Dontloo 28/04/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.