Ciência de dados com R no Google Cloud: tutorial de análise de dados exploratórios

Last reviewed 2024-04-16 UTC

Este tutorial mostra como começar a usar a ciência de dados em escala com o R no Google Cloud. Ele é destinado a quem tem alguma experiência com R e com notebooks Jupyter, além de se sentir confortável com SQL.

O foco deste tutorial é a análise exploratória de dados usando os notebooks gerenciados pelo usuário do Vertex AI Workbench e o BigQuery. É possível encontrar o código deste tutorial no notebook do Jupyter (em inglês) que está no GitHub.

Visão geral

R é uma das linguagens de programação mais usadas para modelagem estatística. Ela tem uma comunidade grande e ativa de cientistas de dados e profissionais de machine learning (ML, na sigla em inglês). Com mais de 15.000 pacotes no repositório de código aberto da rede de arquivamento abrangente do R (CRAN, na sigla em inglês), a R tem ferramentas para todos os aplicativos de análise de dados estatísticos, ML e visualização. A R tem crescido constante nas últimas duas décadas devido à expressividade da sintaxe e à amplitude de dados e bibliotecas de ML.

Como cientista de dados, é possível usar o conjunto de habilidades que você possui com a R e também aproveitar as vantagens dos serviços em nuvem totalmente gerenciados e escalonáveis para ML.

Arquitetura

Neste tutorial, você usa notebooks gerenciados pelo usuário como ambiente de ciência de dados para realizar uma análise de dados exploratória (EDA). Use R em dados extraídos como parte deste tutorial do BigQuery, o armazenamento de dados em nuvem sem servidor, altamente escalonável e econômico do Google. Depois de analisar e processar os dados, os dados transformados são armazenados no Cloud Storage para outras tarefas de ML. Esse fluxo é mostrado no diagrama a seguir:

Fluxo de dados do BigQuery para os notebooks gerenciados pelo usuário, em que eles
são processados usando R e os resultados são enviados ao Cloud Storage
para mais análises.

Dados para o tutorial

O conjunto de dados usado neste tutorial é o conjunto de dados de natalidade do BigQuery. Esse conjunto de dados público inclui informações sobre mais de 137 milhões de nascimentos registrados nos Estados Unidos de 1969 a 2008.

Este tutorial se concentra na EDA e na visualização usando a R e o BigQuery. O tutorial configura uma meta de aprendizado de máquina para prever o peso de um bebê com base em vários fatores sobre a gestação e sobre a mãe do bebê, embora essa tarefa não seja abordada neste tutorial.

Notebooks gerenciados por usuários

Os notebooks Vertex AI Workbench gerenciados pelo usuário são um serviço que oferece um ambiente integrado JupyterLab (em inglês), com os seguintes recursos:

  • Implantação com um clique É possível usar um único clique para iniciar uma instância do JupyterLab pré-configurada com os frameworks de machine learning e ciência de dados mais recentes.
  • Escalonamento por demanda. Comece com uma configuração de máquina pequena (por exemplo, 4 vCPUs e 15 GB de RAM, como neste tutorial). Quando seus dados ficarem muito grandes para uma máquina, você poderá escalonar adicionando CPUs, RAM e GPUs.
  • Integração com o Google Cloud. As instâncias de notebooks gerenciados pelo usuário do Vertex AI Workbench são integradas aos serviços do Google Cloud, como o BigQuery. Essa integração facilita o processamento da ingestão de dados para o pré-processamento e a exploração.
  • Cobrança por utilização. Não há taxa mínima nem compromissos imediatos. Consulte os preços dos notebooks gerenciados pelo usuário do Vertex AI Workbench. Você também paga pelos recursos do Google Cloud usados com a instância de notebooks gerenciados pelo usuário.

Os notebooks gerenciados pelo usuário são executados em Deep Learning VM Images. Essas imagens são otimizadas para oferecer suporte a frameworks de ML, como PyTorch e TensorFlow. Neste tutorial, é possível criar uma instância de notebooks gerenciada pelo usuário que tenha o R 3.6.

Como trabalhar com o BigQuery usando R

