Alura > Cursos de Data Science > Cursos de Machine Learning > Conteúdos de Machine Learning > Primeiras aulas do curso Big Query ML: trabalhando com modelos de classificação

Big Query ML: trabalhando com modelos de classificação

Conhecendo a ferramenta - Apresentação

Você já se perguntou como criar modelos de Machine Learning (Aprendizado de Máquina) em um ambiente de Big Data utilizando a linguagem SQL? Se você tem interesse nesse conteúdo, está no curso certo.

Boas-vindas ao curso de Big Query e Machine Learning, onde criaremos modelos de classificação. O Igor do Nascimento Alves, instrutor na Escola de Dados, e vai nos acompanhar neste conteúdo.

Audiodescrição: Igor do Nascimento é uma pessoa de pele clara. Tem cabelos escuros e curtos, olhos castanhos e uma pinta acima do lábio superior. Está com uma camiseta cinza e fone de ouvido sem fio. Ao fundo, parede lisa iluminada pelas cores verde e azul e, à esquerda, uma vaso de planta.

O que vamos aprender?

No conteúdo deste curso, vamos acompanhar um projeto de uma empresa interessada em analisar seus dados de Google Analytics. O Google Analytics é uma ferramenta para entender o comportamento da pessoa usuária dentro de um site, como o horário de acesso, os cliques realizados e diversas informações sobre a interação da pessoa usuária.

A partir dessas informações, precisamos criar um modelo capaz de classificar se um cliente vai comprar o produto ou não e se fará uma recompra, ou seja, se voltará a comprar em nosso site.

Para entregar esse resultado, vamos criar um dashboard que apresentará os resultados do modelo de classificação para que o time de negócios tome decisões baseadas em dados e nas previsões do nosso modelo.

Neste conteúdo, para construir esse projeto, aprenderemos a explorar e preparar esses dados, além de criar funcionalidades específicas que serão utilizadas no modelo de Machine Learning (ML). Finalmente, criaremos esses modelos de ML e avaliaremos sua performance para entender se estão fazendo boas classificações.

Com isso, construiremos o dashboard através da ferramenta Looker Studio. Dentro do ambiente da Google Cloud Platform (GCP), criaremos o modelo e o dashboard para ser entregue como produto final deste projeto.

Quais são os pré-requisitos?

Para acompanhar este curso, é importante que você já tenha conhecimentos de Machine Learning para entender os modelos que vamos criar e como as métricas são utilizadas. Também é necessário conhecer SQL, pois utilizaremos esse conhecimento para aplicá-lo no cenário de Machine Learning e criação de modelos.

Conhecendo a ferramenta - Explorando o dataset ga_sessions

Nesse projeto, vamos criar um modelo de Machine Learning que facilitará as decisões do time de Marketing. No entanto, surgiu uma preocupação. Nosso time atualmente não possui conhecimento em Python e Jupyter Notebook, que são comumente utilizados para criar modelos de Machine Learning.

O time de dados da nossa empresa trabalha essencialmente com SQL, o que tem sido suficiente para as demandas de extração e análise de dados. No entanto, para criar um modelo de Machine Learning, faz sentido continuar utilizando SQL?

Aprender Python e Jupyter Notebook levaria tempo, e precisamos priorizar este projeto, pois estamos próximos da Black Friday e é importante entregá-lo até lá. Pensando nisso, decidimos utilizar o conhecimento já existente no time. Para acessar esse grande volume de dados com SQL, vamos utilizar a solução do BigQuery.

O BigQuery permite criar modelos de Machine Learning utilizando apenas SQL, o que parece a solução ideal para o nosso projeto.

Criando novo projeto no GCP

Para isso, vamos criar uma conta no GCP (Google Cloud Platform), que oferece um período de teste gratuito de 90 dias com créditos. Confira a atividade de "Preparando o ambiente" onde te ensinamos a fazer seu cadastro e começar seu período de teste.

Após criar a conta, chegamos à tela inicial, que informa a quantidade de créditos disponíveis, a data de expiração e o nome do projeto na barra superior, que por padrão é "My First Project" (Meu Primeiro Projeto).

Vamos criar um novo projeto para nos acostumarmos com a ideia de trabalhar com diversos projetos simultaneamente, como geralmente acontece em uma empresa. Normalmente, existem projetos de diferentes setores ou até em diversas fases, como teste, desenvolvimento ou produção.

