Data

27 fev, 2020

Data Science — Meus Primeiros Passos… e por que não os seus?

Publicidade

Esse texto não se trata de um tutorial raiz**, mas uma mescla de relato da minha prática decorrente de uma aproximação inicial com meus estudos, acerca de um tema tão em voga, apontado como uma demanda de profissionais mais procurada para os próximos anos.

** Mesmo assim, vou escrever os códigos que utilizei 😉

Resolvi neste mês de dezembro de 2019 (finalmente…) estudar um tema que sempre me atraiu, mas por pura desculpa, ficava postergando. Trata-se de Data Science.

Embora seja clichê falar que a quantidade de dados gerados pelos sistemas informatizados é uma importante ferramenta para tomadas de decisões, poucas são as organizações que utilizam a ciência de dados.

O cenário

Para praticar, baixei um dataset da Folha de Pagamento dos servidores públicos do estado do paraná.

Acessando o site http://www.transparencia.pr.gov.br/, há uma série de possibilidades de consultas, entre elas destacam-se as receitas, despesas, compras e pessoal.

Ao clicar em pessoal, expande uma menu com mais links. Utilizei a primeira opção, remuneração.

Na próxima página, há um formulário com alguns campos para filtro e alguns botões. Há também um botão para “download do banco de dados”. Ao clicar, duas opções são apresentadas. Informações Funcionais e Informações Financeiras.

Deixei a primeira opção e solicitei o download.

Uma pasta compactada contendo um arquivo com a extensão cvs foi baixada.

Etapa concluída!!

O próximo passo foi preparar o ambiente para explorar os dados.

Tudo no navegador

Uma vantagem de começar a trabalhar com Data Science é a possibilidade de não precisar instalar nada localmente.

Com uma conta Google, é possível escrever e executar códigos Python em ambiente Jupyter, a partir do navegador.

Acessei o site https://colab.research.google.com e criei um novo notebook (New Python 3 notebook)

O ambiente é basicamente composto por células onde o usuário tem a possibilidade de incluir textos e códigos.

Nas primeiras linhas, importei as bibliotecas necessárias para exploração, visualização e estatística na base.

Após os códigos, precisamos executar. Para isso, temos a possibilidade de clicar no ícone no canto esquerdo ou combinar as teclas CTRL + Enter.

A primeira declaração de import é o pandas. Basicamente é uma biblioteca poderosa de análise de dados e estruturas de dados de alta performance.

A partir dela (pd), vou realizar as principais operações na análise de dados.

Explorando os dados

Vamos fazer o upload do arquivo e realizar o import. Cliquei na aba lateral a esquerda, guia Files, e solicitei o upload indicando o arquivo descompactado na sessão anterior.

Criei uma nova célula e informei:

dados = pd.read_csv(‘TB_RH.csv’, sep =’;’)dados.head()

Na primeira linha, realizei a leitura do arquivo atribuindo a variável dados. Com o método read_csv informo o nome do arquivo.

Essa variável representa um DataFrame que é uma estrutura bidimensional representada em linhas e colunas

Esse trecho inicialmente não estava importando o arquivo corretamente. Ao abrir o arquivo com um bloco de notas, percebi que os valores estavam separados com ‘;’ (ponto e vírgula). Por isso a necessidade de informar esse caractere na propriedade sep.

A função head() exibe os 5 primeiros registros.

Continuando a exploração, verifiquei os tipos de dados e nome das variáveis(colunas). Para isso, fiz:

tipo_de_dados = pd.DataFrame(dados.dtypes, columns = [‘Tipo de Dados’])tipo_de_dados.columns.name = ‘Variáveis’tipo_de_dados

Criei um DataFrame, nomeando as colunas para Variáveis e Tipo de Dados.

Com base nas variáveis, já é possível realizar algumas perguntas na base relacionadas ao salário, cargo, departamento(sigla), vínculo (regime) e gênero.

Por fim, verifiquei quantos registros a base possuía, utilizando a propriedade shape.

print(‘O arquivo disponibilizado possui {} registros’ .format(dados.shape[0]))

Recuperei apenas o primeiro valor do vetor, indicando no índice em [0].

Uma questão verificada foi que a base possuía servidores desligados. Assim, fez-se necessário uma seleção de servidores ativos. As linhas a seguir apresentam os passos para a efetivação:

situacao = [‘ATIVO’]selecao = dados.situacao.isin(situacao)dados_ativo = dados[selecao]

Usei o método que verifica no DataFrame `dados`, mais especificamente na coluna situação, o valor ‘Ativo’. O método isin recebe esse valor, declarado em situação e retorna um DataFrame de booleanos com cada elemento que contém o valor.

Agora sim, posso fazer algumas perguntas para meus dados.

