1 Introdução

1.1 Declaração do Problema

Com a crescente industrialização do setor alimentício e a ampla variedade de produtos disponíveis no mercado global, torna-se essencial compreender como os alimentos consumidos em diferentes países são compostos e classificados nutricionalmente. Os consumidores estão cada vez mais preocupados com a segurança dos alimentos (Meixner; Katt (2020)), o que tem influenciado suas escolhas de consumo.

Estatísticas de vendas de alimentos indicam um maior consumo de alimentos ultraprocessados em países de alta renda, mas um crescimento rápido e exponencial em países de renda média. Entre 1998 e 2012, as vendas de snacks e de refrigerantes aumentaram em 50% nos países de renda média/alta e em mais de 100% nos países de renda média/baixa (Monteiro et al. (2013)). Inquéritos nacionais mostram que alimentos ultraprocessados já são metade ou mais do total da energia consumida em alguns países de alta renda, como Estados Unidos, Canadá e Reino Unido (Steele et al. (2016); Moubarac et al. (2017); Rauber et al. (2018); Machado et al. (2019)). No Brasil, pesquisas de aquisição de gêneros alimentícios para o consumo domiciliar, realizadas nas áreas metropolitanas entre 1987-1988 e 2008-2009 (Martins et al. (2013)) e no país como um todo entre 2002-2003 e 2017-2018 (BRASIL (2020)), indicam aumentos sistemáticos na participação de alimentos ultraprocessados e redução concomitante dos alimentos in natura ou minimamente processados e de ingredientes culinários.

A classificação NOVA, proposta por pesquisadores da Universidade de São Paulo, oferece um novo paradigma para avaliar alimentos, focando no grau e propósito do processamento industrial. O sistema divide os alimentos em quatro grupos: 1) in natura ou minimamente processados; 2) ingredientes culinários processados; 3) alimentos processados; e 4) alimentos ultraprocessados. O foco da NOVA é orientar a saúde pública e as escolhas individuais, recomendando uma dieta baseada nos primeiros grupos e alertando sobre os riscos do consumo de ultraprocessados, que são formulações industriais com alto teor de aditivos.

Alimentos ultraprocessados, como definidos pela classificação NOVA, são formulações industriais de substâncias extraídas ou derivadas de alimentos, que contêm pouco ou nenhum alimento inteiro em sua composição e que são tipicamente adicionadas de flavorizantes, corantes, emulsificantes e outros aditivos que modificam os atributos sensoriais do produto final. Os ingredientes e procedimentos utilizados na fabricação de alimentos ultraprocessados visam criar produtos de baixo custo, hiperpalatáveis e convenientes, com potencial para substituir alimentos in natura ou minimamente processados (Monteiro et al. (2019)). Evidências crescentes apontam que grande parte desse mecanismo pode estar associada a distúrbios na homeostase da microbiota intestinal causados pelo consumo de alimentos ultraprocessados (Zinöcker; Lindseth (2018); Miclotte; Van de Wiele (2020)).

Objetivo e Abordagem

Diante desse contexto, este estudo utiliza dados do dataset Open Food Facts, que reúne informações sobre produtos alimentícios vendidos em diversos países, para analisar suas características nutricionais e o grau de processamento. Para isso, emprega-se pré-processamento de dados, tratamento de valores ausentes, separação correta de países listados em uma mesma linha, tokenização de texto para identificar ingredientes suspeitos e classificação pelo NutriScore.

Além disso, são gerados gráficos e tabelas comparativas que destacam a presença de alimentos ultraprocessados e permitem observar relações entre quantidade de aditivos, calorias e qualidade nutricional, tanto no Brasil quanto em outros países.

Contribuições

A abordagem adotada combina análise de dados, processamento de linguagem natural e visualizações interativas para oferecer uma visão comparativa entre diferentes contextos geográficos. Os resultados ajudarão consumidores a fazer escolhas mais conscientes e fornecerão suporte para políticas públicas que incentivem dietas mais saudáveis, contribuindo para reduzir o consumo de produtos ultraprocessados em nível global.

1.2 Método

O diagrama a seguir apresenta o fluxo de trabalho do projeto, dividido em cinco etapas principais: desde a coleta e extração dos dados brutos até a análise e interpretação dos resultados finais. Cada fase representa um passo essencial na transformação das informações em insights relevantes.