Na barra superior, clicamos na setinha ao lado de "My First Project" para abrir uma nova janela de seleção de projeto. No canto superior direito, vamos clicar no botão "Novo projeto". No nosso caso, nomeamos o projeto como projeto-gcpbqml-igor e clicamos no botão "Criar".

Pode levar algum tempo para carregar o ambiente e criar o projeto.

Gerenciando gastos

Uma preocupação importante em ambientes de cloud é o custo. Ferramentas de nuvem como Azure, AWS e GCP cobram para utilizar seus servidores.

Embora estejamos no período gratuito, é essencial monitorar os gastos - seja em um projeto pessoal para construção de portfólio ou profissional na empresa que você trabalha.

Por isso, podemos acessar o menu de navegação à esquerda (atalho ".") e entrar em "Faturamento". Ou também podemos acessar o campo de pesquisa (atalho "/") e buscar por "Faturamento".

Na página de faturamento, há um dashboard que informa a quantia de créditos usados, o custo total e previsto. No nosso caso, vamos focar no campo de "Criar um alerta de orçamento" na lateral direita da tela. Definimos um orçamento mensal de R$15,00 e clicamos em "Criar".

Esse alerta não interrompe o serviço quando ultrapassamos essa quantia, mas notifica pelo GCP e pelo e-mail quando o orçamento está próximo do valor estipulado, permitindo que tomemos as ações necessárias para identificar o que está gerando esse custo.

Selecionando base de dados no BiQuery

Com o ambiente configurado, vamos para o BigQuery. Basta acessar o menu de navegação à esquerda e selecionar a opção do "BigQuery".

Atenção: Como estamos trabalhando com diversos projetos, você deve conferir, na barra superior, se o projeto correto está selecionado.

Após carregar o projeto-gcpbqml-igor no ambiente do BigQuery, vamos entender como funciona esse ambiente. No painel lateral à esquerda chamado "Explorer", estão listados os projetos e bases de dados que temos acesso.

Na parte central, há um menu inicial com sugestões de ações, como consultas SQL e criação de notebooks Python. Nessa parte também ficam abertas as abas de consulta, onde podemos criar comandos SQL para acessar os dados disponíveis.

Para trazer dados do Google Analytics, utilizaremos uma base de dados pública do GCP. No painel "Explorer", clicamos no botão "Adicionar" e selecionamos a fonte. Poderíamos fazer upload de um arquivo local, conectar com Google Cloud Storage ou até com uma fonte de dados externa.

No nosso caso, queremos a fonte do Google Cloud Platform Public Data. Para isso, vamos procurar por outras fontes, clicando a opção "Marcar um projeto com estrela por nome". Na janela que se abre, especificamos o nome o projeto bigquery-public-data e clicamos no botão "Marcar como estrela":

bigquery-public-data

Com isso, esse projeto fica destacado no painel "Explorer".

Carregando dados de sessão do Google Analytics

Agora que carregamos os dados, vamos buscar pelos dados de sessões do Google Analytics, que são interações de usuários com o site. Para isso, vamos pesquisar por ga_session através do campo de pesquisa de recursos do BigQuery no painel "Explorer":

ga_session

Dentro de bigquery-public-data, encontramos um conjunto de dados chamado google_analytics_sample que contém 366 tabelas de ga_sessions. Ao selecionar esses dados, abre-se uma aba na parte central com diversos metadados dessas tabelas.

Em "Esquema", encontramos o nome das colunas, o tipo e outras informações relacionadas ao formato da tabela. Por exemplo, temos ID da pessoa que visitou (visitorId), o número da visita (visitNumber) e até a data que isso aconteceu (date), dentre outras informações.

Nome do campoTipoModoChaveCompilaçãoValor padrãoTags de políticasDescrição
visitorIdINTEGERNULLABLE-----
visitNumberINTEGERNULLABLE-----
visitIdINTEGERNULLABLE-----
dateSTRINGNULLABLE-----
totalsRECORDNULLABLE-----
........................

Quem já trabalha com SQl está acostumado a encontrar tipos como inteiro (integer), texto (string) e data (date), mas existe um novo tipo de dado no BigQuery chamado record. Esse tipo funciona como um array na programação, ou seja, um conjunto que contém múltiplas informações.

Por exemplo, a coluna totals possui o tipo record. Se clicamos na setinha ao lado esquerdo dessa coluna para expandir seus nós, verificaremos que ela é composta por várias informações do tipo inteiro que contam o total de visitas (visits), o total de cliques no site (hits) e até o total de visualizações no site (pageviews).

