Saturday, 23 August 2025

268.RESTAURANT CUISINE IN INDIA — SAS MINI-PROJECT DATA CREATION | PROC FORMAT | PROC CONTENTS | PROC PRINT | PROC FREQ | PROC MEANS | PROC SUMMARY | PROC SQL | PROC RANK | PROC TRANSPOSE | PROC SGPLOT | MACROS

RESTAURANT CUISINE IN INDIA — SAS MINI-PROJECT DATA CREATION | PROC FORMAT | PROC CONTENTS | PROC PRINT | PROC FREQ | PROC MEANS | PROC SUMMARY | PROC SQL | PROC RANK | PROC TRANSPOSE | PROC SGPLOT | MACROS 

 /*Creating A Dataset Of RESTAURANT CUISINE IN INDIA */

1) FORMATS: for clean display of flags 

proc format;

  value yesno 0='No'

              1='Yes';

  value rupee low-high = [comma10.];

run;

Log:

NOTE: Format YESNO has been output.
NOTE: Format RUPEE has been output.

2) DATA CREATION: base table 

data work.restaurants_india;

  length Restaurant_ID 8

         Restaurant_Name $40 City $20 State $20 Cuisine $20

         Veg_Flag 8 Delivery_Flag 8 Reservation_Flag 8 DineIn_Flag 8

         Price_For_Two 8 Rating 8 Votes 8 Seating_Capacity 8 Opening_Year 8

         Chain_Name $25;

  informat Last_Updated yymmdd10.;

  format  Veg_Flag Delivery_Flag Reservation_Flag DineIn_Flag yesno.

          Price_For_Two rupee. Rating 3.1 Last_Updated yymmdd10.;

  infile datalines dsd truncover;

  input Restaurant_ID

        Restaurant_Name :$40.

        City :$20.

        State :$20.

        Cuisine :$20.

        Veg_Flag

        Delivery_Flag

        Reservation_Flag

        DineIn_Flag

        Price_For_Two

        Rating

        Votes

        Seating_Capacity

        Opening_Year

        Chain_Name :$25.

        Last_Updated;

datalines;

1,"Biryani Blues","Hyderabad","Telangana","Hyderabadi",0,1,1,1,800,4.4,12500,80,2015,"Biryani Blues","2025-08-01"

2,"Chutneys","Hyderabad","Telangana","South Indian",1,0,1,1,900,4.3,8200,120,2003,"","2025-08-01"

3,"Paradise","Hyderabad","Telangana","Hyderabadi",0,1,1,1,850,4.1,22000,150,1953,"Paradise","2025-08-01"

4,"Saravana Bhavan","Chennai","Tamil Nadu","South Indian",1,1,1,1,750,4.2,30000,140,1981,"Saravana Bhavan","2025-08-02"

5,"A2B (Adyar Ananda Bhavan)","Chennai","Tamil Nadu","South Indian",1,1,0,1,650,4.0,18000,130,1988,"A2B","2025-08-02"

6,"Karavalli","Bengaluru","Karnataka","Coastal",0,0,1,1,2000,4.6,5400,90,1994,"","2025-08-02"

7,"Truffles","Bengaluru","Karnataka","Continental",0,1,0,1,1200,4.3,27000,110,2000,"Truffles","2025-08-03"

8,"MTR","Bengaluru","Karnataka","South Indian",1,0,0,1,500,4.5,35000,100,1924,"MTR","2025-08-03"

9,"Bademiya","Mumbai","Maharashtra","North Indian",0,1,0,0,1000,4.2,22000,60,1946,"","2025-08-03"

10,"The Bombay Canteen","Mumbai","Maharashtra","Modern Indian",0,0,1,1,2500,4.7,9000,85,2015,"","2025-08-04"

11,"Leopold Cafe","Mumbai","Maharashtra","Continental",0,1,0,1,1800,4.1,40000,160,1871,"","2025-08-04"

12,"Oh! Calcutta","Kolkata","West Bengal","Bengali",0,1,1,1,1500,4.4,8000,100,1994,"Oh! Calcutta","2025-08-04"

