Análise com a segunda data no Tableau Desktop

Esta é a segunda etapa do tutorial e assume que a primeira etapa, Encontrar a Segunda data com o Tableau Prep, já foi concluída.

Na primeira etapa, pegamos nosso conjunto de dados original e o moldamos para responder às perguntas a seguir:

  1. Qual foi a duração em dias entre a primeira e a segunda infração de cada motorista?

  2. Compare os valores das multas da primeira e da segunda infração. Elas estão correlacionadas?

  3. Qual motorista pagou mais no total? Quem pagou menos?

  4. Quantos motoristas tinham vários tipos de infrações?

  5. Qual foi o valor médio da multa para os motoristas que nunca fizeram autoescola?

Enquanto analisamos essas perguntas, torna-se claro que há alguns prós e contras na primeira estrutura de dados criada. Voltaremos ao Tableau Prep Builder e faremos uma reformulação adicional, depois veremos como isso influencia a mesma análise no Tableau Desktop. Finalmente, veremos uma abordagem, apenas para o Tableau Desktop, à análise por meio de expressões de nível de detalhe (LOD) com os dados originais.

A meta deste tutorial é apresentar vários conceitos no contexto de um cenário da vida real e trabalhar com as opções, sem estabelecer uma que seja a melhor de maneira prescritiva. Ao fim, você deve entender melhor como a estrutura de dados influencia os cálculos e as análises, assim como obter uma maior familiaridade com vários aspectos do Tableau Prep e dos cálculos no Tableau Desktop.

Observação: para completar as tarefas neste tutorial, é necessário ter o Tableau Prep Builder e, opcionalmente, o Tableau Desktop instalados e os dados já baixados.

Para instalar o Tableau Prep e o Tableau Desktop antes de continuar com este tutorial, consulte o Guia de implantação do Tableau Desktop e do Tableau Prep(O link abre em nova janela). Caso contrário, é possível baixar as versões gratuitas de avaliação do Tableau Prep(O link abre em nova janela) e do Tableau Desktop(O link abre em nova janela).

O conjunto de dados é o resultado de Driver Infractions.tflx, conforme criado na primeira etapa.

Análise no Tableau Desktop

Depois de configurar os dados, vamos trazê-los para o Tableau Desktop. Algumas perguntas podem ser respondidas facilmente, mas outras envolvem alguns (ou muitos) cálculos. Tente responder às perguntas abaixo, é possível expandir cada uma delas para obter informações básicas sobre como proceder se você não conseguir seguir adiante.

Observação: você pode baixar a pasta de trabalho Driver Infractions.twbx(O link abre em nova janela) para considerar as soluções dentro do contexto. Lembre-se de que pode haver maneiras alternativas de interpretar a análise ou de chegar às respostas.

1. Qual foi a duração em dias entre a primeira e a segunda infração de cada motorista?
  1. Para responder a essa pergunta no Tableau Desktop, usaremos a função DATEDIFF. Essa função recebe três argumentos: a parte da data, a data de início e a data de término. Já que queremos saber os dias entre esses eventos, usaremos a parte de data 'day’. Nossas datas de início e de término estão no conjunto de dados como 1st Infraction Date (Data da primeira infração) e 2nd Infraction Date Data da segunda infração).

  2. O cálculo é:

    Time Between Infractions = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

  3. É possível plotar isso com relação a ID do motorista como um gráfico de barras. Observe que sete motoristas não possuem uma segunda infração, então existem sete valores nulos.

    Gráfico de barras de motoristas por tempo entre infrações

2. Compare os valores das multas da primeira e da segunda infração. Elas estão correlacionadas?
  1. Para responder a essa pergunta no Tableau Desktop, criaremos um gráfico de dispersão de 1st Fine Amount (Valor da primeira multa) e 2nd Fine Amount (Valor da segunda multa). Ao trazer ID do motorista para a divisória Detalhes no cartão Marcas, é possível criar uma marca para cada motorista.

  2. Para adicionar uma linha de tendência, use a guia Análise no painel à esquerda e trace uma linha de tendência linear. Com o ponteiro do mouse sobre a linha de tendência, é possível ver que o valor R-quadrado é praticamente zero e o valor p está bem acima de qualquer limite de significância. Pode-se determinar que não há correlação entre os valores da primeira e da segunda multa.

    Se usarmos este gráfico de dispersão em um painel, a linha de tendências deve ser removida.

Gráfico de dispersão dos valores da 1ª e 2ª multa por ID do motorista, com a dica de ferramenta da linha de tendência mostrando

3. Qual motorista pagou mais no total? Quem pagou menos?

