terça-feira, 15 de outubro de 2019

Ciência de Dados - Python e não Python

Com o advento da Ciência de Dados o mundo agora está redescobrindo a linguagem Python, e isso pode ser bem caótico para ela (assim como foi a explosão de Java). Calma que explico, existem muitas pessoas que fazem aqueles cursos de 6 hrs ou leem livros tipo "Python Fluente" e já se acham os donos da linguagem e que conseguem fazer relativamente TUDO. Isso é bem verdade pois o Google, fóruns e livros tipo "Cookbook" ajudam muito.


Com Java acontece muito disso (o mesmo ocorre com JavaScript), basta ver os modelos propostos e os que sumiram com uma velocidade assustadora, um pseudo Arquiteto leu uma trabalho de Pós Graduação, achou interessante e resolveu implantar isso sem fazer um estudo de caso, uma análise de impacto ou nada do gênero e pronto está criado aquele sistema com Wicket + Vue.js + MongoDB.

Em Ciência de Dados e Python penso que a coisa irá acontecer a nível de Modelos Implementados, veremos modelos que irão demorar horas (ou dias) para serem executados e ninguém se incomodará pois o "Cientista" falou que isso se deve por causa da quantidade de dados analisados que são enormes (pelo menos dessa vez ninguém culpará a linguagem, mas sim os dados ou as máquinas).

Falar Pythonico ou Não

Se Python é uma linguagem então devemos falar Pythonico, normalmente para aprendermos algo usamos a "Comparação", fazia assim, agora faço assim. A língua inglesa é difícil de aprender (para os brasileiros) pois sua estrutura gramatical muda. Em linguagens de programação isso também acontece (não, não existe uma Gramática de Python), calma não estou falando de tempos verbais, mas sim de formas no modo de programar.

Vamos falar do método zip() por exemplo, esse é quase exclusivo de Python, Java não isso (e se tem serve para aquilo que provavelmente você deve ter imaginado). Este método serve para iterar duas ou mais listas ao mesmo tempo, como por exemplo:
first = [1, 3, 5, 7, 9]
second = [2, 4, 6, 8, 10]
for x, y in zip(first, se0cond):
  print(x + y)
Ou seja, em a cada iteração um valor de cada uma das listas é puxado, outro método pouco conhecido é o map(), que serve para iterar métodos e listas, vamos imaginar que exista um método criado para calcular a Raiz Quadrada de um número (ou outro mais complexo que deseje):
def raiz(x): 
    return x**0.5
Simples assim, e se vem de outras linguagens provavelmente escreverá algo assim para iterar esse método com elementos de uma lista e colocá-los em outra lista:
raizes = []
nums = [4,9,27,32,78,98,45,22]
for num in nums:
    raizes.append(raiz(num))
Quando na verdade isso deveria ser escrito da seguinte forma:
nums = [4,9,27,32,78,98,45,22]
raizes = map(raiz, nums)

Não estou aqui para condenar ninguém ou qualquer curso ou livro, estou apenas chamando a atenção para um fato que vai ocorrer (sim, rodei um Modelo Preditivo para descobrí-lo) muito em breve, se já não está ocorrendo. Ou seja, não é necessário diminuir sua amostra, não é necessário aumentar seu cluster de máquinas apenas melhorar um pouco seu código. Não Fernando, você está falando besteira e sou EXCELENTE. Muito bem, vamos a um pequeno desafio, veja esse código:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def pares(x):
    return x % 2 == 0

numsPares = []
for num in nums:
    if even(num):
        numsPares.append(num)
Como conhece bem a linguagem sabe que esse código está pegando somente os pares da lista de nums e jogando-os na lista numsPares. Suas opções são:
  1. O código está bom do jeito que está.
  2. Deve ser reescrito para ...
  3. Esse corpo não me pertence.
Como disse não quero condenar ninguém, só quero apenas alertar para um fato e isso pode causar a decadência da linguagem em relação a outras que se mostram mais performáticas (mesmo usadas errôneamente).

Obrigado pela atenção
Fernando Anselmo

Spoiler.

O código em questão deveria ser reescrito usando o método filter(), da seguinte forma:
numPares = filter(pares, nums)

domingo, 6 de outubro de 2019

Ciência de Dados - Matematicamente Falando

Quando comecei a estudar as matérias de "Ciência de Dados" percebi algo bem simples e ao mesmo tempo bem complexo. A cadeira envolve 3 áreas de conhecimento:


Ciência da Computação, Conhecimento de Negócios e Matemática (e Estatística). Possuia as duas primeiras porém me faltava a terceira. E minha pergunta era: Como obter o conhecimento matemático necessário que me falta?

Existem milhares de respostas válidas bem como:
  1. Estudar por conta própria.
  2. Achar um bom curso (tipo Udemy).
  3. Fazer uma Pós em Estatística. 
Optei pela terceira, já tinha feito vários cursos mas nenhum deles me trouxe um conhecimento muito profundo e apenas arranhavam a superfície do que planejava. Antes de continuar devo dizer que a segunda área do conhecimento cristalizei ela através de uma Pós em "Gestão Empresarial Avançada" que é totalmente voltada a problemas de negócio. Então nada mais lógico que procurar uma Pós que fosse totalmente prática e aplicada a problemas do dia a dia através de resoluções matemáticas.

Não pretendo fazer propagando de cursos, não é esse meu objetivo. Meu objetivo é que compreenda que para adquirir determinado conhecimento não basta apenas estudar por conta própria (pois o mercado infelizmente não reconhece esse tipo de ação e exige diplomas de formação acadêmica) ou realizar simples cursos de arranham a superfície (quando o que o mercado exige é que o profissional consiga se virar nas 11, ser o técnico e de preferência o Juiz).

Minha recomendação para essa terceira área do conhecimento é, comece com bons livros e ferramentas, três são essenciais para quem gosta do mundo livre:

PSPP

É uma alternativa ao IBM SPSS, pessoalmente diria uma cópia tipo Ctrl+C e Ctrl+V, tanto que houve a brincadeira das letras, para se ter uma ideia do que estou falando não existem muitos livros de PSPP então utilizo os livros de SPSS para estudar, a sintaxe é exatamente a mesma. Na essência é um software para Análise de Dados que permite análises descritivas e o uso de inferência.

Scilab

Esse é uma alternativa para o famoso Matlab e basicamente trata-se de um ambiente computacional para aplicações científicas totalmente orientado a análise numérica.

Octave

Esse é outra alternativa para o Matlab. Dos três é o mais conhecido e usado por quem conhece matemática, basicamente é quase uma linguagem tanto que é possível usar o Jupyter Notebook para executar seus comandos que podem envolver soluções lineares e não-lineares.

Dica: Se usa o Ubuntu o primeiro e o terceiro vem instalado por padrão (se não estiver procure na Loja com o nome GNU PSPP e GNU Octave - Isso mesmo ambos fazem parte do Projeto GNU) e quanto ao segundo utilize uma AppImage (que facilita muito o processo) através de dois comando no terminal:

$ wget https://github.com/davidcl/Scilab.AppDir/releases/download/6.0.2-1/Scilab-x86_64.AppImage
$ chmod +x Scilab-x86_64.AppImage

Ou baixe a imagem no endereço indicado e forneça permissão de execução no Nautilus.

Esses são apenas 3 dos vários softwares que passei a utilizar quando ingressei nesse mundo de ciência de dados, são gratuitos, leves e qualquer um pode ter no computador. E mais uma dica comece adquirindo um bom livro de Matemática:


E lembre-se que conhecimento nunca é demais.

Obrigado e até a próxima
Fernando Anselmo