13,"6 Ballygunge Place","Kolkata","West Bengal","Bengali",0,0,1,1,1300,4.5,6000,90,2003,"","2025-08-04"

14,"Peter Cat","Kolkata","West Bengal","Continental",0,0,0,1,1200,4.2,25000,120,1975,"","2025-08-04"

;

run;

proc print;run;

Output:

ObsRestaurant_IDRestaurant_NameCityStateCuisineVeg_FlagDelivery_FlagReservation_FlagDineIn_FlagPrice_For_TwoRatingVotesSeating_CapacityOpening_YearChain_NameLast_Updated
11Biryani BluesHyderabadTelanganaHyderabadiNoYesYesYes8004.412500802015Biryani Blues2025-08-01
22ChutneysHyderabadTelanganaSouth IndianYesNoYesYes9004.382001202003 2025-08-01
33ParadiseHyderabadTelanganaHyderabadiNoYesYesYes8504.1220001501953Paradise2025-08-01
44Saravana BhavanChennaiTamil NaduSouth IndianYesYesYesYes7504.2300001401981Saravana Bhavan2025-08-02
55A2B (Adyar Ananda Bhavan)ChennaiTamil NaduSouth IndianYesYesNoYes6504.0180001301988A2B2025-08-02
66KaravalliBengaluruKarnatakaCoastalNoNoYesYes2,0004.65400901994 2025-08-02
77TrufflesBengaluruKarnatakaContinentalNoYesNoYes1,2004.3270001102000Truffles2025-08-03
88MTRBengaluruKarnatakaSouth IndianYesNoNoYes5004.5350001001924MTR2025-08-03
99BademiyaMumbaiMaharashtraNorth IndianNoYesNoNo1,0004.222000601946 2025-08-03
1010The Bombay CanteenMumbaiMaharashtraModern IndianNoNoYesYes2,5004.79000852015 2025-08-04
1111Leopold CafeMumbaiMaharashtraContinentalNoYesNoYes1,8004.1400001601871 2025-08-04
1212Oh! CalcuttaKolkataWest BengalBengaliNoYesYesYes1,5004.480001001994Oh! Calcutta2025-08-04
13136 Ballygunge PlaceKolkataWest BengalBengaliNoNoYesYes1,3004.56000902003 2025-08-04
1414Peter CatKolkataWest BengalContinentalNoNoNoYes1,2004.2250001201975 2025-08-04


3) QUICK STRUCTURE CHECK

proc contents data=work.restaurants_india varnum;

  title "Structure of RESTAURANTS_INDIA";

run;

Output:

Structure of RESTAURANTS_INDIA

The CONTENTS Procedure

Data Set NameWORK.RESTAURANTS_INDIAObservations14
Member TypeDATAVariables16
EngineV9Indexes0
Created08/23/2025 19:02:35Observation Length216
Last Modified08/23/2025 19:02:35Deleted Observations0
Protection CompressedNO
Data Set Type SortedNO
Label   
Data RepresentationSOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64  
Encodingutf-8 Unicode (UTF-8)  
Engine/Host Dependent Information
Data Set Page Size131072
Number of Data Set Pages1
First Data Page1
Max Obs per Page606
Obs in First Data Page14
Number of Data Set Repairs0
Filename/saswork/SAS_work850B0000C87B_odaws01-apse1-2.oda.sas.com/SAS_workCA340000C87B_odaws01-apse1-2.oda.sas.com/restaurants_india.sas7bdat
Release Created9.0401M8
Host CreatedLinux
Inode Number201328202
Access Permissionrw-r--r--
Owner Nameu63247146
File Size256KB
File Size (bytes)262144
Variables in Creation Order
#VariableTypeLenFormatInformat
1Restaurant_IDNum8  
2Restaurant_NameChar40  
3CityChar20  
4StateChar20  
5CuisineChar20  
6Veg_FlagNum8YESNO. 
7Delivery_FlagNum8YESNO. 
8Reservation_FlagNum8YESNO. 
9DineIn_FlagNum8YESNO. 
10Price_For_TwoNum8RUPEE. 
11RatingNum83.1 
12VotesNum8  
13Seating_CapacityNum8  
14Opening_YearNum8  
15Chain_NameChar25  
16Last_UpdatedNum8YYMMDD10.YYMMDD10.