Quando queremos ir além em nossa análise, pode ser necessário criar alguns cálculos.

  1. Para responder isso no Tableau Desktop, será necessário adicionar as multas das duas infrações em um único campo. Já que alguns motoristas podem não ter tido uma segunda infração, será necessário usar a função de zerar nulos ZN para transformar qualquer nulo de 2nd Fine Amount (Valor da segunda multa) em zero. Não fazer isso resultará em nulos se não houver uma segunda multa.

  2. O cálculo é:

    Total Amount Paid = [1st Fine Amount] + ZN([2nd Fine Amount])

  3. É possível plotar Valor total pago com relação a ID do motorista e ordenar o gráfico de barras.

Gráfico de barras do valor pago por ID do motorista, com o editor de cálculo mostrando o valor pago

4. Quantos motoristas tinham vários tipos de infrações?
  1. Para responder isso no Tableau Desktop, será necessário fazer um cálculo IF mais sofisticado, comparando se os tipos da primeira e da segunda infração são os mesmos. Se forem, o valor atribuído será "1”. Se não forem os mesmos, o valor atribuído será "2”. Como nos preocupamos apenas com vários tipos de infração, qualquer outro resultado, como um segundo tipo de infração nulo, receberá "1".

  2. O cálculo é:

    Number of Infraction Types =

    IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 
    ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 
    ELSE 1 END
  3. Então é possível plotar Número de tipos de infração com relação a ID do motorista e ordenar o gráfico de barras.

Gráfico de barras do número de tipos de infração por ID do motorista, com o editor de cálculo mostrando o número de tipos de infração

5. Qual foi o valor médio da multa para os motoristas que nunca fizeram autoescola?
  1. Para responder isso no Tableau Desktop, não é possível apenas dividir o valor total da multa por dois, já que alguns motoristas só possuem uma infração. Também não é possível calcular a multa média por motorista e fazer a média desses valores, pois calcular a média de outras médias pode levar a inconsistências. Em vez disso, será necessário calcular o valor total pago pelos motoristas que nunca fizeram autoescola, depois dividi-lo pelo número total de infrações associadas a essas multas.

    1. Primeiro, precisamos determinar se cada motorista teve uma segunda infração. É possível aproveitar o fato de que as informações em todos os campos "2nd” serão nulas se não houver segunda infração e começar a criar o cálculo:

      IFNULL([2nd Infraction Type], 'no')

      Isso retornará um tipo de infração se ela existir, ou "no” se não houver segunda infração.

    2. Em seguida, será necessário transformar essas informações no número de infrações, 1 ou 2. Se o resultado do nosso cálculo IFNULL é "no", então o motorista deve ser marcado como tendo uma multa. Qualquer outro resultado deve ser marcado como tendo duas multas. O cálculo é:

      Number of Infractions =

      IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 
      ELSE 2 
      END
    3. Agora, será necessário considerar o valor total da multa. De maneira similar à pergunta 3 acima, adicionaremos o valor da primeira e da segunda multa, com uma função ZN sendo usada no valor da segunda multa. No entanto, já que não desejamos que isso seja calculado no nível de todo o conjunto de dados, é uma prática recomendada especificar as agregações, SUM, no próprio cálculo. O cálculo é: 

      SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) )

    4. Para reunir tudo, pegamos esse valor total da multa e o dividimos pelo novo campo calculado Número de infrações para determinar o valor médio da multa:

      Average Fine = ( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])

  2. Também será necessário filtrar os motoristas que já fizeram autoescola, mas essas informações também estão armazenadas em dois campos.

    1. O Tableau é muito eficiente em cálculos numéricos. Vamos expressar isso com números para ajudar no desempenho o máximo possível. Para combinar esses dois campos, criaremos um cálculo para cada um que diz "Sim = 1” e "Não = 0” (nulo também deve ser = 0 para motoristas sem segunda infração). Ao somar o resultado desses cálculos, qualquer motorista com um valor total de 0 nunca fez autoescola (e um valor 1 ou 2 representa quantas vezes eles foram). Então é possível filtrar para manter apenas motoristas com um valor 0.

    2. Desta vez, usaremos uma declaração CASE em vez de IF. Elas funcionam de maneira muito similar, mas têm sintaxes diferente. O começo do cálculo deve se parecer com isso:

      CASE [1st Traffic School]
      WHEN 'Yes' THEN 1
      WHEN 'No' THEN 
      ELSE 0
      END
    3. E então faremos o mesmo para a segunda autoescola. É possível adicionar as duas partes no mesmo cálculo ao envolver cada declaração case em parêntesis e adicionar um sinal de mais entre elas. Ao remover algumas das quebras de linhas, se parece com isso:

      Number of Traffic School Attendances =

      (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      +
      (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      
    4. Se arrastarmos o Número de presenças na autoescola até a área Dimensões do painel Dados (acima da linha), os valores de 0 a 2 se tornarão discretos.

    5. Agora, se filtrarmos segundo Número de presenças na autoescola, podemos selecionar apenas os 0 e saber que temos apenas motoristas que nunca fizeram autoescola.

  3. Para responder à pergunta original, apenas arrastaremos Multa média até a divisória Texto no cartão Marcas.

    Já que criamos as agregações no cálculo, a agregação na pílula será AGG e não é possível alterar isso. Isso é o esperado.

Exibição de número único do valor médio pago com o editor de cálculo aberto para mostrar o Número de Frequências da Escola de Trânsito

Vá além—Dados dinamizados

Embora os dados com que estivemos trabalhando fossem bem estruturados para abordar perguntas específicas a respeito da primeira e da segunda infração, essa não é a estrutura padrão recomendada para uso com o Tableau Desktop. Quanto mais a nossa análise diverge das perguntas básicas com relação às datas das infrações, mais complicados nossos cálculos se tornam para combinar as informações relevantes em uma forma útil.

Usualmente, quando os dados são armazenados com várias colunas para o mesmo tipo de dados (como duas colunas para data, duas colunas para o valor da multa, entre outros) e informações únicas são armazenadas no nome do campo (como se é a primeira ou a segunda infração), isso é uma indicação de que os dados devem estar dinamizados.

Realizar várias tabelas dinâmicas no Tableau Prep Builder pode lidar com isso muito bem. Podemos trabalhar no final do fluxo do Tableau Prep para Infração de motorista criado no tutorial anterior Encontrar a Segunda data com o Tableau Prep.

Dica: certifique-se de que tenha voltado ao Tableau Prep para os próximos passos.

  1. Na última etapa de limpeza, adicione uma etapa de dinamização que dinamiza todos os campos duplicados. Use o ícone de mais no canto superior direito da área Campos dinamizados para adicionar mais Valores dinâmicos. Cada conjunto de campos (como Valores da primeira e segunda multas) deve ser dinamizado junto.

    Para obter mais informações sobre tabela dinâmica, consulte Limpar e formatar dados.

  2. Na área Campos dinamizados, sob a coluna Nomes da tabela dinâmica1, clique duas vezes em cada valor e renomeie-os para 1º e 2º lugar.

    Painel de configuração da Tabela dinâmica 1 no Tableau Prep mostrando as cinco tabelas dinâmicas

Os resultados podem ser limpos ao remover datas nulas assim como ao renomear e reordenar campos.

  1. Adicione uma etapa de limpeza após a dinamização. Na coluna Data da infração, clique com o botão direito do mouse na barra de nulos e escolha Excluir.

  2. Clique duas vezes no nome de campo Pivot1 Names e renomeie-o Número da infração.

  3. Arraste campos como apropriado para reordená-los como abaixo:

    Visualização dos dados dinamizados e limpos

  1. A partir dos novos dados dinâmicos, crie um resultado chamado Infrações dinamizadas do motorista e traga-o para o Tableau Desktop. (Não se esqueça de executar o fluxo após adicionar a etapa de Saída.)

Agora podemos considerar as nossas cinco perguntas novamente com essa estrutura de dados dinamizada; é possível expandir cada uma para obter informações básicas sobre como proceder se você não conseguir seguir adiante.

Observação: é possível baixar o arquivo de fluxo completo Pivoted Driver Infractions.tflx para verificar o seu trabalho ou baixar a pasta de trabalho Pivoted Driver Infractions.twbx para considerar as soluções dentro do contexto. Lembre-se de que pode haver maneiras alternativas de interpretar a análise ou de chegar às respostas.

1. Qual foi a duração em dias entre a primeira e a segunda infração de cada motorista?
  1. Para responder isso no Tableau Desktop, como fizemos com o primeiro conjunto de dados, usaremos a função DATEDIFF . Essa função requer uma data inicial e uma data final. Essas informações estão presentes em nossos dados, mas todas em um campo. Será necessário colocá-la em dois campos.

    1. Crie dois campos calculados preliminares:

      1st Infraction Date = IF [Infraction Number] = "1st" THEN [Infraction Date] END

      2nd Infraction Date = IF [Infraction Number] = "2nd" THEN [Infraction Date] END

    2. Já que desejamos garantir que esses valores estejam disponíveis para serem comparados para cada motorista, será necessário fixá-los no nível da ID do motorista.

      Observação: não acredita? Tente fazer um cálculo DATEDIFF com esses dois campos da seguinte maneira: Time Between Infractions = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])
      Você obterá resultados nulos em todos os lugares, pois o Tableau está tentando comparar uma estrutura de dados que se parece com isso:
      tabela de texto mostrando resultados nulos
      Aqui, a linha que sabe qual é a primeira data não sabe qual é a segunda data e vice-versa. Para resolver isso, usaremos uma expressão de nível de detalhe FIXED para forçar que essas primeira e segunda datas estejam relacionadas à ID do motorista.

    3. Edite cada cálculo como mostrado a seguir:

      1st Infraction Date = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Infraction Date] END ) }

      2nd Infraction Date = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Infraction Date] END ) }

      Observação: o cálculo original IF deve ser agregado quando incorporado em uma expressão de LOD. É possível usar qualquer agregação básica que preserve o valor da data (então agregações como SUM, AVG ou MIN funcionam, mas não CNT ou CNTD).

      Observação: esses cálculos também podem ser criados no Tableau Prep Builder. Para obter mais informações sobre expressões LOD no Prep, consulte Criar nível de detalhe, classificação e cálculos de bloco.

    4. Agora, é possível criar o cálculo DATEDIFF com mostrado a seguir:

      Time Between Infractions = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

      • Se desejarmos considerar semanas ou meses, apenas modifique a parte da data (atualmente 'day').

      • Também seria possível criar um único cálculo para tudo colocando os cálculos FIXED diretamente dentro de DATEDIFF: 

        DATEDIFF ( 'day',

        { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Infraction Date] END ) },

        { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Infraction Date] END ) }

        )

    5. Faça a plotagem de Tempo entre infrações em Colunas e ID do motorista em Linhas.

Os resultados serão idênticos aos dos resultados com a estrutura de dados não dinamizada.

2. Compare os valores das multas da primeira e da segunda infração. Elas estão correlacionadas?
  1. Para responder isso no Tableau Desktop, usaremos uma lógica muito similar a da pergunta anterior. Usaremos Número da infração para identificar se uma dada linha é a primeira ou a segunda infração, depois extrair o valor da multa de acordo com isso.

    1. Se tudo o que queremos fazer é plotar um gráfico de dispersão, é possível pular a parte do LOD e apenas usar o cálculo IF :

      1st Fine Amount = IF [Infraction Number] = "1st" THEN [Fine Amount] END

      2nd Fine Amount = IF [Infraction Number] = "2nd" THEN [Fine Amount] END

    2. No entanto, se desejarmos comparar e ver a diferença no valor entre a primeira e a segunda multa para um único motorista, encontraríamos o mesmo problema com os valores nulos que ocorreu com as datas. Não custa nada envolver esses cálculos em uma LOD FIXED , então pode ser melhor já fazer isso desde o começo:

      1st Fine Amount = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }

      2nd Fine Amount = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Fine Amount] END ) }

      Esses cálculos também podem ser criados no Tableau Prep Builder. Para obter mais informações sobre expressões LOD no Prep, consulte Criar nível de detalhe, classificação e cálculos de bloco.

    3. Crie um gráfico de dispersão com o Valor da primeira multa em Colunas e o Valor da segunda multa em Linhas e exiba uma linha de tendência linear, como antes.

Os resultados serão idênticos aos dos resultados com a estrutura de dados não dinamizada.

3. Qual motorista pagou mais no total? Quem pagou menos?
  1. Para responder a essa pergunta no Tableau Desktop, a estrutura de dados dinamizada é a ideal. Apenas será necessário incluir ID do motorista e Valor da multa em um gráfico de barras. A agregação padrão já é SUM, então o valor total pago pelo motorista será automaticamente plotado.

Os resultados serão idênticos aos dos resultados com a estrutura de dados não dinamizada.

4. Quantos motoristas tinham vários tipos de infrações?
  1. Para responder a essa pergunta no Tableau Desktop, a estrutura de dados dinamizada é a ideal. Apenas será necessário traçar ID do motorista e um Contagem distinta de Tipo da infração como um gráfico de barras e teremos nossa resposta.

Os resultados serão idênticos aos dos resultados com a estrutura de dados não dinamizada.

5. Qual foi o valor médio da multa para os motoristas que nunca fizeram autoescola?
  1. Para responder isso no Tableau Desktop, não é possível apenas dividir o valor total da multa por dois, já que alguns motoristas só possuem uma infração. Também não é possível calcular a multa média por motorista e fazer a média desses valores, pois calcular a média de outras médias pode levar a inconsistências. Em vez disso, será necessário calcular o valor total pago pelos motoristas que nunca fizeram autoescola, depois dividi-lo pelo número total de infrações associadas a essas multas.

    1. Primeiro, precisamos determinar se cada motorista teve uma segunda infração. É possível aproveitar o fato de que Data da segunda infração será nula se não houver segunda infração e começar a criar o cálculo:

      IFNULL(STR([2nd Infraction Date]), 'no')

      Isso retornará um tipo de infração se ela existir, ou "no” se não houver segunda infração.

      Observação: a porção STR deste cálculo é necessária porque IFNULL precisa de consistência de tipo de dados em seus argumentos. Já que desejamos retornar a cadeia de caracteres "no” para valores nulos, também será necessário converter a data em uma cadeia de caracteres.

    2. Em seguida, será necessário transformar essas informações no número de infrações, 1 ou 2. Se o resultado do nosso cálculo IFNULL é "no", então o motorista deve ser marcado como tendo uma multa. Qualquer outro resultado deve ser marcado como tendo duas multas. O cálculo é:

      Number of Infractions =

      IF IFNULL(STR([2nd Infraction Date]), 'no')= 'no' THEN 1 
      ELSE 2 
      END
      
    3. Agora, será necessário considerar o valor médio da multa. Já temos um único campo para Valor da multa. Apenas será necessário dividi-lo pelo novo campo Número de infrações e envolver os dois em SUM

      Average Fine = (SUM([Fine Amount]) / SUM([Number of Infractions])

  2. Também precisamos filtrar os motoristas que fizeram autoescola. Parece que poderíamos usar o campo Autoescola e filtrar por Autoescola = não. No entanto, isso filtraria infrações não associadas à autoescola, não motoristas que nunca frequentaram a autoescola. Se um motorista voltou à autoescola por causa de uma infração, mas não pela outra, não queremos que nenhuma das infrações seja considerada aqui. Como o motorista foi à autoescola, ele não se encaixa nos parâmetros da pergunta.

    O que desejamos fazer é filtrar qualquer motorista que tenha feito autoescola. Em termos de dados, desejamos filtrar qualquer motorista que tenha um "Yes" em Traffic School em qualquer linha, independentemente de qual infração está associada. Vamos criar nosso cálculo em estágios, em uma exibição simples para ajudar a visualizar o que está acontecendo:

    1. Primeiro, desejamos saber se um motorista tem um "Yes" em Traffic School. Arraste ID do motorista até Linhas e Autoescola até Colunas. Obteremos uma tabela de texto como um texto de espaço reservado "Abc” que indica os valores relevantes para cada motorista.

    2. Em seguida, desejamos criar um cálculo que identifique se o valor de Autoescola é "Yes". O primeiro estágio do cálculo é:

      Attended Traffic School = CONTAINS([Traffic School), 'Yes')

      Se arrastarmos Fez autoescola até a divisória Cor no cartão Marcas, veremos que ela rotula de maneira precisa como "False" cada marca na coluna "No" e como "True" cada marca na coluna "Yes".

    3. No entanto, o que realmente desejamos são estas informações no nível do motorista, não da infração. Uma expressão de LOD é uma resposta natural ao tentar calcular um resultado em um nível de detalhe diferente da estrutura básica dos dados. Faremos desta uma expressão de LOD FIXED . Mas, como sabemos, a porção da expressão agregada de uma LOD deve ser agregada. Previamente, usamos MIN. Isso funcionará aqui? Modificaremos o cálculo da maneira a seguir: 

      Attended Traffic School = { FIXED [Driver ID] : MIN( CONTAINS([Traffic School], 'Yes'))}

      Uma exibição da ID do Motorista pela Escola de Trânsito, com Escola de Trânsito Frequentada em Cores

      Com essa alteração aplicada na exibição, veremos o oposto do que desejamos. Qualquer motorista que tenha um "No” é marcado como "False” em todos os lugares. Em vez disso, desejamos ter o "Yes” como um "True” em todos os registros para aquele motorista. O que o MIN está fazendo aqui? Ele está retornando a primeira resposta em ordem alfabética, que é, "No”.

    4. E se o alterássemos para MAX? Isso retornaria a última resposta em ordem alfabética? Modificaremos o cálculo da maneira a seguir: 

      Attended Traffic School = { FIXED [Driver ID] : MAX ( CONTAINS( [Traffic School], 'Yes') ) }

      Uma exibição da ID do Motorista pela Escola de Trânsito, com Escola de Trânsito Frequentada em Cores

      E aqui temos a resposta que desejamos, se um motorista tem "Yes” em qualquer lugar dos dados, ele é marcado como "True” por ter feito autoescola, mesmo em infrações que não envolvam a autoescola.

    5. Se arrastarmos Fez autoescola até a divisória Filtros e selecionarmos apenas "False", ficaremos apenas com motoristas que nunca fizeram autoescola.

  3. Para responder à pergunta original, com o nosso filtro em ação apenas arrastaremos Multa média até a divisória Texto no cartão Marcas. Já que criamos as agregações no cálculo, a agregação no campo será AGG e não é possível alterar isso. Isso é o esperado.

Os resultados serão idênticos aos dos resultados com a estrutura de dados não dinamizada.

Vantagens dos dados dinamizados

Poderíamos continuar com a estrutura de dados original do tutorial se soubéssemos que apenas precisaríamos responder perguntas fáceis de responder com essa estrutura. No entanto, o formato de dados dinamizado é mais flexível. Mesmo que ele requeira alguns cálculos, uma vez que eles estejam em ação o conjunto de dados resultante é bem adequado para responder a perguntas mais amplas.

Vá mais além—Somente cálculos

E se você não tiver acesso ao Tableau Prep Builder? Você está totalmente sem sorte se estiver preso aos dados originais? De maneira alguma!

O Tableau Desktop e as expressões de LOD podem responder a todas as nossas perguntas de análise. Se nos conectarmos a Traffic Violations.xlsx(O link abre em nova janela) original, a sua aparência é muito similar ao conjunto de dados dinamizados—apenas sem o campo essencial Número da infração. Precisaremos imitar o resultado das etapas de agregação por meio de expressões de LOD.

Observação: é possível baixar a pasta de trabalho LOD Driver Infractions.twbx(O link abre em nova janela) para considerar as soluções dentro do contexto. Lembre-se de que pode haver maneiras alternativas de interpretar a análise ou de chegar às respostas.

1. Qual foi a duração em dias entre a primeira e a segunda infração de cada motorista?
  1. Para responder isso no Tableau Desktop, usaremos novamente a função DATEDIFF . Essa função requer uma data inicial e uma data final. Essas informações estão presentes em nossos dados, mas todas em um campo. Será necessário colocá-la em dois campos. Já que desejamos garantir que esses valores estejam disponíveis para serem comparados para cada motorista, será necessário fixá-los no nível da ID do motorista.

    1. Para encontrar a data da primeira infração, usamos o cálculo:

      1st Infraction = { FIXED [Driver ID] : MIN ( [Infraction Date] ) } 

    2. Descobriremos a data da segunda infração em estágios.

      1. Para começar, será necessário considerar apenas as datas que são maiores do que a primeira data:

        IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END

      2. Mas isso nos dará como resposta todas as infrações após a primeira e apenas desejamos a segunda. Então desejamos a menor dessas datas. Envolva tudo com MIN:

        MIN( IF [Infraction] : [1st Infraction] THEN [Infraction Date] END )

      3. Também desejamos recalcular a segunda data de infração para cada motorista. É aqui que entram as expressões de LOD. Corrigiremos isso no nível de Driver ID:

        2nd Infraction = { FIXED [Driver ID] : MIN ( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }

    3. E agora é possível criar o cálculo DATEDIFF :

      Time Between Infractions = DATEDIFF('day', [1st Infraction], [2nd Infraction])

Os resultados serão idênticos aos dos resultados com as outras duas estruturas de dados.

2. Compare os valores das multas da primeira e da segunda infração. Elas estão correlacionadas?
  1. Para responder isso no Tableau Desktop, usaremos uma lógica muito similar a da versão com dados dinamizados da pergunta. Usaremos os campos Primeira infração e Segunda infração criados para a pergunta 1 para identificar se uma dada linha é a primeira ou a segunda infração, depois extrair o valor da multa de acordo com isso.

    1. Se tudo o que queremos fazer é plotar um gráfico de dispersão, é possível pular a parte do LOD e apenas usar um cálculo IF :

      1st Fine Amount = IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END

      2nd Fine Amount = IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END

    2. No entanto, se desejarmos comparar e ver a diferença no valor entre a primeira e a segunda multa para um único motorista, encontraríamos o mesmo problema com os valores nulos que ocorreu na primeira estrutura de dados. Não custa nada envolver esses cálculos um uma LOD FIXED, então pode ser melhor já fazer isso desde o começo:

      1st Fine Amount = { FIXED [Driver ID] : MIN ( IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

      2nd Fine Amount = {FIXED [Driver ID] : MIN( IF [2ndInfraction] = [Infraction Date] THEN [Fine Amount] END ) }

Os resultados serão idênticos aos dos resultados com as outras duas estruturas de dados.

3. Qual motorista pagou mais no total? Quem pagou menos?
  1. Para responder isso no Tableau Desktop, primeiro será necessário entender algo sobre o método que usa somente LOD. Os dois métodos que usam o Tableau Prep filtram os registros que não são a primeira ou a segunda infração de um motorista. O método de LOD no Tableau Desktop mantém todos os registros. Isso significa que se criássemos uma visualização de SUM(Amount Paid) (Soma, valor pago) por ID do motorista, a versão apenas com o Tableau Desktop mostrará quantidades maiores para motoristas com mais de duas infrações. Para obter um valor de Valor total pago pelos dados completos que corresponda aos outros métodos, em vez de usar o campo original Valor da multa, será necessário somar a primeira e a segunda multa como fizemos com a primeira estrutura de dados.

  2. Usando os campos que criamos para a pergunta 2, somaremos os dois valores da multa. ZN  é necessário para evitar um resultado nulo para qualquer motorista que tenha apenas uma infração. O cálculo é: 

    Total Amount Paid = [1st Fine Amount] + ZN([2nd Fine Amount])

Os resultados serão idênticos aos dos resultados com as outras duas estruturas de dados.

4. Quantos motoristas tinham vários tipos de infrações?
  1. Para responder a essa pergunta no Tableau Desktop, não é possível apenas traçar ID do motorista e uma Contagem distinta de Tipo da infração. Já que esse conjunto de dados tem infrações além da segunda, alguns motoristas podem ter mais do que dois tipos de infração. Para que os resultados correspondam aos dos outros métodos, será necessário limitar o escopo apenas para as duas primeiras infrações.

  1. É possível extrair o primeiro e o segundo tipo de infração, envolve-los em expressões de LOD para torná-los FIXED ao motorista, depois usar um cálculo IF para contar os tipos:

    1. 1st Infraction Type = { FIXED [Driver ID] : MIN ( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

    2. 2nd Infraction Type = { FIXED [Driver ID] : MIN ( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

    3. Number of Infraction Types =

      IF [1st Infraction Type] = [2nd Infraction Type] THEN 1 
      ELSEIF [1st Infraction Type] != [2nd Infraction Type] THEN 2
      ELSE 1 END 

      Observação: também é possível criar muitos desses cálculos como um único campo ao aninhar os cálculos iniciais diretamente no cálculo maior. Aqui, o cálculo combinado teria essa aparência:
      IF
      {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      =
      {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      THEN 1

      ELSEIF
      {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      !=
      {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      THEN 2

      ELSE 1
      END


      Que é um pouco mais difícil de entender, mas funciona se preferir. (Observe que as quebras de linha e alguns espaços não influenciam em como um cálculo é interpretado pelo Tableau.)

  2. Então é possível plotar Número de tipos de infração com relação a ID do motorista e ordenar o gráfico de barras.

Os resultados serão idênticos aos dos resultados com as outras duas estruturas de dados.

5. Qual foi o valor médio da multa para os motoristas que nunca fizeram autoescola?
  1. Para responder isso no Tableau Desktop, não é possível apenas dividir o valor total da multa por dois, já que alguns motoristas só possuem uma infração. Também não é possível calcular a multa média por motorista e fazer a média desses valores, pois calcular a média de outras médias pode levar a inconsistências. Em vez disso, será necessário calcular o valor total pago pelos motoristas que nunca fizeram autoescola, depois dividi-lo pelo número total de infrações associadas a essas multas.

    1. Primeiro, precisamos determinar se cada motorista teve uma segunda infração. É possível aproveitar o fato de que as informações em todos os campos "2nd” serão nulas se não houver segunda infração e começar a criar o cálculo:

      IFNULL([2nd Infraction Type], 'no')

      Isso retornará um tipo de infração se ela existir, ou "no” se não houver segunda infração.

    2. Em seguida, será necessário transformar essas informações no número de infrações, 1 ou 2. Se o resultado do nosso cálculo IFNULL é "no", então o motorista deve ser marcado como tendo uma multa. Qualquer outro resultado deve ser marcado como tendo duas multas. O cálculo é:

      Number of Infractions =

      IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1
      ELSE 2
      END
    3. Para o valor total pago, é possível usar o cálculo da pergunta 3. Para reunir tudo, pegamos esse valor total da multa e o dividimos pelo novo campo calculado Número de infrações para determinar o valor médio da multa:

      Average Fine = SUM([Total Amount Paid]) / SUM([Number of Infractions])

  2. Também precisamos filtrar os motoristas que fizeram autoescola. Já que esse conjunto de dados contém alguns motoristas com uma terceira ou quarta infração, não é possível usar o mesmo método que o usado para a estrutura de dados dinamizada. Em vez disso, seguiremos o mesmo método usado para os dados não dinamizados, resumido aqui:

    1. Primeiro, será necessário criar dois cálculos que identifiquem se a primeira e a segunda infração envolveram autoescola ou não: 

      1st Traffic School = { FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }

      2nd Traffic School = { FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }

    2. Então adicionaremos esses valores para obter o número total de pessoas que fizeram autoescola: 

      Number of Traffic School Attendances =

      (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      +
      (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
    3. Se arrastarmos o Número de presenças na autoescola até a área Dimensões do painel Dados, os valores de 0 a 2 se tornarão discretos.

    4. Agora, se filtrarmos segundo Número de presenças na autoescola, podemos selecionar apenas os 0 e saber que temos apenas motoristas que nunca fizeram autoescola.

  3. Para responder à pergunta original, apenas arrastaremos Multa média até a divisória Texto no cartão Marcas. Já que criamos as agregações no cálculo, a agregação no campo será AGG e não é possível alterar isso. Isso é o esperado.

Os resultados serão idênticos aos dos resultados com as outras duas estruturas de dados.

É importante lembrar que esta solução tem muitos cálculos aninhados e expressões de LOD. Dependendo do tamanho do conjunto de dados e da complexidade dos dados, o desempenho pode ser prejudicado.

Reflexão sobre métodos

Que caminho você deve seguir? Isso só depende de você e das ferramentas a sua disposição.

  • Se desejar ficar longe de LODs, há uma solução de formação de dados, embora cálculos possam ser necessários para algumas análises (Análise no Tableau Desktop).

  • Se é possível formar os dados e você se sente confortável em fazer cálculos—inclusive LODs—a segunda opção oferece a maior flexibilidade (Vá além—Dados dinamizados).

  • Se você se sente confortável com LODs, há uma influência mínima no desempenho e/ou você não tem acesso ao Tableau Prep, resolver isso apenas com LODs é uma opção viável (Vá mais além—Somente cálculos).

No mínimo, valer a pena entender como a agregação no Tableau Prep e as expressões de nível de detalhe no Tableau Desktop estão interrelacionadas e influenciam na análise de dados. Assim como na maioria das vezes no Tableau, há mais de uma maneira de se fazer o que for necessário. Explorar todas as várias opções pode ajudar a reunir conceitos e permitir que você escolha a melhor solução para você.

Os cálculos usaram:

Infrações dos motoristas

  • Time Between Infractions = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

  • Total Amount Paid =[1st Fine Amount] + ZN([2nd Fine Amount])

  • Number of Infraction Types = IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END

  • Number of Infractions = IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END

  • Average Fine = ( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])

  • Number of Traffic School Attendances = (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)

Infrações dinamizadas dos motoristas

  • 1st Infraction = {FIXED [Driver ID] : MIN(IF [Infraction Number] = "1st" THEN [Infraction Date] END)}

  • 2nd Infraction = {FIXED [Driver ID] : MIN(IF [Infraction Number] = "2nd" THEN [Infraction Date] END)}

  • Time Between Infractions = DATEDIFF('day', [1st Infraction], [2nd Infraction])

  • 1st Fine Amount = {FIXED [Driver ID] : MIN( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }

  • Number of Infractions = IF IFNULL(STR([2nd Infraction]), 'no')= 'no' THEN 1 ELSE 2 END

  • Average Fine = SUM([Fine Amount])/SUM([Number of Infractions])

  • Attended Traffic School = { FIXED [Driver ID] : MAX( CONTAINS([Traffic School], 'Yes'))}

Infrações dos motoristas com LOD

  • 1st Infraction = {FIXED [Driver ID] : MIN([Infraction Date])}

  • 2nd Infraction = { FIXED [Driver ID] : MIN( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }

  • Time Between Infractions = DATEDIFF('day', [1st Infraction], [2nd Infraction])

  • 1st Fine Amount = {FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

  • 2nd Fine Amount = {FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

  • Total Amount Paid = [1st Fine Amount] + ZN([2nd Fine Amount])

  • 1st Infraction Type = {FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

  • 2nd Infraction Type = {FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

  • Number of Infraction Types = IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END

  • Number of Infractions = IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END

  • Average Fine = SUM ([Total Amount Paid]) / SUM([Number of Infractions])

  • 1st Traffic School = {FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }

  • 2nd Traffic School = {FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }

  • Number of Traffic School Attendances = (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)

Observação: agradecimento especial ao tópico do Workout Wednesday da Ann Jackson Os clientes gastam mais na primeira ou na segunda compra?(O link abre em nova janela) e a dica para o Tableau Prep do Andy Kriebel Retornar a primeira e a segunda data de compra(O link abre em nova janela), que forneceram a inspiração inicial para este tutorial. Clicar nestes links o levará para fora do site do Tableau. A Tableau não pode ser responsabilizada pela exatidão ou pela atualidade de páginas mantidas por provedores externos. Entre em contato com os proprietários se você tiver dúvidas a respeito do conteúdo deles.

Agradecemos seu feedback!Seu feedback foi enviado. Obrigado!