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.
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.
Nesta análise, utilizamos um dataset colaborativo que reúne informações sobre produtos alimentícios comercializados no Brasil e outros países.
| 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.
| 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 |
| 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.
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
Número de Linhas
## [1] 356001
Número de colunas
## [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
## [1] 356001
Número de colunas do dataset tratado
## [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")| 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:
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
| nutrition_grade_fr | n |
|---|---|
| desconhecido | 101119 |
| d | 72436 |
| c | 52879 |
| e | 50236 |
| a | 40315 |
| b | 39016 |
| is_ultraprocessed | n |
|---|---|
| Não | 231685 |
| Sim | 124316 |
| is_healthy | n |
|---|---|
| Não Saudável | 175551 |
| Desconhecido | 101119 |
| Saudável | 53174 |
| Nutricionalmente boa, mas ultraprocessada | 26157 |
| 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 |
| countries_en | n |
|---|---|
| united states | 173708 |
| france | 129346 |
| switzerland | 17206 |
| germany | 9403 |
| spain | 6061 |
| brands | n |
|---|---|
| desconhecido | 29025 |
| carrefour | 3847 |
| auchan | 3334 |
| u | 2636 |
| leader price | 2224 |
Observações sobre as variáveis categóricas:
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.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.
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.
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.
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.
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.
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.
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.