4) BASIC BROWSE 

proc print data=work.restaurants_india (obs=10) noobs label;

  var Restaurant_ID Restaurant_Name City State Cuisine Veg_Flag Delivery_Flag Reservation_Flag DineIn_Flag

      Price_For_Two Rating Votes Seating_Capacity Opening_Year Chain_Name Last_Updated;

  title "Sample Rows — Formatted Flags & Prices";

run;

Output:

Sample Rows — Formatted Flags & Prices

Restaurant_IDRestaurant_NameCityStateCuisineVeg_FlagDelivery_FlagReservation_FlagDineIn_FlagPrice_For_TwoRatingVotesSeating_CapacityOpening_YearChain_NameLast_Updated
1Biryani BluesHyderabadTelanganaHyderabadiNoYesYesYes8004.412500802015Biryani Blues2025-08-01
2ChutneysHyderabadTelanganaSouth IndianYesNoYesYes9004.382001202003 2025-08-01
3ParadiseHyderabadTelanganaHyderabadiNoYesYesYes8504.1220001501953Paradise2025-08-01
4Saravana BhavanChennaiTamil NaduSouth IndianYesYesYesYes7504.2300001401981Saravana Bhavan2025-08-02
5A2B (Adyar Ananda Bhavan)ChennaiTamil NaduSouth IndianYesYesNoYes6504.0180001301988A2B2025-08-02
6KaravalliBengaluruKarnatakaCoastalNoNoYesYes2,0004.65400901994 2025-08-02
7TrufflesBengaluruKarnatakaContinentalNoYesNoYes1,2004.3270001102000Truffles2025-08-03
8MTRBengaluruKarnatakaSouth IndianYesNoNoYes5004.5350001001924MTR2025-08-03
9BademiyaMumbaiMaharashtraNorth IndianNoYesNoNo1,0004.222000601946 2025-08-03
10The Bombay CanteenMumbaiMaharashtraModern IndianNoNoYesYes2,5004.79000852015 2025-08-04

5) DISTRIBUTIONS 

proc freq data=work.restaurants_india;

  tables City State Cuisine Veg_Flag*City / nocum nopercent;

  title "Frequency: City, State, Cuisine & Veg-by-City";

run;

Output:

Frequency: City, State, Cuisine & Veg-by-City

The FREQ Procedure

CityFrequency
Bengaluru3
Chennai2
Hyderabad3
Kolkata3
Mumbai3
StateFrequency
Karnataka3
Maharashtra3
Tamil Nadu2
Telangana3
West Bengal3
CuisineFrequency
Bengali2
Coastal1
Continental3
Hyderabadi2
Modern Indian1
North Indian1
South Indian4
Frequency
Row Pct
Col Pct
Table of Veg_Flag by City
Veg_FlagCity
BengaluruChennaiHyderabadKolkataMumbaiTotal
No
2
20.00
66.67
0
0.00
0.00
2
20.00
66.67
3
30.00
100.00
3
30.00
100.00
10
 
 
Yes
1
25.00
33.33
2
50.00
100.00
1
25.00
33.33
0
0.00
0.00
0
0.00
0.00
4
 
 
Total
3
2
3
3
3
14

6) SUMMARY STATS

proc means data=work.restaurants_india n mean median min p25 p75 max maxdec=1;

  class City Cuisine;

  var Price_For_Two Rating Votes Seating_Capacity;

  title "Descriptive Statistics by City and Cuisine";

run;

Output:

Descriptive Statistics by City and Cuisine

The MEANS Procedure

CityCuisineN ObsVariableNMeanMedianMinimum25th Pctl75th PctlMaximum
BengaluruCoastal1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
2000.0
4.6
5400.0
90.0
2000.0
4.6
5400.0
90.0
2000.0
4.6
5400.0
90.0
2000.0
4.6
5400.0
90.0
2000.0
4.6
5400.0
90.0
2000.0
4.6
5400.0
90.0
 Continental1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
