Restaurant Review Dataset
It includes details on restaurants, users, and their reviews, suitable for text analysis and ML practitioners. A free sample is available, with the full download costing credits.
At a glance
- 3tables
- 90,277rows
- 16columns
- Jan 2018 – Dec 2023date range
The 3 tables
preview and data dictionary per tableRestaurants restaurants · table · 4,500 rows
Information about individual restaurant establishments.
Preview
| restaurant_iduuid | restaurant_namestring | cuisine_typestring | citystring | statestring | rating_avgdecimal | price_rangestring |
|---|---|---|---|---|---|---|
| ae5df9ab-5753-44f6-b8ce-b35a2161acbf | Golden Dragon Palace | Chinese | Los Angeles | CA | 3.97 | $$ |
| 4ff1a955-ee03-466b-a813-6205cd77982e | Spice Route Bistro | Indian | New York | NY | 4.36 | $$ |
| 01054c6f-bf86-47b2-8a1e-4aa9ef97307d | Vesuvio Trattoria | Italian | New York | NY | 3.88 | $$ |
| 2282d611-3d4e-4953-8c93-ebddc9d679a3 | Liberty Grill | American | Philadelphia | PA | 3.68 | $$ |
| 05a2e233-f500-458b-a04c-0ad367069de5 | Mumbai Masala House | Indian | Los Angeles | CA | 3.57 | $$ |
| 60fd08c2-c7ff-4d4a-952a-671c5f0ee0be | The Daily Grind Cafe | Cafe | Houston | TX | 3.92 | $$ |
| 3363177a-e7bc-4b57-99b6-6829797681cc | Ocean's Catch Seafood | Seafood | Philadelphia | PA | 4.51 | $$ |
| 42104c48-07dc-4d84-bc0c-ca40f6b27655 | Lone Star Diner | American | Houston | TX | 3.91 | $$ |
| 532dd713-3317-43d5-9543-a8b1c024936a | El Fuego Cantina | Mexican | Dallas | TX | 3.9 | $$ |
| 6e8da6ae-03c1-4ef1-8321-cf23750d3e29 | Bella Napoli Pizzeria | Italian | San Jose | CA | 4.07 | $$ |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
restaurant_ | uuid | Unique identifier for the restaurant establishment.unique | ae5df9ab-5753-44f6-b8ce-b35a2161acbf | 0% |
restaurant_ | string | Trading name of the restaurant or dining venue. | Golden Dragon Palace | 0% |
cuisine_ | string | Primary culinary category served by the establishment. | Chinese | 0% |
city | string | Metropolitan city where the restaurant is located. | Los Angeles | 0% |
state | string | Two-letter US state code matching the restaurant city. | CA | 0% |
rating_ | decimal | Overall average user rating on a 2.00 to 5.00 scale. | 3.97 | 0% |
price_ | string | Price tier indicator indicating affordability level. | $$ | 0% |
Users users · dimension table · 5,000 rows
Details about the users who submitted reviews.
Preview
| user_iduuid | usernamestring | join_datedate |
|---|---|---|
| 26e94a43-e04d-473a-b096-199951b8e9bd | Arthur_Miller | 2018-03-14 |
| ed3f6e73-8b82-4ecc-9844-13529298046f | Brenda_Walker | 2020-08-20 |
| 589b16b2-8714-4bd0-be95-1083ee94401b | Clarence_Scott | 2019-11-03 |
| b4dbaaf8-1f0a-4afd-9ee8-0cc4ac16bfc8 | Diana_Nelson | 2020-06-27 |
| 73b11917-9dd8-4204-98ff-945d1c1d89dc | Edward_Carter | 2018-08-05 |
| 1081f179-fa8f-4650-a1e0-8877ef93eebb | Fiona_Mitchell | 2021-08-05 |
| 3cee59bc-0bca-4e32-9211-699cde0c09fd | George_Adams | 2020-03-02 |
| 76fcb947-e107-4128-a78f-cb754fb2fc17 | Helen_Baker | 2018-04-17 |
| e1bb1906-d700-46db-88c9-41df58848298 | Isaac_Campbell | 2021-06-01 |
| 58cda873-5a7b-4457-a5eb-3062a31071cf | Joyce_Evans | 2019-05-27 |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
user_ | uuid | Primary key uniquely identifying each user reviewer account.unique | 26e94a43-e04d-473a-b096-199951b8e9bd | 0% |
username | string | Unique handle or screen name of the restaurant reviewer.unique | Arthur_Miller | 0% |
join_ | date | The date when the user created their account on the platform. | 2018-03-14 | 0% |
Reviews reviews · fact table · 80,777 rows
Individual customer reviews for restaurants.
Preview
| review_iduuid | ratinginteger | review_textstring | review_datedate | restaurant_iduuid | user_iduuid |
|---|---|---|---|---|---|
| bd58d897-455e-42c8-8bbb-b6dad2409e89 | 4 | The outdoor seating was perfect on a warm evening. Enjoyed the refreshing cocktails. | 2022-04-02 | bf1f5153-3688-4427-b263-d2734dd10482 | 04e75bb4-5227-4d5c-9c35-340f4e368875 |
| 8e2da9db-1c6c-4ffb-9660-d77685218569 | 4 | The staff seemed a little disorganized, but they were trying their best. The salmon was flaky and well-cooked. | 2021-10-29 | f8b55a8b-639b-47cf-aebd-72fad1dc2f58 | 972947db-efe9-4e6c-b28c-eb99ea723d75 |
| 3ac02705-6414-4e04-be4d-a51d0ae13718 | 4 | Loved the ambiance, it felt very authentic. The tacos were delicious and had just the right amount of spice. | 2023-07-23 | 479b3826-9269-4a8e-a78e-b70e02a815e7 | 01165ed9-ddf1-47c6-b02c-f953d7fbb197 |
| 7f212166-e51b-4187-9b4b-1b7d1a1bb464 | 3 | An experience that was neither good nor bad. Just sort of there. | 2023-01-10 | 4088c9ce-12f6-49d0-aae6-339bcaff0320 | 74350eca-f3a0-4201-a7be-457fddc3ac14 |
| 8c1b73e4-8c20-4893-9ed7-7ab8f7549eab | 4 | The service was exceptional from start to finish. Very accommodating. | 2021-12-01 | 5fda6bf5-8b32-4b12-8a7f-88f87769f9ed | 64ad73b9-45a5-4524-8c3a-c319acfad676 |
| 73ca17c6-a75c-410a-ac84-54c1ed4669cf | 5 | The vegetarian options were surprisingly creative and delicious. I was very impressed with the quality and variety. | 2022-01-23 | fdcccff2-5da3-44c9-93d7-c47e820d16d0 | 2eeeab3c-4d39-4025-9123-80441bd4243d |
| 4ff818ed-85c5-4790-906c-1d4c67d2334a | 3 | The sushi was not very fresh. I would not recommend it. | 2022-12-11 | 0d5c6b99-7c4c-48d5-ac71-fb5fbc5f4abd | 98715fa7-ebff-4cce-90df-ca814e37ad44 |
| 19c9540b-bb50-43b5-b885-59bec11a1903 | 3 | A solid, if not spectacular, dining experience. The server was polite. | 2023-04-20 | 8b3103c3-31af-49a4-9b62-c7da5ec1b147 | a7b89b6d-f096-4632-9bcf-758e05f2b8bd |
| fe4fd931-0d0e-43d4-91b1-d29a7eba757a | 5 | I'm so glad we found this place. The food was exceptional, and the prices were very reasonable. We'll definitely be regulars. | 2021-11-29 | 8087ce46-f0fe-4fad-bad0-0eff77f5d54d | 70cb21c8-8676-4520-8a95-ef99aa91a8d6 |
| 32e6d81e-50c9-4227-8071-6f24bbbbe4b9 | 4 | The wine selection was extensive. Really enjoyed the recommendation from our server. | 2023-03-28 | a578f1da-4c30-4f90-a394-31a12aa01389 | 47af8008-a698-476a-91f8-77809c9dda0c |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
review_ | uuid | Unique identifier for the review. | bd58d897-455e-42c8-8bbb-b6dad2409e89 | 0% |
rating | integer | Numerical star rating awarded by the customer (1 to 5). | 4 | 0% |
review_ | string | Detailed text feedback written by the customer (10 to 300 words). | The outdoor seating was perfect on a warm evening. Enjoyed the refreshing cockta | 0% |
review_ | date | Date when the review was posted by the user. | 2022-04-02 | 0% |
restaurant_ | uuid | Foreign key to restaurants.restaurant_id. | bf1f5153-3688-4427-b263-d2734dd10482 | 0% |
user_ | uuid | Foreign key to users.user_id. | 04e75bb4-5227-4d5c-9c35-340f4e368875 | 0% |
How the tables join
reviews.restaurant_id references restaurants.restaurant_idmany to one: each Reviews row points to one Restaurants rowreviews.user_id references users.user_idmany to one: each Reviews row points to one Users row
Questions to answer with it
What is the average rating for each restaurant?
Join restaurants and reviews tables on restaurant_id and calculate the average rating.
tables: restaurants, reviews
Can sentiment analysis be performed on the review text?
The 'review_text' column contains -form text suitable for sentiment analysis.
tables: reviews
Are there any correlations between restaurant cuisine type and review sentiment?
Join restaurants and reviews tables, then analyze review sentiment in relation to cuisine_type.
tables: restaurants, reviews
How many reviews did each user write?
Join users and reviews tables on user_id and count the number of reviews per user.
tables: users, reviews
Starter SQL
run against this data before publishingTable names match the SQLite file and the SQL script.
Average rating per restaurant
SELECT r.restaurant_name, AVG(rv.rating) AS average_rating FROM restaurants r JOIN reviews rv ON r.restaurant_id = rv.restaurant_id GROUP BY r.restaurant_name ORDER BY average_rating DESC LIMIT 20;Top 5 most reviewed restaurants
SELECT r.restaurant_name, COUNT(rv.review_id) AS review_count FROM restaurants r JOIN reviews rv ON r.restaurant_id = rv.restaurant_id GROUP BY r.restaurant_name ORDER BY review_count DESC LIMIT 5;Reviews from users who joined in 2018
SELECT rv.review_text, rv.rating FROM reviews rv JOIN users u ON rv.user_id = u.user_id WHERE u.join_date BETWEEN '2018-01-01' AND '2018-12-31' LIMIT 20;Average rating by city
SELECT city, AVG(rating_avg) AS avg_restaurant_rating FROM restaurants GROUP BY city ORDER BY avg_restaurant_rating DESC LIMIT 20;Load it with pandas
import pandas as pd
# Unzip the CSV download first: one file per table
restaurants = pd.read_csv("restaurants.csv")
users = pd.read_csv("users.csv")
reviews = pd.read_csv("reviews.csv")
# Join reviews to restaurants
df = reviews.merge(restaurants, left_on="restaurant_id", right_on="restaurant_id", how="left", suffixes=("", "_restaurants"))
print(df.groupby("cuisine_type").size().sort_values(ascending=False))Using it in your tool
- Excel
- Load each table into a separate sheet. Use XLOOKUP or Power Query to join tables based on IDs. Create a PivotTable on the reviews sheet to analyze ratings by cuisine type.
- Power BI
- Set up a star schema with 'reviews' as the fact table and 'restaurants' and 'users' as dimension tables. Create relationships using the respective ID columns. Implement DAX measures for average rating and review count.
- SQL
- Load the SQLite or SQL dump into your preferred database. Use foreign keys (restaurant_id, user_id) to join tables for analysis. Example join path: reviews.restaurant_id -> restaurants.restaurant_id.
- Python
- Load CSV files into pandas DataFrames. Use pandas for data manipulation, analysis, and visualization. Libraries like NLTK or spaCy can be used for text analysis on the review_text column.
Formats available
- CSV (zip)One CSV file per table, zipped
- Excel workbookOne worksheet per table
- SQLite databaseA ready-to-query database file with every table
- Parquet (zip)One Parquet file per table, zipped
- SQL scriptCREATE TABLE with primary and foreign keys, then INSERTs
- CSVA single CSV file
- JSONA single JSON file
How this data was generated
Synthetic data. Every row was generated: no real people, customers or companies are in this dataset.
Synthetic data generated by GoMask DataFactory from a relational blueprint: keys, links and rules are enforced in code, text columns are filled by a language model. No real people, companies or transactions.
- Data generated using GoMask DataFactory.
- Synthetic data created to simulate real-world review patterns.
- Includes realistic distributions for ratings, text length, and user activity.
- Checked by an automated quality gate: unique keys, no orphan foreign keys, required columns filled, declared rules and date ranges (realism score 100).
Limitations
- The dataset is synthetic and does not represent actual user experiences or businesses.
- Review text length is capped between 10 and 300 words.
- Limited number of cuisine types (10) and cities (10) represented.
- Distributions and correlations are modelled, not measured from real records.
blueprint · restaurant-review-dataset
Scale this dataset
Same tables. As many rows as you need.
Open the blueprint behind these 3 tables in Data Factory: keep the relationships, change a column, and generate it at the size you need.
- 200,000 rows
- 1,000,000 rows
- Tables
- restaurants, users, reviews
- Licence
- yours to use, including commercially
- API slug
- restaurant-review-dataset