Postmates Data Analysis
Background and Motivation
Cooking your own food is usually a much healthier and cheaper option than going out to eat. Oftentimes however, cooking your own food may not be an option. Sometimes you may not have the essential ingredients in your kitchen. Other times, you may not want to go through the lengthy process of cooking and then cleaning. For times like these, when cooking your own food is not an option, finding places around you to eat is the next best option. But even finding places to eat can be overwhelming. What places are around you? What places sell a particular dish you're in the mood for? What places adhere to a specific diet you're trying? What places sell a particular dish for the cheapest price? What places do a lot of people in your area really enjoy? These are just some of the questions that may come to mind when deciding where to eat.
For this project, I scraped restaurant menus for over 700 restaurants in New York City, the majority of which located in the Manhattan area. I then built a simple interactive dashboard broken into three different sections to visualize this data. The first section of this dashboard displays all the scraped restaurants and their locations in New York City. The second section allows a user to input a particular food and get back a list of menu items most similar to the that food. The third and final section allows a user to select a particular menu item and get the distribution of prices for vendors that sell that item.
Section I - Restaurants In New York City
This section of the application displays all the scraped food vendors on a map of New York City.
The color of the dots represent the category that the vendor belongs to. The size of the dots represent how many of Postmate's users favorited that vendor. Bigger dots have more favorites while smaller dots have less favorites. Double clicking on one of the categories in the legend will only display vendors belonging to that category. For example, double clicking on the pizza category gives us the results shown in the plot below.
Section II - Finding vendors with a particular item
This section of the application allows a user to type a particular food in a search bar and get back vendors that sell similar menu items. Typing in "avocado toast" yields the results shown in the output below.
How similar menu items are chosen
Building the algorithm to find similar menu items involved some data preprocessing steps before ultimately using the cosine similarity as the similarity measurement.
First, a bag of words for each menu item was created that included the menu item name and the menu item description. Stopwords, or words that add little to no meaning like "the", "a", or "are", were removed from the bag of words. Every word was then converted to lowercase and punctuation was removed. Converting every word to lowercase ensured that words such as "Sushi" and "sushi" were considered the same. Removing punctuation ensured that occurrences like "chocolate" and "chocolate," were also considered to be the same. Finally, each word was then lemmatized to get the dictionary form of the word. Examples of lemmatized words would include transformations such as "eggs" to "egg" or "smashed" to "smash".
In order for the cosine similarity to work, each menu item's bag of words needed to be converted into a vector of numerical data. I used python's count vectorizer to obtain these vectors where each vector now contained the count of each word contained in the entire corpus.
After getting vector representations for each menu item, I obtain the vector representation of the user-inputed string using the same preprocessing steps and vector transformations used previously. The count vectorizer is transformed, but not fit again, on the user-inputted string so the vocabulary for all the menu items is consistent with the vocabulary for the user-inputted string. The cosine similarity of the user-inputed string and every menu item in the dataset is then calculated. Menu items with a higher score will be considered more similar to the user's input. The top ten cosine similarity scores for the search term "Spaghetti and Meatballs" is shown in the table below.
Section III - Item Price Distributions
This section of the application allows the user to select a menu item and get the distribution of prices for that menu item. The distribution of prices for the menu item of "Fries" is shown below.
In addition, a bar plot is displayed which displays each vendor that sells that particular item. The bar chart is sorted in ascending order by the price in which the item is sold. The bar chart for the menu item "Fries" is shown below.
In future revisions of this application, I would like to add more restaurants in New York City. I would also like to automate the data scraping process in order to include restaurants that are new to Postmates.
In the third section of the application, the list of menu items to choose from contains duplicate menu items like "Diet Coke (can)", "Diet Coke", and "Diet Coke Can". I would like to remove duplicate items such as these in future revisions.