O BigQuery não requer gerenciamento de infraestrutura. Portanto, você pode se concentrar na descoberta de insights significativos. Com o BigQuery, você usa o SQL conhecido para trabalhar com seus dados. Portanto, não é necessário ter um administrador de banco de dados. Você pode usar o BigQuery para analisar grandes quantidades de dados em escala e preparar conjuntos de dados para ML usando os recursos analíticos avançados do BigQuery.

Para consultar dados do BigQuery usando R, use a bigrquery, uma biblioteca de código aberto da R. No pacote bigrquery, são fornecidos os seguintes níveis de abstração sobre o BigQuery:

  • A API de nível inferior fornece wrappers finos sobre a API REST do BigQuery.

  • A interface DBI envolve a API de nível inferior e torna o trabalho com o BigQuery semelhante a qualquer outro sistema de banco de dados. Essa é a camada mais conveniente, se você quiser executar consultas SQL no BigQuery ou fazer upload de menos de 100 MB.

  • A interface dbplyy permite tratar tabelas do BigQuery como frames de dados na memória. Essa é a camada mais conveniente se você não quiser gravar SQL, mas quiser que o dbplyr a grave para você.

Este tutorial usa a API de baixo nível do bigrquery, sem a necessidade de DBI ou dbplyr.

Objetivos

  • Crie uma instância de notebooks gerenciada pelo usuário que seja compatível com R.
  • Consulte e analise dados do BigQuery usando a biblioteca R do bigrquery.
  • Preparar e armazenar dados para ML no Cloud Storage.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

Como criar uma instância de notebooks gerenciada pelo usuário com R

A primeira etapa é criar uma instância de notebooks gerenciada pelo usuário que possa ser usada neste tutorial.

  1. No Console do Google Cloud, acesse a página "Notebooks".

    Acesse o Notebooks

  2. Na guia Notebooks gerenciados pelo usuário, clique em  Novo notebook.

  3. Selecione R 3.6.

    Selecionar a versão de R.

  4. Para este tutorial, deixe todos os valores padrão e clique em Criar:

    Como criar a nova instância de notebook.

    A instância de notebooks gerenciados pelo usuário pode levar até 90 segundos para ser iniciada. Quando estiver pronta, você o verá listado no painel Instâncias de notebook com um link Abrir JupyterLab ao lado do nome da instância:

    Console quando a instância estiver pronta.

Como abrir o JupyterLab

Para passar pelo tutorial no notebook, você precisa abrir o ambiente do JupyterLab, clonar o repositório do GitHub ml-on-gcp e abrir o notebook.

  1. Na lista de instâncias, clique em Abrir o JupyterLab. Isso abrirá o ambiente JupyterLab no navegador.

    A tela de início do Jupyter.

  2. Para iniciar uma guia de terminal, clique em Terminal na tela de início.

  3. No terminal, clone o repositório do GitHub ml-on-gcp:

    git clone https://github.com/GoogleCloudPlatform/ml-on-gcp.git
    

    Quando o comando for concluído, você verá a pasta ml-on-gcp no navegador de arquivos.

  4. No navegador de arquivos, abra ml-on-gcp, tutorials e R.

    O resultado da clonagem é semelhante ao seguinte:

    Abrindo o arquivo R.

Como abrir o notebook e configurar o R

As bibliotecas R necessárias para este tutorial, incluindo o bigrquery, são instaladas em notebooks R por padrão. Como parte desse procedimento, você as importa para disponibilizá-las ao notebook.

  1. No navegador de arquivos, abra o notebook 01-EDA-with-R-and-BigQuery.ipynb.

    Este notebook abrange o tutorial exploratório de análises de dados com R e BigQuery. A partir deste ponto, no tutorial, você trabalha no notebook e executa o código que vê no próprio notebook do Jupyter.

  2. Importe as bibliotecas R necessárias para este tutorial:

    library(bigrquery) # used for querying BigQuery
    library(ggplot2) # used for visualization
    library(dplyr) # used for data wrangling
    
  3. Autentique bigrquery usando a autenticação fora da banda:

    bq_auth(use_oob = True)
    
  4. Defina uma variável para o nome do projeto que você usa neste tutorial:

    # Set the project ID
    PROJECT_ID <- "gcp-data-science-demo"
    
  5. Defina uma variável com o nome do bucket do Cloud Storage:

    BUCKET_NAME <- "bucket-name"
    

    Substitua bucket-name por um nome exclusivo globalmente.

    Posteriormente, use o bucket para armazenar os dados de saída.