Essa abordagem simplifica o processo de armazenar dados, pois evita a necessidade de criar tabelas separadas e relacionamentos entre elas. Graças ao sistema de record, podemos manter todas as informações dentro de uma única tabela.

A ga_sessions possui 366 tabelas divididas por data. Repare que é possível filtrar pela data na barra de ferramentas. Os dados abrangem os anos de 2017 e 2016, com informações diárias para todos os meses desses dois anos. Essa organização facilita a busca, pois podemos focar em datas específicas.

Além do esquema, temos uma opção de "Detalhes", que traz informações sobre a tabela, como ID da tabela, data de criação e última modificação, quantidade de linhas, tamanho total e até local de armazenamento dos dados.

É interessante saber onde os dados estão armazenados, pois isso impacta na performance, no custo e no acesso aos dados. Se o ambiente em que você está trabalhando não for próximo do local dos dados, pode haver dificuldades para acessá-los.

Na opção de "Visualização", podemos conferir os dados reais, incluindo todas as colunas e valores.

LinhavisitorIdvisitNumbervisitIdvisitStartTimedatetotals.visitstotals.hitstotal.pageviewstotal.timeOnSite...
1null11501591568150159156820170801111null...
2null21501589647150158964720170801111null...
.................................

Note que o tipo record é apresentado como colunas separadas, sempre iniciando com o nome do campo seguido do nome do subcampo para facilitar a leitura da visualização.

Próximos passos

Agora, vamos explorar esses dados com SQL, aprendendo a consultá-los, transformá-los e analisá-los diretamente no ambiente do BigQuery.

Funções SQL no BigQuery - Utilizando curinga e pseudo-colunas

No nosso projeto de criação de um modelo de machine learning capaz de prever se uma pessoa cliente irá realizar uma compra no site, com base nos dados do Google Analytics, já avançamos significativamente ao carregar essa base de dados no nosso ambiente do BigQuery.

Exploração dos dados para modelagem de machine learning

Para criar um modelo de machine learning, seguimos um pipeline estruturado, e o primeiro passo nesse processo é a exploração dos dados.

É fundamental compreender esses dados antes de desenvolver o modelo, identificar quais colunas devem ser incluídas, verificar se é necessário algum tratamento ou modificação nos valores dessas colunas, e todas essas questões podem ser respondidas por meio da exploração dos dados.

Essas explorações poderiam ser realizadas utilizando linguagens como Python, Spark ou PySpark. No entanto, como a expertise do nosso time é em SQL e o ambiente do BigQuery oferece suporte para esse tipo de exploração, optaremos por utilizar SQL.

Retornando ao nosso ambiente do BigQuery, já havíamos acessado a guia e explorado alguns detalhes do esquema, bem como a visualização da tabela do ga_sessions para uma data específica. Agora, realizaremos essa exploração por meio de consultas SQL.

Executando consultas SQL

Para isso, no canto superior central, encontramos a opção de "Consulta SQL" representado com um ícone de adição dentro de um quadrado azul. Ao clicar nesta opção, podemos digitar a consulta desejada, seguindo o padrão do SQL.

Como desejamos selecionar todas as colunas, usamos SELECT *, indicando que todas as colunas serão selecionadas, e na linha seguinte, usamos FROM para definir a origem dos dados.

SELECT *
FROM

Há uma diferença em relação ao que talvez estejamos acostumados com SQL, pois precisaremos descrever todo o caminho. Para isso, retornamos ao "Explorer" no canto superior esquerdo para visualizar o caminho completo.

Após o FROM, digitamos aspas simples e, dentro delas, inserimos "bigquery-public-data", que é o nome do projeto. À esquerda, temos "google_analytics_sample", que corresponde à segunda camada.

Em seguida, temos o nome do projeto, seguido pelo nome do conjunto de dados, que é "google_analytics_sample". Adicionamos mais um ponto e, por fim, o nome da tabela, que é "ga_sessions".

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions`

Nossa base de dados possui uma particularidade: a tabela é composta por várias tabelas separadas por datas. Ela cobre um ano de dados diários, com intervalos de dia, mês e dois anos, que é o período abrangido. Precisamos especificar isso na consulta. Vamos revisar a tabela que estávamos analisando.

Na guia anterior, visualizamos que estávamos observando dados de 8 de janeiro de 2017, ou seja, 2017-08-01, que representa o dia 1º de agosto de 2017.

Após ga_sessions, adicionamos um underline e especificamos a variação da tabela de acordo com o período que desejamos analisar, ou seja, 2017-08-01. Com isso, definimos a origem dos nossos dados e, para limitar a quantidade de registros, que correspondem às pessoas usuárias por dia, colocamos um limite de 100 resultados com LIMIT 100 na próxima linha, seguido de ponto e vírgula.

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801`
LIMIT 100;