O diagrama ilustra uma metodologia organizada em etapas bem definidas. As etapas iniciais de limpeza, pré-processamento e engenharia de variáveis foram fundamentais para garantir a validade e a confiabilidade das análises subsequentes. A seguir, são apresentados os achados mais relevantes e as interpretações extraídas a partir da análise dos dados.

1.3 Conjunto de Dados

Nesta análise, utilizamos um dataset colaborativo que reúne informações sobre produtos alimentícios comercializados no Brasil e outros países.

Conjunto de Dados
Nome Descrição Fonte
Open Food Facts Dataset Dataset com informações sobre alimentos, ingredientes e rótulos. https://www.kaggle.com/datasets/openfoodfacts/world-food-facts

Detalhamento do Dataset

O dataset original contém centenas de milhares de registros de produtos alimentícios coletados globalmente. Para este projeto, foram selecionados apenas produtos e outras informações relevantes para a análise nutricional e de processamento.

Descrição das Colunas
Coluna Descrição
product_name Nome do produto alimentar
brands Marca(s) do produto
countries_en País(es) onde o produto é comercializado
categories_en Categoria(s) do produto
ingredients_text Texto com a lista de ingredientes
nutrition_grade_fr Nota nutricional do produto (NutriScore: a melhor, e pior)
energy_100g Energia por 100g (kcal)
fat_100g Gorduras por 100g
sugars_100g Açúcares por 100g
salt_100g Sal por 100g
fiber_100g Fibras por 100g
proteins_100g Proteínas por 100g
carbohydrates_100g Carboidratos por 100g
labels_tags Tags de rotulagem relacionadas ao produto

2 Pacotes Requeridos

Para mapear os produtos, serão utilizados os seguintes pacotes:
Pacotes Utilizados no Projeto
Pacote Descrição Usado no projeto
readr Importação eficiente de arquivos .tsv. Importar dados do Open Food Facts (.tsv).
dplyr Manipulação de dados eficiente. Filtrar, transformar e organizar os dados.
stringr Manipulação e análise de strings. Detectar e tratar ingredientes nos textos.
ggplot2 Criação de gráficos estatísticos. Gerar visualizações dos alimentos e classificações.
DT Criação de tabelas interativas em HTML. Exibir dataframes interativos no relatório.
tidytext Manipulação de texto em formato tidy (ordenado). Tokenizar e contar palavras dos ingredientes, analisando frequência textual.
tm Manipulação e análise de textos. Refinar a lista de ingredientes, removendo palavras irrelevantes para ver os mais importantes/frequentes.
tidyr Manipulação e reorganização de dados, separando e unindo colunas para análises detalhadas. Separar valores compostos em múltiplas linhas para análise por país.
kableExtra Permite criar tabelas HTML e LaTeX mais bonitas e personalizadas. Formatar e estilizar as tabelas geradas com kable(), deixando o relatório mais apresentável.
knitr Pacote base para gerar relatórios dinâmicos em R Markdown com funções como kable(). Gerar tabelas básicas com kable(), que serve como base para aplicar estilos do kableExtra.

Esses pacotes serão empregados para carregar, manipular, unir e visualizar os dados dos conjuntos de dados, bem como para realizar análises estatísticas e gráficas.

3 Preparação dos dados

Fonte dos dados com link: Open Food Facts

Descrição e peculiaridades

O Open Food Facts é uma uma plataforma colaborativa que reúne informações de produtos alimentícios de todo o mundo. O arquivo original, disponível no Kaggle, foi baixado em 09/06/2025 e contém dados que são atualizados regularmente pela comunidade, abrangendo um período contínuo de coleta. Ele possui mais de 350.000 registros e cerca de 160 colunas. Produtos podem conter múltiplos países em uma célula, e há registros com valores ausentes em diversas variáveis nutricionais.

Etapas de Importação e Limpeza de Dados

A análise utiliza o dataset da Open Food Facts, que exigiu um rigoroso pré-processamento devido a inconsistências e valores ausentes. O processo envolveu a seleção de colunas essenciais, o tratamento de dados faltantes (imputação pela mediana para números e rótulos para textos) e a criação de novas variáveis analíticas. O destaque foi a identificação de “ingredientes suspeitos” via expressões regulares (regex) para classificar os produtos quanto ao nível de processamento. Por fim, os dados geográficos foram reestruturados para garantir análises corretas por país, resultando em uma base de dados limpa e pronta para a análise.