Como consultar dados do BigQuery

Nesta seção do tutorial, leia os resultados da execução de uma instrução SQL do BigQuery em R e analise detalhadamente os dados.

  1. Crie uma instrução SQL do BigQuery que extraia alguns possíveis indicadores e a variável de previsão de destino para uma amostra de nascimentos desde 2000:

    sql_query <- "
        SELECT
          ROUND(weight_pounds, 2) AS weight_pounds,
          is_male,
          mother_age,
          plurality,
          gestation_weeks,
          cigarette_use,
          alcohol_use,
          CAST(ABS(FARM_FINGERPRINT(CONCAT(
            CAST(YEAR AS STRING), CAST(month AS STRING),
            CAST(weight_pounds AS STRING)))
            ) AS STRING) AS key
        FROM
            publicdata.samples.natality
        WHERE
          year > 2000
          AND weight_pounds > 0
          AND mother_age > 0
          AND plurality > 0
          AND gestation_weeks > 0
          AND month > 0
        LIMIT %s
    "
    

    A coluna key é um identificador de linha gerado com base nos valores concatenados das colunas year, month e weight_pounds.

  2. Execute a consulta e recupere os dados como um objeto data frame na memória:

    sample_size <- 10000
    sql_query <- sprintf(sql_query, sample_size)
    
    natality_data <- bq_table_download(
        bq_project_query(
            PROJECT_ID,
            query=sql_query
        )
    )
    
  3. Veja os resultados recuperados:

    head(natality_data)
    

    A saída será assim:

    Resultados da recuperação do frame de dados.

  4. Veja o número de linhas e tipos de dados de cada coluna:

    str(natality_data)
    

    A saída será assim:

    Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   10000 obs. of  8 variables:
     $ weight_pounds  : num  7.75 7.4 6.88 9.38 6.98 7.87 6.69 8.05 5.69 9.22 ...
     $ is_male        : logi  FALSE TRUE TRUE TRUE FALSE TRUE ...
     $ mother_age     : int  47 44 42 43 42 43 42 43 45 44 ...
     $ plurality      : int  1 1 1 1 1 1 1 1 1 1 ...
     $ gestation_weeks: int  41 39 38 39 38 40 35 40 38 39 ...
     $ cigarette_use  : logi  NA NA NA NA NA NA ...
     $ alcohol_use    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
     $ key            : chr  "3579741977144949713" "8004866792019451772" "7407363968024554640" "3354974946785669169" ...
    
  5. Veja um resumo dos dados recuperados:

    summary(natality_data)
    

    A saída será assim:

     weight_pounds     is_male          mother_age     plurality
     Min.   : 0.620   Mode :logical   Min.   :13.0   Min.   :1.000
     1st Qu.: 6.620   FALSE:4825      1st Qu.:22.0   1st Qu.:1.000
     Median : 7.370   TRUE :5175      Median :27.0   Median :1.000
     Mean   : 7.274                   Mean   :27.3   Mean   :1.038
     3rd Qu.: 8.110                   3rd Qu.:32.0   3rd Qu.:1.000
     Max.   :11.440                   Max.   :51.0   Max.   :4.000
     gestation_weeks cigarette_use   alcohol_use         key
     Min.   :18.00   Mode :logical   Mode :logical   Length:10000
     1st Qu.:38.00   FALSE:580       FALSE:8284      Class :character
     Median :39.00   TRUE :83        TRUE :144       Mode  :character
     Mean   :38.68   NA's :9337      NA's :1572
     3rd Qu.:40.00
     Max.   :47.00
    

Como visualizar dados usando ggplot2

Nesta seção, você usa a biblioteca ggplot2 em R para estudar algumas das variáveis do conjunto de dados de natalidade.

  1. Exiba a distribuição dos valores weight_pounds usando um histograma:

    ggplot(
        data = natality_data,
        aes(x = weight_pounds)
    ) + geom_histogram(bins = 200)
    

    O gráfico resultante é semelhante ao seguinte:

    Histograma mostrando a distribuição do peso.

  2. Exiba o relacionamento entre gestation_weeks e weight_pounds usando um gráfico de dispersão:

    ggplot(
        data = natality_data,
        aes(x = gestation_weeks, y = weight_pounds)
    ) + geom_point() + geom_smooth(method = "lm")
    

    O gráfico resultante é semelhante ao seguinte:

    Distribuição de semanas de gestação com base no peso.