Rodamos essa célula selecionando o comando e clicando no botão "Executar" na parte superior central.

O retorno abaixo foi parcialmente transcrito:

LinhavisitorIdvisitNumbervisitIdvisitStartTimedatetotals.visits
1null115015915681501591568201708011

O resultado aparecerá na parte inferior, abaixo da consulta. Há uma barra que podemos arrastar para ajustar o espaço da tela, perdendo um pouco da área onde escrevemos o comando, mas ganhando melhor visualização dos resultados.

Agora, encontramos uma nova aba chamada "Resultado da Consulta", que contém informações sobre o job na aba "Informações do job". Como estamos em um ambiente de cloud, esse processamento ocorreu em outra máquina. A aba traz diversas informações, mas o foco estará na parte do "Resultado".

Ao clicar em "Resultado", visualizamos as mesmas colunas que já havíamos observado anteriormente, como "visitorId", "visitNumber", "visitStartTime", entre outras colunas. Uma coluna que se destaca é a primeira, a de visitorId, que apresenta diversos valores nulos.

Essa coluna é importante, pois funciona como o identificador de cada pessoa usuária. No entanto, por questões de anonimização dos dados, com o objetivo de desvincular as informações do uso de uma pessoa, a fim de evitar a identificação direta, em conformidade com as regras da LGPD e outras questões legais relacionadas ao armazenamento de dados pessoais, é possível que os valores dessa coluna tenham sido removidos.

Para confirmar isso, será necessário analisar todos os conjuntos de dados. No caso, estamos focando no ga_session de um único dia, mas será preciso ampliar a análise para todos os dias e verificar se existe alguma coluna em que os valores não sejam nulos.

Para realizar essa consulta, devemos ajustar o script que já temos. Primeiramente, diminuímos a parte do resultado e adicionamos alguns enters no script para construir a nova consulta.

Começamos com o comando SELECT, como desejamos selecionar todas as colunas, usamos o asterisco "*". Em seguida, usamos o comando FROM, e copiamos o mesmo caminho que utilizamos anteriormente: bigquery-public-data.google_analytics_sample.ga_sessions_20170801.

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801`
LIMIT 100;

Para acessar todos os dias, precisamos remover a parte da data que colocamos no final da consulta. Ao fazer isso, garantimos que a consulta será executada para todos os dias, sem restringir a um único dia.

Em vez de especificar um dia, utilizamos o curinga * para selecionar todas as tabelas, indicando que queremos todas as colunas. Colocamos o asterisco após o sessions, e, na próxima linha, limitamos o resultado novamente, conforme necessário.

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
LIMIT 100;

Selecionamos o comando e o executamos. Esse comando demorou mais do que o normal, pois estamos acessando um conjunto de dados bem maior. Talvez fosse mais eficiente se tivéssemos aplicado nossa regra antes de executar, mas ele foi executado, e, embora tenha demorado um pouco, não foi um tempo excessivo, já que o número de cláusulas era reduzido. O comando retornou o nosso resultado.

LinhavisitorIdvisitNumbervisitIdvisitStartTimedate
1null21475539225147553922520161003

Agora, temos um conjunto de dados abrangendo todas as informações, mas ainda não conseguimos identificar se o "visitorId" está nulo para todos os registros.

Modificando a consulta

Fazemos uma pequena modificação nesta consulta. Após o FROM, inserimos uma cláusula WHERE, digitamos "WHERE", o nome da coluna que desejamos validar, que é o visitorId, e verificamos se o visitorId não é nulo. Assim, buscamos apenas os resultados onde a coluna visitorId não esteja nula: WHERE visitorId IS NOT NULL.

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE visitorId IS NOT NULL
LIMIT 100;

Selecionamos novamente o comando e clicamos no botão de execução, localizado no centro da tela. O sistema processa todo o conjunto de dados, que consiste em 366 tabelas com diversos registros, o que pode levar um tempo, pois o processo percorre cada linha e verifica se a coluna é nula.

No canto inferior esquerdo, é possível observar o tempo decorrido, que indica quanto está sendo consumido pelo processo. Esse tempo está relacionado ao custo, pois, em consultas mais pesadas, podemos estar utilizando mais recursos do que o necessário, o que pode gerar custos adicionais e até travar o serviço. Por isso, as métricas de consulta são informações extremamente importantes.

Não há dados para exibir

Focando no nosso resultado, observamos que não há dados para exibir. Isso confirma que estávamos corretos: não encontramos o valor de "visitorId" para identificar cada pessoa usuária. Por alguma razão, esse dado foi removido, impossibilitando a identificação individual de cada usuário. Continuamos a exploração para entender como podemos correlacionar as linhas de dados de outra maneira.

Selecionando dados por mês

Agora, exploramos um cenário em que desejamos selecionar dados de um mês específico.

Já utilizamos o curinga, o asterisco, para selecionar todos os dados de um dia ao digitar 2017-08-01, e agora o objetivo é filtrar os dados por mês. Para isso, repetimos o comando anterior, copiando até a parte do FROM. O comando se torna SELECT * FROM.

A seguir, teclamos alguns enters para organizar melhor a tela, diminuímos a parte do resultado e mantemos SELECT * FROM bigquery-public-data.google_analytics_sample.ga_sessions, o que nos permite acessar todas as colunas.

-- comando sql omitido

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`

