Com base no código acima, e nos conceitos de Pandas e análise de dados, é correto afirmar que:
Ao código utiliza fillna() para substituir valores ausentes por zero, o que pode enviesar a distribuição dos dados.
Ba função cut() cria intervalos categóricos baseados na variável score_credito e substitui valores ausentes por “desconhecido”.
Ca normalização do score de crédito transforma os dados em uma escala entre 0 e 1, facilitando a aplicação de algoritmos de machine learning.
Do agrupamento final calcula a média do tempo de contrato por faixa etária, considerando apenas os clientes que cancelaram o serviço.
Eo método groupby() não pode ser utilizado após filtragem condicional com colchetes, sendo necessário aplicar query() previamente.
Revelar gabarito e comentário▾
GabaritoD — o agrupamento final calcula a média do tempo de contrato por faixa etária, considerando apenas os clientes que cancelaram o serviço.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Pandas: manipulação de dados e análise de churn
Gabarito: letra D. O código final agrupa os clientes que cancelaram (df[df["churn"] == 1]) por faixa etária (groupby("idade_faixa")) e calcula a média do tempo de contrato (mean()), exatamente como descreve a alternativa D. As demais alternativas distorcem o comportamento real dos métodos Pandas utilizados.
O trecho apresentado é um pipeline típico de análise de churn: primeiro trata valores ausentes, depois cria uma nova coluna categórica, normaliza uma variável numérica e, por fim, agrega os dados para extrair um insight. Vamos entender cada etapa, pois é isso que a questão cobra — não decoreba de sintaxe, mas a compreensão do que cada método faz.
1. Tratamento de valores ausentes com fillna() — A linha df["tempo_contrato"].fillna(df["tempo_contrato"].median(), inplace=True) substitui os valores nulos da coluna tempo_contrato pela mediana da própria coluna. A mediana é uma medida de tendência central robusta a outliers, e essa técnica é chamada de imputação por mediana. O parâmetro inplace=True modifica o DataFrame original sem precisar reatribuir. A alternativa A afirma que o preenchimento é feito com zero — isso está errado, pois o valor usado é a mediana, não zero. Preencher com zero seria uma escolha inadequada, pois distorceria a distribuição, mas não é o que o código faz.
2. Criação de faixas etárias com pd.cut() — A função pd.cut() discretiza uma variável contínua em intervalos (bins). No código, bins=[0, 25, 40, 60, np.inf] define quatro intervalos: (0, 25], (25, 40], (40, 60], (60, ∞). Os rótulos correspondentes são "Jovem", "Adulto", "Meia-idade" e "Idoso". A variável usada é df["idade"], não score_credito como afirma a alternativa B. Além disso, pd.cut() não substitui valores ausentes por "desconhecido" — se houvesse NaN em idade, eles permaneceriam como NaN na nova coluna (a menos que se usasse include_lowest ou outro tratamento). A alternativa B mistura dois conceitos: a base da discretização (idade) e o tratamento de ausentes (que não ocorre aqui).
3. Normalização z-score — A linha df["score_normalizado"] = (df["score_credito"] - df["score_credito"].mean()) / df["score_credito"].std() aplica a padronização (z-score), que transforma os dados para terem média 0 e desvio padrão 1. Isso é diferente da normalização min-max, que escala os valores para um intervalo [0, 1]. A alternativa C confunde os dois métodos: o z-score não limita os valores a 0 e 1; ele pode gerar valores negativos e positivos. A normalização min-max seria (x - min) / (max - min). Ambos são usados em machine learning, mas têm efeitos distintos.
4. Agrupamento e agregação — A última linha df_churn = df[df["churn"] == 1].groupby("idade_faixa")["tempo_contrato"].mean() faz o seguinte: primeiro filtra o DataFrame para manter apenas as linhas onde churn é igual a 1 (clientes que cancelaram), depois agrupa por idade_faixa e calcula a média de tempo_contrato para cada grupo. O resultado é uma Series com a média do tempo de contrato por faixa etária, apenas para os churners. A alternativa D descreve exatamente isso.
5. groupby() após filtragem — A alternativa E afirma que groupby() não pode ser usado após filtragem com colchetes, o que é falso. Em Pandas, é perfeitamente válido encadear uma filtragem booleana com groupby(). O método query() é uma alternativa para filtrar, mas não é um pré-requisito. O código df[df["churn"] == 1].groupby(...) funciona normalmente.
A pegadinha central desta questão é a troca de conceitos: a banca mistura imputação por zero com mediana, discretização por idade com score, z-score com min-max, e ainda inventa uma restrição inexistente sobre groupby(). O candidato que domina o significado de cada método identifica a única alternativa que descreve corretamente o fluxo.
Filtra churn=1, agrupa por faixa etária, calcula média do tempo de contrato
A: usa mediana, não zero; B: usa idade, não score; C: z-score, não min-max; E: groupby() funciona após filtragem
Conceito-chave
Agregação condicional pós-filtro
A: imputação; B: discretização; C: padronização vs. normalização; E: encadeamento de métodos
Erro na alternativa
Nenhum — descrição fiel ao código
A: troca mediana por zero; B: troca idade por score e inventa imputação; C: confunde z-score com escala 0-1; E: inventa restrição inexistente
Alternativa A — ❌ Incorreta
A alternativa afirma que fillna() substitui valores ausentes por zero. No código, o valor usado é a mediana da coluna tempo_contrato: df["tempo_contrato"].fillna(df["tempo_contrato"].median(), inplace=True). Preencher com zero seria uma escolha que poderia enviesar a distribuição, mas não é o que o código faz. O erro está em trocar a medida de tendência central (mediana) por um valor fixo (zero).
Alternativa B — ❌ Incorreta
A alternativa afirma que cut() cria intervalos baseados em score_credito e substitui ausentes por "desconhecido". Na verdade, pd.cut() é aplicado à coluna idade (pd.cut(df["idade"], bins=[0, 25, 40, 60, np.inf], labels=[...])). Além disso, cut() não trata valores ausentes — se houvesse NaN em idade, eles permaneceriam como NaN na nova coluna. A alternativa mistura a variável de entrada (idade) com outra (score) e inventa um comportamento de imputação.
Alternativa C — ❌ Incorreta
A alternativa afirma que a normalização transforma os dados em escala 0 a 1. O código aplica a padronização z-score: (x - média) / desvio padrão, que resulta em dados com média 0 e desvio padrão 1, podendo assumir valores negativos e positivos. A escala 0 a 1 é obtida pela normalização min-max: (x - min) / (max - min). A alternativa confunde os dois métodos de escalonamento.
Alternativa D — ✅ Correta ⟵ GABARITO
A alternativa descreve com precisão o que a última linha do código faz: df[df["churn"] == 1] filtra apenas os clientes que cancelaram (churn = 1), .groupby("idade_faixa") agrupa por faixa etária, e ["tempo_contrato"].mean() calcula a média do tempo de contrato para cada grupo. O resultado é a média do tempo de contrato por faixa etária, considerando somente os churners. É exatamente o que a alternativa afirma.
Alternativa E — ❌ Incorreta
A alternativa afirma que groupby() não pode ser usado após filtragem com colchetes, exigindo query(). Isso é falso: em Pandas, é perfeitamente válido encadear uma filtragem booleana com groupby(). O código df[df["churn"] == 1].groupby(...) é sintaticamente correto e amplamente utilizado. O método query() é apenas uma alternativa de filtragem, não um requisito.