1200.0
4.3
27000.0
110.0
1200.0
4.3
27000.0
110.0
1200.0
4.3
27000.0
110.0
1200.0
4.3
27000.0
110.0
1200.0
4.3
27000.0
110.0
1200.0
4.3
27000.0
110.0
 South Indian1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
500.0
4.5
35000.0
100.0
500.0
4.5
35000.0
100.0
500.0
4.5
35000.0
100.0
500.0
4.5
35000.0
100.0
500.0
4.5
35000.0
100.0
500.0
4.5
35000.0
100.0
ChennaiSouth Indian2
Price_For_Two
Rating
Votes
Seating_Capacity
2
2
2
2
700.0
4.1
24000.0
135.0
700.0
4.1
24000.0
135.0
650.0
4.0
18000.0
130.0
650.0
4.0
18000.0
130.0
750.0
4.2
30000.0
140.0
750.0
4.2
30000.0
140.0
HyderabadHyderabadi2
Price_For_Two
Rating
Votes
Seating_Capacity
2
2
2
2
825.0
4.3
17250.0
115.0
825.0
4.3
17250.0
115.0
800.0
4.1
12500.0
80.0
800.0
4.1
12500.0
80.0
850.0
4.4
22000.0
150.0
850.0
4.4
22000.0
150.0
 South Indian1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
900.0
4.3
8200.0
120.0
900.0
4.3
8200.0
120.0
900.0
4.3
8200.0
120.0
900.0
4.3
8200.0
120.0
900.0
4.3
8200.0
120.0
900.0
4.3
8200.0
120.0
KolkataBengali2
Price_For_Two
Rating
Votes
Seating_Capacity
2
2
2
2
1400.0
4.5
7000.0
95.0
1400.0
4.5
7000.0
95.0
1300.0
4.4
6000.0
90.0
1300.0
4.4
6000.0
90.0
1500.0
4.5
8000.0
100.0
1500.0
4.5
8000.0
100.0
 Continental1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
1200.0
4.2
25000.0
120.0
1200.0
4.2
25000.0
120.0
1200.0
4.2
25000.0
120.0
1200.0
4.2
25000.0
120.0
1200.0
4.2
25000.0
120.0
1200.0
4.2
25000.0
120.0
MumbaiContinental1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
1800.0
4.1
40000.0
160.0
1800.0
4.1
40000.0
160.0
1800.0
4.1
40000.0
160.0
1800.0
4.1
40000.0
160.0
1800.0
4.1
40000.0
160.0
1800.0
4.1
40000.0
160.0
 Modern Indian1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
2500.0
4.7
9000.0
85.0
2500.0
4.7
9000.0
85.0
2500.0
4.7
9000.0
85.0
2500.0
4.7
9000.0
85.0
2500.0
4.7
9000.0
85.0
2500.0
4.7
9000.0
85.0
 North Indian1
Price_For_Two
Rating
Votes
Seating_Capacity
1
1
1
1
1000.0
4.2
22000.0
60.0
1000.0
4.2
22000.0
60.0
1000.0
4.2
22000.0
60.0
1000.0
4.2
22000.0
60.0
1000.0
4.2
22000.0
60.0
1000.0
4.2
22000.0
60.0

7) COLLAPSED CITY SUMMARY DATASET

proc summary data=work.restaurants_india nway;

  class City;

  var Price_For_Two Rating Votes;

  output out=work.city_summary(drop=_:) 

         n()=N_Restaurants

         mean(Price_For_Two)=Avg_Price

         mean(Rating)=Avg_Rating

         sum(Votes)=Total_Votes;

run;

proc print;run;

Output:

ObsCityN_RestaurantsAvg_PriceAvg_RatingTotal_Votes
1Bengaluru31,2334.567400
2Chennai27004.148000
3Hyderabad38504.342700
4Kolkata31,3334.439000
5Mumbai31,7674.371000


8) SQL ANALYTICS 

proc sql;

  create view work.top_modern as

  select *

  from work.restaurants_india

  where Cuisine in ('Modern Indian','Continental')

    and Rating >= 4.3;

  

   Cuisine-level KPIs 

  create table work.cuisine_kpis as

  select Cuisine,

         count(*) as N,

         mean(Price_For_Two) as Avg_Price format=rupee.,

         mean(Rating) as Avg_Rating format=3.2,

         sum(Votes) as Total_Votes format=comma12.

  from work.restaurants_india

  group by Cuisine

  order by Avg_Rating desc, Total_Votes desc;


   "Value Score": normalize price & rating to a simple heuristic 

  create table work.value_score as

  select Restaurant_ID, Restaurant_Name, City, Cuisine, Price_For_Two, Rating, Votes,

         (Rating*1000) / (Price_For_Two + 1) as Value_Score format=8.1

  from work.restaurants_india

  order by Value_Score desc;

quit;

proc print data=work.top_modern;

run;

Output:

ObsRestaurant_IDRestaurant_NameCityStateCuisineVeg_FlagDelivery_FlagReservation_FlagDineIn_FlagPrice_For_TwoRatingVotesSeating_CapacityOpening_YearChain_NameLast_Updated
17TrufflesBengaluruKarnatakaContinentalNoYesNoYes1,2004.3270001102000Truffles2025-08-03
210The Bombay CanteenMumbaiMaharashtraModern IndianNoNoYesYes2,5004.79000852015 2025-08-04

proc print data=work.cuisine_kpis;

run;

Output:

ObsCuisineNAvg_PriceAvg_RatingTotal_Votes
1Modern Indian12,5004.79,000
2Coastal12,0004.65,400
3Bengali21,4004.514,000
4South Indian47004.391,200
5Hyderabadi28254.334,500
6Continental31,4004.292,000
7North Indian11,0004.222,000

proc print data=work.value_score;

run;

Output:

ObsRestaurant_IDRestaurant_NameCityCuisinePrice_For_TwoRatingVotesValue_Score
18MTRBengaluruSouth Indian5004.5350009.0
25A2B (Adyar Ananda Bhavan)ChennaiSouth Indian6504.0180006.1
34Saravana BhavanChennaiSouth Indian7504.2300005.6
41Biryani BluesHyderabadHyderabadi8004.4125005.5
53ParadiseHyderabadHyderabadi8504.1220004.8
62ChutneysHyderabadSouth Indian9004.382004.8
79BademiyaMumbaiNorth Indian1,0004.2220004.2
87TrufflesBengaluruContinental1,2004.3270003.6
914Peter CatKolkataContinental1,2004.2250003.5
10136 Ballygunge PlaceKolkataBengali1,3004.560003.5
1112Oh! CalcuttaKolkataBengali1,5004.480002.9
126KaravalliBengaluruCoastal2,0004.654002.3
1311Leopold CafeMumbaiContinental1,8004.1400002.3
1410The Bombay CanteenMumbaiModern Indian2,5004.790001.9


9) RANKING BY CITY (Rating)

proc rank data=work.restaurants_india out=work.rank_by_city descending ties=low;

  by City notsorted;

  var Rating;

  ranks Rank_in_City;

run;


proc print data=work.rank_by_city noobs;

  where Rank_in_City <= 2;

  var City Restaurant_Name Cuisine Rating Rank_in_City;

  title "Top 2 by Rating within Each City";

run;

Output:

Top 2 by Rating within Each City

CityRestaurant_NameCuisineRatingRank_in_City
HyderabadBiryani BluesHyderabadi4.41
HyderabadChutneysSouth Indian4.32
ChennaiSaravana BhavanSouth Indian4.21
ChennaiA2B (Adyar Ananda Bhavan)South Indian4.02
BengaluruKaravalliCoastal4.61
BengaluruMTRSouth Indian4.52
MumbaiBademiyaNorth Indian4.22
MumbaiThe Bombay CanteenModern Indian4.71
KolkataOh! CalcuttaBengali4.42
Kolkata6 Ballygunge PlaceBengali4.51