Importação do arquivo TSV

dados <- readr::read_tsv("archive/en.openfoodfacts.org.products.tsv", guess_max = 100000)

Número de Linhas

nrow(dados)
## [1] 356001

Número de colunas

ncol(dados)
## [1] 163

Seleção de colunas de interesse para a análise nutricional e de processamento.

dados_limpos <- dados %>%
  select(
    product_name, brands, countries_en, categories_en, ingredients_text,
    nutrition_grade_fr, energy_100g, fat_100g, sugars_100g, salt_100g,
    fiber_100g, proteins_100g, carbohydrates_100g, labels_tags
  )

Calcular porcentagem de NAs por coluna

na_porcentagem <- sapply(dados_limpos, function(x) mean(is.na(x)) * 100)
na_porcentagem_df <- data.frame(
  Variável = names(na_porcentagem),
  `Porcentagem de NA (%)` = round(na_porcentagem, 2)
)
print(na_porcentagem_df)
##                              Variável Porcentagem.de.NA....
## product_name             product_name                  4.92
## brands                         brands                  8.15
## countries_en             countries_en                  0.07
## categories_en           categories_en                 70.99
## ingredients_text     ingredients_text                 20.26
## nutrition_grade_fr nutrition_grade_fr                 28.40
## energy_100g               energy_100g                 17.02
## fat_100g                     fat_100g                 21.48
## sugars_100g               sugars_100g                 21.57
## salt_100g                   salt_100g                 18.61
## fiber_100g                 fiber_100g                 38.01
## proteins_100g           proteins_100g                 17.37
## carbohydrates_100g carbohydrates_100g                 21.56
## labels_tags               labels_tags                 83.38

Substituição de valores ausentes

dados_tratados <- dados_limpos %>%
  mutate(
    product_name       = if_else(is.na(product_name), "desconhecido", str_to_title(product_name)),
    brands             = if_else(is.na(brands), "desconhecido", tolower(brands)),
    countries_en       = if_else(is.na(countries_en), "não informado", tolower(countries_en)),
    categories_en      = if_else(is.na(categories_en), "desconhecido", tolower(categories_en)),
    ingredients_text   = if_else(is.na(ingredients_text), "não informado", tolower(ingredients_text)),
    nutrition_grade_fr = if_else(is.na(nutrition_grade_fr), "desconhecido", nutrition_grade_fr),
    energy_100g        = if_else(is.na(energy_100g), median(energy_100g, na.rm = TRUE), energy_100g),
    fat_100g           = if_else(is.na(fat_100g), median(fat_100g, na.rm = TRUE), fat_100g),
    sugars_100g        = if_else(is.na(sugars_100g), median(sugars_100g, na.rm = TRUE), sugars_100g),
    salt_100g          = if_else(is.na(salt_100g), median(salt_100g, na.rm = TRUE), salt_100g),
    fiber_100g         = if_else(is.na(fiber_100g), median(fiber_100g, na.rm = TRUE), fiber_100g),
    proteins_100g      = if_else(is.na(proteins_100g), median(proteins_100g, na.rm = TRUE), proteins_100g),
    carbohydrates_100g = if_else(is.na(carbohydrates_100g), median(carbohydrates_100g, na.rm = TRUE), carbohydrates_100g),
    labels_tags        = if_else(is.na(labels_tags), "sem rotulagem", labels_tags)
  )

Criação de variáveis derivadas

dados_tratados <- dados_tratados %>%
  mutate(
    ingredientes_qtd   = str_count(ingredients_text, ",") + 1,
    calorias_por_grama = energy_100g / 100,
    qtd_suspeitos = str_count(
      ingredients_text,
      regex(
        "acidulantes?|estabilizantes?|emulsificantes?|espessantes?|aromatizantes?|aromas?|xaropes?|corantes?|conservadores?|glutamato|glicerina|lecitina|hidrogenad[ao]|edulcorantes?|fosfatos?|maltodextrina|propionato|diglicer|polirricinoleato|e[0-9]{3}|bht|bha|p[óo]",
        ignore_case = TRUE
      )
    ),
    is_ultraprocessed = if_else(qtd_suspeitos >= 1, "Sim", "Não"),
    is_healthy = case_when(
      nutrition_grade_fr %in% c("a", "b") & qtd_suspeitos == 0 ~ "Saudável",
      nutrition_grade_fr %in% c("a", "b") & qtd_suspeitos >= 1 ~ "Nutricionalmente boa, mas ultraprocessada",
      nutrition_grade_fr == "desconhecido" ~ "Desconhecido",
      TRUE ~ "Não Saudável"
    )
  )

