AtliQ Grands, a prominent player in the Indian hospitality industry with over 20 years of experience and multiple five-star hotels, is currently facing a significant decline in market share and revenue within the luxury/business hotel category. This downturn is attributed to strategic moves by competitors and ineffective decision-making within the management team. To counteract this trend and regain their competitive edge, AtliQ Grands' managing director has decided to incorporate "Business and Data Intelligence" into their strategy. However, the lack of an in-house data analytics team poses a challenge in extracting actionable insights from their historical data. Therefore, AtliQ Grands' revenue management team has decided to engage a third-party service provider to leverage data analytics for informed decision-making and to drive revenue growth. The primary objective is to identify key factors contributing to the decline, optimize pricing strategies, enhance customer satisfaction, and ultimately restore AtliQ Grands' market position in the luxury/business hotel segment.
Revenue Management Team
You are a data analyst who has been provided with sample data and a mock-up dashboard to work on the following task.
- Create the metrics according to the metric list.
- Create a dashboard according to the mock-up provided by stakeholders.
- Create relevant insights that are not provided in the metric list/mock-up dashboard.
The public dataset is completely available on the Code basis website platform where it stores and consolidates all available datasets for analysis. The specific individual datasets at hand can be obtained at this link below: https://codebasics.io/challenge/codebasics-resume-project-challenge
The dataset is taken from the AtliQ. Thanks to the AtliQ for providing datasets for public access which is a great learning asset - feel free to explore them. This dataset contains 5 csv file, 1 text file (meta_data) & mock_up_dashboard.
- Microsoft Excel
- Power BI
- dim_date
- dim_hotels
- dim_rooms
- fact_aggregated_bookings
- fact_bookings
Column Description for dim_date:
- date: This column represents the dates present in May, June and July.
- mmm yy: This column represents the date in the format of mmm yy (monthname year).
- week no: This column represents the unique week number for that particular date.
- day_type: This column represents whether the given day is Weekend or Weekeday.
Column Description for dim_hotels:
- property_id: This column represents the Unique ID for each of the hotels.
- property_name: This column represents the name of each hotel.
- category: This column determines which class[Luxury, Business] a particular hotel/property belongs to.
- city: This column represents where the particular hotel/property resides in.
Column Description for dim_rooms:
- room_id: This column represents the type of room[RT1, RT2, RT3, RT4] in a hotel.
- room_class: This column represents to which class[Standard, Elite, Premium, Presidential] particular room type belongs.
Column Description for fact_aggregated_bookings:
- property_id: This column represents the Unique ID for each of the hotels.
- check_in_date: This column represents all the check_in_dates of the customers.
- room_category: This column represents the type of room[RT1, RT2, RT3, RT4] in a hotel.
- successful_bookings: This column represents all the successful room bookings that happen for a particular room type in that hotel on that particular date.
- capacity: This column represents the maximum count of rooms available for a particular room type in that hotel on that particular date.
Column Description for fact_bookings:
- booking_id: This column represents the Unique Booking ID for each customer when they booked their rooms.
- property_id: This column represents the Unique ID for each of the hotels
- booking_date: This column represents the date on which the customer booked their rooms.
- check_in_date: This column represents the date on which the customer check-in(entered) at the hotel.
- check_out_date: This column represents the date on which the customer check-out(left) of the hotel.
- no_guests: This column represents the number of guests who stayed in a particular room in that hotel.
- room_category: This column represents the type of room[RT1, RT2, RT3, RT4] in a hotel.
- booking_platform: This column represents in which way the customer booked his room.
- ratings_given: This column represents the ratings given by the customer for hotel services.
- booking_status: This column represents whether the customer cancelled his booking[Cancelled], successfully stayed in the hotel[Checked Out] or booked his room but not stayed in the hotel[No show].
- revenue_generated: This column represents the amount of money generated by the hotel from a particular customer.
- revenue_realized: This column represents the final amount of money that goes to the hotel based on booking status. If the booking status is cancelled, then 40% of the revenue generated is deducted and the remaining is refunded to the customer. If the booking status is Checked Out/No show, then full revenue generated will goes to hotels.
Data Analyzing
Power BI was used to analyze data.
Calculated Column Name | Description / Purpose | DAX Formula | Table |
---|---|---|---|
wn | To get the week number from the corresponding date | wn = WEEKNUM(dim_date[date]) | dim_date |
day type | Based on the feedback from stakeholder, we considered weekdays and weekends separately | day type = Var wkd = WEEKDAY(dim_date[date]) | dim_date |
Sno. | Measures | Description / Purpose | DAX Formula | Table |
---|---|---|---|---|
1 | Revenue | To get the total revenue_realized | Revenue = SUM(fact_bookings[revenue_realized]) | fact_bookings |
2 | Total Bookings | To get the total number of bookings happened | Total Bookings = COUNT(fact_bookings[booking_id]) | fact_bookings |
3 | Total Capacity | To get the total capacity of rooms present in hotels | Total Capacity = SUM(fact_aggregated_bookings[capacity]) | fact_aggregated_bookings |
4 | Total Successful Bookings | To get the total successful bookings happened for all hotels | Total Successful Bookings = SUM(fact_aggregated_bookings[successful_bookings]) | fact_aggregated_bookings |
5 | Occupancy % | Occupancy means total successful bookings happened to the total rooms available (capacity) | Occupancy % = DIVIDE([Total Successful Bookings],[Total Capacity],0) | fact_aggregated_bookings |
6 | Average Rating | Get the average ratings given by the customers | Average Rating = AVERAGE(fact_bookings[ratings_given]) | fact_bookings |
7 | No of days | To get the total number of days present in the data. In our case, we have data from May to July. So 92 days. | No of days = DATEDIFF(MIN(dim_date[date]),MAX(dim_date[date]),DAY) +1 | dim_date |
8 | Total cancelled bookings | To get the "Cancelled" bookings out of all Total bookings happened | Total cancelled bookings = CALCULATE([Total Bookings],fact_bookings[booking_status]="Cancelled") | fact_bookings |
9 | Cancellation % | Calculating the cancellation percentage. | Cancellation % = DIVIDE([Total cancelled bookings],[Total Bookings]) | fact_bookings |
10 | Total Checked Out | To get the successful 'Checked out' bookings out of all Total bookings happened | Total Checked Out = CALCULATE([Total Bookings],fact_bookings[booking_status]="Checked Out") | fact_bookings |
11 | Total no show bookings | To get the "No Show" bookings out of all Total bookings happened ("No show" means those customers who neither cancelled nor attend to their booked rooms) | Total no show bookings = CALCULATE([Total Bookings],fact_bookings[booking_status]="No Show") | fact_bookings |
12 | No Show rate % | Calculating the no show percentage. | No Show rate % = DIVIDE([Total no show bookings],[Total Bookings]) | fact_bookings |
13 | Booking % by Platform | To show the percentage contribution of each booking platform for bookings in hotels. We have booking platforms like makeyourtrip, logtrip, tripster etc) | Booking % by Platform = DIVIDE([Total Bookings], CALCULATE([Total Bookings], ALL(fact_bookings[booking_platform]))) * 100 | fact_bookings |
14 | Booking % by Room class | To show the percentage contribution of each room class over total rooms booked. We have room classes like Standard, Elite, Premium, Presidential. | Booking % by Room class = DIVIDE([Total Bookings], CALCULATE([Total Bookings], ALL(dim_rooms[room_class]))) * 100 | fact_bookings, dim_rooms |
15 | ADR | Calculate the ADR(Average Daily rate). It is the ratio of revenue to the total rooms booked/sold. It is the measure of the average paid for rooms sold in a given time period | ADR = DIVIDE([Revenue], [Total Bookings], 0) | fact_bookings |
16 | Realisation % | Calculate the realisation percentage. It is nothing but the successful "checked out" percentage over all bookings happened. | Realisation % = 1- ([Cancellation %] + [No Show rate %]) | fact_bookings |
17 | RevPAR | Calculate the RevPAR(Revenue Per Available Room). RevPAR represents the revenue generated per available room, whether or not they are occupied. | RevPAR = DIVIDE([Revenue], [Total Capacity]) | fact_bookings, fact_agg_bookings |
18 | DBRN | Calculate DBRN(Daily Booked Room Nights). This metric tells on average how many rooms are booked for a day considering a time period. | DBRN = DIVIDE([Total Bookings], [No of days]) | fact_bookings, dim_date |
19 | DSRN | Calculate DSRN(Daily Sellable Room Nights). This metric tells on average how many rooms are ready to sell for a day considering a time period. | DSRN = DIVIDE([Total Capacity], [No of days]) | fact_agg_bookings, dim_date |
20 | DURN | Calculate DURN(Daily Utilized Room Nights). This metric tells on average how many rooms are successfully utilized by customers for a day considering a time period. | DURN = DIVIDE([Total Checked Out], [No of days]) | fact_bookings, dim_date |
21 | Revenue WoW change % | To get the revenue change percentage week over week. Here, revcw for current week, revpw for previous week. | Revenue WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([Revenue], dim_date[wn] = selv) var revpw = CALCULATE([Revenue], FILTER(ALL(dim_date), dim_date[wn] = selv-1)) return DIVIDE(revcw, revpw, 0) - 1 | dim_date |
22 | Occupancy WoW change % | To get the occupancy change percentage week over week. Here, revcw for current week, revpw for previous week. | Occupancy WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([Occupancy %], dim_date[wn] = selv) var revpw = CALCULATE([Occupancy %], FILTER(ALL(dim_date), dim_date[wn] = selv-1)) return DIVIDE(revcw, revpw, 0) - 1 | dim_date |
23 | ADR WoW change % | To get the ADR(Average Daily rate) change percentage week over week. Here, revcw for current week, revpw for previous week. | ADR WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([ADR], dim_date[wn] = selv) var revpw = CALCULATE([ADR], FILTER(ALL(dim_date), dim_date[wn] = selv-1)) return DIVIDE(revcw, revpw, 0) - 1 | dim_date |
24 | RevPAR WoW change % | To get the RevPAR(Revenue Per Available Room) change percentage week over week. Here, revcw for current week, revpw for previous week. | RevPAR WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([RevPAR], dim_date[wn] = selv) var revpw = CALCULATE([RevPAR], FILTER(ALL(dim_date), dim_date[wn] = selv-1)) return DIVIDE(revcw, revpw, 0) - 1 | dim_date |
25 | Realisation WoW change % | To get the Realisation change percentage week over week. Here, revcw for current week, revpw for previous week. | Realisation WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([Realisation %], dim_date[wn] = selv) var revpw = CALCULATE([Realisation %], FILTER(ALL(dim_date), dim_date[wn] = selv-1)) return DIVIDE(revcw, revpw, 0) - 1 | dim_date |
26 | DSRN WoW change % | To get the DSRN(Daily Sellable Room Nights) change percentage week over week. Here, revcw for current week, revpw for previous week. | DSRN WoW change % = Var selv = IF(HASONEFILTER(dim_date[wn]), SELECTEDVALUE(dim_date[wn]), MAX(dim_date[wn])) var revcw = CALCULATE([DSRN], dim_date[wn]=selv) var revpw=CALCULATE([DSRN],FILTER(ALL(dim_date),dim_date[wn]= selv-1)) return DIVIDE(revcw,revpw,0)-1 | dim_date |