10) TRANSPOSE: Avg Price per Cuisine 

proc sql;

  create table work.city_price as

  select City, Cuisine, mean(Price_For_Two) as Avg_Price format=rupee.

  from work.restaurants_india

  group by City, Cuisine;

quit;


proc transpose data=work.city_price out=work.city_price_wide prefix=Price_;

  by City;

  id Cuisine;

  var Avg_Price;

run;


proc print data=work.city_price_wide label noobs;

  title "Average Price for Two by Cuisine (Wide by City)";

run;

Output:

Average Price for Two by Cuisine (Wide by City)

CityNAME OF FORMER VARIABLEPrice_CoastalPrice_ContinentalPrice_South IndianPrice_HyderabadiPrice_BengaliPrice_Modern IndianPrice_North Indian
BengaluruAvg_Price2,0001,200500....
ChennaiAvg_Price..700....
HyderabadAvg_Price..900825...
KolkataAvg_Price.1,200..1,400..
MumbaiAvg_Price.1,800...2,5001,000

11) SIMPLE VISUAL

ods graphics on;

proc sgplot data=work.restaurants_india;

  vbar Cuisine / response=Price_For_Two stat=mean datalabel;

  yaxis label="Average Price for Two (INR)";

  title "Mean Price for Two by Cuisine";

run;

ods graphics off;

Output:

The SGPlot Procedure


12) MACRO: City Dashboard 

%macro citydash(city=);

  title "CITY DASHBOARD: &city";

  proc sql;

    select "&city" as City length=20,

           count(*) as N_Restaurants,

           mean(Price_For_Two) format=rupee. as Avg_Price,

           mean(Rating) format=3.2 as Avg_Rating,

           sum(Votes) format=comma12. as Total_Votes

    from work.restaurants_india

    where City="&city";

  quit;


  proc print data=work.rank_by_city noobs;

    where City="&city" and Rank_in_City<=3;

    var Restaurant_Name Cuisine Rating Rank_in_City;

    title3 "Top 3 Rated in &city";

  run;


  proc freq data=work.restaurants_india nlevels;

    where City="&city";

    tables Cuisine / nocum;

    title3 "Cuisine Mix in &city";

  run;

%mend;


%citydash(city=Hyderabad);

Output:

CITY DASHBOARD: Hyderabad

CityN_RestaurantsAvg_PriceAvg_RatingTotal_Votes
Hyderabad38504.342,700

CITY DASHBOARD: Hyderabad

Top 3 Rated in Hyderabad

Restaurant_NameCuisineRatingRank_in_City
Biryani BluesHyderabadi4.41
ChutneysSouth Indian4.32
ParadiseHyderabadi4.13

CITY DASHBOARD: Hyderabad

Cuisine Mix in Hyderabad

The FREQ Procedure

Number of Variable Levels
VariableLevels
Cuisine2
CuisineFrequencyPercent
Hyderabadi266.67
South Indian133.33

%citydash(city=Bengaluru);

Output:

CITY DASHBOARD: Bengaluru

CityN_RestaurantsAvg_PriceAvg_RatingTotal_Votes
Bengaluru31,2334.567,400

CITY DASHBOARD: Bengaluru

Top 3 Rated in Bengaluru

Restaurant_NameCuisineRatingRank_in_City
KaravalliCoastal4.61
TrufflesContinental4.33
MTRSouth Indian4.52

CITY DASHBOARD: Bengaluru

Cuisine Mix in Bengaluru

The FREQ Procedure

Number of Variable Levels
VariableLevels
Cuisine3
CuisineFrequencyPercent
Coastal133.33
Continental133.33
South Indian133.33


To Visit My Previous Proc  Means And Nway Option:Click Here
To Visit My Previous Proc Means And CharType Option:Click Here
To Visit My Previous SAS Functions:Click Here
To Visit My Previous Length Statement Using In Many Ways:Click Here





 
--- FOLLOW OUR BLOG FOR MORE INFORMATION.
--->PLEASE DO COMMENTS AND SHARE OUR BLOG.




Follow Us On : 





No comments:

Post a Comment