Separação de países múltiplos em linhas distintas.

dados_paises <- dados_tratados %>%
  filter(!is.na(countries_en), countries_en != "não informado") %>%
  separate_rows(countries_en, sep = ",") %>%
  mutate(countries_en = str_trim(countries_en))

Número de linhas do dataset tratado

nrow(dados_tratados)
## [1] 356001

Número de colunas do dataset tratado

ncol(dados_tratados)
## [1] 19

Sumário dos Dados Limpos

Após as etapas de limpeza e tratamento, o conjunto de dados dados_tratados está pronto para análise. Abaixo, um resumo das principais variáveis, oferecendo uma visão geral da distribuição e características dos dados após o pré-processamento.

# Selecionar as colunas numéricas de interesse
numeric_cols_to_summarize <- dados_tratados %>%
  select(
    energy_100g, fat_100g, sugars_100g, salt_100g, fiber_100g,
    proteins_100g, carbohydrates_100g, ingredientes_qtd,
    calorias_por_grama, qtd_suspeitos
  )

# Calcular estatísticas 
summary_stats <- sapply(numeric_cols_to_summarize, function(x) {
  c(
    Min = min(x, na.rm = TRUE),
    `1st Qu.` = quantile(x, 0.25, na.rm = TRUE),
    Median = median(x, na.rm = TRUE),
    Mean = mean(x, na.rm = TRUE),
    `3rd Qu.` = quantile(x, 0.75, na.rm = TRUE),
    Max = max(x, na.rm = TRUE)
  )
})

# Converter para data frame
sumario_numerico_df <- as.data.frame(summary_stats)

# Renomear colunas
colnames(sumario_numerico_df) <- c(
  "Energy (kcal/100g)", "Fat (g/100g)", "Sugars (g/100g)",
  "Salt (g/100g)", "Fiber (g/100g)", "Proteins (g/100g)",
  "Carbohydrates (g/100g)", "Qtd. Ingredientes",
  "Calorias/Grama", "Qtd. Suspeitos"
)

# Adicionar coluna com o nome das estatísticas
sumario_numerico_df <- cbind(Estatística = rownames(sumario_numerico_df), sumario_numerico_df)

# Mostrar a tabela com kableExtra
kable(sumario_numerico_df, caption = "Sumário das Variáveis Numéricas", booktabs = TRUE, digits = 2) %>%
  kable_styling(full_width = FALSE, position = "center") %>%
  scroll_box(width = "100%", height = "500px")
Sumário das Variáveis Numéricas
Estatística Energy (kcal/100g) Fat (g/100g) Sugars (g/100g) Salt (g/100g) Fiber (g/100g) Proteins (g/100g) Carbohydrates (g/100g) Qtd. Ingredientes Calorias/Grama Qtd. Suspeitos
Min Min 0.0 0.000000e+00 -17.86 0.00 -6.7 -8.000000e+02 0.000000e+00 1.00 0.00 0.00
1st Qu..25% 1st Qu..25% 494.0 9.000000e-01 2.25 0.10 0.8 1.560000e+00 8.600000e+00 1.00 4.94 0.00
Median Median 1092.0 5.290000e+00 5.40 0.56 1.5 4.880000e+00 2.000000e+01 6.00 10.92 0.00
Mean Mean 1119.7 4.401855e+04 13.46 1.68 238254.9 4.401413e+04 4.403640e+04 8.53 11.20 0.82
3rd Qu..75% 3rd Qu..75% 1569.0 1.504000e+01 15.00 1.12 2.2 8.510000e+00 5.000000e+01 13.00 15.69 1.00
Max Max 231199.0 1.566667e+10 3520.00 64312.80 84818150000.0 1.566667e+10 1.566667e+10 169.00 2311.99 76.00

