{
  "brief": "Tasty Bytes: Recipe Site Traffic",
  "source_profile": {
    "source_url": "https://s3.amazonaws.com/talent-assets.datacamp.com/recipe_site_traffic_2212.csv",
    "source_sha256": "da2c83dd061fa7cfc85c9a5ce7a92682db14da721cac09eb0d166a42d49c9733",
    "rows": 947,
    "columns": [
      "recipe",
      "calories",
      "carbohydrate",
      "sugar",
      "protein",
      "category",
      "servings",
      "high_traffic"
    ],
    "recipe_missing": 0,
    "recipe_duplicate_ids": 0,
    "numeric_missing_by_column": {
      "calories": 52,
      "carbohydrate": 52,
      "sugar": 52,
      "protein": 52
    },
    "rows_all_four_nutrients_missing": 52,
    "category_levels": [
      "Beverages",
      "Breakfast",
      "Chicken",
      "Chicken Breast",
      "Dessert",
      "Lunch/Snacks",
      "Meat",
      "One Dish Meal",
      "Pork",
      "Potato",
      "Vegetable"
    ],
    "unexpected_category_levels": [
      "Chicken Breast"
    ],
    "servings_non_numeric_rows": 3,
    "servings_non_numeric_values": [
      "4 as a snack",
      "6 as a snack"
    ],
    "target_values": {
      "High": 574,
      "blank": 373
    },
    "unexpected_target_values": []
  },
  "label_assumption": "Blank high_traffic treated as not-High; must be confirmed before deployment.",
  "category_decision": "Retain Chicken Breast as an observed 11th level; do not silently merge with Chicken.",
  "servings_decision": "Extract leading integer from three 'as a snack' values; retain all rows.",
  "nutrition_decision": "Keep 52 rows with four missing nutrient fields; impute medians inside training pipeline only.",
  "split": {
    "train": 567,
    "validation": 190,
    "test": 190,
    "seed": 42,
    "method": "stratified random 60/20/20"
  },
  "class_prevalence": 0.6061,
  "dummy_test": {
    "threshold": 0.5,
    "true_negative": 0,
    "false_positive": 75,
    "false_negative": 0,
    "true_positive": 115,
    "selected_count": 190,
    "selection_coverage": 1.0,
    "precision": 0.6053,
    "recall": 1.0,
    "f1": 0.7541,
    "accuracy": 0.6053,
    "balanced_accuracy": 0.5
  },
  "models": {
    "Logistic regression": {
      "validation_at_half": {
        "threshold": 0.5,
        "true_negative": 47,
        "false_positive": 28,
        "false_negative": 29,
        "true_positive": 86,
        "selected_count": 114,
        "selection_coverage": 0.6,
        "precision": 0.7544,
        "recall": 0.7478,
        "f1": 0.7511,
        "accuracy": 0.7,
        "balanced_accuracy": 0.6872
      },
      "validation_choice": {
        "threshold": 0.7021,
        "true_negative": 59,
        "false_positive": 16,
        "false_negative": 51,
        "true_positive": 64,
        "selected_count": 80,
        "selection_coverage": 0.4211,
        "precision": 0.8,
        "recall": 0.5565,
        "f1": 0.6564,
        "accuracy": 0.6474,
        "balanced_accuracy": 0.6716,
        "met_80_percent_precision_on_validation": true
      }
    },
    "Random forest": {
      "validation_at_half": {
        "threshold": 0.5,
        "true_negative": 40,
        "false_positive": 35,
        "false_negative": 21,
        "true_positive": 94,
        "selected_count": 129,
        "selection_coverage": 0.6789,
        "precision": 0.7287,
        "recall": 0.8174,
        "f1": 0.7705,
        "accuracy": 0.7053,
        "balanced_accuracy": 0.6754
      },
      "validation_choice": {
        "threshold": 0.6425,
        "true_negative": 57,
        "false_positive": 18,
        "false_negative": 40,
        "true_positive": 75,
        "selected_count": 93,
        "selection_coverage": 0.4895,
        "precision": 0.8065,
        "recall": 0.6522,
        "f1": 0.7212,
        "accuracy": 0.6947,
        "balanced_accuracy": 0.7061,
        "met_80_percent_precision_on_validation": true
      }
    }
  },
  "selected": {
    "model": "Random forest",
    "threshold_chosen_on_validation": 0.6425,
    "met_80_percent_precision_on_validation": true,
    "validation": {
      "threshold": 0.6425,
      "true_negative": 57,
      "false_positive": 18,
      "false_negative": 40,
      "true_positive": 75,
      "selected_count": 93,
      "selection_coverage": 0.4895,
      "precision": 0.8065,
      "recall": 0.6522,
      "f1": 0.7212,
      "accuracy": 0.6947,
      "balanced_accuracy": 0.7061,
      "met_80_percent_precision_on_validation": true
    },
    "test": {
      "threshold": 0.6425,
      "true_negative": 63,
      "false_positive": 12,
      "false_negative": 37,
      "true_positive": 78,
      "selected_count": 90,
      "selection_coverage": 0.4737,
      "precision": 0.8667,
      "recall": 0.6783,
      "f1": 0.761,
      "accuracy": 0.7421,
      "balanced_accuracy": 0.7591
    },
    "test_precision_wilson_95_percent": [
      0.7813,
      0.9221
    ]
  },
  "limits": [
    "No timestamps permit prospective validation.",
    "The historical featured recipes were selected by a person; this sample may not represent all candidate recipes.",
    "Traffic association does not establish that the recipe caused the increase or that subscriptions rose.",
    "Blank traffic is an unconfirmed negative-label assumption."
  ]
}