Questão nº 62
Questão de Análise de Dados · FGV TCU 2021 (nº 62)
Natasha, uma cientista de dados, está trabalhando com um conjunto de dados sobre carros para fazer um modelo preditivo para uma companhia de seguros. A primeira versão do modelo utiliza apenas informações básicas sobre os carros: a marca e a cor.
Como esses dados são categóricos, Natasha faz um pré-processamento usando a biblioteca scikit-learn. Em um ambiente interativo, ela executa os comandos a seguir.
```
>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> X = [['Toyota', 'vermelho'], ['Toyota', 'verde'], ['BMW', 'vermelho']]
>>> enc.fit(X)
>>> enc.get_feature_names()
array(['x0_BMW', 'x0_Toyota', 'x1_verde', 'x1_vermelho'], dtype=object)
>>> X_prime = enc.transform(X).toarray()
>>> X_prime
array([[0., 1., 0., 1.], [0., 1., 1., 0.], [1., 0., 0., 1.]])
```
Para contar o número de carros da marca Toyota no conjunto de dados, obtendo corretamente o resultado 2, Natasha pode usar a seguinte linha de código:
- A
len([i for i in X if i == 'Toyota']) - B
len([i for i in X_prime if i[0] == 1]) - C`sum([i for i in X if 'Toyota' in i])`
- D`sum(X_prime)[1]` (alternativa correta)
- E`sum(X_prime[:,0])`
Resposta comentada
Gabarito Alternativa D
One-Hot Encoding é uma técnica de pré-processamento que transforma dados categóricos (como nomes de marcas ou cores) em um formato numérico binário (0s e 1s) que modelos de machine learning podem processar. Para cada categoria única em uma coluna original, uma nova coluna é criada, e um '1' indica a presença daquela categoria, enquanto um '0' indica sua ausência.
- (A) Incorreta: A condição
i == 'Toyota'compara uma lista (uma linha deX, por exemplo['Toyota', 'vermelho']) com uma string ('Toyota'), o que sempre resultará emFalse. Portanto, a lista resultante será vazia elen()retornará 0. - (B) Incorreta: A coluna de índice
0emX_primecorresponde à categoriax0_BMW(BMW), conforme definido porenc.get_feature_names(). Assim,i[0] == 1contaria os carros da marca BMW, não Toyota. - (C) Incorreta: Embora a list comprehension
[i for i in X if 'Toyota' in i]identifique corretamente as linhas que contêm 'Toyota', a funçãosum()não pode ser aplicada diretamente a uma lista de listas (como[['Toyota', 'vermelho'], ['Toyota', 'verde']]) para contar elementos. Ela resultaria em um erro (TypeError) ou não produziria o resultado desejado. A armadilha aqui é que a lógica de filtragem está correta, mas a função de agregação (sum()) é usada de forma inadequada para contar. - (D) Correta: Quando a função
sum()embutida do Python é aplicada a um array NumPy bidimensional (comoX_prime), ela realiza uma soma elemento a elemento ao longo do primeiro eixo (ou seja, soma as linhas). O resultado é um novo array onde cada elemento é a soma dos valores da respectiva coluna. No caso deX_prime,sum(X_prime)resultaria em[1., 2., 1., 2.]. Este array representa a contagem de cada categoria na ordem em que aparecem emenc.get_feature_names():[count(BMW), count(Toyota), count(verde), count(vermelho)]. Como 'Toyota' corresponde ao índice1,sum(X_prime)[1]retorna2, que é a contagem correta de carros Toyota. - (E) Incorreta:
X_prime[:,0]seleciona todos os elementos da primeira coluna deX_prime. Conformeenc.get_feature_names(), a primeira coluna (x0_BMW) representa a marca BMW. Assim,sum(X_prime[:,0])contaria os carros da marca BMW, não Toyota.
Fonte: FGV TCU 2021 Auditor Federal de Controle Externo - Área Controle Externo (AUFC-CE) (Caderno Tipo 1). Reproduzida para fins de estudo.