Observações sobre as variáveis numéricas:

  • As medidas de energia (energy_100g), gordura (fat_100g), açúcares (sugars_100g), sal (salt_100g), fibra (fiber_100g), proteínas (proteins_100g) e carboidratos (carbohydrates_100g) mostram a distribuição dos nutrientes por 100g de produto. A mediana representa o valor central após o preenchimento de NAs, refletindo a composição típica dos produtos.
  • ingredientes_qtd indica a contagem de ingredientes por produto, sendo uma proxy para a complexidade da formulação.
  • calorias_por_grama é uma variável derivada que normaliza a energia, facilitando comparações.
  • qtd_suspeitos reflete o número de aditivos e ingredientes ultraprocessados detectados, sendo fundamental para a classificação is_ultraprocessed.

Sumário das variáveis categóricas

Variáveis Categóricas

Distribuição por Grade Nutricional (NutriScore)
nutrition_grade_fr n
desconhecido 101119
d 72436
c 52879
e 50236
a 40315
b 39016
Classificação de Ultraprocessados
is_ultraprocessed n
Não 231685
Sim 124316
Classificação de Saúde dos Produtos
is_healthy n
Não Saudável 175551
Desconhecido 101119
Saudável 53174
Nutricionalmente boa, mas ultraprocessada 26157
Top 5 Categorias de Produtos
categories_en n
desconhecido 252726
beverages,non-sugared beverages 2345
sugary snacks,biscuits and cakes,biscuits 893
fats 732
sugary snacks,chocolates,dark chocolates 678
Top 5 Países com Mais Produtos
countries_en n
united states 173708
france 129346
switzerland 17206
germany 9403
spain 6061
Top 5 Marcas de Produtos
brands n
desconhecido 29025
carrefour 3847
auchan 3334
u 2636
leader price 2224

Observações sobre as variáveis categóricas:

  • A distribuição de nutrition_grade_fr mostra a predominância de certas notas NutriScore, indicando a qualidade nutricional geral dos produtos. É relevante notar a alta quantidade de registros classificados como “desconhecido” (101.119), o que pode influenciar a representatividade das notas NutriScore nas análises gerais.
  • is_ultraprocessed e is_healthy fornecem uma visão clara da proporção de produtos ultraprocessados e saudáveis, respectivamente, dentro do dataset. A categoria “Desconhecido” em is_healthy (101.119 produtos) reflete diretamente a falta de classificação NutriScore para esses itens.
  • As top categorias, países e marcas mais frequentes revelam quais tipos de produtos e origens são mais representados no dataset, permitindo contextualizar a análise. A presença da marca “desconhecido” (29.025 registros) entre as mais frequentes indica que uma parcela considerável dos produtos não possui informação de marca associada.

4 Análise Exploratória dos Ingredientes

4.1 DataFrame

4.2 Produtos por Nota Nutricional

O gráfico a seguir mostra a distribuição dos produtos alimentícios de acordo com sua classificação NutriScore, que varia de A (mais saudável) a E (menos saudável). Isso permite visualizar a qualidade nutricional geral dos itens analisados.

ggplot(
  dados_tratados %>% filter(nutrition_grade_fr %in% c("a", "b", "c", "d", "e")),
  aes(x = nutrition_grade_fr, fill = nutrition_grade_fr)
) +
  geom_bar() +
  scale_fill_manual(
    values = c("a" = "#008001", "b" = "#85bb2f", "c" = "#fdd835",
               "d" = "#fb8c00", "e" = "#e53935"),
    name = "Nota Nutricional",
    labels = c("A (Melhor)", "B", "C", "D", "E (Pior)")
  ) +
  labs(title = "Distribuição da Nota Nutricional (NutriScore)",
       x = "Nota Nutricional", y = "Quantidade de Produtos") +
  theme_minimal()

Observa-se que uma clara concentração de produtos nas categorias de qualidade nutricional intermediária a ruim: as maiores alturas estão em C, D e E, com destaque para a categoria D (mais de 70.000 itens). Mesmo somando A e B, chegamos a cerca de 80.000 produtos “bons”, enquanto C + D + E ultrapassam 170.000, revelando que as opções menos saudáveis são mais que o dobro das saudáveis.

Em comparação aos extremos, há cerca de 40.000 itens na categoria A, mais de 50.000 na E, mostrando que, embora existam escolhas saudáveis, o consumidor se depara com uma oferta ainda maior de produtos de pior qualidade nutricional, o que torna a adoção de uma dieta balanceada um desafio.

