Postmates Data Analysis

Posted on Jul 10, 2021

Github | Application

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.

Project Summary

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.

Data Preprocessing

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".

Count Vectorizer

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.

Cosine Similarity

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. 

Future Revisions

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.

About Author

Leave a Comment

No comments found.

View Posts by Categories


Our Recent Popular Posts


View Posts by Tags

#python #trainwithnycdsa 2019 airbnb Alex Baransky alumni Alumni Interview Alumni Reviews Alumni Spotlight alumni story Alumnus API Application artist aws beautiful soup Best Bootcamp Best Data Science 2019 Best Data Science Bootcamp Best Data Science Bootcamp 2020 Best Ranked Big Data Book Launch Book-Signing bootcamp Bootcamp Alumni Bootcamp Prep Bundles California Cancer Research capstone Career Career Day citibike clustering Coding Course Demo Course Report D3.js data Data Analyst data science Data Science Academy Data Science Bootcamp Data science jobs Data Science Reviews Data Scientist Data Scientist Jobs data visualization Deep Learning Demo Day Discount dplyr employer networking feature engineering Finance Financial Data Science Flask gbm Get Hired ggplot2 googleVis Hadoop higgs boson Hiring hiring partner events Hiring Partners Industry Experts Instructor Blog Instructor Interview Job Job Placement Jobs Jon Krohn JP Morgan Chase Kaggle Kickstarter lasso regression Lead Data Scienctist Lead Data Scientist leaflet linear regression Logistic Regression machine learning Maps matplotlib Medical Research Meet the team meetup Networking neural network Neural networks New Courses nlp NYC NYC Data Science nyc data science academy NYC Open Data NYCDSA NYCDSA Alumni Online Online Bootcamp Online Training Open Data painter pandas Part-time Portfolio Development prediction Prework Programming PwC python Python Data Analysis python machine learning python scrapy python web scraping python webscraping Python Workshop R R language R Programming R Shiny r studio R Visualization R Workshop R-bloggers random forest Ranking recommendation recommendation system regression Remote remote data science bootcamp Scrapy scrapy visualization seaborn Selenium sentiment analysis Shiny Shiny Dashboard Spark Special Special Summer Sports statistics streaming Student Interview Student Showcase SVM Switchup Tableau team TensorFlow Testimonial tf-idf Top Data Science Bootcamp twitter visualization web scraping Weekend Course What to expect word cloud word2vec XGBoost yelp