Como processar os dados no BigQuery a partir do R

Ao trabalhar com grandes conjuntos de dados, recomendamos que você faça o maior número de análises possíveis (agregação, filtragem, mesclagem, computação de colunas etc.) no BigQuery e recupere os resultados. Executar essas tarefas em R é menos eficiente. O uso do BigQuery para análise aproveita a escalonabilidade e o desempenho do BigQuery, além de garantir que os resultados retornados possam caber na memória no R.

  1. Crie uma função que encontre o número de registros e a ponderação média de cada valor da coluna escolhida:

    get_distinct_values <- function(column_name) {
        query <- paste0(
            'SELECT ', column_name, ',
                COUNT(1) AS num_babies,
                AVG(weight_pounds) AS avg_wt
            FROM publicdata.samples.natality
            WHERE year > 2000
            GROUP BY ', column_name)
    
        bq_table_download(
            bq_project_query(
                PROJECT_ID,
                query = query
            )
        )
    }
    
  2. Chame essa função usando a coluna mother_age e veja o número de bebês e o peso médio por idade da mãe:

    df <- get_distinct_values('mother_age')
    ggplot(data = df, aes(x = mother_age, y = num_babies)) + geom_line()
    ggplot(data = df, aes(x = mother_age, y = avg_wt)) + geom_line()
    

    A saída do primeiro comando ggplot é a seguinte, mostrando o número de bebês nascidos pela idade da mãe.

    Gráfico do número de bebês nascidos pela idade da mãe.

    A saída do segundo comando ggplot é a seguinte, mostrando o peso médio dos bebês pela idade da mãe.

    Gráfico do peso médio de bebês pela idade da mãe.

Para ver mais exemplos de visualização, consulte o notebook.

Como salvar dados como arquivos CSV

A próxima tarefa é salvar dados extraídos do BigQuery como arquivos CSV no Cloud Storage para usá-los em outras tarefas de ML.

  1. Carregue dados de treinamento e avaliação do BigQuery em R:

    # Prepare training and evaluation data from BigQuery
    sample_size <- 10000
    sql_query <- sprintf(sql_query, sample_size)
    
    train_query <- paste('SELECT * FROM (', sql_query,
      ') WHERE MOD(CAST(key AS INT64), 100) <= 75')
    eval_query <- paste('SELECT * FROM (', sql_query,
      ') WHERE MOD(CAST(key AS INT64), 100) > 75')
    
    # Load training data to data frame
    train_data <- bq_table_download(
        bq_project_query(
            PROJECT_ID,
            query = train_query
        )
    )
    
    # Load evaluation data to data frame
    eval_data <- bq_table_download(
        bq_project_query(
            PROJECT_ID,
            query = eval_query
        )
    )
    
  2. Grave os dados em um arquivo CSV local:

    # Write data frames to local CSV files, without headers or row names
    dir.create(file.path('data'), showWarnings = FALSE)
    write.table(train_data, "data/train_data.csv",
       row.names = FALSE, col.names = FALSE, sep = ",")
    write.table(eval_data, "data/eval_data.csv",
       row.names = FALSE, col.names = FALSE, sep = ",")
    
  3. Faça o upload dos arquivos CSV para o Cloud Storage unindo comandos gsutil que são passados para o sistema:

    # Upload CSV data to Cloud Storage by passing gsutil commands to system
    gcs_url <- paste0("gs://", BUCKET_NAME, "/")
    command <- paste("gsutil mb", gcs_url)
    system(command)
    gcs_data_dir <- paste0("gs://", BUCKET_NAME, "/data")
    command <- paste("gsutil cp data/*_data.csv", gcs_data_dir)
    system(command)
    command <- paste("gsutil ls -l", gcs_data_dir)
    system(command, intern = TRUE)
    

    Outra opção para essa etapa é usar a biblioteca googleCloudStorageR para fazer isso usando a API JSON do Cloud Storage.

Limpeza

Remova os recursos usados neste tutorial para evitar cobranças na conta do Google Cloud.

Excluir o projeto

A maneira mais fácil de eliminar o faturamento é excluir o projeto que você criou para o tutorial.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

A seguir