Project Template Notebook Ipynb 1
Project Template Notebook Ipynb 1
1.0.1 Context
The number of restaurants in New York is increasing day by day. Lots of students and busy
professionals rely on those restaurants due to their hectic lifestyles. Online food delivery service is
a great option for them. It provides them with good food from their favorite restaurants. A food
aggregator company FoodHub offers access to multiple restaurants through a single smartphone
app.
The app allows the restaurants to receive a direct online order from a customer. The app assigns a
delivery person from the company to pick up the order after it is confirmed by the restaurant. The
delivery person then uses the map to reach the restaurant and waits for the food package. Once
the food package is handed over to the delivery person, he/she confirms the pick-up in the app and
travels to the customer’s location to deliver the food. The delivery person confirms the drop-off in
the app after delivering the food package to the customer. The customer can rate the order in the
app. The food aggregator earns money by collecting a fixed margin of the delivery order from the
restaurants.
1.0.2 Objective
The food aggregator company has stored the data of the different orders made by the registered
customers in their online portal. They want to analyze the data to get a fair idea about the demand
of different restaurants which will help them in enhancing their customer experience. Suppose you
are a Data Scientist at Foodhub and the Data Science team has shared some of the key questions
that need to be answered. Perform the data analysis to find answers to these questions that will
help the company to improve the business.
1
• restaurant_name: Name of the restaurant
• cuisine_type: Cuisine ordered by the customer
• cost_of_the_order: Cost of the order
• day_of_the_week: Indicates whether the order is placed on a weekday or weekend (The
weekday is from Monday to Friday and the weekend is Saturday and Sunday)
• rating: Rating given by the customer out of 5
• food_preparation_time: Time (in minutes) taken by the restaurant to prepare the food.
This is calculated by taking the difference between the timestamps of the restaurant’s order
confirmation and the delivery person’s pick-up confirmation.
• delivery_time: Time (in minutes) taken by the delivery person to deliver the food package.
This is calculated by taking the difference between the timestamps of the delivery person’s
pick-up confirmation and drop-off information
1.0.5 Please read the instructions carefully before starting the project.
This is a commented Jupyter IPython Notebook file in which all the instructions and tasks to be
performed are mentioned. Read along carefully to complete the project. * Blanks ‘_______’ are
provided in the notebook that needs to be filled with an appropriate code to get the correct result.
Please replace the blank with the right code snippet. With every ‘_______’ blank, there is a
comment that briefly describes what needs to be filled in the blank space. * Identify the task to
be performed correctly, and only then proceed to write the required code. * Fill the code wherever
asked by the commented lines like “# write your code here” or “# complete the code”. Running
incomplete code may throw an error. * Please run the codes in a sequential manner from the
beginning to avoid any unnecessary errors. * You can the results/observations derived from the
analysis here and use them to create your final presentation.
2
[42]: order_id customer_id restaurant_name cuisine_type \
0 1477147 337525 Hangawi Korean
1 1477685 358141 Blue Ribbon Sushi Izakaya Japanese
2 1477070 66393 Cafe Habana Mexican
3 1477334 106968 Blue Ribbon Fried Chicken American
4 1478249 76942 Dirty Bird to Go American
delivery_time
0 20
1 23
2 28
3 15
4 24
1.0.8 Question 1: How many rows and columns are present in the data? [0.5 mark]
[3]: (1898, 9)
1.0.9 Question 2: What are the datatypes of the different columns in the dataset?
[0.5 mark]
[4]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1898 entries, 0 to 1897
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 order_id 1898 non-null int64
1 customer_id 1898 non-null int64
2 restaurant_name 1898 non-null object
3 cuisine_type 1898 non-null object
4 cost_of_the_order 1898 non-null float64
5 day_of_the_week 1898 non-null object
6 rating 1898 non-null object
7 food_preparation_time 1898 non-null int64
8 delivery_time 1898 non-null int64
3
dtypes: float64(1), int64(4), object(4)
memory usage: 133.6+ KB
1.0.10 Question 3: Are there any missing values in the data? If yes, treat them using
an appropriate method. [1 Mark]
1.0.11 Question 4: Check the statistical summary of the data. What is the minimum,
average, and maximum time it takes for food to be prepared once an order is
placed? [2 marks]
4
[7]: order_id customer_id cost_of_the_order food_preparation_time \
count 1.898000e+03 1898.000000 1898.000000 1898.000000
mean 1.477496e+06 171168.478398 16.498851 27.371970
std 5.480497e+02 113698.139743 7.483812 4.632481
min 1.476547e+06 1311.000000 4.470000 20.000000
25% 1.477021e+06 77787.750000 12.080000 23.000000
50% 1.477496e+06 128600.000000 14.140000 27.000000
75% 1.477970e+06 270525.000000 22.297500 31.000000
max 1.478444e+06 405334.000000 35.410000 35.000000
delivery_time
count 1898.000000
mean 24.161749
std 4.972637
min 15.000000
25% 20.000000
50% 25.000000
75% 28.000000
max 33.000000
[9]: 1898
Customer ID
[10]: # check unique customer ID
5
df['customer_id'].nunique() ## Complete the code to find out number of unique␣
↪Customer ID
[10]: 1200
Restaurant name
[11]: # check unique Restaurant Name
df['restaurant_name'].nunique() ## Complete the code to find out number of␣
↪unique Restaurant Name
[11]: 178
Cuisine type
[12]: # Check unique cuisine type
df['cuisine_type'].nunique() ## Complete the code to find out number of ␣
↪unique cuisine type
[12]: 14
6
7
Day of the week
[15]: # # Check the unique values
df['day_of_the_week'].nunique() ## Complete the code to check unique values for␣
↪the 'day_of_the_week' column
[15]: 2
8
Rating
[17]: # Check the unique values
df['rating'].nunique() ## Complete the code to check unique values for the␣
↪'rating' column
[17]: 4
[18]: sns.countplot(data = df, x = 'rating') ## Complete the code to plot bar graph␣
↪for 'rating' column
9
Food Preparation time
[19]: sns.histplot(data=df,x='cost_of_the_order') ## Complete the code to plot the␣
↪histogram for the cost of order
plt.show()
sns.boxplot(data=df,x='cost_of_the_order') ## Complete the code to plot the␣
↪boxplot for the cost of order
plt.show()
10
11
Delivery time
[20]: sns.histplot(data=df,x='delivery_time') ## Complete the code to plot the␣
↪histogram for the delivery time
plt.show()
sns.boxplot(data=df,x='delivery_time') ## Complete the code to plot the boxplot␣
↪for the delivery time
plt.show()
12
13
1.0.16 Question 7: Which are the top 5 restaurants in terms of the number of orders
received? [1 mark]
14
[23]: American 415
Japanese 335
Italian 207
Name: cuisine_type, dtype: int64
1.0.18 Question 9: What percentage of the orders cost more than 20 dollars? [2
marks]
# Calculate the number of total orders where the cost is above 20 dollars
print('The number of total orders that cost above 20 dollars is:',␣
↪df_greater_than_20.shape[0])
The number of total orders that cost above 20 dollars is: 555
Percentage of orders above 20 dollars: 29.24 %
1.0.19 Question 10: What is the mean order delivery time? [1 mark]
print('The mean delivery time for this dataset is', round(mean_del_time, 2),␣
↪'minutes')
1.0.20 Question 11: The company has decided to give 20% discount vouchers to the
top 3 most frequent customers. Find the IDs of these customers and the
number of orders they placed. [1 mark]
[26]: 52832 13
47440 10
83287 9
Name: customer_id, dtype: int64
15
1.0.21 Multivariate Analysis
1.0.22 Question 12: Perform a multivariate analysis to explore relationships between
the important variables in the dataset. (It is a good idea to explore rela-
tions between numerical variables as well as relations between numerical and
categorical variables) [9 marks]
Cuisine vs Cost of the order
[27]: # Relationship between cost of the order and cuisine type
plt.figure(figsize=(15,7))
sns.boxplot(x = "cuisine_type", y = "cost_of_the_order", data = df, palette =␣
↪'PuBu')
plt.xticks(rotation = 60)
plt.show()
<ipython-input-27-d4845c8bfb45>:3: FutureWarning:
16
sns.boxplot(data=df,x='food_preparation_time',y='cuisine_type') ## Complete␣
↪the code to visualize the relationship between food preparation time and␣
plt.xticks(rotation = 60)
plt.show()
↪using boxplot
plt.show()
17
Run the below code and write your observations on the revenue generated by the
restaurants.
[31]: df.groupby(['restaurant_name'])['cost_of_the_order'].sum().
↪sort_values(ascending = False).head(14)
[31]: restaurant_name
Shake Shack 3579.53
The Meatball Shop 2145.21
Blue Ribbon Sushi 1903.95
Blue Ribbon Fried Chicken 1662.29
Parm 1112.76
RedFarm Broadway 965.13
RedFarm Hudson 921.21
TAO 834.50
Han Dynasty 755.29
Blue Ribbon Sushi Bar & Grill 666.62
Rubirosa 660.45
Sushi of Gari 46 640.87
Nobu Next Door 623.67
Five Guys Burgers and Fries 506.47
Name: cost_of_the_order, dtype: float64
↪using pointplot
plt.show()
18
Rating vs Cost of the order
[33]: # Relationship between rating and cost of the order
plt.figure(figsize=(15, 7))
sns.pointplot(data=df,x='rating',y='cost_of_the_order') ## Complete the code␣
↪to visualize the relationship between rating and cost of the order using␣
↪pointplot
plt.show()
19
[34]: # Plot the heatmap
col_list = ['cost_of_the_order', 'food_preparation_time', 'delivery_time']
plt.figure(figsize=(15, 7))
sns.heatmap(df[col_list].corr(), annot=True, vmin=-1, vmax=1, fmt=".2f",␣
↪cmap="Spectral")
plt.show()
1.0.23 Question 13: The company wants to provide a promotional offer in the ad-
vertisement of the restaurants. The condition to get the offer is that the
restaurants must have a rating count of more than 50 and the average rating
should be greater than 4. Find the restaurants fulfilling the criteria to get the
promotional offer. [3 marks]
# Create a dataframe that contains the restaurant names with their rating counts
df_rating_count = df_rated.groupby(['restaurant_name'])['rating'].count().
↪sort_values(ascending = False).reset_index()
df_rating_count.head()
20
2 Blue Ribbon Sushi 73
3 Blue Ribbon Fried Chicken 64
4 RedFarm Broadway 41
[ ]: # Get the restaurant names that have rating count more than 50
rest_names = df_rating_count['rating']['restaurant_name'] ## Complete the code␣
↪to get the restaurant names having rating count more than 50
# Filter to get the data of restaurants that have rating count more than 50
df_mean_4 = df_rated[df_rated['restaurant_name'].isin(rest_names)].copy()
# Group the restaurant names with their ratings and find the mean rating of␣
↪each restaurant
df_mean_4.groupby(['rating'])['restaurant_name'].mean().sort_values(ascending =␣
↪False).reset_index().dropna() ## Complete the code to find the mean rating
1.0.24 Question 14: The company charges the restaurant 25% on the orders having
cost greater than 20 dollars and 15% on the orders having cost greater than 5
dollars. Find the net revenue generated by the company across all orders. [3
marks]
df.head()
21
1.0.25 Question 15: The company wants to analyze the total time required to deliver
the food. What percentage of orders take more than 60 minutes to get de-
livered from the time the order is placed? (The food has to be prepared and
then delivered.)[2 marks]
[49]: # Calculate total delivery time and add a new column to the dataframe df to␣
↪store the total delivery time
## Write the code below to find the percentage of orders that have more than 60␣
↪minutes of total delivery time (see Question 9 for reference)
total_order = df['total_time'].count()
print("Total no of orders is",total_order)
Total no of orders have more than 60 mins of total delivery time is 200
Total no of orders is 1898
1.0.26 Question 16: The company wants to analyze the delivery time of the orders
on weekdays and weekends. How does the mean delivery time vary during
weekdays and weekends? [2 marks]
## Write the code below to get the mean delivery time on weekends and print it
22
Shack 7.)The number of total orders that cost above 20 dollars is: 555 8.) Percentage of orders
above 20 dollars: 29.24 % 9.)The mean delivery time for this dataset is 24.16 minutes 10.)Shake
Shack has the most revenue generated company and aslo the most rated company. 11.) Total no
of orders have more than 60 mins of total delivery time is 200. Total no of orders is 1898 12.)The
mean delivery time on weekdays is around 28 minutes.
1.0.30 Recommendations:
1.)736 out of 1898 orders were not rated, hence, restaurant should have some kind of promotional
offers to encourage customers to rate the orders. 2.)Discount should be given to the customers
for weekday orders to increase the revenue. 3.)Study shows that rating decreased to 3, for longer
delivery time, improvement in the terms of delivery time is needed; however traffic during the
weekdays causes the delay in delivery, which isn’t controllable. 4.)Most of the rating received on
weekend. 5.Promotional offers should be launched to attract weekday customers
23