Nota: Nas análises exploratórias e comparações por NutriScore, os registros com informações faltantes ou marcados como ‘desconhecido’ foram excluídos, garantindo maior precisão nos resultados.

4.3 Produtos Ultraprocessados vs. Não

Este gráfico compara a quantidade de produtos classificados como saudáveis e não saudáveis, com base na combinação do NutriScore e na presença de ingredientes suspeitos de ultraprocessamento.

# Filtrar apenas produtos com classificação conhecida
dados_filtrados_nutricao <- dados_tratados %>%
  filter(is_healthy %in% c("Saudável", "Não Saudável"))

ggplot(dados_filtrados_nutricao, aes(x = is_healthy, fill = is_healthy)) +
  geom_bar() +
  scale_fill_manual(values = c("Saudável" = "green3", "Não Saudável" = "red3")) +
  labs(
    title = "Classificação Nutricional dos Produtos",
    x = "Classificação",
    y = "Quantidade de Produtos"
  ) +
  theme_minimal()

Percebe-se que o ambiente alimentar é dominado por produtos de baixa qualidade nutricional e ultraprocessados. Mostrando que a oferta de itens não saudáveis é muito superior à de opções saudáveis.

Nota: Nas análises exploratórias e comparações os registros com informações faltantes ou marcados como ‘desconhecido’ foram excluídos, garantindo maior precisão nos resultados.

4.4 Relação entre Aditivos e Calorias

O gráfico apresenta a relação entre a quantidade de ingredientes suspeitos de ultraprocessamento e a média de calorias por grama dos produtos, segmentados pela classificação saudável ou não.

# Filtrar produtos com classificação conhecida
dados_plot <- dados_tratados %>%
  filter(is_healthy %in% c("Saudável", "Não Saudável"))

# Categorizar quantidade de ingredientes suspeitos
dados_plot <- dados_plot %>%
  mutate(suspeitos_faixa = case_when(
    qtd_suspeitos == 0 ~ "0",
    qtd_suspeitos %in% 1:2 ~ "1-2",
    qtd_suspeitos %in% 3:4 ~ "3-4",
    qtd_suspeitos >= 5 ~ "5+"
  ))

ggplot(
  dados_plot,
  aes(x = suspeitos_faixa, y = calorias_por_grama, color = is_healthy)
) +
  stat_summary(fun = mean, geom = "point", size = 4, position = position_dodge(width = 0.4)) +
  stat_summary(fun = mean, geom = "line", aes(group = is_healthy), linetype = "dashed") +
  facet_wrap(~ is_healthy) +
  scale_color_manual(values = c("Saudável" = "green4", "Não Saudável" = "firebrick")) +
  labs(
    title = "Média de Calorias por Grama vs Ingredientes Suspeitos",
    subtitle = "Facetas para Saudáveis e Não Saudáveis",
    x = "Quantidade de Ingredientes Suspeitos",
    y = "Calorias por grama",
    color = "Classificação"
  ) +
  theme_minimal()

Nota-se que a presença de ingredientes associados ao ultraprocessamento está diretamente ligada a uma maior densidade calórica. Basta um desses ingredientes para que o produto tenha, em média, o dobro de calorias por grama em comparação com produtos sem esses aditivos, o que pode contribuir para dietas menos saudáveis.

Nota: Nas análises exploratórias e comparações os registros com informações faltantes ou marcados como ‘desconhecido’ foram excluídos, garantindo maior precisão nos resultados.

4.5 Ingredientes mais frequentes

O gráfico abaixo mostra os 20 ingredientes mais frequentes encontrados nos produtos analisados, após a remoção de palavras irrelevantes.

stopwords_pt <- stopwords("pt")

# Tokenização e contagem de palavras
ingredientes_palavras <- dados_tratados %>%
  unnest_tokens(palavra, ingredients_text) %>%
  count(palavra, sort = TRUE)

# Filtragem, seleção e visualização
ingredientes_palavras %>%
  filter(
    !palavra %in% stopwords_pt,
    nchar(palavra) > 3,
    palavra != "informado" 
  ) %>%
  top_n(20, n) %>%
  ggplot(aes(x = reorder(palavra, n), y = n)) +
  geom_col(fill = "#5a5cfa") +
  coord_flip() +
  labs(
    title = "20 Ingredientes Mais Frequentes",
    x = "Ingrediente",
    y = "Frequência"
  ) +
  theme_minimal()