Perguntas

Continuando a exploração de dados, vamos partir agora para algumas perguntas.

Aqui, observa-se o porquê da importância do profissional que trabalha com Data Science possuir um perfil multidisciplinar, mesclando conhecimentos técnicos com conhecimentos do negócio.

A importância de fazer as perguntas certas que retornem um produto de informação com valor.

Bem, como esse não é o caso aqui, vamos a elas.

Comecei querendo saber qual a idade do funcionário mais antigo e mais novo?

Nas linhas abaixo eu recupero o índice do servidor que possui o menor ano de nascimento, em idxmin() e exibo respectivamente com a propriedade loc .

servidor_mais_velho = dados_ativo.ano_nasc.idxmin()dados_ativo.loc[servidor_mais_velho]

O resultado foi um servidor de 1933, ou seja, com 86 anos.

A conclusão mais razoável é que há inconsistências na base. Poderia ser um erro de digitação do ano, ou o servidor não está mais na ativa, porém com a situação desatualizada no cadastro.

Podemos fazer o mesmo para o servidor mais novo em:

servidor_mais_novo = dados_ativo.ano_nasc.idxmax()dados_ativo.loc[servidor_mais_novo]

O resultado dessa vez pareceu mais coerente. Uma servidor de 2001, com a função de aprendiz.

Podemos extrair a quantidade de servidores por siglas, que seriam as secretarias e departamentos do governo com o método value_counts:

dados_ativo.sigla.value_counts()

E descobrir os tipos de regimes dos servidores

dados_ativo.regime.unique()

O resultado aqui é um array com valores únicos.

Podemos consultar a quantidade de funcionários por regime:

dados_ativo.regime.value_counts()

Para ver em porcentagem, basta adicionar no parâmetro do método value_counts() a propriedade normalize = True.

dados_ativo.regime.value_counts(normalize = True) * 100

O número de efetivos (estatutário) representam quase 80% do total de servidores. Esses valores ainda mostram que os regimes temporários e CRES (Regime Especial), juntos totalizam uma pouco mais de 17%, indicando ainda a necessidade de concursos para o suprimento.

Podemos fazer perguntas um pouco mais complexas como:

mulheres_comissionadas = (dados_ativo.genero == ‘F’) & (dados_ativo.cargo == ‘CARGO EM COMISSÃO’)& (dados_ativo[‘ult_remu_bruta’] > 20000 )qtd_fem_com = dados_ativo[mulheres_comissionadas].shape[0]print(‘{} mulheres comissionadas’.format(qtd_fem_com))

Na primeira linha, fazemos uma seleção de condiçõesusa no DataFrame usando os atributos generocargo ult_remu_bruta.

Passamos no índice a seleção construída, recuperando novamente a quantidade com o atributo shape[0].

Para saber mais sobre esse tipo de consulta, veja Boolean Indexing.

Data Visualization

Em relação ao tópico de visualização das informações, há também uma abordagem própria denominada Data Visualization. Nesse sentido, o profissional tem a disposição uma série de bibliotecas que facilitam a criação e personalização dos mais variados tipos de gráficos.

Vou começar exibindo um sobre a remuneração, utilizando os métodos do panda.

dados_ativo['ult_remu_bruta'].plot.hist(bins = 30, edgecolor='black')

O gráfico gerado foi do tipo histograma, mas há disponível uma variedade de formatos.

Agora, outro exemplo, mas dessa vez utilizando o Seaborn, vamos plotar usando o método catplot:

sns.catplot(x = “regime”, data = dados_ativo, kind=”count”, aspect=2)

Informamos qual a coluna que irá ser contada (regime), a fonte dados com o nosso DataFrame (dados_ativo) e uma propriedade para aumentar o gráfico em aspect .

O resultado está logo abaixo:

Considerações, indicações e links

Algumas considerações sobre esse contato inicial.

Nunca tinha programado uma linha em Python. No entanto, a linguagem é bastante simples, principalmente para quem vem de javascript.

Além disso, o autocomplete do ambiente ajuda muito.

Outro ponto, é que não cheguei arranhar a superfície das possibilidades que as ferramentas permitem. De qualquer forma, estou bastante satisfeito com os resultados alcançados como abordagem inicial.

Para leitura recomendo o blog do Data Hackers.

Um excelente local com tutoriais para iniciantes e dicas para quem deseja entrar na área.

Outra indicação é o curso da Alura, Data Science: Meus Primeiros Passos.

A didática, sequência, material e a abordagem como são apresentados os conceitos e as ferramentas são excelentes e fundamentais para manter o cursista engajado na progressão do tema.

(Recomendadíssimo!!!)

Por fim, no meu GitHub disponibilizo o arquivo do notebook com os códigos utilizados e o dataset.