Uncovering Jaipur’s Foodscape: Insights from the Zomato Dataset

Kartik SharmaKartik Sharma
4 min read

As a data science enthusiast, I recently embarked on an in-depth analysis of the Zomato Jaipur Dataset to extract actionable, technical insights about the city’s restaurant scene. The dataset, rich with customer reviews, menu items, pricing, and restaurant metadata, allowed me to uncover unique patterns and trends. In this article, I walk you through 7 data-backed insights, the technical challenges I faced while deriving them, and how I visualized them effectively.


1. Top 5 Restaurants in Jaipur with the Highest Money-to-Value Ratio

💡 Insight: These restaurants offer the best average rating per rupee spent, maximizing customer satisfaction at a lower cost.

🔧 Challenge: Creating a custom metric—Money-to-Value Ratio = Average Rating / Average Price—and ensuring price anomalies were handled.

df_jaipurValuable=df_jaipurValuable.groupby('Restaurant_Name').agg({
    'Dining_Rating': 'mean',
    'Delivery_Rating': 'mean',
    'Place_Name': 'first',  
    'total_rating': 'mean'  
}).reset_index()

df_jaipurValuable.nlargest(5,'total_rating')


💡 Insight: Identified budget-friendly restaurants that still maintain excellent quality.

🔧 Challenge: Filtering for low-priced segments and avoiding bias from restaurants with very few reviews.


2. Top 5 Places with the Highest Number of Orders

💡 Insight: These localities see the highest food order activity, suggesting dense customer demand.

🔧 Challenge: No timestamp was available—had to treat every row as one order. Places with more entries assumed to have more orders.

order_count = df_jaipur['Place_Name'].value_counts()

x=topNPlace.index
y=topNPlace.values
plt.figure(figsize=(10,6))

plt.title('Top 5 Places with Highest Order' , pad=20 , fontweight='bold', fontsize=20)
plt.xlabel('Places', labelpad=20, fontsize=12)
plt.ylabel('Number of Orders', labelpad=20, fontsize=12)

plt.bar(x,y, color='#CB202D')
plt.grid(True , alpha=0.3 , axis='y')
plt.tight_layout()


3. Places with the Most Expensive Food

💡 Insight: Highlighted Jaipur areas where food is generally more premium.

🔧 Challenge: Weighted average prices across items without duplication.

expensive_Places=df_jaipur.groupby('Place_Name')['Prices'].mean().sort_values(ascending=False).head(5)

x=expensive_Places.index
y=expensive_Places.values
plt.figure(figsize=(10,6))

plt.title('Top 5 Places with most Expensive Food' , pad=20 , fontweight='bold', fontsize=20)
plt.xlabel('Places', labelpad=20, fontsize=12)
plt.ylabel('Average Order Price (in ₹)', labelpad=20, fontsize=12)
plt.ylim(0,y.max()+50)

plt.bar(x,y, color='#CB202D')
plt.grid(True , alpha=0.3 , axis='y')
plt.tight_layout()


4. Most Ordered Food Items

💡 Insight: The dataset's most frequently occurring items hint at Jaipur’s culinary preferences.

🔧 Challenge: Handling inconsistent naming of food items (e.g., 'Cold coffee' vs 'Cold Coffee').

top5Food=df_jaipur['Item_Name'].value_counts(ascending=False).head(5)

plt.figure(figsize=(8, 8))
plt.pie(
    x=top5Food.values,
    labels=top5Food.index,
    autopct='%1.1f%%',       # Show percentages
    startangle=140,          # Start angle for better layout
    colors=plt.cm.Pastel1.colors  # Optional: nicer color palette
)

plt.title('Most Ordered Food Items', fontsize=14, weight='bold')
plt.axis('equal')  # Equal aspect ratio for a circular pie
plt.tight_layout()
plt.show()


5. Ratings of the Highest Selling Cuisines

💡 Insight: Combined popularity with quality—helpful for choosing what to try.

🔧 Challenge: Grouping and aggregating by cuisine while maintaining rating context.

top10CuisinesRatings=df_jaipur[df_jaipur['Cuisine'].isin(top10Cuisines.index)].groupby('Cuisine')['Average_Rating'].mean()

x=top10CuisinesRatings.index
y=top10CuisinesRatings.values
plt.figure(figsize=(12,8))

plt.title('Rating of Highest Selling Cuisines' , pad=20, fontsize=20, fontweight='bold')
plt.xlabel('Cuisines', labelpad=20, fontsize=12)
plt.ylabel('Rating', labelpad=20, fontsize=12)
plt.ylim(y.min()-0.05,y.max()+0.05)

plt.fill_between(x, y, color='#CB202D', alpha=0.4)
plt.plot(x,y, marker='o', linestyle='--',color='#CB202D')
plt.grid(True , alpha=0.3)


6. Top 5 Restaurants by Popularity

💡 Insight: Popularity was inferred from the number of entries per restaurant (proxy for orders).

🔧 Challenge: Ensured restaurants with large order volumes weren’t favored due to duplicate entries.

popularRestraunt=df_jaipur.groupby('Restaurant_Name')['Total_Votes'].mean()
TopPopularRestraunt=popularRestraunt.sort_values(ascending=False).head(5)

plt.figure(figsize=(10,6))
plt.title('TOP 5 Most Famous Restraunts' , pad=20, fontweight='bold', fontsize=20)
plt.xlabel('Customer Votes', labelpad=20, fontsize=12)
plt.ylabel('Restraunt Name', labelpad=20, fontsize=12)

plt.grid(True ,alpha=0.3 , axis='x')
plt.barh(TopPopularRestraunt.index[::-1],TopPopularRestraunt.values[::-1] , color='#CB202D')


7. Price vs Rating Correlation

💡 Insight: Weak to moderate correlation—higher price doesn’t always guarantee higher ratings.

🔧 Challenge: Visual clutter from dense points—required filtering and regression line fitting.

plt.figure(figsize=(12,6))

sns.scatterplot(

    x=sampledd_prices['Prices'],                        
    y=sampledd_prices['Average_Rating'],                   
    edgecolor='black',
    color='red',
    alpha=0.3
)
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(100))


plt.title('Price vs Average Rating' , fontsize=16,pad=10)
plt.xlabel('Price (₹)',labelpad=20)
plt.ylabel('Average Rating',labelpad=20)
plt.grid(True , alpha=0.3)
plt.tight_layout()
plt.show()


Conclusion

This journey through the Zomato Jaipur dataset was a powerful learning experience. It sharpened my data wrangling, aggregation, and visualization skills. More importantly, it reminded me of the challenges that arise in real-world datasets: messy data, lack of timestamps, inconsistent labels, and the need for creative metrics.

Each visualization told a story about Jaipur’s vibrant food culture, beyond just numbers. Whether you’re a data enthusiast, a food lover, or a local business owner, I hope these insights offer a new perspective on the city’s dining landscape.


Lets Connect on LinkedIn
0
Subscribe to my newsletter

Read articles from Kartik Sharma directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kartik Sharma
Kartik Sharma