Análise de Dados do Linkedin

Naiara Cerqueira
pyladiesbh
Published in
5 min readDec 13, 2020

Enquanto não consigo obter mais dados do linkedin (aceito dicas para pegar dados de publicações na minha timeline, por exemplo), decidi trabalhar com os dados *.csv disponbilizados por eles (dados das conexões — não se anime, são poucos — e de mensagens). O notebook com o código completo está aqui.

1. Coleta dos dados

Para se obter esses dados é necessário seguir esse passo a passo na página no linkedin: Eu (ícone com sua foto, no canto superior direito) -> Configurações e Privacidade -> Privacidade dos dados -> Como o LinkedIn utiliza seus dados> Obtenha uma cópia dos seus dados. Eu solicitei dados em particular: Mensagens e Conexões.

Obtendo os dados do Linkedin

Importei os dois arquivos no Google Colab e as bibliotecas:

import pandas as pd
import matplotlib.pyplot as plt

2. Analisando as Conexões

Começando com o dataset das conexões, vamos observar quais colunas tenho, os tipos dos dados e a quantidade de valores nulos (%):

pd.DataFrame({'type':df.dtypes,
'null':df.isna().sum()/df.shape[0]*100})
Saída do código acima

Eu possuo 7.245 conexões; o nome dessas conexões e seus emails não trazem análises legais, logo, vou focar no nome das empresas, dos cargos e a data de conexão.

Após transformar minha coluna de data em datetime, observei que tenho dados, variando de novembro de 2017 a dezembro de 2020 e uma média de 11,9 adições de conexões por dia (em que houveram conexões novas).

df['data'] = pd.to_datetime(df['Connected On'])df['data'].min(), df['data'].max()df['data'].max() — df['data'].min()

Plotando um gráfico de principais (top 20) empresas onde as conexões trabalham e seus principais cargos:

empresas = df.Company.value_counts()plt.figure(figsize=(15,4))
plt.bar(empresas.index[:20], empresas[:20], color='lightseagreen')
plt.xticks(rotation=45, ha='right');

Impressionante a quantidade de gente no meu LinkedIn que trabalha no Itaú!

Como os cargos são inseridos pelo próprio usuário, sem padronização, padronizei os nomes todos em minúsculas, para depois plotar o gráfico.

df.Position = df.Position.str.lower()cargos = df.Position.value_counts()plt.figure(figsize=(15,4))
plt.bar(cargos.index[:20], cargos[:20], color='cadetblue')
plt.xticks(rotation=45, ha='right')

Dá para perceber que eu adiciono muitos Cientistas de Dados, né?

Para analisar o número de pessoas adicionadas ao longo do tempo, removi as linhas em que ‘Position’ estava nula e segmentei (usando filtro com regex) minhas conexões por temáticas: (1) área ambiental, com 204 pessoas, (2) tutores e professores, 158 pessoas, (3) área de dados, com 1665 pessoas.

dados = df_semna[df_semna.Position.str.match(".*(D|d)ados.*|.*(D|d)ata.*|.*(M|m)achine (L|l)earning.*|.*Estati?í?stic.*|.*BI.*|.*(B|b)usiness (I|i)ntelligence.*")]professor = df_semna[df_semna.Position.str.match(".*(P|p)rofessor.*|.*(T|t)utor.*")]ambiental = df_semna[df_semna.Position.str.match(".*(A|a)mbiental.*|.*(a|A)mbiente")]

A plotagem do gráfico:

plt.figure(figsize=(15,5))plt.title("Conexões adicionadas por dia")plt.plot(conexoes_amb, color='yellowgreen')plt.plot(conexoes_dados, color='lightseagreen')plt.plot(conexoes_prof, color='orchid')plt.legend(["Ambiental","Dados","Professores"]);

Aparentemente eu só comecei a utilizar o LinkedIn em 2019, momento em que comecei a pensar em uma transição de carreira da Engenharia Ambiental para Ciência de Dados.

Houve um momento nesse ano em que adicionei algumas pessoas da área ambiental (talvez uma última tentativa de fazer as pazes com a área + meus colegas do mestrado). No final do ano comecei a adicionar pessoas da área de dados (e me desconectar das pessoas da ambiental, para limpar a linha do tempo) e nunca mais parei.

Considerando apenas os cientistas de dados, as principais empresas em que trabalham são:

