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.dat
que 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:
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.py
rapidamente 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:
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:
usuários de representantes muito baixos, com grande número de visualizações e baixos perfis de informações.
Esses usuários provavelmente estão redirecionando o tráfego de algum lugar.
Relacionado: houve um meta-tópico para a famosa pergunta manipulação de crachá de ouro por um usuário, mas não consigo encontrá-lo agora.
Se houver muitos desses usuários, nossa análise será difícil e precisaremos considerar outros parâmetros para evitar essa "fraude":
- A 1 143100 2445750 https://stackoverflow.com/users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 https://stackoverflow.com/users/2139869/xxn
- E 40 23067 5740196 https://stackoverflow.com/users/5740196/listcrawler
- F 11 7738 3313079 https://stackoverflow.com/users/3313079/rikitikitaco
- G 136 11123 4102129 https://stackoverflow.com/users/4102129/abhishek-deshpande
- K 377 24453 1012351 https://stackoverflow.com/users/1012351/overstack
- L 1489 57515 1249338 https://stackoverflow.com/users/1249338/frosty
- M 1767 40986 2578799 https://stackoverflow.com/users/2578799/naresh-walia
- Acho esse cluster de usuários interessante, tudo tão próximo no gráfico:
- H 58 4331 1818755 https://stackoverflow.com/users/1818755/eerongal
- I 103 4366 1816274 https://stackoverflow.com/users/1816274/angelov
- J 157 4688 688552 https://stackoverflow.com/users/688552/oylex
fama externa:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Modelo da Victoria's Secret: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO co-fundador
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO co-fundador
- os usuários com maior reputação tendem a obter mais visualizações de perfil porque aparecem nas consultas / listagens do Google "usuários com maior reputação":
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert envolvido no design de C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc - principal usuário # 2, quantidade insana de respostas
perfis peculiares:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Essa imagem! Eu também acho que ele era um moderador anteriormente.
- R 143904 144287 895245 https://stackoverflow.com/users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad % e5% bf% 83996icu% e5% 85% ad% e5% 9b% 9b% e4% ba% 8b% e4% bb% b6
- T 291742 161929 560648 https://stackoverflow.com/users/560648/lightness-races-in-orbit
usuários de alto representante que foram suspensos no momento. Ah, o idiota do seu representante vai para 1 regra:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
não tenho certeza, estou tentado a dizer manipulação de exibição:
- Q 65788 126085 50776 https://stackoverflow.com/users/50776/casperone
- S 15655 81541 293594 https://stackoverflow.com/users/293594/xnx
- W 12019 37047 2227834 https://stackoverflow.com/users/2227834/unheilig
- X 1421 27963 1255427 https://stackoverflow.com/users/1255427/jack-nicholson
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
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- Teste de outliers bivariados
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Existe uma maneira simples de detectar discrepâncias?
- Como os discrepantes devem ser tratados na análise de regressão linear?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Testado no Ubuntu 18.10, VisIt 2.13.3.
Respostas:
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.
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 n c μ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.
fonte