{
"cells": [
{
"cell_type": "markdown",
"id": "9c8fe017",
"metadata": {},
"source": [
"# Central Motivation\n",
"\n",
"How different are fast food places from each other? Many people swear by their favorite restaurant, but can this by justified by emprirical factors, such as nutrition facts? Is there a big difference between the fast food chains that claim specializations in certain food products, such as burger places vs. chicken places vs. \"healthy\" options? Our program is exploratory by nature, seeking find the differentiating nutritional factors between varying fast food chains. The applications range from helping businesses gain insight on how their menus vary from their competitors to recommending similar food items."
]
},
{
"cell_type": "markdown",
"id": "7905a458",
"metadata": {},
"source": [
"# Summary of Data Processing Pipeline "
]
},
{
"cell_type": "markdown",
"id": "40e68a9d",
"metadata": {},
"source": [
"Data Sources from multiple sources:\n",
"\n",
"## Get Data Sources\n",
"1. From PDF converted to Xcel (BGOOD) (converted using ADOBE) --> merged\n",
"\n",
"\n",
"2. Webscraping \n",
"\n",
"\n",
"3. CSV file of fast food nutrition facts downloaded from [OpenIntro](https://www.openintro.org/data/index.php?data=fastfood)\n",
"\n",
"\n",
"4. From PDF to CSV (In and Out Burger)\n",
"\n",
"\n",
"## Merge Data Sources\n",
"1. Merge all our data sources into one dataframe\n",
"\n",
"\n",
"## Clean Data\n",
"1. In the pandas DF, we need to further clean and account for missing values"
]
},
{
"cell_type": "markdown",
"id": "cda11570",
"metadata": {},
"source": [
"# Obtain, Clean, and Merge Data Sources "
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "e766376b",
"metadata": {},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"import requests\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import plotly\n",
"import requests"
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "ccf3797c",
"metadata": {},
"outputs": [],
"source": [
"def get_url(url):\n",
" \"\"\" gets the html string of the url\n",
"\n",
" Args:\n",
" url (str): website url\n",
"\n",
" Returns:\n",
" html_str (str): html of website\n",
" \"\"\"\n",
" html_str = requests.get(url).text\n",
" \n",
" return html_str"
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "2895fbc0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" restaurant \n",
" item \n",
" calories \n",
" cal_fat \n",
" total_fat \n",
" sat_fat \n",
" trans_fat \n",
" cholesterol \n",
" sodium \n",
" total_carb \n",
" fiber \n",
" sugar \n",
" protein \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Mcdonalds \n",
" Artisan Grilled Chicken Sandwich \n",
" 380 \n",
" 60 \n",
" 7 \n",
" 2.0 \n",
" 0.0 \n",
" 95 \n",
" 1110 \n",
" 44 \n",
" 3.0 \n",
" 11 \n",
" 37.0 \n",
" \n",
" \n",
" 1 \n",
" Mcdonalds \n",
" Single Bacon Smokehouse Burger \n",
" 840 \n",
" 410 \n",
" 45 \n",
" 17.0 \n",
" 1.5 \n",
" 130 \n",
" 1580 \n",
" 62 \n",
" 2.0 \n",
" 18 \n",
" 46.0 \n",
" \n",
" \n",
" 2 \n",
" Mcdonalds \n",
" Double Bacon Smokehouse Burger \n",
" 1130 \n",
" 600 \n",
" 67 \n",
" 27.0 \n",
" 3.0 \n",
" 220 \n",
" 1920 \n",
" 63 \n",
" 3.0 \n",
" 18 \n",
" 70.0 \n",
" \n",
" \n",
" 3 \n",
" Mcdonalds \n",
" Grilled Bacon Smokehouse Chicken Sandwich \n",
" 750 \n",
" 280 \n",
" 31 \n",
" 10.0 \n",
" 0.5 \n",
" 155 \n",
" 1940 \n",
" 62 \n",
" 2.0 \n",
" 18 \n",
" 55.0 \n",
" \n",
" \n",
" 4 \n",
" Mcdonalds \n",
" Crispy Bacon Smokehouse Chicken Sandwich \n",
" 920 \n",
" 410 \n",
" 45 \n",
" 12.0 \n",
" 0.5 \n",
" 120 \n",
" 1980 \n",
" 81 \n",
" 4.0 \n",
" 18 \n",
" 46.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" restaurant item calories cal_fat \\\n",
"0 Mcdonalds Artisan Grilled Chicken Sandwich 380 60 \n",
"1 Mcdonalds Single Bacon Smokehouse Burger 840 410 \n",
"2 Mcdonalds Double Bacon Smokehouse Burger 1130 600 \n",
"3 Mcdonalds Grilled Bacon Smokehouse Chicken Sandwich 750 280 \n",
"4 Mcdonalds Crispy Bacon Smokehouse Chicken Sandwich 920 410 \n",
"\n",
" total_fat sat_fat trans_fat cholesterol sodium total_carb fiber \\\n",
"0 7 2.0 0.0 95 1110 44 3.0 \n",
"1 45 17.0 1.5 130 1580 62 2.0 \n",
"2 67 27.0 3.0 220 1920 63 3.0 \n",
"3 31 10.0 0.5 155 1940 62 2.0 \n",
"4 45 12.0 0.5 120 1980 81 4.0 \n",
"\n",
" sugar protein \n",
"0 11 37.0 \n",
"1 18 46.0 \n",
"2 18 70.0 \n",
"3 18 55.0 \n",
"4 18 46.0 "
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Open Intro Menu Data\n",
"df_ff = pd.read_csv('fastfood.csv')\n",
"df_ff.drop(columns=['salad', 'calcium', 'vit_a', 'vit_c'], inplace=True)\n",
"df_ff.head()"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "39942153",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" item \n",
" calories \n",
" total_fat \n",
" sat_fat \n",
" trans_fat \n",
" cholesterol \n",
" sodium \n",
" total_carb \n",
" fiber \n",
" sugar \n",
" protein \n",
" restaurant \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" The Classic \n",
" 590 \n",
" 40.2 \n",
" 9.1 \n",
" 1 \n",
" 87 \n",
" 977 \n",
" 33 \n",
" 3 \n",
" 4 \n",
" 23 \n",
" BGood \n",
" \n",
" \n",
" 1 \n",
" West Side \n",
" 550 \n",
" 44.6 \n",
" 9.9 \n",
" 1 \n",
" 58 \n",
" 1294 \n",
" 45 \n",
" 9 \n",
" 9 \n",
" 25 \n",
" BGood \n",
" \n",
" \n",
" 2 \n",
" The Farmhouse \n",
" 720 \n",
" 56.1 \n",
" 16.9 \n",
" 1 \n",
" 130 \n",
" 1174 \n",
" 34 \n",
" 2 \n",
" 4 \n",
" 37 \n",
" BGood \n",
" \n",
" \n",
" 3 \n",
" The Freebird \n",
" 785 \n",
" 52.8 \n",
" 15.7 \n",
" 0 \n",
" 166 \n",
" 991 \n",
" 36 \n",
" 3 \n",
" 5 \n",
" 43 \n",
" BGood \n",
" \n",
" \n",
" 4 \n",
" Power Play \n",
" 640 \n",
" 47.1 \n",
" 16.5 \n",
" 1 \n",
" 350 \n",
" 1281 \n",
" 38 \n",
" 7 \n",
" 4 \n",
" 41 \n",
" BGood \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" item calories total_fat sat_fat trans_fat cholesterol sodium \\\n",
"0 The Classic 590 40.2 9.1 1 87 977 \n",
"1 West Side 550 44.6 9.9 1 58 1294 \n",
"2 The Farmhouse 720 56.1 16.9 1 130 1174 \n",
"3 The Freebird 785 52.8 15.7 0 166 991 \n",
"4 Power Play 640 47.1 16.5 1 350 1281 \n",
"\n",
" total_carb fiber sugar protein restaurant \n",
"0 33 3 4 23 BGood \n",
"1 45 9 9 25 BGood \n",
"2 34 2 4 37 BGood \n",
"3 36 3 5 43 BGood \n",
"4 38 7 4 41 BGood "
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# B GOOD Data\n",
"df_bgood = pd.read_csv('bgood_menu_only.csv')\n",
"df_bgood['restaurant'] = 'BGood'\n",
"\n",
"\n",
"df_bgood.rename(columns = {'Craft Burgers':'item', \n",
" 'Calories':'calories',\n",
" 'Total Fat (g)':'total_fat',\n",
" 'Saturated Fat (g)':'sat_fat',\n",
" 'Trans Fat (g)':'trans_fat',\n",
" 'Cholesterol (mg)':'cholesterol',\n",
" 'Sodium (mg)': 'sodium',\n",
" 'Total Carbohydrate (g)':'total_carb',\n",
" 'Fiber (g)': 'fiber',\n",
" 'Sugars (g)': 'sugar',\n",
" 'Protein (g)': 'protein'}, inplace = True)\n",
"\n",
"df_bgood.drop(['Unnamed: 3', 'Unnamed: 5', 'Unnamed: 7', \n",
" 'Unnamed: 9', 'Unnamed: 11','Unnamed: 13', \n",
" 'Unnamed: 14','Unnamed: 16'], axis = 1, inplace = True)\n",
"\n",
"df_bgood.head()"
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "0175117c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" item \n",
" calories \n",
" total_fat \n",
" sat_fat \n",
" trans_fat \n",
" cholesterol \n",
" sodium \n",
" total_carb \n",
" fiber \n",
" sugar \n",
" protein \n",
" restaurant \n",
" cal_fat \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" The Classic \n",
" 590 \n",
" 40.2 \n",
" 9.1 \n",
" 1 \n",
" 87 \n",
" 977 \n",
" 33 \n",
" 3 \n",
" 4 \n",
" 23 \n",
" BGood \n",
" NaN \n",
" \n",
" \n",
" 1 \n",
" West Side \n",
" 550 \n",
" 44.6 \n",
" 9.9 \n",
" 1 \n",
" 58 \n",
" 1294 \n",
" 45 \n",
" 9 \n",
" 9 \n",
" 25 \n",
" BGood \n",
" NaN \n",
" \n",
" \n",
" 2 \n",
" The Farmhouse \n",
" 720 \n",
" 56.1 \n",
" 16.9 \n",
" 1 \n",
" 130 \n",
" 1174 \n",
" 34 \n",
" 2 \n",
" 4 \n",
" 37 \n",
" BGood \n",
" NaN \n",
" \n",
" \n",
" 3 \n",
" The Freebird \n",
" 785 \n",
" 52.8 \n",
" 15.7 \n",
" 0 \n",
" 166 \n",
" 991 \n",
" 36 \n",
" 3 \n",
" 5 \n",
" 43 \n",
" BGood \n",
" NaN \n",
" \n",
" \n",
" 4 \n",
" Power Play \n",
" 640 \n",
" 47.1 \n",
" 16.5 \n",
" 1 \n",
" 350 \n",
" 1281 \n",
" 38 \n",
" 7 \n",
" 4 \n",
" 41 \n",
" BGood \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 510 \n",
" Spicy Triple Double Crunchwrap \n",
" 780 \n",
" 38 \n",
" 10 \n",
" 0.5 \n",
" 50 \n",
" 1850 \n",
" 87 \n",
" 9 \n",
" 8 \n",
" 23 \n",
" Taco Bell \n",
" 340.0 \n",
" \n",
" \n",
" 511 \n",
" Express Taco Salad w/ Chips \n",
" 580 \n",
" 29 \n",
" 9 \n",
" 1 \n",
" 60 \n",
" 1270 \n",
" 59 \n",
" 8 \n",
" 7 \n",
" 23 \n",
" Taco Bell \n",
" 260.0 \n",
" \n",
" \n",
" 512 \n",
" Fiesta Taco Salad-Beef \n",
" 780 \n",
" 42 \n",
" 10 \n",
" 1 \n",
" 60 \n",
" 1340 \n",
" 74 \n",
" 11 \n",
" 7 \n",
" 26 \n",
" Taco Bell \n",
" 380.0 \n",
" \n",
" \n",
" 513 \n",
" Fiesta Taco Salad-Chicken \n",
" 720 \n",
" 35 \n",
" 7 \n",
" 0 \n",
" 70 \n",
" 1260 \n",
" 70 \n",
" 8 \n",
" 8 \n",
" 32 \n",
" Taco Bell \n",
" 320.0 \n",
" \n",
" \n",
" 514 \n",
" Fiesta Taco Salad-Steak \n",
" 720 \n",
" 36 \n",
" 8 \n",
" 1 \n",
" 55 \n",
" 1340 \n",
" 70 \n",
" 8 \n",
" 8 \n",
" 28 \n",
" Taco Bell \n",
" 320.0 \n",
" \n",
" \n",
"
\n",
"
571 rows × 13 columns
\n",
"
"
],
"text/plain": [
" item calories total_fat sat_fat trans_fat \\\n",
"0 The Classic 590 40.2 9.1 1 \n",
"1 West Side 550 44.6 9.9 1 \n",
"2 The Farmhouse 720 56.1 16.9 1 \n",
"3 The Freebird 785 52.8 15.7 0 \n",
"4 Power Play 640 47.1 16.5 1 \n",
".. ... ... ... ... ... \n",
"510 Spicy Triple Double Crunchwrap 780 38 10 0.5 \n",
"511 Express Taco Salad w/ Chips 580 29 9 1 \n",
"512 Fiesta Taco Salad-Beef 780 42 10 1 \n",
"513 Fiesta Taco Salad-Chicken 720 35 7 0 \n",
"514 Fiesta Taco Salad-Steak 720 36 8 1 \n",
"\n",
" cholesterol sodium total_carb fiber sugar protein restaurant cal_fat \n",
"0 87 977 33 3 4 23 BGood NaN \n",
"1 58 1294 45 9 9 25 BGood NaN \n",
"2 130 1174 34 2 4 37 BGood NaN \n",
"3 166 991 36 3 5 43 BGood NaN \n",
"4 350 1281 38 7 4 41 BGood NaN \n",
".. ... ... ... ... ... ... ... ... \n",
"510 50 1850 87 9 8 23 Taco Bell 340.0 \n",
"511 60 1270 59 8 7 23 Taco Bell 260.0 \n",
"512 60 1340 74 11 7 26 Taco Bell 380.0 \n",
"513 70 1260 70 8 8 32 Taco Bell 320.0 \n",
"514 55 1340 70 8 8 28 Taco Bell 320.0 \n",
"\n",
"[571 rows x 13 columns]"
]
},
"execution_count": 102,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_bgood_ff = pd.concat([df_bgood, df_ff])\n",
"df_bgood_ff"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "cc95306c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" item \n",
" calories \n",
" total_fat \n",
" saturated_fat \n",
" trans_fat \n",
" cholesterol \n",
" sodium \n",
" total_carb \n",
" fiber \n",
" sugar \n",
" protein \n",
" restaurant \n",
" \n",
" \n",
" \n",
" \n",
" 4 \n",
" Hamburger Patty \n",
" 220 \n",
" 17 \n",
" 8 \n",
" 1 \n",
" 60 \n",
" 50 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 16 \n",
" Five Guys \n",
" \n",
" \n",
" 5 \n",
" Hot Dog \n",
" 240 \n",
" 20 \n",
" 9 \n",
" 1 \n",
" 45 \n",
" 1040 \n",
" 2 \n",
" 0 \n",
" 1 \n",
" 11 \n",
" Five Guys \n",
" \n",
" \n",
" 7 \n",
" Five Guys Bun \n",
" 260 \n",
" 9 \n",
" 3.5 \n",
" 0 \n",
" 5 \n",
" 330 \n",
" 39 \n",
" 2 \n",
" 8 \n",
" 7 \n",
" Five Guys \n",
" \n",
" \n",
" 9 \n",
" Little \n",
" 526 \n",
" 23 \n",
" 4 \n",
" 0.5 \n",
" 0 \n",
" 531 \n",
" 72 \n",
" 8 \n",
" 2 \n",
" 8 \n",
" Five Guys \n",
" \n",
" \n",
" 10 \n",
" Regular \n",
" 953 \n",
" 41 \n",
" 7 \n",
" 1 \n",
" 0 \n",
" 962 \n",
" 131 \n",
" 15 \n",
" 4 \n",
" 15 \n",
" Five Guys \n",
" \n",
" \n",
" 11 \n",
" Large \n",
" 1314 \n",
" 57 \n",
" 10 \n",
" 1 \n",
" 0 \n",
" 1327 \n",
" 181 \n",
" 21 \n",
" 6 \n",
" 20 \n",
" Five Guys \n",
" \n",
" \n",
" 13 \n",
" A.1® Sauce \n",
" 15 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 280 \n",
" 3 \n",
" 0 \n",
" 2 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 15 \n",
" Cheese*# (1 slice) \n",
" 70 \n",
" 6 \n",
" 4 \n",
" 0.2 \n",
" 15 \n",
" 360 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 4 \n",
" Five Guys \n",
" \n",
" \n",
" 17 \n",
" Grilled Mushrooms \n",
" 5 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 55 \n",
" 1 \n",
" 0 \n",
" 1 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 18 \n",
" Hot Sauce \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 200 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 20 \n",
" Ketchup \n",
" 20 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 160 \n",
" 5 \n",
" 0 \n",
" 4 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 22 \n",
" Mayonnaise \n",
" 100 \n",
" 11 \n",
" 2 \n",
" 0 \n",
" 10 \n",
" 75 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 23 \n",
" Mustard \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 55 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 25 \n",
" Pickles \n",
" 3 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 258 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
" 26 \n",
" Relish \n",
" 10 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 105 \n",
" 3 \n",
" 0 \n",
" 3 \n",
" 0 \n",
" Five Guys \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" item calories total_fat saturated_fat trans_fat cholesterol \\\n",
"4 Hamburger Patty 220 17 8 1 60 \n",
"5 Hot Dog 240 20 9 1 45 \n",
"7 Five Guys Bun 260 9 3.5 0 5 \n",
"9 Little 526 23 4 0.5 0 \n",
"10 Regular 953 41 7 1 0 \n",
"11 Large 1314 57 10 1 0 \n",
"13 A.1® Sauce 15 0 0 0 0 \n",
"15 Cheese*# (1 slice) 70 6 4 0.2 15 \n",
"17 Grilled Mushrooms 5 0 0 0 0 \n",
"18 Hot Sauce 0 0 0 0 0 \n",
"20 Ketchup 20 0 0 0 0 \n",
"22 Mayonnaise 100 11 2 0 10 \n",
"23 Mustard 0 0 0 0 0 \n",
"25 Pickles 3 0 0 0 0 \n",
"26 Relish 10 0 0 0 0 \n",
"\n",
" sodium total_carb fiber sugar protein restaurant \n",
"4 50 0 0 0 16 Five Guys \n",
"5 1040 2 0 1 11 Five Guys \n",
"7 330 39 2 8 7 Five Guys \n",
"9 531 72 8 2 8 Five Guys \n",
"10 962 131 15 4 15 Five Guys \n",
"11 1327 181 21 6 20 Five Guys \n",
"13 280 3 0 2 0 Five Guys \n",
"15 360 0 0 0 4 Five Guys \n",
"17 55 1 0 1 0 Five Guys \n",
"18 200 0 0 0 0 Five Guys \n",
"20 160 5 0 4 0 Five Guys \n",
"22 75 0 0 0 0 Five Guys \n",
"23 55 0 0 0 0 Five Guys \n",
"25 258 1 0 0 0 Five Guys \n",
"26 105 3 0 3 0 Five Guys "
]
},
"execution_count": 103,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# B GOOD Data\n",
"five_guys_df = pd.read_csv('five_guys.csv', \n",
" names=['item','serving_size','calories', 'total_fat', \n",
" 'saturated_fat', 'trans_fat', 'cholesterol', 'sodium',\n",
" 'total_carb', 'fiber', 'sugar', 'protein'])\n",
"five_guys_df.dropna(inplace=True)\n",
"five_guys_df = five_guys_df[1:] \n",
"five_guys_df['restaurant'] = 'Five Guys'\n",
"five_guys_df.drop(columns='serving_size', inplace=True)\n",
"five_guys_df\n"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "50312a17",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" item \n",
" calories \n",
" total_fat \n",
" saturated_fat \n",
" trans_fat \n",
" cholesterol \n",
" sodium \n",
" total_carb \n",
" fiber \n",
" sugar \n",
" protein \n",
" restaurant \n",
" sat_fat \n",
" cal_fat \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Hamburger Patty \n",
" 220 \n",
" 17 \n",
" 8 \n",
" 1 \n",
" 60 \n",
" 50 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 16 \n",
" Five Guys \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 1 \n",
" Hot Dog \n",
" 240 \n",
" 20 \n",
" 9 \n",
" 1 \n",
" 45 \n",
" 1040 \n",
" 2 \n",
" 0 \n",
" 1 \n",
" 11 \n",
" Five Guys \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2 \n",
" Five Guys Bun \n",
" 260 \n",
" 9 \n",
" 3.5 \n",
" 0 \n",
" 5 \n",
" 330 \n",
" 39 \n",
" 2 \n",
" 8 \n",
" 7 \n",
" Five Guys \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 3 \n",
" Little \n",
" 526 \n",
" 23 \n",
" 4 \n",
" 0.5 \n",
" 0 \n",
" 531 \n",
" 72 \n",
" 8 \n",
" 2 \n",
" 8 \n",
" Five Guys \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 4 \n",
" Regular \n",
" 953 \n",
" 41 \n",
" 7 \n",
" 1 \n",
" 0 \n",
" 962 \n",
" 131 \n",
" 15 \n",
" 4 \n",
" 15 \n",
" Five Guys \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 581 \n",
" Spicy Triple Double Crunchwrap \n",
" 780 \n",
" 38 \n",
" NaN \n",
" 0.5 \n",
" 50 \n",
" 1850 \n",
" 87 \n",
" 9 \n",
" 8 \n",
" 23 \n",
" Taco Bell \n",
" 10 \n",
" 340.0 \n",
" \n",
" \n",
" 582 \n",
" Express Taco Salad w/ Chips \n",
" 580 \n",
" 29 \n",
" NaN \n",
" 1 \n",
" 60 \n",
" 1270 \n",
" 59 \n",
" 8 \n",
" 7 \n",
" 23 \n",
" Taco Bell \n",
" 9 \n",
" 260.0 \n",
" \n",
" \n",
" 583 \n",
" Fiesta Taco Salad-Beef \n",
" 780 \n",
" 42 \n",
" NaN \n",
" 1 \n",
" 60 \n",
" 1340 \n",
" 74 \n",
" 11 \n",
" 7 \n",
" 26 \n",
" Taco Bell \n",
" 10 \n",
" 380.0 \n",
" \n",
" \n",
" 584 \n",
" Fiesta Taco Salad-Chicken \n",
" 720 \n",
" 35 \n",
" NaN \n",
" 0 \n",
" 70 \n",
" 1260 \n",
" 70 \n",
" 8 \n",
" 8 \n",
" 32 \n",
" Taco Bell \n",
" 7 \n",
" 320.0 \n",
" \n",
" \n",
" 585 \n",
" Fiesta Taco Salad-Steak \n",
" 720 \n",
" 36 \n",
" NaN \n",
" 1 \n",
" 55 \n",
" 1340 \n",
" 70 \n",
" 8 \n",
" 8 \n",
" 28 \n",
" Taco Bell \n",
" 8 \n",
" 320.0 \n",
" \n",
" \n",
"
\n",
"
586 rows × 14 columns
\n",
"
"
],
"text/plain": [
" item calories total_fat saturated_fat \\\n",
"0 Hamburger Patty 220 17 8 \n",
"1 Hot Dog 240 20 9 \n",
"2 Five Guys Bun 260 9 3.5 \n",
"3 Little 526 23 4 \n",
"4 Regular 953 41 7 \n",
".. ... ... ... ... \n",
"581 Spicy Triple Double Crunchwrap 780 38 NaN \n",
"582 Express Taco Salad w/ Chips 580 29 NaN \n",
"583 Fiesta Taco Salad-Beef 780 42 NaN \n",
"584 Fiesta Taco Salad-Chicken 720 35 NaN \n",
"585 Fiesta Taco Salad-Steak 720 36 NaN \n",
"\n",
" trans_fat cholesterol sodium total_carb fiber sugar protein restaurant \\\n",
"0 1 60 50 0 0 0 16 Five Guys \n",
"1 1 45 1040 2 0 1 11 Five Guys \n",
"2 0 5 330 39 2 8 7 Five Guys \n",
"3 0.5 0 531 72 8 2 8 Five Guys \n",
"4 1 0 962 131 15 4 15 Five Guys \n",
".. ... ... ... ... ... ... ... ... \n",
"581 0.5 50 1850 87 9 8 23 Taco Bell \n",
"582 1 60 1270 59 8 7 23 Taco Bell \n",
"583 1 60 1340 74 11 7 26 Taco Bell \n",
"584 0 70 1260 70 8 8 32 Taco Bell \n",
"585 1 55 1340 70 8 8 28 Taco Bell \n",
"\n",
" sat_fat cal_fat \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
".. ... ... \n",
"581 10 340.0 \n",
"582 9 260.0 \n",
"583 10 380.0 \n",
"584 7 320.0 \n",
"585 8 320.0 \n",
"\n",
"[586 rows x 14 columns]"
]
},
"execution_count": 104,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_all_ff = pd.concat([five_guys_df, df_bgood_ff], axis=0, ignore_index=True)\n",
"\n",
"df_all_ff"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "00745809",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Five Guys', 'BGood', 'Mcdonalds', 'Chick Fil-A', 'Sonic', 'Arbys',\n",
" 'Burger King', 'Dairy Queen', 'Subway', 'Taco Bell'], dtype=object)"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_all_ff.restaurant.unique()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "33573791",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "eddb15fd",
"metadata": {},
"source": [
"# Visualization "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "84bacee6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
":4: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" dfg = df_ff.groupby(['restaurant'])['calories','sodium','protein'].mean()\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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jODyyy/nuOOO46abbgLgmWee4a677qJr165ceeWVC19z/PHHc+KJJ7Lddtvx4osvsttuuzF16lTOO+88Lr74YrbddlveffddevTosdQ/l5OFmVkruueee9h///3p2bMnAKutthqTJ0/mwAMPZNasWXz00UdlxzaMHz+eG29MS4wfdthhfP/731+474ADDqBr166Lveauu+7iySefXPj8nXfeYe7cuWy77bacdNJJHHLIIey333706dNnqX8uV0OZmbWiiFisW+p3v/tdjj32WCZPnsxvfvObqsY3lJ5j+eWXL3vMJ598wvjx45k0aRKTJk3i5ZdfZsUVV+SUU07hsssuY968eQwdOpSnnnpq6X4onCzMzFrVsGHDuOGGG3jjjTcAePPNN3n77bfp3bs3AGPGjCn7um222YbrrrsOgLFjx7LddttVvNauu+66SE+qSZMmAfDcc8+x+eabM2rUKAYNGtQqycLVUGbWobVmV9dqbLrpppx++unssMMOdO3alS233JIzzzyTAw44gN69ezN06FCmT5++2OsuvPBCvvGNb/CLX/yCXr16ccUVV1S81oUXXsgxxxzDgAEDmD9/Pttvvz2//vWv+eUvf8k//vEPunbtyiabbMKXv/zlpf65FBFLfZJ6NGjQoFjqxY/cwG3W7kydOpWNN9646DDahXLvlaSJETGo8bGuhjIzs4qcLMzMrCInCzMzq8jJwszMKnKyMDOzipwszMysIo+zMLOOrbku8Et0vrbpNj9u3DjOO+88brvttsKmIW+Ok4WZWZ0pahry5jhZmLVXHjRal9577z2++tWvMnPmTBYsWMAPf/hDevbsycknn8z8+fMZPHgwo0ePpnv37tx+++2ccMIJ9OzZk6222mrhOUoXRTriiCPYa6+92H///QFYYYUVePfddxk3bhxnnHEGa665JpMmTWK//fZj880354ILLmDevHncdNNNrL/++q32c7nNwsysFd1+++2svfbaPPbYYzzxxBPsvvvuHHHEEVx//fVMnjyZ+fPnM3r0aD744AOOOuoobr31Vv75z3/y6quvtvhajz32GBdccAGTJ0/m6quv5plnnuHhhx/mm9/8JhdddFGr/lxOFmZmrWjzzTfnrrvuYtSoUfzzn/9kxowZ9OvXjw022ACAESNGcN999/HUU0/Rr18/+vfvjyQOPfTQFl9r8ODB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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Segmented Bar Chart \n",
"\n",
"df_ff = df_ff.replace(np.nan, 0)\n",
"dfg = df_ff.groupby(['restaurant'])['calories','sodium','protein'].mean()\n",
"\n",
"dfg.plot(kind='bar', title='Restaurant Mean Nutritional Values', ylabel='Mean Values(g)',\n",
" xlabel='Restaurants', figsize=(6, 5))\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "dd3b84a7",
"metadata": {},
"source": [
"* The segmented barchart is a good tool to show stark differences between specific nutritional categproes on a restaurant to restaurant basis. For example, the visualization above shows that Arby's is the leader in average sodium in menu items, where as Chick-Fil-A is the leader in calorie deficit menu items. "
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "3166bce5",
"metadata": {},
"outputs": [],
"source": [
"# Regression Functions \n",
"\n",
"def get_mse(y_true, y_pred):\n",
" # calculate the mean squared distance between the predicted and actual y\n",
" return np.mean((y_pred - y_true) ** 2)\n",
"\n",
"def show_fit(x, y, slope, intercept):\n",
" plt.figure()\n",
" \n",
" # transform the input data into numpy arrays and flatten them for easier processing\n",
" x = np.array(x).ravel()\n",
" y = np.array(y).ravel()\n",
" \n",
" # plot the actual data\n",
" plt.scatter(x, y, label='data')\n",
" \n",
" # compute linear predictions \n",
" # x is a numpy array so each element gets mulitplied by slope and intercept is added\n",
" y_pred = slope * x + intercept\n",
" \n",
" # plot the linear fit\n",
" plt.plot(x, y_pred, color='black',\n",
" ls=':',\n",
" label='linear fit')\n",
" \n",
" # for each data point plot the error\n",
" for idx, (x_i, y_i) in enumerate(zip(x, y)):\n",
" plt.plot([x_i, x_i], [y_i, slope * x_i + intercept], \n",
" ls='--', lw=3, color='tab:red',\n",
" label='error' if idx == 0 else \"\")\n",
" \n",
" plt.legend()\n",
" \n",
" plt.xlabel('x')\n",
" plt.ylabel('y')\n",
" \n",
" # print the mean squared error\n",
" y_pred = slope * x + intercept\n",
" mse = get_mse(y_true=y, y_pred=y_pred)\n",
" plt.suptitle(f'y_hat = {slope:.2f} * x + {intercept:.2f}, MSE = {mse:.3f}')\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "e29128bd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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GzZsoG3btq5lM2bMICUlhQ0bNjB37twKnYc/kew6uwfoIyK1saqhrgTWASeBscAM+9/F9vpLgH+JyHNYJZF2wJoI5k+puJXZPY1tHp9V+V155ZWce+65AHTq1Indu3dTUFDA1q1b6du3LwA//fQTl156KQDLly/n2WefpbCwkKNHj9K5c2euu+46oHT1UlUSyTaL1SKyEPgKKAaygZeAusB8EbkNK6CMttffIiLzga32+ncZY0q87lwpFfdWrFjhep+UlFTqc+3atUt9Pvfcc0t9btSoUanP5513XoXyUqtWLdf7xMREiouLMcYwaNAg3nzzzVLrnjp1igkTJrBu3TrOP/98pk6dWmpUep06dSqUl0iJaG8oY8xjxpgOxpguxpib7J5O+caYK40x7ex/j7qtP90Y09YY094Y80Ek86aUUpHUp08fPv/8c3bs2AFYVWPffvutKzA0atSIEydOhKWhPCkpiaKiogrvxx+dSFAppSKgcePGzJkzh+uvv54LL7yQPn368M0335Camsrtt99O165dyczM5JJLLqnwscaPH8+FF14Y0QZucbbCx6KePXsaffiRUuWzrUNH1/uO32zzs2bVsG3bNjp27Bh4RVWKt+9NRNYbY3qGsh8tWSillApIg4VSSqmAdNZZpeJU6ujR0c6CiiEaLJSKU82emBbtLKgYotVQSimlAtJgoZRSKiANFkoppQLSNgul4tT+Rx51vdf2i/ApKSkhMTHR52dvjDEYY0hIqLr371U3Z0qpiCpYsMD1UsF744036NWrF926deOOO+6gpKSEunXr8uijj9K7d2++/PLLMp+fe+45unTpQpcuXXj++ecBa5rzjh07MmHCBHr06MHevXuje2IBaMlCKRWTDr/wfxx58cWg1k0dPbpM6Wn/I4+WCpSN7rqLxvfc7Xc/27ZtY968eXz++eckJSUxYcIE5s6dy8mTJ+nSpQvTplnHcP+8fv16Zs+ezerVqzHG0Lt3by6//HLq169PTk4Os2fPZtasWSGefeXTYKGUUkH6+OOPWb9+vWs+J4fDQZMmTUhMTGTkyJGu9dw/f/bZZwwfPtw1m+yIESNYuXIlQ4cOpVWrVvTp06fyT6QcNFgopVSQjDGMHTuWp59+ulT6H/7wh1LtEsnJya7P/ubfq6rTkXujwUIpFZMa33N3wGojf5o9MS3khv0rr7yS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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Regressing between two given nutritional categories \n",
"\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.metrics import r2_score\n",
"\n",
"x = df_ff['calories'].to_numpy()\n",
"y = df_ff['cholesterol']\n",
"\n",
"x = x.reshape((-1, 1))\n",
"\n",
"reg = LinearRegression()\n",
"reg.fit(x, y) \n",
"slope = reg.coef_[0]\n",
"intercept = reg.intercept_\n",
"\n",
"show_fit(x, y, slope, intercept)"
]
},
{
"cell_type": "markdown",
"id": "b7dcf6bd",
"metadata": {},
"source": [
"* The scatterplot above is a foundation for running a machine learning regression based model. This chart can also be used to demonstrate levels of correlation between select nutritional categories. For instance, the chart above shows that there is a relatively high correlation between calories and cholesterol (with exception to a few outliers). "
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "ae827eb3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"R2 = 0.5813448793142899\n"
]
}
],
"source": [
"y_pred = reg.predict(x) \n",
"\n",
"# computing R2 from sklearn\n",
"r2 = r2_score(y_true=y, y_pred=y_pred)\n",
"print('R2 =',r2)"
]
},
{
"cell_type": "markdown",
"id": "4eaeb940",
"metadata": {},
"source": [
"# Discussion of Machine Learning Tools"
]
},
{
"cell_type": "markdown",
"id": "f60c4dfa",
"metadata": {},
"source": [
"* Machine Learning Tools: SciKit (K-nearest neighbors, K-means) and SKLearn. We believe k-nearest neighbors make the most sense because groups are already made through restaurant identification. K-means, on the other hand, is used to identify groups that are yet to exist. Another option is potentially using linear regression on certain nutritional value categories to identify correlations among groups. \n",
"\n",
"\n",
"* Relevant assumptions: For k-nearest neighbors, an assumption is made that individual menu items are connected and represent a specific restaurant and can be used as an identifier for further analysis.\n",
"\n",
"\n",
"* Use cases: We could build a new food item recommendor based on favorite menu items and/or specifications on ranges of preferred nutritional values. Businesses could also use this tool to compare the nutritional value of their items with their competitors and modify their menus according to their strategic goals. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3f9c78db",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}