Este trabalho é uma prática no campo da ciencia de dados utilizando R como ferramenta analítica. A intenção é tentar reproduzir os resultados obtidos e publicados pelo Institudo Brasileiro de Geografia e Estatística (IBGE) sobre o consumo de proteínas no país e fazer novas inferências com o mesmo conjunto de dados, entre elas, qual a razão entre a proteina vegetal e animal na dieta. Nem todos os passos do tratamento dos dados e bases usadas para cálculo de valor proteico foram encontradas, foi escolhida a melhor aproximação possível.
Os seguintes pacotes foram utiizados dentro do R versão 3.6.3
library(readr)
library(tidyverse)
library(stringr)
library(vtree)
library(knitr)
library(kableExtra)
Os dados da POF foram otidos a partir do site do IBGE e são referentes aos anos 2017-2018: https://www.ibge.gov.br/estatisticas/sociais/saude/24786-pesquisa-de-orcamentos-familiares-2.html?=&t=downloads
Os scripts de ingestão foram fornecidos pelo proprio IBGE juntamente com os dados brutos Estes scripts criam um data frame já com a identificação e largura de cada coluna.
Primeiro com o consumo alimentar:
CONSUMO_ALIMENTAR <-
read.fwf("CONSUMO_ALIMENTAR.txt"
, widths = c(2,4,1,9,2,1,2,2,2,4,2,7,3,
2,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,2,2,7,9,6,14,14,14,14,
14,14,14,14,14,14,14,14,
14,14,14,14,14,14,14,14,
14,14,14,14,14,14,14,14,
14,14,15,10,15,1
)
, na.strings=c(" ")
, col.names = c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG",
"COD_UPA", "NUM_DOM", "NUM_UC",
"COD_INFOR,MANTE", "QUADRO", "SEQ",
"V9005", "V9007", "V9001", "V9015",
"F_PREPARO", "V9017", "V9018", "V9019",
"V9020", "V9021", "V9022", "V9023",
"V9024", "V9025", "V9026", "V9027",
"V9028", "V9029", "V9030",
"COD_UNIDADE_MEDIDA_FINAL",
"COD_PREPARACAO_FINAL", "GRAMATURA1",
"QTD", "COD_TBCA", "ENERGIA_KCAL",
"ENERGIA_KJ", "PTN", "CHOTOT", "FIBRA",
"LIP", "COLEST", "AGSAT", "AGMONO",
"AGPOLI", "AGTRANS", "CALCIO", "FERRO",
"SODIO", "MAGNESIO", "FOSFORO", "POTASSIO",
"COBRE", "ZINCO", "VITA_RAE", "TIAMINA",
"RIBOFLAVINA", "NIACINA", "PIRIDOXAMINA",
"COBALAMINA", "VITD", "VITE", "VITC",
"FOLATO", "PESO", "PESO_FINAL",
"RENDA_TOTAL", "DIA_SEMANA", "DIA_ATIPICO")
, dec="."
)
Armazena no HD local arquivo serializado para leituras futuras:
saveRDS(CONSUMO_ALIMENTAR,"CONSUMO_ALIMENTAR.rds")
Agora, com as caracteristicas da dieta:
CARACTERISTICAS_DIETA <-
read.fwf("CARACTERISTICAS_DIETA.txt"
, widths = c(2,4,1,9,2,1,2,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,3,3,14,15,10
)
, na.strings=c(" ")
, col.names = c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG",
"COD_UPA", "NUM_DOM", "NUM_UC",
"COD_INFORMANTE", "V7101", "V7102",
"V71031", "V71032", "V71033", "V71034",
"V71035", "V71036", "V71037", "V71038",
"V7104", "V71051", "DIETA_PRESSAO_ALTA", "DIETA_COLESTEROL",
"DIETA_DIABETES", "DIETA_CORACAO", "V71056", "V71A01",
"V71A02", "V72C01", "V72C02", "PESO",
"PESO_FINAL", "RENDA_TOTAL")
, dec="."
)
# Armazena no HD local arquivo serializado para leituras futuras
saveRDS(CARACTERISTICAS_DIETA,"CARACTERISTICAS_DIETA.rds")
Dados do Morador:
setwd("/mnt/DADOS/Data Science/POF")
MORADOR <-
read.fwf("MORADOR.txt"
, widths = c(2,4,1,9,2,1,2,2,1,2,2,4,3,1,1,
1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,2,1,1,2,1,1,2,1,1,1,
2,1,2,14,14,10,1,1,20,20,20,20)
, na.strings=c(" ")
, col.names = c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG",
"COD_UPA", "NUM_DOM", "NUM_UC", "COD_INFORMANTE",
"V0306", "V0401", "V04021", "V04022", "V04023",
"V0403", "V0404", "V0405", "V0406", "V0407",
"V0408", "V0409", "V0410", "V0411", "V0412",
"V0413", "V0414", "V0415", "V0416",
"V041711", "V041712", "V041721", "V041722",
"V041731", "V041732", "V041741", "V041742",
"V0418", "V0419", "V0420", "V0421", "V0422",
"V0423", "V0424", "V0425", "V0426", "V0427",
"V0428", "V0429", "V0430", "ANOS_ESTUDO",
"PESO", "PESO_FINAL", "RENDA_TOTAL",
"INSTRUCAO", "COMPOSICAO", "PC_RENDA_DISP",
"PC_RENDA_MONET", "PC_RENDA_NAO_MONET",
"PC_DEDUCAO")
, dec="."
)
# Armazena no HD local arquivo serializado para leituras futuras
saveRDS(MORADOR,"MORADOR.rds")
Salvando os dados do Morador:
MORADOR <- readRDS("MORADOR.rds")
Criando a POF completa, consolidando as planilhas MORADOR, CONSUMO_ALIMENTAR E CARACTERISTICAS_DIETA usando o campo “control” que é a concatenizacao dos campos COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE presente em todas as planilhas:
CARACTERISTICAS_DIETA <-transform(CARACTERISTICAS_DIETA, control=paste0(COD_UPA,NUM_DOM,NUM_UC,COD_INFORMANTE))
MORADOR <- transform(MORADOR, control=paste0(COD_UPA,NUM_DOM,NUM_UC,COD_INFORMANTE))
CONSUMO_ALIMENTAR <- transform(CONSUMO_ALIMENTAR, control=paste0(COD_UPA,NUM_DOM,NUM_UC,COD_INFOR.MANTE))
POF_completa <-merge(MORADOR,CONSUMO_ALIMENTAR, by="control",all.x = TRUE, all.y = TRUE)
POF_completa <-merge(CARACTERISTICAS_DIETA,POF_completa, by="control", all.x = TRUE, all.y = TRUE)
saveRDS(POF_completa,"POF_completa.rds")
Carregando a POF_completa anteriomente salva
POF_completa <- readRDS("POF_completa.rds")
Filtrando somente os codigos que interessam: control, UF, peso corporal, altura, idade, sexo, gravida, lactante, anos de estudo, grau de instrucao, rural/urbano, codigo do alimento, quantidade, cod. TBCA, peso(amostral), peso (amostral) final:
POF_filtrada <- POF_completa[c(1,2,4,21,22,23,24,26,27,28,29,45,46,47,80,81,82,84,97,101,103,119,121,122,153)]
Confirmando os nomes da colunas (variáveis) dentro da POF_filtrada:
names(POF_filtrada)
## [1] "control" "UF" "TIPO_SITUACAO_REG"
## [4] "V71052" "V71053" "V71054"
## [7] "V71055" "V71A01" "V71A02"
## [10] "V72C01" "V72C02" "V0403"
## [13] "V0404" "V0405" "ANOS_ESTUDO"
## [16] "PESO.x" "PESO_FINAL.x" "INSTRUCAO"
## [19] "QUADRO" "V9001" "V9016"
## [22] "COD_PREPARACAO_FINAL" "QTD" "COD_TBCA"
## [25] "PESO_FINAL.y"
saveRDS(POF_filtrada,"POF_filtrada.rds")
POF_filtrada<- POF_filtrada %>%
rename("Area_Habitacao"="TIPO_SITUACAO_REG",
"Sexo"="V0404",
"Altura"="V72C02",
"Idade"="V0403",
"Cor"="V0405",
"Gravida"="V71A01",
"Lactante"="V71A02",
"Cod_alimento"="V9001",
"PREPARACAO"="V9016",
"DCORACAO"="V71055",
"DDIABETES" ="V71054",
"DPRESSAOALTA"="V71052",
"DCOLESTEROL"="V71053",
"Peso"="V72C01")
Usando “Recode” para trocar os valores sem precisar alterar a ordem das colunas dentro do dataframe, o grupo é mantido de acordo com o “peso”.
POF_filtrada$Area_Habitacao <- recode(POF_filtrada$Area_Habitacao, '1' = "urbano", '2' = "rural")
POF_filtrada$Sexo <- recode(POF_filtrada$Sexo, '1' = "homem", '2' = "mulher")
POF_filtrada$Cor <-recode(POF_filtrada$Cor, '1'= "branco",'2' ="preta" ,'3'="amarela", '4'="parda", '5'="indigena", '9'="SD")
POF_filtrada$Gravida <-recode(POF_filtrada$Gravida, '1'= "gravida",'2' ="nao gravida")
POF_filtrada$Lactante <-recode(POF_filtrada$Lactante, '1'= "lactante",'2' ="nao lactante")
POF_filtrada$INSTRUCAO <-recode(POF_filtrada$INSTRUCAO, '1'= "Sem instrucao",'2' ="Fundamental Incompleto" ,'3'="Fundamental Completo", '4'="Medio Incompleto", '5'="Medio Completo",'6'="Superior Incompleto",'7'="Superior Completo")
POF_filtrada$DPRESSAOALTA <-recode(POF_filtrada$DPRESSAOALTA, '1'= "sim",'2' ="nao")
POF_filtrada$DCOLESTEROL <-recode(POF_filtrada$DCOLESTEROL, '1'= "sim",'2' ="nao")
POF_filtrada$DDIABETES <-recode(POF_filtrada$DDIABETES, '1'= "sim",'2' ="nao")
POF_filtrada$DCORACAO <-recode(POF_filtrada$DCORACAO, '1'= "sim",'2' ="nao")
POF_filtrada$Preparacao <-recode(POF_filtrada$PREPARACAO, '1'= "Assado",'2' ="Cozido_gord" ,'3'="Cozido_sgordura", '4'="cru", '5'="Empanado",'6'="Ensopado",'7'="Frito", '8'="Grelhado", '9'="Refogado", '99'= "NA")
POF_filtrada$COD_PREPARACAO_FINAL <-recode(POF_filtrada$COD_PREPARACAO_FINAL, '1'= "Assado",'2' ="Cozido_gord" ,'3'="Cozido_sgordura", '4'="cru", '5'="Empanado",'6'="Ensopado",'7'="Frito", '8'="Grelhado", '9'="Refogado", '99'= "NA")
Conferindo todos os nomes das colunas novamente:
names(POF_filtrada)
## [1] "control" "UF" "Area_Habitacao"
## [4] "DPRESSAOALTA" "DCOLESTEROL" "DDIABETES"
## [7] "DCORACAO" "Gravida" "Lactante"
## [10] "Peso" "Altura" "Idade"
## [13] "Sexo" "Cor" "ANOS_ESTUDO"
## [16] "PESO.x" "PESO_FINAL.x" "INSTRUCAO"
## [19] "QUADRO" "Cod_alimento" "PREPARACAO"
## [22] "COD_PREPARACAO_FINAL" "QTD" "COD_TBCA"
## [25] "PESO_FINAL.y" "Preparacao"
Foi pesquisado durante a entrevista todos os alimentos consumidos nos ultimos dois dias. Substituindo o codigo do alimento pelo nome (por ex. C0001C por Abacate):
library(readxl)
Alimentos <- read_excel("Cadastro.xls")
names(Alimentos)[1:2] <- c("Codigo","Alimento")
POF_filtrada <- merge(POF_filtrada,Alimentos,by.x ="Cod_alimento",by.y = "Codigo",all.x = TRUE, all.y = TRUE)
POF_filtrada <-POF_filtrada[c(2:27,1)]
Salva a POF filtrada como RDS novamente:
saveRDS(POF_filtrada,"POF_filtrada.rds")
Os dados de composição centesimal de proteínas de cada alimento foram, utilizando o COD_TBCA, “Raspados” de internet e adicionados ao dataframe TBCA3
Merge da POF_filtrada com os dados de Proteína da TBCA3, criando uma POF que contem tb os valores de proteína dos alimentos reportados:
TBCA3 <-read_rds("TBCA3.rds")
TBCA3$Proteína<- as.numeric(gsub(",",".",TBCA3$Proteína))
TBCA4 <- TBCA3 %>% group_by(COD_TBCA) %>% summarise(Proteína=mean(Proteína))
POF_Proteina <-merge(POF_filtrada,TBCA4,by.x ="COD_TBCA",by.y = "COD_TBCA" ,all.x = FALSE, all.y=FALSE )
Agora, cada alimento possui na coluna Proteína, o valor percentual que contem de proteína. Para saber a quantidade de proteína ingerida, basta multiplicar a quantidade consumida (QTD) pelo % proteico(Proteína) e teremos o valor em g de proteína consumida durante os dois dias pesquisados.
Criando a coluna Proteína_QTD por dia e salvando como RDS:
POF_Proteina %>% mutate(Proteina_QTD= QTD*(Proteína/100)) ->POF_Proteina
saveRDS(POF_Proteina,"POF_Proteina")
Sumário de proteina ingerida pro dia por pessoa no Brasil
POF_Proteina %>%
group_by(control) %>%
summarise(sum=sum(Proteina_QTD)/2) %>%
summarise(mean=mean(sum, na.rm=TRUE))
## # A tibble: 1 × 1
## mean
## <dbl>
## 1 71.7
O valor médio de consumo de proteína por dia no Brasil foi de 71,7g
Apenas por homens acima de 60 anos:
POF_Proteina %>%
filter(Sexo=="homem", Idade >60) %>%
group_by(control) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>% summarise(mean=mean(sum, na.rm=TRUE))
## # A tibble: 1 × 1
## mean
## <dbl>
## 1 77.0
Encontrado 77.0g enquanto o IBGE reporta 79.9g. Diferença de 3.6%.
Usando a media ponderada (weighted.mean) para tentar compensar pelas variações na amostragem obtemos um valor de 70.5g contra os 79.9g encontrados pelo IBGE. Isso indica que a fonte da variação poderia ser outra e não a poderação em si.
Avaliandos apenas mulheres acima de 60 anos:
POF_Proteina %>%
filter(Sexo=="mulher", Idade>60) %>%
group_by(control) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
summarise(mean=mean(sum, na.rm=TRUE))
## # A tibble: 1 × 1
## mean
## <dbl>
## 1 60.5
FOi encontrado um valor de 60,5g de proteína por dia enquanto o valor reportados pelo IBGE foi de 62.8g, uma diferença de 3,7%.
Levando em consideração as fontes de variação existentes: o uso ou não de fatores de expanção, variação nas tabelas de teor de proteína nos alimentos, etapas de limpeza dos dados e etc. Considero uma diferença de 3,7% como aceitavel e prosseguirei para tentar encontrar a razão entre fontes vegetais e animais.
Filtragem de todos os codigos que possuem as palavras chaves: Carne, Frango, Bovino, Porco, Ovo e Peixe
carnes <- c("frango", "bovino", "porco", "Ovo", "Peixe", "boi","carne")
TBCA3 %>% filter(str_detect(Descrição,pattern = paste(carnes, collapse="|"))) -> TBCA5
TBCA3 %>% filter(!str_detect(Descrição,pattern = paste(carnes, collapse="|"))) -> TBCA6
A TBCA5 possui 355 entradas com todos os alimentos que possuem ingredientes animais com as seis palavras chaves.
Cálculo do teor proteico ingerido usando somente os dados de proteína animal:
POF_Proteina %>%
filter(Sexo=="homem", Idade >60, COD_TBCA %in% TBCA5$COD_TBCA) %>%
group_by(control) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>% summarise(mean=mean(sum, na.rm=TRUE))
## # A tibble: 1 × 1
## mean
## <dbl>
## 1 48.1
Agora, vegetal:
POF_Proteina %>%
filter(Sexo=="homem", Idade >60, COD_TBCA %in% TBCA6$COD_TBCA) %>%
group_by(control) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>% summarise(mean=mean(sum, na.rm=TRUE))
## # A tibble: 1 × 1
## mean
## <dbl>
## 1 30.2
Podemos notar que a seleção dos alimentos que contem proteína animal usando palavras chaves acabaram rendendo um valor proteico de 48g (60%) e os de fonte vegetais 30g(40%).
Esse dado está de acordo com pesquisas que apontam valores como 68%(2) e 66% (3) mas esses dados são relativos aos EUA e Reino Unido. É um pouco surpreendente que o consumo de proteína no brasil se aproxime desses paises desenvolvidos e ainda mais para a população idosa.
Vamos investigar agora como esse consumo de proteina se relaciona com outras variáveis:
Consumo de proteína animal por sexo para pessoas acima de 60 anos:
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo,proteina_animal=COD_TBCA %in% TBCA5$COD_TBCA) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
vtree("Sexo proteina_animal", summary="sum \n media(g)=%meanx%",horiz = FALSE)
## `summarise()` has grouped output by 'control', 'Sexo'. You can override using the `.groups` argument.
No Diagrama acima é possivel ver o teor de Proteína de fonte anima para homens acima de 60 anos(48g) e de origem vegetal (30g) por dia. Os valore femininos são de 36g para origem animal e 25g para vegetal. Desconsiderar os valores médios por sexo, os corretos são:
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
vtree("Sexo ", summary="sum \n media=%meanx%", horiz = FALSE)
## `summarise()` has grouped output by 'control'. You can override using the `.groups` argument.
E qual seria a ingestão de proteína dos indivíduos que não consomem nenhum produto animal? Eles de certa forma compensariam a ausência com plantas mais ricas em proteínas?
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control)%>%
filter(!any(COD_TBCA %in% TBCA5$COD_TBCA)) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2)
## # A tibble: 220 × 2
## control sum
## <chr> <dbl>
## 1 110000016211 47.1
## 2 110000016212 42.7
## 3 1100041521211 27.8
## 4 1100171151415 74.1
## 5 110018411611 31.9
## 6 110018411612 20.7
## 7 1200003201011 14.9
## 8 120001081511 51.7
## 9 1500191201011 42.0
## 10 150027356811 42.5
## # … with 210 more rows
Tivemos 220 idosos (do total de 46164 pessoas) que não reportaram nenhuma das palavras chaves.
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo)%>%
filter(!any(COD_TBCA %in% TBCA5$COD_TBCA)) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
group_by(Sexo)%>%
summarise(mean=mean(sum, na.rm=TRUE))
## `summarise()` has grouped output by 'control'. You can override using the `.groups` argument.
## # A tibble: 2 × 2
## Sexo mean
## <chr> <dbl>
## 1 homem 31.2
## 2 mulher 24.9
Os idosos que não reportaram consumo de proteína animal possuem uma média muito inferior ao resto da população brasileira.
Vamos ver como é a distribuição deles:
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo)%>%
filter(!any(COD_TBCA %in% TBCA5$COD_TBCA)) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
ggplot()+geom_boxplot(aes(Sexo,sum))+ylab("Proteína por dia (g)")
## `summarise()` has grouped output by 'control'. You can override using the `.groups` argument.
Realmente, valore médios mais baixos e poucos outliers.
Ingestão de proteína por sexo e grau de instrução:
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo, INSTRUCAO)%>%
filter(!any(COD_TBCA %in% TBCA5$COD_TBCA)) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
vtree("INSTRUCAO", horiz = FALSE)
## `summarise()` has grouped output by 'control', 'Sexo'. You can override using the `.groups` argument.
Aparentemente a falta de proteína animal indica falta de recursos e não escolha consciente.
Cerca de 75% dos idosos sem ingestão de proteina animal possui apenas Fundamental incompleto ou não possuem instrução.
Onde vivem? Regiões rurais ou urbanas?
POF_Proteina %>%
filter( Idade >60) %>%
group_by(control,Sexo, Area_Habitacao)%>%
filter(!any(COD_TBCA %in% TBCA5$COD_TBCA)) %>%
summarise(sum=sum(Proteina_QTD,na.rm=TRUE)/2) %>%
vtree("Area_Habitacao",horiz=FALSE)
## `summarise()` has grouped output by 'control', 'Sexo'. You can override using the `.groups` argument.
A grande maioria areas urbanas.
Pode ser considerado um exito a reprodução das mesmas médias obtidas pelo IBGE em seu relatório de “Análise do Consumo Alimentar Pessoal no Brasil”(4) para o estrato de idosos acima de 60 anos com um erro tão pequeno como 3,7%. A ingestão de proteína de fonte animal ainda é predominante no Brasil com mais de 60%. A fração da população que menos ingere proteína animal tb ingere uma média inferior de proteína vegetal. Esse estrato da população vive majoritáriamente em cidades (75%) e não possui instrução ou possui somente fundamental incompleto (75%). Pode-se concluir que populações mais pobres são associadas com menor consumo de proteína animal por questões econômicas. (BAH…óbvio Fabiano!)
2 Levine, Morgan E. et al. Cell Metabolism, Volume 19, Issue 3, 407 - 417
3 onnie M, Hooker E, Brunstrom JM, et al. Protein for Life: Review of Optimal Protein Intake, Sustainable Dietary Sources and the Effect on Appetite in Ageing Adults. Nutrients. 2018;10(3):360. Published 2018 Mar 16. doi:10.3390/nu10030360
4 https://biblioteca.ibge.gov.br/visualizacao/livros/liv101742.pdf