<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Paixão por Dados</title>
    <link>http://www.sillasgonzaga.com/tags/redes-sociais/index.xml</link>
    <description>Recent content on Paixão por Dados</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>&amp;copy; 2016. All rights reserved.</copyright>
    <atom:link href="http://www.sillasgonzaga.com/tags/redes-sociais/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>BBB no R: Estudando as interações entre membros por análise de redes</title>
      <link>http://www.sillasgonzaga.com/post/bbb-no-r/</link>
      <pubDate>Thu, 22 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/bbb-no-r/</guid>
      <description>&lt;p&gt;Eu &lt;strong&gt;realmente&lt;/strong&gt; não acredito que estou escrevendo um post sobre Big Brother Brasil.&lt;/p&gt;
&lt;p&gt;Ok, respirei fundo, vamos lá…&lt;/p&gt;
&lt;p&gt;Sejam bem-vindos a mais um post! Em 2018, um dos projetos mais incríveis que vou tocar é um curso online de Análise de Redes Sociais (ARS) no R a ser oferecido por mim e pelo &lt;a href=&#34;http://ibpad.com.br/&#34;&gt;IBPAD&lt;/a&gt;, que é referência nacional em ARS e em outras coisas. A previsão é de que o curso seja lançado até Maio de 2018.&lt;/p&gt;
&lt;p&gt;Como um aperitivo do conteúdo a ser abordado no curso, lhes apresento uma simples porém criativa (para quem gosta, né) e prática aplicação de ARS: analisar interações de brothers e sisters (meu Deus, que termos ridículos), descobrir participantes influentes e aplicar algoritmos de detecção de comunidades. Com isso, minha intenção é demonstrar que você pode usar seus conhecimentos em R para aplicar em basicamente qualquer projeto que você quiser.&lt;/p&gt;
&lt;p&gt;Uma breve introdução sobre ARS pode ser vista neste artigo na &lt;a href=&#34;https://pt.wikipedia.org/wiki/An%C3%A1lise_de_redes_sociais&#34;&gt;Wikipedia&lt;/a&gt;. Se prefere um conteúdo mais elaborado e completo, sugiro adquirir &lt;a href=&#34;http://ibpad.com.br/&#34;&gt;este livro&lt;/a&gt; dos caras do IBPAD.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# pacotes usados
library(tidyverse)
library(rvest)
library(igraph)
library(Rfacebook)
library(knitr)
library(viridis)&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&#34;coleta-dos-dados&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Coleta dos dados&lt;/h1&gt;
&lt;p&gt;Para preparar os dados para a realização da ARS no R, precisamos obter um dataset neste formato:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;tribble(
  ~pessoa_1, ~pessoa_2,
  &amp;quot;Fulano&amp;quot;, &amp;quot;Ciclano&amp;quot;,
  &amp;quot;Fulano&amp;quot;, &amp;quot;Beltrano&amp;quot;,
  &amp;quot;Ciclano&amp;quot;, &amp;quot;Beltrano&amp;quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 3 x 2
##   pessoa_1 pessoa_2
##   &amp;lt;chr&amp;gt;    &amp;lt;chr&amp;gt;   
## 1 Fulano   Ciclano 
## 2 Fulano   Beltrano
## 3 Ciclano  Beltrano&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou seja, o formato desejado é uma simples matriz de 2 colunas onde cada linha representa uma interação entre a Pessoa 1 e a Pessoa 2. A ordem (ex.: Fulano na coluna 1 ou 2) não importa, porque não se trata de uma rede direcionada (&lt;em&gt;directed&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Como, então, obter esses dados?&lt;/p&gt;
&lt;p&gt;Existem diversas alternativas. Minha solução foi coletar as manchetes do &lt;a href=&#34;https://gshow.globo.com/realities/bbb/&#34;&gt;site do BBB&lt;/a&gt; (após me recuperar do desgaste psicológico que é entrar em contato com um material literário tão rico) e extrair os nomes presentes na manchete.&lt;/p&gt;
&lt;p&gt;Por exemplo, a partir da “notícia” &lt;a href=&#34;https://gshow.globo.com/realities/bbb/BBB18/agora-na-casa/noticia/diego-kaysar-e-lucas-limpam-espelho-do-banheiro.ghtml&#34;&gt;Diego, Kaysar e Lucas limpam espelho do banheiro&lt;/a&gt;, será retornado um dataframe com todas as possíveis combinações de duplas formadas pelos três participantes presentes no título.&lt;/p&gt;
&lt;p&gt;Para coletar todas as notícias sobre o BBB já publicadas no site, utilizei a mesma estratégia descrita &lt;a href=&#34;http://sillasgonzaga.com/post/analise-g1-01/&#34;&gt;neste post sobre o G1&lt;/a&gt;, ou seja: coletar todos os links já publicados na página do BBB no Facebook.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;posts &amp;lt;- getPage(&amp;quot;BigBrotherBrasil&amp;quot;, token, n = 5000, since = &amp;quot;2018/01/22&amp;quot;)
links &amp;lt;- posts$link[posts$type == &amp;quot;link&amp;quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Após extrair os links, o código abaixo faz um webscraping bem simples e extrair o título e o corpo das matérias.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;extrair_bbb &amp;lt;- function(url){
  url &amp;lt;- url %&amp;gt;% read_html()
  
  css_titulo &amp;lt;- &amp;quot;.content-head__title&amp;quot;
  css_texto &amp;lt;- &amp;quot;.content-text__container&amp;quot;
  
  noticia_titulo &amp;lt;- url %&amp;gt;% 
    html_nodes(css = css_titulo) %&amp;gt;% 
    html_text()
  
  noticia_texto &amp;lt;- url %&amp;gt;% 
    html_nodes(css = css_texto) %&amp;gt;% 
    html_text() %&amp;gt;% 
    dplyr::first()
  
  tibble(noticia_titulo, noticia_texto)
}

lst &amp;lt;- links %&amp;gt;% map(extrair_bbb)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# juntar a lista em um dataframe
df_bbb &amp;lt;- bind_rows(lst)
# remover noticias de resumo
df_bbb &amp;lt;- df_bbb %&amp;gt;% filter(!str_detect(noticia_titulo, &amp;quot;Resumo&amp;quot;))

glimpse(df_bbb)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## Observations: 595
## Variables: 2
## $ noticia_titulo &amp;lt;chr&amp;gt; &amp;quot;Wagner elogia Gleici: &amp;#39;Você tá linda&amp;#39;&amp;quot;, &amp;quot;Ayrto...
## $ noticia_texto  &amp;lt;chr&amp;gt; &amp;quot; Na sala, Gleici chega perto de Wagner e eles ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A seguir, mostro funções para extrair os participantes mencionados nos títulos e retornar as combinações de duplas.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;participantes &amp;lt;- c(&amp;quot;Ayrton&amp;quot;, &amp;quot;Ana Clara&amp;quot;, &amp;quot;Ana Paula&amp;quot;, &amp;quot;Breno&amp;quot;, &amp;quot;Caruso&amp;quot;, &amp;quot;Diego&amp;quot;,
                   &amp;quot;Gleici&amp;quot;, &amp;quot;Jaqueline&amp;quot;, &amp;quot;Jéssica&amp;quot;, &amp;quot;Kaysar&amp;quot;, &amp;quot;Lucas&amp;quot;, &amp;quot;Mahmoud&amp;quot;,
                   &amp;quot;Mara&amp;quot;, &amp;quot;Nayara&amp;quot;, &amp;quot;Patrícia&amp;quot;, &amp;quot;Paula&amp;quot;, &amp;quot;Viegas&amp;quot;, &amp;quot;Wagner&amp;quot;)

extrair_mencionados &amp;lt;- function(x){
  participantes[str_detect(x, participantes)]
}

mencionados &amp;lt;- df_bbb$noticia_titulo %&amp;gt;% map(extrair_mencionados)
# manter na lista apenas onde length(.) &amp;gt; 2
mencionados &amp;lt;- mencionados %&amp;gt;% keep(~length(.) &amp;gt; 1)

# gerar lista de combinacoes entre todos os mencionados
gerar_pares &amp;lt;- function(x){
  x &amp;lt;- sort(unique(x))
  x &amp;lt;- x %&amp;gt;% combn(m = 2, simplify = TRUE) %&amp;gt;% t()
  x &amp;lt;- as.tibble(x)
  colnames(x) &amp;lt;- c(&amp;quot;P1&amp;quot;, &amp;quot;P2&amp;quot;)
  x
}
# exemplo
gerar_pares(c(&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 3 x 2
##   P1    P2   
##   &amp;lt;chr&amp;gt; &amp;lt;chr&amp;gt;
## 1 A     B    
## 2 A     C    
## 3 B     C&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df_mencionados &amp;lt;- mencionados %&amp;gt;%
  map(gerar_pares) %&amp;gt;%
  bind_rows() %&amp;gt;% 
  group_by_all() %&amp;gt;% 
  summarise(n = n())

kable(head(df_mencionados))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;P1&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;P2&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;n&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Ana Paula&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Ayrton&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Breno&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Caruso&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Diego&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Ana Clara&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Gleici&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&#34;visualizacao-dos-dados&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Visualização dos dados&lt;/h1&gt;
&lt;p&gt;Antes de partir para ARS, vamos ver como se dá a frequência de interações entre os participantes:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df_mencionados %&amp;gt;% 
  ggplot(aes(x = P1, y = P2, fill = n)) +
  geom_tile() +
  viridis::scale_fill_viridis() +
  geom_text(aes(label = n), color = &amp;quot;black&amp;quot;) + 
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-02-22-bbb-no-r_files/figure-html/unnamed-chunk-8-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Temos que, praticamente, todo mudo interage com todo mundo. Por isso, antes mesmo de plotar o grafo dessa rede, espera-se que ela seja bem densa, com todos os vértices se ligando.&lt;/p&gt;
&lt;p&gt;Entretanto, não deixa de ser interessante notar que, dentro de um grupo de apenas 18 pessoas confinadas em um espaço limitado como uma casa durante algumas semanas ou meses, é incrível como existem pares que simplesmente não interagem entre si (de acordo com a metodologia deste post).&lt;/p&gt;
&lt;p&gt;Para deixar a análise interessante, vou remover os nós em que existem menos de 3 interações.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df_mencionados &amp;lt;- df_mencionados %&amp;gt;% filter(n &amp;gt; 3)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;analise-da-rede&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Análise da Rede&lt;/h1&gt;
&lt;p&gt;Para definir o grafo, vamos criar um dataframe de metadados sobre os vértices (os participantes), como sexo:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;vertices &amp;lt;- tibble(
  nome = participantes,
  sexo = c(&amp;quot;M&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;F&amp;quot;,
           &amp;quot;F&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;M&amp;quot;)
)

vertices &amp;lt;- vertices %&amp;gt;%
  filter(nome %in% df_mencionados$P1 | nome %in% df_mencionados$P2)

g &amp;lt;- graph_from_data_frame(d = df_mencionados, vertices = vertices,
                           directed = FALSE)

# adicionar cor aos pontos de acordo com o sexo
V(g)$color &amp;lt;- ifelse(V(g)$sexo == &amp;quot;M&amp;quot;, &amp;quot;lightblue&amp;quot;, &amp;quot;pink&amp;quot;)
# adicionar peso aos nós
E(g)$weight &amp;lt;- df_mencionados$n &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finalmente, o grafo em si:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(123)
plot(g, vertex.label.color = &amp;quot;black&amp;quot;, layout = layout_with_kk(g),
     vertex.size = 20) #,edge.width = E(g)$n/50)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-02-22-bbb-no-r_files/figure-html/unnamed-chunk-11-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Ok, me tornei o que mais temia, um crítico de BBB, mas vamos lá:&lt;/p&gt;
&lt;p&gt;Pela grafo, nota-se que existem alguns participantes mais isolados, como Viegas, Jaqueline e Wagner. Sobre Jaqueline, existe um viés causado pelo tempo, visto que ela já foi eliminada no momento em que vos escrevo.&lt;/p&gt;
&lt;p&gt;Outra observação é que de fato existem alguns participantes mais importantes na rede, como Paula, Lucas e Patrícia, visto que estão localizados mais ao centro do grafo.&lt;/p&gt;
&lt;p&gt;Uma medida que pode ser usada para mensurar a importância de cada pessoa na rede é o &lt;em&gt;betweenness&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;rev(sort(betweenness(g)))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##     Nayara     Kaysar    Jéssica     Caruso      Lucas     Gleici 
## 21.9166667 16.8333333 16.5000000 13.2500000  9.7500000  9.4166667 
##      Paula    Mahmoud      Diego      Breno  Jaqueline     Wagner 
##  7.0000000  4.0000000  2.5833333  2.3333333  1.0000000  0.3333333 
##     Viegas   Patrícia  Ana Paula  Ana Clara     Ayrton 
##  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;De acordo com essa métrica, Nayara, Kaysar e Jéssica são os brothers com maior articulação entre todos.&lt;/p&gt;
&lt;p&gt;Outra medida é o &lt;em&gt;degree&lt;/em&gt;, que é simplesmente a contagem de outras pessoas com as quais cada participante está conectado:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;rev(sort(degree(g)))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##     Paula     Lucas    Kaysar    Gleici   Mahmoud    Caruso  Patrícia 
##        14        13        12        11        10        10         9 
##    Nayara   Jéssica     Diego     Breno Ana Paula Ana Clara    Wagner 
##         9         9         7         7         7         7         4 
## Jaqueline    Ayrton    Viegas 
##         3         3         1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma aplicação muito interessante em ARS é a detecção de comunidade. Com o perdão por não entrar em detalhes sobre o funcionamento do algoritmo (isso eu deixo para meu curso), segue abaixo um exemplo disso:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;cluster &amp;lt;- fastgreedy.community(g)
cluster&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## IGRAPH clustering fast greedy, groups: 3, mod: 0.23
## + groups:
##   $`1`
##   [1] &amp;quot;Ayrton&amp;quot;    &amp;quot;Ana Clara&amp;quot; &amp;quot;Breno&amp;quot;     &amp;quot;Caruso&amp;quot;    &amp;quot;Gleici&amp;quot;   
##   [6] &amp;quot;Jaqueline&amp;quot; &amp;quot;Nayara&amp;quot;    &amp;quot;Viegas&amp;quot;    &amp;quot;Wagner&amp;quot;   
##   
##   $`2`
##   [1] &amp;quot;Ana Paula&amp;quot; &amp;quot;Diego&amp;quot;     &amp;quot;Kaysar&amp;quot;    &amp;quot;Mahmoud&amp;quot;   &amp;quot;Patrícia&amp;quot; 
##   [6] &amp;quot;Paula&amp;quot;    
##   
##   $`3`
##   [1] &amp;quot;Jéssica&amp;quot; &amp;quot;Lucas&amp;quot;  
##   + ... omitted several groups/vertices&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(123)
plot(cluster, g)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-02-22-bbb-no-r_files/figure-html/unnamed-chunk-14-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;O algoritmno encontrou três comunidades dentro da rede, sendo um deles formados apenas por Jéssica e Lucas.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;conclusao&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Conclusão&lt;/h1&gt;
&lt;p&gt;Você talvez tenha percebido pelo meu tom jocoso no post que não sou lá muito fã de BBB. Contudo, isso não me impediu de pensar nessa aplicação como exemplo de demonstração de situações em que é possível aplicar a Análise de Redes Sociais. Como tudo na vida quando se sabe R, os limites dependem da sua criatividade :)&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>