data_science = df[(df.Position == "data scientist") | (df.Position == "cientista de dados")]empresas = data_science.Company.value_counts()plt.figure(figsize=(15,4))plt.bar(empresas.index[:20], empresas[:20])plt.xticks(rotation=45, ha='right');

Os bancos dominam essa área!!!

3. Analisando as Mensagens

O dataset de mensagens possui 5.846 mensagens, porém, dessas, apenas 420 únicas (com IDs diferentes).

Ignorei essas colunas com mais de 90% de nulos, transformei a data em datetime, separei por ‘date’, e plotei o gráfico do número de mensagens trocadas e o número de conversas únicas ao longo do tempo.

df['just_date'] = df['DATE'].dt.dateconversas_data = df.groupby('just_date')['CONVERSATION ID'].count()
conversas_unicas = df.groupby('just_date')['CONVERSATION ID'].nunique()
plt.figure(figsize=(15,5))plt.plot(conversas_data.index, conversas_data.values, color='mediumorchid')plt.plot(conversas_unicas.index, conversas_unicas.values, color='mediumturquoise')plt.legend(['Mensagens totais','Conversas únicas']);

As comunicações por mensagem tiveram um pico em 2020, no início do ano, mesmo momento do pico de adições de novas conexões.

Transformei o datetime em ‘hora’ e plotei o gráfico do número de mensagens trocadas e o número de conversas únicas ao longo do dia.

df['just_hour'] = pd.DatetimeIndex(df['DATE']).hourhora = df.groupby('just_hour')['CONVERSATION ID'].count()
hora_unica = df.groupby('just_hour')['CONVERSATION ID'].nunique()
plt.figure(figsize=(15,5))
plt.plot(hora.index, hora.values, color='coral')
plt.plot(hora_unica.index, hora_unica.values, color='steelblue')
plt.legend(['Mensagens totais','Conversas únicas'])
plt.xticks(range(0,24))
plt.xlabel("Hora do dia");

Os horários mais comuns de troca de mensagens são às 14h, 18h e 21h.

Já a temática das mensagens será avaliada considerando as palavras, sem acentuação, sem stopwords e sem pontuação. Fiz a remoção de todas as mensagens que eu mesma escrevi, focando apenas nas mensagens que recebi. Para isso, importei as seguintes bibliotecas:

    #pré-processamento:
from nltk.corpus import stopwords
import string
import re
from unidecode import unidecode
#para contagem de itens na lista e gráfico:
from collections import Counter
import operator
#para o progress_apply:
from tqdm._tqdm_notebook import tqdm_notebook
tqdm_notebook.pandas()

As mensagens foram pré-processadas:

def pre_processamento_texto(corpus):
tokenizado = re.findall(r"\w+(?:'\w+)?|[^\w\s]", corpus)
minusculo = [palavra.lower() for palavra in tokenizado]
sem_stops = [palavra for palavra in minusculo if palavra not in stopwords.words('portuguese')]
sem_numeros = [re.sub(r"\d+",'',palavra) for palavra in sem_stops]
sem_pontuacao = [palavra for palavra in sem_numeros if palavra not in string.punctuation]
sem_acento = [unidecode(palavra) for palavra in sem_pontuacao]
return sem_acento
df['texto'] = conteudo.progress_apply(lambda x: pre_processamento_texto(x))

Agora tenho uma coluna com os textos pré processados em listas, para transformar todos os termos encontrados em uma lista utilizei o .extend() , após isso, contei as palavras dessa lista e ordenei os valores de maior para menor:

lista = list(mensagens)
palavras = []
for palavra in mensagens:
palavras.extend(palavra)
palavras = Counter(palavras)palavras = sorted(palavras.items(), key=operator.itemgetter(1), reverse=True)

Assim, fiz um gráfico de frequência simples das 50 palavras mais utilizadas nas mensagens:

plt.figure(figsize=(15,5))plt.bar(dict(palavras[:50]).keys(), dict(palavras[:50]).values(), color='salmon')plt.xticks(rotation=90);

Infelizmente, nada muito revelador: muitas referências ao meu nome, dados, cursos e trabalho. Algumas pessoas me dando parabéns, outras me agradecendo e diversos verbos.

A terceira barra está vazia, possivelmente porque quando removi stopwords e pontuações da mensagem, nada sobrou na lista.

Eu quero me tornar cientista de dados, logo, se tiver algo errado, alguma observação, crítica ou elogio: me avise!

Obrigada a todos pelas dicas ❤

--

--