Eu tenho um arquivo CSV com 4 milhões de bordas de uma rede direcionada representando pessoas se comunicando (por exemplo, John envia uma mensagem para Mary, Mary envia uma mensagem para Ann, John envia outra mensagem para Mary etc.). Eu gostaria de fazer duas coisas:
Encontre medidas de centralidade de grau, entre e (talvez) autovetor para cada pessoa.
Obtenha uma visualização da rede.
Eu gostaria de fazer isso na linha de comando em um servidor Linux, pois meu laptop não tem muita energia. Eu tenho R instalado nesse servidor e na biblioteca statnet. Encontrei este post de 2009 de alguém mais competente do que eu tentando fazer a mesma coisa e tendo problemas com ela. Então, eu queria saber se mais alguém tem alguma dica sobre como fazer isso, de preferência me dando um passo a passo, pois só sei carregar o arquivo CSV e nada mais.
Só para você ter uma idéia, é assim que meu arquivo CSV se parece:
$ head comments.csv
"src","dest"
"6493","139"
"406705","369798"
$ wc -l comments.csv
4210369 comments.csv
Respostas:
O que você tem é uma lista de borda, que pode ser convertida em um objeto de rede usando a biblioteca de rede. Aqui está um exemplo usando dados fictícios.
No entanto, é necessário um aviso: você tem uma rede muito grande e não tenho certeza de que uma trama seja tão informativa. Provavelmente parecerá um grande novelo de lã. Também não tenho certeza de como essas bibliotecas lidam com conjuntos de dados tão grandes. Sugiro que você dê uma olhada na documentação das bibliotecas de rede, statnet e ergm. O Journal of Statistical Software (v24 / 3) oferece vários artigos que cobrem essas bibliotecas. O problema pode ser encontrado aqui:
http://www.jstatsoft.org/v24
fonte
src
edst
. Isto é o que eu normalmente faço para carregar o arquivo (agora um arquivo delimitado por tabulação):el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
statnet
família de bibliotecas em uma rede não direcionada de mais de 3500 nós (~ 8 milhões de arestas possíveis). Isso foi possível, principalmente quando o objetivo era apenas calcular as estatísticas da rede. Até estimei ERGMs em redes desse tamanho. Mas seu ponto de vista é bem aceito; Duvido que redes de milhões de nós possam ser facilmente analisadas.Eu não acho que R seja a primeira escolha aqui (talvez eu esteja errado). Você precisará de grandes matrizes aqui para indexar e preparar seus arquivos de rede no formato de dados apropriado. Primeiramente, tentarei usar a biblioteca SNAP de Jure (Rob o mencionou no post acima) ; está escrito em C ++ e funciona muito bem em grandes redes.
fonte
centrality.cpp
deTUNGraph
paraTNEGraph
(consulte a linha 24 do pastebin.com/GHUquJvT ). Não está mais compilando. Eu suspeito que requer um tipo diferente de nó? O erro que eu recebo é:centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested
(ver erro completo em pastebin.com/86mCbByG )Gephi ( http://gephi.org/ ) pode ser uma maneira fácil de explorar os dados. Você quase certamente pode visualizá-lo e executar alguns cálculos (embora eu não o tenha usado há algum tempo, não lembro de todas as funções).
fonte
De experiências anteriores com uma rede de 7 milhões de nós, acho que visualizar sua rede completa fornecerá uma imagem incompreensível. Eu poderia sugerir visualizações diferentes usando subconjuntos de seus dados, como usar apenas os 10 nós principais com mais links de entrada ou saída. A segunda sugestão de Celenius sobre o uso de gephi.
fonte
Se você está preocupado com o tamanho da rede, pode tentar o
igraph
pacote em R. Ou até onetworkx
pacote para Pythonfonte
Você suspeita que a rede tenha um pequeno número de componentes conectados muito grandes? Caso contrário, você pode decompor em componentes distintos, o que tornará muito mais fácil calcular medidas de centralidade.
fonte
Existem vários pacotes de software R que se pode usar, incluindo "sna" e "network". Uma coisa em que eu não necessariamente confiaria se você estivesse tendo problemas de desempenho com o sna é o NetworkX. Eu amo o NetworkX até a morte, e o uso durante a maior parte da minha análise, mas o NetworkX tem muito orgulho de ser uma implementação principalmente puramente pitônica. Ele não explora bem o código pré-compilado rapidamente, e o sna geralmente ultrapassa o NetworkX por uma margem considerável.
fonte