Abstract

High-protein diets are widely promoted for weight management, often under the assumption that high-protein foods are less calorie-dense. This analysis tests whether that assumption holds empirically using the USDA National Nutrient Database for Standard Reference. Foods were divided into two groups based on protein content: high-protein (>15 g per 100 g) and low-protein (≤15 g per 100 g). A Welch two-sample t-test compared mean caloric content (kcal per 100 g) between groups, and a multiple linear regression examined the simultaneous effects of protein and fat on calories.

Contrary to initial expectations, no statistically significant difference in mean calorie content was found between high-protein and low-protein foods (p = 0.1817, well above α = 0.05). The null hypothesis of no difference was not rejected. Mean calorie content was nearly identical: approximately 223.5 kcal/100 g for high-protein foods and 227.8 kcal/100 g for low-protein foods. The multiple linear regression confirmed that fat content is the dominant predictor of caloric density, whereas binary protein group membership is not a reliable indicator of caloric “lightness” or “heaviness.” Consumers and clinicians should evaluate the full macronutrient profile rather than relying on protein content as a proxy for energy density.



Overview

Research Question: Is there a statistically significant difference in the average calorie content (kcal per 100 g) between high-protein foods (>15 g protein per 100 g) and low-protein foods (≤15 g protein per 100 g)?

Data context: USDA National Nutrient Database for Standard Reference — an observational dataset of nutritional values for thousands of distinct food items.

Variables:

Variable Role Type Description
calories Response (dependent) Numerical Energy content in kcal per 100 g
protein_group Explanatory variable 1 Categorical “high” if protein > 15 g/100 g, “low” otherwise
fat Explanatory variable 2 Numerical Total fat content in grams per 100 g

Why this analysis matters: Many consumers and clinicians assume high-protein foods are inherently lower in calories. If that assumption is wrong, then labeling foods as “high protein” conveys no reliable information about caloric density — a meaningful finding for dietary planning and health communication.


Part 1 – Introduction

Many people associate high-protein foods with “clean eating” or weight management, often assuming that high-protein foods are inherently lower in calories. However, the relationship between protein content and caloric density is not straightforward. A grilled chicken breast and a handful of mixed nuts can both qualify as high-protein foods, yet they differ dramatically in fat and calorie content.

This analysis uses data from the USDA National Nutrient Database to test whether protein group membership predicts caloric content via a two-sample Welch t-test. A second explanatory variable — total fat content (g per 100 g) — is also explored through multiple linear regression to understand what actually drives caloric density across food groups.


Part 2 – Data

Data Source:
The dataset is sourced from the USDA National Nutrient Database for Standard Reference, compiled into CSV format and hosted on Kaggle by user Viktorija Zezere:
https://www.kaggle.com/datasets/viktorzezere/usda-food-nutritional-values

Cases:
Each case (row) represents a unique food item (e.g., “Butter, with salt”, “Mackerel, salted”). The full dataset contains 8790 food items, and after removing missing values the analysis uses 8790 complete cases.

Type of Study:
This is an observational study. Nutritional measurements were collected from existing food items; no experimental manipulation was conducted.

Explanatory Variables:

  • protein_group (Explanatory Variable 1 — Categorical): Each food is classified as “high” protein if it contains more than 15 g of protein per 100 g, and “low” otherwise. This binary variable is the primary predictor of interest in the t-test.
  • fat (Explanatory Variable 2 — Numerical): Total fat content in grams per 100 g. This continuous variable is included in the regression model to account for the dominant role of fat in caloric density, since fat contributes approximately 9 kcal/g compared to ~4 kcal/g for protein or carbohydrates.

Part 3 – Exploratory Data Analysis

3.1 Group Sizes

food_clean |>
  count(protein_group) |>
  rename(Group = protein_group, Count = n) |>
  kable(caption = "Sample sizes by protein group") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Sample sizes by protein group
Group Count
high 2966
low 5824

3.2 Summary Statistics

summary_stats <- food_clean |>
  group_by(protein_group) |>
  summarise(
    n          = n(),
    mean_cal   = round(mean(calories), 1),
    median_cal = round(median(calories), 1),
    sd_cal     = round(sd(calories), 1),
    min_cal    = min(calories),
    max_cal    = max(calories)
  )

summary_stats |>
  rename(
    Group = protein_group, N = n,
    Mean = mean_cal, Median = median_cal,
    SD = sd_cal, Min = min_cal, Max = max_cal
  ) |>
  kable(caption = "Summary statistics for calories by protein group") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Summary statistics for calories by protein group
Group N Mean Median SD Min Max
high 2966 223.5 198 106.8 69 669
low 5824 227.8 165 194.3 0 902

The mean calorie content is remarkably similar between the two groups: 223.5 kcal/100 g for high-protein foods and 227.8 kcal/100 g for low-protein foods. This small numerical difference — with low-protein foods being marginally higher — suggests that protein group alone may not be a meaningful predictor of caloric content.

3.3 Distributions: Boxplot

ggplot(food_clean, aes(x = protein_group, y = calories, fill = protein_group)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.3) +
  scale_fill_manual(values = c("high" = "#E07B54", "low" = "#5B8DB8")) +
  labs(
    title    = "Distribution of Calorie Content by Protein Group",
    subtitle = "USDA National Nutrient Database",
    x        = "Protein Group",
    y        = "Calories (kcal per 100 g)",
    fill     = "Protein Group"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

Both groups show right skew with notable outliers. The median calorie content and overall distributions are visually similar between groups, consistent with the small numerical difference in means. Both groups contain foods across a wide calorie range, suggesting substantial heterogeneity within each group.

3.4 Distributions: Density Plot

ggplot(food_clean, aes(x = calories, fill = protein_group, color = protein_group)) +
  geom_density(alpha = 0.4, linewidth = 1) +
  scale_fill_manual(values  = c("high" = "#E07B54", "low" = "#5B8DB8")) +
  scale_color_manual(values = c("high" = "#C0522B", "low" = "#3A6A96")) +
  labs(
    title = "Density of Calorie Content by Protein Group",
    x     = "Calories (kcal per 100 g)",
    y     = "Density",
    fill  = "Protein Group",
    color = "Protein Group"
  ) +
  theme_minimal(base_size = 13)

The density curves for both groups overlap substantially, particularly in the moderate-calorie range. The low-protein group shows a sharper, lower-calorie peak (driven by fruits and vegetables), while the high-protein group is more spread out. Despite these shape differences, the means are nearly equal — calorie content is not systematically higher in either group.

3.5 Fat vs. Calories: Scatterplot

ggplot(food_clean, aes(x = fat, y = calories, color = protein_group)) +
  geom_point(alpha = 0.3, size = 1.2) +
  geom_smooth(method = "lm", se = TRUE, linewidth = 1.2) +
  scale_color_manual(values = c("high" = "#E07B54", "low" = "#5B8DB8")) +
  labs(
    title = "Calories vs. Fat Content by Protein Group",
    x     = "Total Fat (g per 100 g)",
    y     = "Calories (kcal per 100 g)",
    color = "Protein Group"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

The strong positive relationship between fat and calories is apparent in both groups. This suggests that fat content — not protein group membership — is the primary driver of caloric density across food items.


Part 4 – Inference

4.1 Hypotheses

  • H₀: There is no difference in mean calorie content between high-protein and low-protein foods.
    μ_high − μ_low = 0

  • H₁: There is a statistically significant difference in mean calorie content between the two groups.
    μ_high − μ_low ≠ 0

Significance level: α = 0.05

4.2 Checking Assumptions

1. Independence: Each food item is a distinct entry in the USDA database. Observations are independent within and between groups. ✅

2. Nearly Normal Distribution (or large n): Both groups are heavily right-skewed (as seen in the density plots). However, with n > 30 in both groups, the Central Limit Theorem ensures the sampling distribution of the mean is approximately normal. ✅

protein_group n
high 2966
low 5824

3. Equal Variance: We use Welch’s two-sample t-test (default in R), which does not assume equal variances between groups. ✅

4.3 Two-Sample t-Test

t_result <- t.test(calories ~ protein_group, data = food_clean, var.equal = FALSE)
print(t_result)
## 
##  Welch Two Sample t-test
## 
## data:  calories by protein_group
## t = -1.3357, df = 8739.8, p-value = 0.1817
## alternative hypothesis: true difference in means between group high and group low is not equal to 0
## 95 percent confidence interval:
##  -10.591672   2.007139
## sample estimates:
## mean in group high  mean in group low 
##           223.4737           227.7660

4.4 Results Summary

Two-sample Welch t-test results
Statistic Value
t-statistic -1.336
Degrees of freedom 8739.8
p-value 1.817e-01
95% CI (lower) -10.59
95% CI (upper) 2.01
Mean calories – high protein 223.5
Mean calories – low protein 227.8

4.5 Interpretation

The Welch two-sample t-test yields t = −1.336, p = 0.1817 with 8739.8 degrees of freedom.

Since p = 0.1817 > α = 0.05, we fail to reject the null hypothesis. There is insufficient statistical evidence to conclude that high-protein and low-protein foods differ in mean calorie content.

The 95% confidence interval for the difference in means (μ_high − μ_low) is [−10.59, 2.01], which includes zero. This is consistent with the non-significant p-value: zero is a plausible value for the true difference, meaning we cannot rule out that the groups are equally calorie-dense on average.

Notably, the observed difference in means is small (≈ −4.3 kcal/100 g) and in the direction opposite to the common assumption — low-protein foods had a slightly higher mean calorie count. However, this difference was not statistically significant, and we cannot generalize it to the broader food population.

4.6 Multiple Linear Regression: Protein and Fat as Predictors

To formally examine the roles of both macronutrients as continuous predictors, we fit a multiple linear regression model predicting calories from both protein and fat.

mlr_model <- lm(calories ~ protein + fat, data = food_clean)
summary(mlr_model)
## 
## Call:
## lm(formula = calories ~ protein + fat, data = food_clean)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -223.17  -66.68  -38.42   45.01  275.14 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 123.85774    1.69125  73.234   <2e-16 ***
## protein       1.00977    0.10133   9.965   <2e-16 ***
## fat           8.62313    0.06747 127.799   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 99.85 on 8787 degrees of freedom
## Multiple R-squared:  0.6546, Adjusted R-squared:  0.6546 
## F-statistic:  8328 on 2 and 8787 DF,  p-value: < 2.2e-16
Multiple Linear Regression: Calories ~ Protein + Fat
Term Estimate Std. Error t value Pr(>&#124;t&#124;)
(Intercept) 123.8577 1.6913 73.2343 0
protein 1.0098 0.1013 9.9648 0
fat 8.6231 0.0675 127.7990 0

Model Fit (R²):

The model explains 65.5% of the variance in caloric content (R² = 0.655, Adjusted R² = 0.655). This indicates a strong fit: together, protein and fat content account for the large majority of between-food variation in calories, which is consistent with biochemistry — calories are derived almost entirely from macronutrients (fat ≈ 9 kcal/g, protein and carbohydrates ≈ 4 kcal/g each).

Reconciling the t-test and regression results:
These two analyses appear contradictory at first glance — the t-test found protein non-significant while the regression found it significant — but the discrepancy is statistically valid and instructive. The t-test compared groups defined by a binary cutoff (>15 g vs. ≤15 g). That cutoff lumps together very different foods within each group (e.g., a 16 g-protein food and an 80 g-protein food are both “high”), discarding continuous information and creating heterogeneous groups in which the protein signal is diluted. The regression treats protein as a continuous variable, preserving the full range of values and capturing the linear relationship between protein content and calories — a relationship that exists but is obscured by the coarse binary grouping. In short: the binary grouping loses information; the continuous relationship is significant, but the threshold-based comparison is not.

Interpretation of coefficients: For every additional gram of fat per 100 g, calories increase by approximately 8–9 kcal — consistent with the known energy density of fat (9 kcal/g). Fat remains the dominant predictor in both effect size and variance explained.


Part 5 – Conclusion

Summary: This analysis tested whether high-protein foods (>15 g protein per 100 g) differ significantly in caloric content from low-protein foods using the USDA National Nutrient Database (n = 8790). The two-sample Welch t-test produced p = 0.1817, which exceeds the α = 0.05 significance threshold. We therefore fail to reject the null hypothesis: there is no statistically significant difference in mean calorie content between the two groups.

Key Finding: Protein group membership — defined by a binary threshold of 15 g/100 g — is not a statistically significant predictor of caloric content. The mean calorie values for both groups were nearly identical (223.5 vs. 227.8 kcal/100 g), and the 95% confidence interval for the difference in means included zero. The multiple linear regression revealed that fat content is the dominant driver of caloric density (R² = 0.655), explaining the vast majority of variance in calories. When protein is treated as a continuous variable, it also reaches statistical significance — but the binary grouping used in the t-test is too coarse to detect that relationship.

Why This Analysis Matters: These findings directly challenge the widespread dietary assumption that “high-protein” is synonymous with “lower-calorie.” Our results show that protein group membership conveys no reliable information about caloric density. Consumers who select foods on the basis of high protein content alone — expecting to reduce calorie intake — may be misled. Clinicians and nutrition educators should emphasize that the full macronutrient profile, particularly fat content, is what determines how calorie-dense a food is. This has practical implications for food labeling, dietary counseling, and public health messaging around protein-centric diets.

Limitations:

  • The 15 g/100 g threshold for “high protein” is arbitrary; different cutoffs could yield different results.
  • This is an observational study — we cannot infer causation from group membership.
  • The USDA database includes raw, processed, and restaurant foods without weighting for actual consumption frequency, so the groups may not reflect real dietary patterns.
  • The dataset does not account for serving size, which matters more for actual caloric intake than per-100 g values.
  • Database composition bias: The USDA database over-represents processed and manufactured foods; in a dataset of whole, minimally processed foods, results might differ.
  • The non-significant result does not prove the groups are identical — it means the data did not provide enough evidence to detect a difference at α = 0.05. A Type II error (failing to detect a real but small difference) remains possible.

Future Directions: A natural extension would model the relationship continuously (protein as a numeric predictor) and stratify by food category (e.g., meats vs. dairy vs. legumes) to understand within-category variation. Incorporating carbohydrates as a third macronutrient predictor would yield a more complete energy model.


References

Zezere, V. (n.d.). USDA food nutritional values [Dataset]. Kaggle. https://www.kaggle.com/datasets/viktorzezere/usda-food-nutritional-values

U.S. Department of Agriculture, Agricultural Research Service. USDA National Nutrient Database for Standard Reference. https://www.ars.usda.gov/northeast-area/beltsville-md-bhnrc/beltsville-human-nutrition-research-center/nutrient-data-laboratory/

R Core Team (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/

Wickham H, et al. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686.


Appendix

# QQ plots to visualize departure from normality in each group
par(mfrow = c(1, 2))

qqnorm(food_clean$calories[food_clean$protein_group == "high"],
       main = "Q-Q Plot: High Protein")
qqline(food_clean$calories[food_clean$protein_group == "high"], col = "#E07B54", lwd = 2)

qqnorm(food_clean$calories[food_clean$protein_group == "low"],
       main = "Q-Q Plot: Low Protein")
qqline(food_clean$calories[food_clean$protein_group == "low"], col = "#5B8DB8", lwd = 2)

Both groups show deviation from normality in the tails (right skew), as expected for nutritional data. The large sample sizes in both groups (n >> 30) mean the Central Limit Theorem applies and the t-test remains valid despite the non-normality.