Síntese do curso Analyzing Data with Python – IBM: DA0101EN

O curso faz parte de um programa de formação completo em Data Science da IBM na plataforma EDX com previsão de duração de 1 ano. Depois de uma longa busca por opções de curso, achei esse interessante, bastante aplicado e com a possibilidade de fazer a formação de forma gratuita no modo “audit”, que permite assistir as aulas, fazer os laboratórios, alguns exercícios, mas não te dá acesso completo ao curso depois de um tempo e não te as tarefas avaliadas pelos pares, além do projeto final. Iniciei pelo curso de análise de dados para ver uma abordagem mais prática e testar se a forma de ensino funcionaria bem para síntese e experiência, sobretudo, laboratorial. Bem, para um teste inicial achei que seria o modelo adequado.


A avaliação geral é que o curso entrega uma boa quantidade de material de forma muito didática, simplificando muita coisa que em livros você demoraria mais tempo para digerir e sem ter uma visão tão prática quanto ele entrega. Enfim, gostei e quero resumir aqui os módulos e os conteúdos tratados em cada um deles. Pretendo utilizar como base para uma nova disciplina no PPGCINf da UnB, ainda com nome provisório de Métodos Computacionais para Ciência de Dados: aplicações para a pesquisa na Ciência da Informação.

O curso é dividido em 5 módulos e mais o projeto final. A seguir apresento os módulos e as referências de cada um deles:

  1. Módulo 01 – Importing Datasets (anotações em PDF)
    1. o módulo apresenta as 3 bibliotecas principais de computação científica que serão utilizadas pelo curso: Pandas, NumPy e SciPy;
    2. apresenta as duas bibliotecas de visualização que serão utilizadas: Matplotlib e Seaborn;
    3. apresenta as duas bibliotecas de algoritmos para construção de modelos e processamento de estatísticas: Scikit-learn e Statsmodels;
    4. trata de formas de importação de dados no Pandas:
      1. apresenta o pd.read_csv por meio de url;
      2. mostra como imprimir um dataframe usando df, df.head(n) e df.tail(n) para inspecionar o formato das primeiras e últimas linhas;
      3. mostra como acrescentar um header em um dataframe: df.columns=headers, onde headers é um vetor com as strings de colunas;
      4. mostra como exportar um dataframe para um csv: df.to_csv(path);
      5. mostra as diferentes formatos de leitura e gravação de dados em um dataframe. Na documentação do Pandas, pode-se encontrar uma tabela completa para todos os diferentes formatos e como lidar com eles;
    5. apresenta algumas técnicas elementares para se adquirir insights iniciais sobre os dados:
      1. verificar os tipos de dados coletados
        1. apresenta o comando df.dtypes para verificar os tipos de dados em um dataframe;
        2. apresenta df.info() para ver um sumário conciso dos dados;
      2. verificar o formato da distribuição dos dados
        1. apresenta o comando df.describe() para ver as estatísticas descritivas de cada columa;
        2. apresenta o comando df.describe(include=”all”) para incluir as variáveis categóricas, onde agora se pode observar além das estatísticas descritivas, o número de valores únicos de uma categoria, o valor mais frequente e a frequência do valor com mais ocorrências;
        3. apresenta alguns conceitos da API Python para banco de dados (DB API), mas de uma forma bastante superficial. Esse item valeria a pena ser mais detalhado e será necessário complementar com outros materiais e referências.
  2. Módulo 02 – Data Wrangling (anotações em PDF)
    1. A tradução de wrangling não é muito clara, mas compreendendo o módulo e lendo mais sobre o termo, fica claro que se refere ao que conhecemos em língua portuguesa como a etapa de pré-processamento de dados. Há alguns tutoriais muito interessantes e até mesmo um livro específico sobre pré-processamento de dados em Python que podem ser bons materiais para estudo. Vale dizer que essa etapa agrega um valor enorme na qualidade de bases de dados e planilhas, o que por si só é algo que vale dedicação e estudo, sobretudo no campo da Ciência da Informação. É uma etapa que vale especial atenção para profissionais dessa área e o trabalho com suas possíveis aplicações (preparar dados para repositórios digitais, melhorar dados em planilhas para análise e publicação e repositórios de dados científicos, entre outros).
    2. O módulo define o que será apresentado como o “processo de converter ou mapear dados de uma forma inicial crua para outros formatos, de maneira a preparar os dados para análises posteriores”;
    3. Divide o pré-processamento nas seguintes etapas:
      1. Identificar e tratar valores ausentes:
        1. o curso sugere alguns modos de tratar valores ausentes:
          1. checar com a fonte de dados para confirmar ausência ou corrigir os erros
          2. retirar os valores ausentes da base, seja por retirar o registro ou excluir a variável inteira:
            1. dataframes.dropna() – retira o registro da base;
          3. substituir os valores ausentes: dataframe.replace(missing_value,new_value)
            1. substituir pela média:
              1. mean = df[“coluna”].mean()
              2. df[“coluna”].replace(np.nan,mean)
            2. substituir pela frequência;
            3. substituir baseado em outras funções de interesse.
          4. ignorar e deixar o dado da forma como está
      2. Formatação de dados:
        1. substituir o formato sintático de um dado por outro: df.rename(columns={“antigo”:”novo”}, inplace=True) – para substituir o nome de uma coluna;
        2. modificar o tipo de dados de uma coluna: df[“coluna”]=df[“coluna”].astype(“int”) – transforma a coluna o tipo int
      3. Normalização de dados (centralização e escala):
        1. normaliza os valores pelo valor máximo: df[“coluna”]=df[“coluna”]/df[“coluna”].max()
        2. normaliza pela diferença entre o valor máximo do valor mínimo;
        3. normaliza pelo Z-Score: df[“coluna”]=(df[“coluna”]-df[“coluna”].mean())/df[“coluna”].std()
      4. Data Binning (colocar os dados numéricos dentro de faixas de valores categóricos):
        1. Uma forma visual de compreender o que é o data binning pode ser vista nesse tutorial desenvolvido pelo Google e um outro também interessante que encontrei nas pesquisas do tema;
        2. No módulo, é apresentado como sendo o processo de converter dados numéricos em variáveis categóricas (transformar conjuntos de dados em faixas categóricas);
        3. Para isso, usa uma função do NumPy chamada linspace, que divide conjuntos de dados a partir de valores de referência em grupos, e uma função do Pandas, a pd.cut que produz o corte em faixas numa coluna do dataframe;
        4. Uma outra função interessante, mas não apresentada no curso é pd.qcut, que corta os dados em faixas baseada nos quartis;
        5. Um tutorial bem didático que mostra como fazer isso usando cut e qcut
      5. Transformar dados categóricos em variáveis numéricas:
        1. a transformação de dados categóricos em variáveis numéricas se dá pelo processo de criar variáveis dummy. Aqui um bom tutorial que explica o que são;
        2. em Pandas, pode ser feito por: pd.get_dummies(df[“coluna”])
  3. Módulo 03 – Exploratory Data Analysis (anotações em PDF)
    1. O módulo apresenta os principais passos para a realização de uma análise exploratória dos dados:
      1. Sintetizar as principais características dos dados e Ganhar melhor compreensão do conjunto dados
        1. df.describe() – sintetiza as principais estatísticas para um dataframe. Já foi apresentado acima;
        2. a saída padrão de describe não exibe as variáveis do tipo “object”. Para isso, é preciso: df.describe(include=[‘object’])
        3. para resumir uma variável categórica, podemos contar quantos itens de cada categoria com: df[“coluna”].value_counts()
        4. uma das formas de descrever uma variável de forma sintética é utilizando o diagrama de caixa, que mostra várias estatísticas descritivas em uma mesma imagem, além de ser muito útil para comparar variáveis utilizando a mesma imagem para todas. É apresentado no módulo a partir da biblioteca Seaborn (um bom tutorial sobre como fazer esse tipo de diagrama com Pandas).
        5. na pesquisa para este post, encontrei um excelente tutorial da biblioteca Seaborn sobre como trabalhar com visualização e análise de dados categóricos. Vale o olhar;
        6. Um outro tipo de análise proposta é o gráfico de dispersão. O gráfico é muito utilizado para se fazer a análise da relação entre duas variáveis e ver seu comportamento distributivo. Em geral, coloca-se a variável independente (preditora) no eixo X e a variável dependente (o alvo a ser previsto) no eixo Y. É utilizada a função plot.scatter de um dataframe para isso.
        7. Outra análise apresentada é a possibilidade de agrupar variáveis categóricas por uma ou mais de suas categorias (como numa tabela dinâmica). É utilizado o comando dataframe.groupby(). O comando em Pandas é apresentado aqui e um bom tutorial de operações e possibilidades de agrupamento vale o olhar do que se pode fazer.
        8. Outra análise bastante útil para resumir dados é a construção de uma tabela pivot. Essas tabelas permitem se colocar uma variável categórica nas colunas e outra variável categórica nas linhas, permitindo o cruzamento de dados difícil de visualizar em outros formatos. Em Pandas isso é feito com o comando pivot_table em um dataframe. Na pesquisa, encontrei outro bom tutorial de reformatação de tabelas que incluí as pivot table como opção, incluindo imagens ilustrativas bem didáticas para se usar em aulas;
        9. Outra forma de avaliar como as variáveis se comportam é por meio do mapa de calor. Em Pandas, pode ser feito com a biblioteca Seaborn (ver tutorial) ou com a Matplotlib (ver tutorial);
        10. Nas pesquisas, encontrei um excelente tutorial da Seaborn sobre diferentes formas de visualizar a distribuição de dados;
      2. Descobrir relacionamentos entre as variáveis
        1. o tópico começa discutindo a correlação. Apresenta o comando df.corr() para mostrar uma tabela cruzada de correlação entre todas as variáveis de um dataframe.
        2. permite também selecionar apenas algumas variáveis para analisar a correlação entre elas: df[[‘coluna1′,’coluna2′,’coluna3’]].corr()
        3. pode-se desenhar a linha de correlação estimada em gráfico com a Seaborn usando o comando regplot. Outro tutorial e mais um.
        4. Para mensurar a correlação é importante avaliar o coeficiente de correlação e o P-value (uma estatística que mostra o grau de significância do valor da correlação). O módulo trabalhar inicialmente com a correlação de Pearson. Aqui uma boa discussão sobre como interpretar o grau de significância. Sabe-se que outra forma de analisar correlação é pelo método de Spearman, que parece oferecer resultados melhores quando as variáveis forem ordinais. Há boa discussão sobre a comparação entre esses métodos aqui.
        5. A correlação é apresentada pelo método pearsonr da biblioteca SciPy além da correlação de spearman.
      3. Extrair as variáveis mais importantes
        1. A abordagem do módulo para se identificar as variáveis mais importantes é por meio da análise de variância ou ANOVA. A ANOVA é uma técnica estatística para comparação entre grupos. Exemplo: comparar o preço médio de diferentes veículos a partir de suas marcas. A análise serve, além de comparar as médias dos grupos, identificar a correlação entre diferentes grupos de uma variável categórica e seu efeito para avaliar como influencia uma variável alvo;
        2. Ela utiliza um teste chamado F-score, que avalia a variação das médias entre os grupos dividida pela variação dentro do mesmo grupo. No módulo é apresentado o método f_oneway da biblioteca SciPy para a realização do teste. Se a variação da média dentro de um mesmo grupo categórico for grande, significa que essa categoria terá pouco efeito na variável alvo – isso nos leva a valores de F pequenos. Já se a variação for pequena dentro de grupo e grande em relação a outro grupo, significa que essas categorias têm efeito considerável na variável alvo – isso nos leva a valores de F grandes. Um excelente tutorial que discute os aspectos conceituais e como interpretar os resultados.
  4. Módulo 04 – Model development (anotações em PDF – parte 1, parte 2, parte 3 e parte 4)
    1. Um modelo pode ser pensando como uma equação matemática utilizada para predizer os valores de uma ou mais variáveis;
    2. relaciona uma ou mais variáveis independentes a uma variável dependente;
    3. O módulo apresenta os tipos de análise listas abaixo.
    4. Regressão linear simples e múltipla
      1. A regressão linear simples utiliza uma única variável como preditora de uma outra variável;
      2. O módulo propõe o uso do método LinearRegression da biblioteca Sci-kit Learn. Segue aqui um exemplo de uso e outro exemplo mais direcionado a aplicação com Pandas;
      3. A regressão linear múltipla utiliza dois ou mais preditores para uma variável alvo. Utiliza os mesmos métodos acima, apenas passando mais variáveis para o cálculo da regressão. Um bom exemplo.
    5. Avaliação de modelos utilizando visualização
      1. O módulo volta no tema dos gráficos de dispersão para estimar a relação entre duas variáveis, a força da correlação e a direção (positiva ou negativa) do relacionamento;
      2. O gráfico de dispersão agora faz uma combinação da relação entre as variáveis e a curva de regressão;
      3. Há um bom tutorial da biblioteca Seaborn sobre como visualizar relações lineares;
      4. O módulo apresenta a importância do gráfico residual para se avaliar se o modelo linear é um preditor. Para gráficos residuais com pontos aleatoriamente distribuídos em torno da média, os modelos lineares parecem funcionar bem, já quando o resíduo não se encontra aleatoriamente distribuído e possui um formato específico, os modelos lineares tendem a não serem bons preditores. O módulo usa o método residplot da biblioteca Seaborn para essa análise.
      5. O módulo apresenta os gráficos de distribuição como um recurso para se comparar visualmente os valores previstos pelo modelo com os valores reais. Um exemplo interessante de análise que utiliza gráficos de distribuição ao final.
    6. Regressão polinomial e pipelines de análise de dados
      1. É utilizado para descrever relacionamentos curvilíneos não-lineares;
      2. É apresentado no módulo a partir das funcionalidades da biblioteca NumPy (referências: 1, 2, 3), mas também pode ser feito usando a Sci-kit learn (refências: 1, 2 ,3).
      3. O módulo termina falando das funcionalidades de padronização automática do StandardScaler da biblioteca Sci-kit learn e uma discussão bastante inicial sobre a criação de pipeline de análise da dados. O módulo não avança de forma satisfatória nessa discussão, valendo aprofundar melhor em outras referências. Deixo aqui dois tutoriais (tutorial 1 e tutorial 2) que iniciam a discussão um pouco mais aprofundada e que também vão dialogar com o módulo 5, quando se inicia a discussão sobre avaliação de modelos.
    7. Coeficiente de determinação (R2) e erro quadrático médio para avaliação de amostras
      1. O coeficiente de determinação e o erro quadrático médio são apresentados como duas formas numéricas de se avaliar o quão bem a regressão atendeu ao conjunto de dados;
      2. O erro quadrático médio é calculado a partir do método mean_squared_error da biblioteca Sci-kit learn. Sua interpretação é bastante simples, sendo valores menores desejáveis (0) e valores maiores demonstrando cada vez maior inadequação. Há várias outras medidas de precisão que podem ser utilizadas;
      3. O coeficiente de determinação é uma medida que determina quão próximo estão os dados reais da linha regressão. Mostra a porcentagem da variação que é explicada pelo modelo linear. Sua interpretação é que quanto mais próximo de 1, melhor a reta explica os dados reais. Seu resultado é obtido pelo método score da regressão linear.
    8. Predição e tomada de decisão
      1. para saber se o modelo está ajustado de forma adequada, o módulo propõe a seguinte sequência de análises:
        1. os valores previstos fazem sentido?
          1. a avaliação dos coeficientes faz sentido? os números retornados são ordens de grandeza que dialogam com o fenômeno?
        2. realizar as visualizações: dispersão, resíduo e distribuição;
        3. realizar as medidas de avaliação numéricas: erro quadrático médio e coeficiente de determinação.
        4. comparar modelos.
  5. Módulo 05 – Model evaluation (anotações em PDF):
    1. As técnicas vistas no módulo anterior para avaliação não permitiam avaliar como o modelo se comporta para prever novos dados. Foram sempre apresentadas avaliações com base em dados já conhecidos;
    2. Para resolver esse problema, existe a técnica de separar o conjunto de dados em duas partes (inicialmente): Conjunto de treinamento (70%) e conjunto de teste (30%);
    3. O modelo é construído e treinado com o conjunto de treinamento;
    4. O modelo é avaliado em relação ao seu desempenho como modelo preditivo com base no conjunto de teste;
    5. Uma vez a fase de teste realizada, é possível usar o conjunto completo de dados para melhorar o desempenho do treinamento;
    6. É possível implementar isso utilizando a biblioteca Sci-kit Learn no método train_test_split. Essa discussão apareceu em alguns tutoriais já mencionados anteriormente nesse post. Aqui um tutorial de exemplo.
    7. Outra forma que o módulo apresenta para avaliação de modelos é o uso da técnica de validação cruzada. Nessa técnica, o conjunto de dados é separado várias vezes de formas diferentes, sempre garantindo uma parte para teste e uma parte para treinamento. É possível usar a biblioteca Sci-kit Learn no método cross_val_score para isso. Um excelente tutorial da própria biblioteca mostra como fazer isso. Uma vez computados os scores das várias formas de divisão dos dados, é possível calcular as médias deles para ter os parâmetros mais precisos;
    8. Os resultados preditivos podem ser obtidos com o método cross_val_predict.
    9. O módulo apresenta algumas técnicas para lidar com a sobre-estimação ou a sub-estimação dos parâmetros. Essa discussão pode ser bem resumida nesse tutorial;
    10. O módulo apresenta uma discussão rápida e um pouco superficial sobre a otimização de hiperparâmetros. É discutida uma técnica de validação cruzada em torno dos hiperparâmetros de forma a selecionar valores que sejam mais eficientes em aumentar a precisão do modelo. O nome da técnica é a Grid Search. Algumas discussões sobre: 1, 2 e 3
    11. No caso da regressão linear, é apresentado a técnica de regressão Ridge para ajudar parametrizar os coeficientes dos termos da regressão múltipla linear.
    12. Em tese, com o uso dessas técnicas, é possível se chegar a estimadores mais precisos e melhor a eficiência dos modelos preditivos.
    13. Vale ressaltar todo o cuidado e rigor necessário no uso dessas ferramentas, valendo entender bem as formas de aplicações, suas limitações e possibilidades de uso. Talvez seja interessante identificar materiais complementares para aprofundar essa parte do curso.

Para encerrar, recomendo a formação e a discussão que o curso apresenta. São oferecidos os notebooks em Jupyter para estudo e com vários bons exemplos que podem ser customizados pelos estudantes. Acredito que para um curso curto em análise de dados em Python os elementos fundamentais são explorados e dicas importantes do que estudar e como pesquisar ficam mais claras. Vale o percurso.

Deixe um comentário