A análise dos ingredientes revela a presença recorrente de componentes industrializados, adoçantes e aditivos, evidenciando que a maioria dos itens é formada por produtos processados e ultraprocessados.

Nota: Para a análise de ingredientes, o termo “informado”, que é provavelmente um resíduo de textos como “ingredientes não informados”, foi removido para focar a análise em componentes reais e aumentar a precisão dos resultados.

4.6 Ultraprocessados por País

O gráfico a seguir exibe a quantidade de produtos ultraprocessados por país, considerando apenas países com mais de 50 produtos registrados.

# Contar produtos ultraprocessados por país
ultraprocessados_por_pais <- dados_paises %>%
  filter(is_ultraprocessed == "Sim") %>%
  count(countries_en, sort = TRUE) %>%
  filter(n > 50)

ggplot(ultraprocessados_por_pais, aes(x = reorder(countries_en, n), y = n)) +
  geom_col(fill = "#e63946") +
  coord_flip() +
  labs(
    title = "Quantidade de Produtos Ultraprocessados por País",
    subtitle = "Separação correta de países múltiplos",
    x = "País",
    y = "Quantidade de Produtos"
  ) +
  theme_minimal()

Verifica-se que países de diferentes regiões apresentam grandes quantidades de produtos ultraprocessados, evidenciando uma tendência global.

Nota: Nas análises exploratórias e comparações por país, os registros com informações faltantes ou marcados como ‘desconhecido’ foram excluídos, garantindo maior precisão nos resultados.

4.7 Proporção de Ultraprocessados

Este gráfico compara a proporção de produtos ultraprocessados entre os países com maiores percentuais, destacando o Brasil na comparação global.

# Calcular proporção de ultraprocessados por país
proporcao_ultraprocessados <- dados_paises %>%
  group_by(countries_en) %>%
  summarise(
    total = n(),
    ultraprocessados = sum(is_ultraprocessed == "Sim"),
    percentual = 100 * ultraprocessados / total
  ) %>%
  filter(total >= 100)

# Brasil isolado
proporcao_brasil <- proporcao_ultraprocessados %>%
  filter(countries_en == "brazil")

# Top 19 países com maior % + Brasil
top_outros <- proporcao_ultraprocessados %>%
  filter(countries_en != "brazil") %>%
  arrange(desc(percentual)) %>%
  slice_head(n = 19)

comparacao_final <- bind_rows(top_outros, proporcao_brasil) %>%
  distinct(countries_en, .keep_all = TRUE)

# Gráfico
ggplot(comparacao_final, aes(x = reorder(countries_en, percentual), y = percentual, fill = countries_en == "brazil")) +
  geom_col() +
  coord_flip() +
  scale_fill_manual(values = c("TRUE" = "#5e60ce", "FALSE" = "#f9844a"), guide = "none") +
  labs(
    title = "Proporção de Produtos Ultraprocessados por País",
    subtitle = "Brasil em destaque comparado aos 19 países com maior percentual",
    x = "País",
    y = "Percentual de Ultraprocessados (%)"
  ) +
  theme_minimal()

O gráfico mostra o elevado consumo desses alimentos não é privilégio de nações ricas: Madagascar, Sérvia e Guadalupe figuram entre os maiores consumidores, indicando que a expansão dos ultraprocessados e a adoção de hábitos alimentares industrializados têm alcance global. Porém a comparação destaca como o Brasil se posiciona frente a outras nações desenvolvidas como França, EUA e Portugal, ficando claro que o país tem fatia muito menor de ultraprocessados em seu mercado, podendo ser um sinal de resistência cultural a esses produtos ou de políticas públicas de alimentação mais efetivas.

5 Conclusão

A presente análise fundamenta-se nos dados da plataforma colaborativa Open Food Facts, a partir da qual foi conduzido um rigoroso processo metodológico. Este processo incluiu a limpeza e o tratamento de valores ausentes, a separação de múltiplos países por registro e, crucialmente, a classificação dos produtos com base em dois critérios: o sistema NutriScore e a identificação de ingredientes suspeitos de ultraprocessamento via expressões regulares. Os achados detalhados a seguir derivam diretamente dessa abordagem.

A análise revela uma predominância massiva de produtos de baixa qualidade nutricional. A distribuição pelo NutriScore demonstrou que os produtos classificados como C, D e E são mais que o dobro daqueles com notas A e B. De forma ainda mais contundente, a classificação binária mostrou que para cada produto “Saudável” no dataset, existem aproximadamente 3,5 produtos “Não Saudáveis”, evidenciando um profundo desequilíbrio na oferta de alimentos.

Essa classificação desfavorável é um reflexo direto da composição desses itens. A análise textual dos ingredientes mostrou que os termos mais frequentes são salt (sal), sugar (açúcar), acid (ácido) e flour (farinha), a base para a maioria das formulações industriais. Além disso, a presença de ingredientes suspeitos se correlacionou diretamente com a densidade energética: produtos “Não Saudáveis” apresentaram, em média, o dobro de calorias por grama (cerca de 14 kcal/g) em comparação com os “Saudáveis” (7 kcal/g).

Geograficamente, a tendência de consumo de ultraprocessados se mostrou global. Contudo, a análise de volumes absolutos indicou que a base de dados é fortemente concentrada em produtos dos Estados Unidos e da França, que juntos respondem por mais de 110.000 itens da amostra, um viés que deve ser considerado. Neste cenário, o Brasil se destacou comparativamente, apresentando uma proporção de ultraprocessados (~20%) inferior à de muitos países desenvolvidos, como a França (~38%) e Portugal (~39%), embora a literatura aponte para um crescimento contínuo dessa categoria no país.

Esses achados destacam a importância de políticas públicas voltadas à rotulagem transparente, educação alimentar e estímulo ao consumo de alimentos in natura ou minimamente processados em escala global. O estudo também fornece informações valiosas para consumidores, profissionais de saúde e formuladores de políticas públicas, auxiliando na promoção de hábitos alimentares mais saudáveis.

Como limitação, destaca-se que os dados dependem de contribuições voluntárias, o que pode gerar lacunas em alguns países ou categorias. Para evoluir este trabalho, recomenda-se integrar outras bases oficiais de dados nutricionais, atualizar periodicamente o conjunto de dados e aplicar técnicas mais avançadas de análise de texto ou aprendizado de máquina para detectar ingredientes e aditivos de forma mais automatizada.

Referências

BRASIL, I. Pesquisa de orçamentos familiares 2017-2018: avaliação nutricional da disponibilidade domiciliar de alimentos no Brasil. Rio de Janeiro:[sn], 2020.
MACHADO, Priscila P. et al. Ultra-processed foods and recommended intake levels of nutrients linked to non-communicable diseases in Australia: evidence from a nationally representative cross-sectional study. BMJ open, v. 9, n. 8, p. e029544, 2019.
MARTINS, Ana Paula Bortoletto et al. Increased contribution of ultra-processed food products in the Brazilian diet (1987-2009). Revista de saude publica, v. 47, p. 656–665, 2013.
MEIXNER, Oliver; KATT, Felix. Assessing the impact of COVID-19 on consumer food safety perceptions—A choice-based willingness to pay study. Sustainability, v. 12, n. 18, p. 7270, 2020.
MICLOTTE, Lisa; VAN DE WIELE, Tom. Food processing, gut microbiota and the globesity problem. Critical reviews in food science and nutrition, v. 60, n. 11, p. 1769–1782, 2020.
MONTEIRO, Carlos A. et al. Ultra-processed products are becoming dominant in the global food system. Obesity reviews, v. 14, p. 21–28, 2013.
MONTEIRO, Carlos A. et al. Ultra-processed foods: what they are and how to identify them. Public health nutrition, v. 22, n. 5, p. 936–941, 2019.
MOUBARAC, Jean-Claude et al. Consumption of ultra-processed foods predicts diet quality in Canada. Appetite, v. 108, p. 512–520, 2017.
RAUBER, Fernanda et al. Ultra-processed food consumption and chronic non-communicable diseases-related dietary nutrient profile in the UK (2008–2014). Nutrients, v. 10, n. 5, p. 587, 2018.
STEELE, Eurı́dice Martı́nez et al. Ultra-processed foods and added sugars in the US diet: evidence from a nationally representative cross-sectional study. BMJ open, v. 6, n. 3, p. e009892, 2016.
ZINÖCKER, Marit K.; LINDSETH, Inge A. The western diet–microbiome-host interaction and its role in metabolic disease. Nutrients, v. 10, n. 3, p. 365, 2018.