Para filtrar por um mês, utilizamos novamente a cláusula WHERE, mas agora aplicamos uma novidade: a variação que aparece no final do nome da tabela, o sufixo do nome da tabela.

Existe uma maneira de acessar essa informação por meio do _TABLE_SUFFIX. Utilizando o sufixo do nome da tabela, que corresponde exatamente à parte da data, como por exemplo 20170801, conseguimos acessar essa informação. Com isso, podemos definir o intervalo desejado, utilizando o operador BETWEEN. Assim, configuramos um intervalo, como por exemplo, de 20170801 até 20170131, sempre utilizando as aspas simples para indicar as datas.

-- comando sql omitido

SELECT *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE _TABLE_SUFFIX BETWEEN '20170101' AND '20170131';

Selecionamos o comando que criamos e clicamos em "Executar".

Como sempre que utilizamos o asterisco, o processo não será instantâneo e levará um tempo devido ao tamanho do conjunto de dados. No entanto, o comando conseguiu retornar o resultado esperado, assim como observamos anteriormente.

O retorno abaixo foi parcialmente transcrito:

LinhavisitorIdvisitNumbervisitIdvisitStartTimedatetotals.visits
1null114838586251483858625201701071

Com a consulta, obtemos os resultados que correspondem ao primeiro mês de 2017.

A visualização está organizada de forma que as linhas estão espaçadas, mas é possível identificar diversos resultados. No canto inferior direito, visualizamos que são apresentados 50 resultados por página, e estamos visualizando do primeiro até o 50º. Ao todo, temos 64.694 retornos, ou seja, um grande volume de dados sobre as pessoas usuárias.

Observamos que a coluna "visitorId" não poderá ser utilizada, mas há diversas outras que podem ser aproveitadas, como a coluna "visitNumber". Esta indica quantas vezes a pessoa usuária visitou o site, sendo a visita número 1, a visita número 2 e assim por diante. Cada uma dessas visitas possui um ID único, o que nos permite combinar as visitas de uma mesma pessoa usuária.

Há uma grande quantidade de colunas disponíveis, o que é possível observar pela barra no canto inferior da tela. Ao percorrermos as colunas, notamos a variedade de dados. Também podemos identificar colunas que são um array ou um record, como vimos anteriormente. Essas colunas são representadas primeiro pelo nome, como em "device.browserSize" e "device.operatingSystem", e são capazes de armazenar dados com uma estrutura diferente das tabelas com as quais normalmente trabalhamos.

A parte referente ao device é particularmente interessante, pois fornece informações como o sistema operacional utilizado, no caso, Linux, além de detalhes sobre o navegador, como o Chrome. Esses dados podem ser cruciais, pois a experiência de compra da pessoa usuária pode variar dependendo do navegador utilizado, o que torna essa informação importante para análise.

Outro ponto importante refere-se às colunas que são mais complexas do que os arrays que já vimos, especificamente os arrays dentro de arrays. Isso pode ser observado, por exemplo, na coluna Heats, ou mais detalhadamente em "hits.page.pagePathLevel4", que contém uma lista dentro de outra lista.

Próximos passos

Precisamos entender como trabalhar com esse tipo de estrutura de dados, como selecionar essas colunas em uma consulta. Para modificar e manipular esses dados, é fundamental aprender a acessar as informações corretamente, e é isso que abordaremos em breve.

Sobre o curso Big Query ML: trabalhando com modelos de classificação

O curso Big Query ML: trabalhando com modelos de classificação possui 159 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas