Resolvendo case para processo seletivo de analista de dados no Linkedin

Jul 29 / REF. Nathan Rosidi
Neste artigo, trabalharemos com uma das perguntas comuns da entrevista de cientistas de dados do LinkedIn que exigem uma ampla gama de habilidades de SQL.

A pergunta da entrevista do cientista de dados do LinkedIn que estamos resolvendo tem várias maneiras de chegar a uma solução, mas vamos simplificar o processo de solução de problemas trabalhando em pequenas etapas. Continue lendo para ver como aproveitamos uma estrutura que você pode aplicar a qualquer desafio de ciência de dados para dividir essa pergunta de entrevista de cientista de dados do LinkedIn de dificuldade média em partes mais gerenciáveis.

O LinkedIn começou em 2003 com o objetivo de conectar os profissionais e especialistas do mundo para aumentar o sucesso de suas carreiras. Com mais de 750 milhões de membros em todo o mundo, o LinkedIn tem mais profissionais do que qualquer outra rede social, desde aqueles que começaram sua carreira até executivos de todas as empresas da Fortune 500.

Operacionalmente, o LinkedIn é uma empresa global com uma ampla variedade de modelos de receita envolvendo soluções de marketing, talentos, vendas e associação.

Cargo de Cientista de Dados no LinkedIn

Os cargos de cientista de dados do LinkedIn geralmente trabalham para a equipe de ciência de dados, que pertence à divisão maior de engenharia de dados. Como membro da equipe de Data Science, você aproveitará os dados de mais de 700 milhões de membros para fornecer insights sobre produtos, vendas, marketing, economia, infraestrutura e outras equipes.

Esses insights de dados orientarão a estratégia, aplicarão inferência estatística e algoritmos para otimização e criarão soluções projetadas para dimensionar os objetivos de negócios contínuos do LinkedIn e a visão de longo prazo da empresa.

As posições de Cientista de Dados no LinkedIn exigem habilidades com SQL, dados estruturados e não estruturados, sistemas de dados distribuídos, linguagens de programação como R ou Python, fluxos de trabalho de dados e muito mais. Para obter informações adicionais sobre a equipe de Data Science no LinkedIn, aqui está sua página oficial .

Conceitos testados nas perguntas da entrevista do cientista de dados do LinkedIn

As principais habilidades de SQL que você mostraria em um desafio de entrevista de cientista de dados do Linkedin incluem:

  • Uso de operações aritméticas básicas em colunas de dados
  • Usando subconsultas
  • Uso de JOIN para combinar tabelas de dados
  • Como usar a função CEILING
  • Como converter dados inteiros em dados de ponto flutuante
  • Usando WHERE para filtrar resultados

O problema que veremos a seguir requer conhecimento de vários desses conceitos, e você poderá aplicá-los em seu próprio código na plataforma StrataScratch para entendê-los melhor e ficar pronto para a entrevista.

LinkedIn pergunta de entrevista de cientista de dados

Projetos arriscados

Essa pergunta foi ouvida em uma entrevista para um cargo de cientista de dados no LinkedIn. É intitulado “Projetos arriscados”, e o principal desafio é descobrir quais projetos do LinkedIn estão acima do orçamento usando dados de conjuntos diferentes.
Em última análise, a questão está nos pedindo para usar os salários dos funcionários, a duração do projeto e o orçamento do projeto para determinar quais projetos excedem as expectativas.

Essa pergunta da entrevista do cientista de dados do LinkedIn é realmente mais do tipo médio-difícil do que médio, pois, como veremos, a resposta requer subconsultas, cálculos de várias colunas e junção de várias tabelas de dados. Embora existam várias maneiras de resolver essa questão, vamos nos concentrar em uma solução flexível que mostra nosso conhecimento de vários conceitos importantes de SQL.

Estrutura para resolver o problema

Um dos princípios mais importantes ao responder a problemas de ciência de dados é começar com uma estrutura. Descreveremos uma estrutura de três etapas que cria um processo lógico para abordar e resolver esse problema por meio de código. Estamos adaptando essa estrutura para a questão em questão, mas, com alguns ajustes simples, você pode enquadrar qualquer outra questão. Aqui estão nossos passos:

1. Entenda seus dados:

a). Primeiro, olhe para todas as colunas que a pergunta lhe dá e faça algumas suposições sobre os dados. Se você receber várias tabelas, anote quais dados cada uma das tabelas está fornecendo e como você pode precisar deles para sua resposta.

b). Se você não entender o esquema, veja se pode examinar alguns dados de exemplo. Observe as primeiras linhas e tente corresponder por que os valores se correlacionam com suas respectivas colunas. Não hesite em pedir ao entrevistador do LinkedIn por valores de exemplo se você não receber nenhum inicialmente. Ver dados de amostra pode ajudá-lo a estabelecer limites para sua solução ou determinar se você precisa ampliá-la para casos extremos.

2. Formule sua abordagem:

a). Comece a escrever programação lógica ou etapas de código. Não precisa estar em ordem primeiro. Na verdade, a solução que fornecemos aqui também não estará em ordem, pois consultamos as datas do projeto antes de recebermos o salário neste problema.

b). É útil identificar as principais funções que você deve usar para realizar seus cálculos. Tente traduzir a declaração do problema e os dados em uma série de funções SQL.

c). Tente não ficar em silêncio ao descobrir a solução. Seu entrevistador do LinkedIn vai querer entender como você aborda os problemas. Você pode pedir esclarecimentos e esperar que eles especifiquem se você precisa escrever tudo do zero.

3. Execução do Código:

a). É importante construir o código de forma a evitar apresentar uma solução simplificada ou complicada demais. Aproveite o espaço em branco entre as subconsultas para manter sua solução organizada. Nunca há mal algum em comentar um bloco de código ao qual você deseja retornar mais tarde.

b). Siga as etapas descritas no início. Isso ajudará você a evitar confusão e garantir que você esteja respondendo a todas as perguntas.

c). Mais importante ainda, pense em suas funções e operações. O uso desses poços pode produzir soluções eficientes e genéricas.

d). Fale através do seu código com o entrevistador do LinkedIn. Eles vão avaliar suas habilidades de resolução de problemas quando você começar a escrever.

Entenda seus dados

O primeiro passo em nossa estrutura é examinar nossos dados. Normalmente, você não terá acesso a dados reais nem poderá executar código durante entrevistas como as do LinkedIn. Normalmente, você terá que entender os dados e, em vez disso, fazer suposições com base no esquema e nas informações que o entrevistador fornece.

No caso desta pergunta da entrevista do cientista de dados do LinkedIn, a pergunta nos fornece o esquema para três tabelas, portanto, precisamos começar analisando o que há em cada tabela.

linkedin_projects

Esta tabela linkedin_projects nos informa há quanto tempo um projeto está em execução, seu orçamento e seu id.

linkedin_emp_projects

A tabela linkedin_emp_projects mapeia quais funcionários trabalham em quais projetos.

linkedin_employees

Linkedin_employees nos informa o salário de cada funcionário e seu id. Como precisamos saber o salário, os IDs do funcionário e do projeto, a duração do projeto e o orçamento do projeto para calcular quais projetos estão acima do orçamento, teremos que juntar os dados das três tabelas usando os IDs. Também podemos concluir neste ponto que seremos capazes de descartar algumas colunas irrelevantes, como títulos de projetos e nomes e sobrenomes de funcionários.

Solução:

Formular Abordagem

De acordo com nossa estrutura, desejaremos descrever algumas etapas gerais para traduzir em código. Vamos mantê-lo em alto nível e ser mais específico mais tarde, mas descrever essas etapas inicialmente facilitará a escrita do código. Aqui estão os passos gerais:
  1. Consulte linkedin_projects e use subtração e conversão de tipo de ponto flutuante para obter as durações totais do projeto em anos

  2. Coloque nossa primeira consulta de lado enquanto JOIN nossas tabelas linkedin_emp_projects e linkedin_employees no ID do funcionário para obter um salário anual para cada ID do projeto

  3. JUNTE-SE à nossa consulta inicial ao salário anual do projeto no ID do projeto

  4. Calcule a despesa rateada do funcionário multiplicando o salário anual do projeto pela duração do projeto e complete nossa saída usando a função CEILING

  5. Use uma cláusula WHERE para filtrar projetos acima do orçamento

Calcular as durações do projeto

Vamos traduzir as etapas gerais que estabelecemos em código SQL funcional. Para a primeira etapa, começamos consultando a tabela linkedin_projects e subtraindo a data_final do projeto da data_inicial do projeto. Não precisamos nos preocupar com diferenças estranhas aqui, pois data_final sempre será após data_inicial. Como nossos dados salariais estão em anos, também devemos converter o comprimento do projeto em uma fração de anos e precisaremos convertê-lo como um decimal de ponto flutuante para evitar que os resultados sejam arredondados para 0.

SELECT id,
       título,
       orçamento,
       data_inicial,
       data_final,
       data_final - data_inicial AS project_duration
FROM linkedin_projects
Temos a duração do projeto em dias, então vamos dividir por 365 para obter em anos para comparar com os salários anuais:

SELECT id,
       título,
       orçamento,
       data_inicial,
       data_final,
       (data_final - data_inicial)/365 AS project_duration
FROM linkedin_projects
Como dividimos inteiro por inteiro, nosso cálculo é arredondado para 0, pois todos os projetos são menores que um ano. Vamos converter o denominador 365 como um float para obter o valor decimal da duração do projeto em anos.

SELECT id,
       título,
       orçamento,
       data_inicial,
       data_final,
       (data_final - data_inicial)/365::float AS project_duration
FROM linkedin_projects
Agora temos a duração do projeto como uma parte decimal de um ano.
Mais tarde, podemos usar esse valor e os salários anuais coletivos de todos os funcionários do projeto para obter as despesas totais do projeto.

Calcular o salário anual dos funcionários por projeto

Sinta-se à vontade para comentar seu código existente enquanto criamos nossa próxima consulta. Antes de prosseguirmos, aqui está uma oportunidade de testar interativamente o cálculo da duração do projeto da seção anterior e o salário anual por consulta de projeto para esta seção:

SELECT *
FROM linkedin_emp_projects ep
JOIN linkedin_employees e ON ep.emp_id = e.id

Como precisamos saber o salário anual de todos os funcionários em um projeto, nossa próxima etapa inclui a combinação de linked_emp_projects mostrando quais funcionários trabalham em quais projetos com dados de salário de funcionários de linkedin_employees para obter salário por projeto.

Vemos que ambas as tabelas têm uma coluna para ids de funcionários, então é bastante óbvio juntá-las nesses ids.
Lembre-se de que precisamos somar os salários por projeto, então também GROUP BY project id.

SELECT project_id,
       SUM(salary) AS project_yearly_salary
FROM linkedin_emp_projects ep
JOIN linkedin_employees e ON ep.emp_id = e.id
GROUP BY project_id
Agora temos um salário anual por projeto, e está bem claro que nosso próximo passo é combinar o conjunto de dados de salário anual do projeto com o conjunto de dados linkedin_projects.

Unindo todos os conjuntos de dados

Vamos descomentar nosso código original e JOIN os conjuntos de dados no project_id. Observe que encerramos e damos um nome ao nosso conjunto de dados de salário anual do projeto para concluir a junção.

SELECT id,
       title,
       budget,
       start_date,
       end_date,
       (end_date - start_date)/365::float AS project_duration,
       project_yearly_salary
FROM linkedin_projects
JOIN
  (SELECT project_id,
          SUM(salary) AS project_yearly_salary
   FROM linkedin_emp_projects ep
   JOIN linkedin_employees e ON ep.emp_id = e .id
   GROUP BY project_id) yearly_salary ON linkedin_projects.id = yearly_salary.project_id
Isso conclui a junção de todos os nossos conjuntos de dados. Em uma tabela, temos todas as informações que precisamos para qualquer projeto para calcular se está acima do orçamento ou não. A partir deste ponto, podemos descartar algumas das colunas, como id e datas, para simplificar nossa tabela.

SELECT título,
       orçamento,
       (end_date - start_date)/365::float AS project_duration,
       project_yearly_salary
Antes de encerrarmos as duas últimas etapas desta pergunta da entrevista do cientista de dados do LinkedIn, aqui está outra oportunidade de praticar essa pergunta de forma interativa. Veja se você pode concluir o cálculo de despesas por projeto e determinar quais projetos estão acima do orçamento:

SELECT id,
       budget,
       (end_date - start_date)/365::float AS project_duration,
       project_yearly_salary
FROM linkedin_projects
JOIN
  (SELECT project_id,
          SUM(salary) AS project_yearly_salary
   FROM linkedin_emp_projects ep
   JOIN linkedin_employees e ON ep.emp_id = e.id
   GROUP BY project_id) yearly_salary ON linkedin_projects.id = yearly_salary.project_id

A despesa rateada com funcionários é um cálculo bastante simples, exigindo apenas que multipliquemos a duração do projeto pelo salário anual do projeto.

SELECT title,
       budget,
       (end_date - start_date)/365::float * project_yearly_salary AS prorated_employee_expense
FROM linkedin_projects
JOIN
  (SELECT project_id,
          SUM(salary) AS project_yearly_salary
   FROM linkedin_emp_projects ep
   JOIN linkedin_employees e ON ep.emp_id = e.id
   GROUP BY project_id) salário_anual 
Nossa saída não é arredondada, então aplicamos uma função CEILING para obter um prorated_employee_expense em um formato em que possamos compará-lo melhor com o orçamento. Lembre-se de que uma função CEILING retornará o menor valor inteiro que for maior ou igual à entrada, portanto, sempre arredondará para cima qualquer ponto flutuante diferente de um número inteiro.

SELECT título,
       orçamento,
       CEILING((end_date - start_date)/365::float* project_yearly_salary) AS prorated_employee_expense
FROM linkedin_projects
Nossas despesas são arredondadas e parecem mais comparáveis ​​aos números do orçamento. Para finalizar nossa resposta, tudo o que precisamos fazer é comparar o orçamento com a despesa rateada do funcionário.

Filtrar projetos que estão acima do orçamento

Estamos essencialmente comparando dois números inteiros neste momento representando o orçamento do projeto e a despesa rateada do projeto com funcionários. Como a pergunta nos pede para apresentar apenas projetos que estão acima do orçamento, podemos usar uma cláusula WHERE para filtrar quaisquer projetos abaixo do orçamento. Lembre-se de que teremos que repetir nosso cálculo de despesas rateadas com funcionários na cláusula WHERE devido às limitações da sintaxe SQL. Veja como é nossa solução completa:

SELECT título,
       orçamento,
       CEILING((end_date - start_date)/365::float * project_yearly_salary) AS prorated_employee_expense
FROM linkedin_projects
JOIN
  (SELECT project_id,
          SUM(salary) AS project_yearly_salary
   FROM linkedin_emp_projects ep
   JOIN linkedin_employees e ON ep.emp_id = e.id
   GROUP POR project_id) yearly_salary ON linkedin_projects.id = yearly_salary.project_id
ONDE ((end_date - start_date)/365::float*project_yearly_salary) > orçamento 
Esta nova saída mostra que estão faltando vários projetos que se correlacionam com aqueles que estão abaixo do orçamento. Embora o resultado contenha mais do que esses cinco projetos, você verá que todos os resultados têm um valor prorated_employee_expense superior ao orçamento do projeto.

Agora resolvemos para a resposta correta. A solução acabou sendo um pouco complexa com várias junções, operações aritméticas e manipulações de tipos, mas ainda é flexível o suficiente para lidar com vários conjuntos de dados que seguem esse esquema. Além disso, ele exibe uma variedade de diferentes habilidades de SQL que seu entrevistador pode apreciar.

Conclusão

Neste artigo, abordamos uma das perguntas de entrevista de cientista de dados do LinkedIn de dificuldade média com código complexo, mas robusto. Esta não é a única maneira de responder a esta pergunta, por isso recomendamos tentar ver se você pode encontrar outras maneiras que sejam mais ou menos eficientes.
Created with