Thursday, 30 October 2025

296.FAMOUS DELHI CELEBRITIES AND THEIR BUSINESS FAMILY DATA ANALYSIS USING ARRAYS | RETAIN | CONDITIONAL LOGIC | PROC SUMMARY | PROC UNIVARIATE | PROC FREQ | PROC SQL | AND %MALL_REPORT MACRO

FAMOUS DELHI CELEBRITIES AND THEIR BUSINESS FAMILY DATA ANALYSIS USING ARRAYS | RETAIN | CONDITIONAL LOGIC | PROC SUMMARY | PROC UNIVARIATE | PROC FREQ | PROC SQL | AND  %MALL_REPORT MACRO


options nocenter;

1) Create simulated dataset of 12 Delhi celebrities and their businesses 

data del_celeb_bus;

  infile datalines dsd dlm= ',';

  length CelebID 8 CelebName $40 BusinessName $60 BizType $30 FamilyOwner $40 NumBranches 8;

  format CelebID 8.;

  input CelebID CelebName :$40. BusinessName :$60. BizType :$30. FamilyOwner :$40. NumBranches;

  datalines;

1,"Arjun Mehra","Mehra Mall & Co","Luxury Mall","Mehra Family",6

2,"Riya Chopra","Chopra Neighborhood Mall","Neighborhood Mall","Chopra Family",3

3,"Kabir Singh","Singh Outlets","Outlet Mall","Singh Brothers",8

4,"Tara Bhandari","Bhandari Multiplexes","Multiplex","Bhandari Family",4

5,"Nikhil Grover","Grover Grocers","Grocery","Grover Family",12

6,"Ananya Rao","Rao Electronics Bazaar","Electronics Bazaar","Rao Family",7

7,"Vikram Sethi","Sethi Luxury Plaza","Luxury Mall","Sethi Family",5

8,"Meena Khurana","Khurana Neighborhood","Neighborhood Mall","Khurana Family",2

9,"Rohit Ahuja","Ahuja Outlets","Outlet Mall","Ahuja Group",6

10,"Pooja Malhotra","Malhotra Multiplex","Multiplex","Malhotra Family",3

11,"Ishaan Verma","Verma Supergrocers","Grocery","Verma Family",9

12,"Sana Bedi","Bedi Electronics Hub","Electronics Bazaar","Bedi Family",1

;

run;

proc print data = del_celeb_bus;run;

OUTPUT:

ObsCelebIDCelebNameBusinessNameBizTypeFamilyOwnerNumBranches
11Arjun MehraMehra Mall & CoLuxury MallMehra Family6
22Riya ChopraChopra Neighborhood MallNeighborhood MallChopra Family3
33Kabir SinghSingh OutletsOutlet MallSingh Brothers8
44Tara BhandariBhandari MultiplexesMultiplexBhandari Family4
55Nikhil GroverGrover GrocersGroceryGrover Family12
66Ananya RaoRao Electronics BazaarElectronics BazaarRao Family7
77Vikram SethiSethi Luxury PlazaLuxury MallSethi Family5
88Meena KhuranaKhurana NeighborhoodNeighborhood MallKhurana Family2
99Rohit AhujaAhuja OutletsOutlet MallAhuja Group6
1010Pooja MalhotraMalhotra MultiplexMultiplexMalhotra Family3
1111Ishaan VermaVerma SupergrocersGroceryVerma Family9
1212Sana BediBedi Electronics HubElectronics BazaarBedi Family1

2) DATA step using ARRAY, RETAIN and conditional logic to create indicators and running totals 

data del_celeb_bus_flags;

  set del_celeb_bus;

  /* Create numeric indicator variables for each BizType using an array */

  array mall_flag[6] Mall_Luxury Mall_Neighborhood Mall_Outlet Mall_Multiplex Mall_Grocery Mall_Electronics;

  /* Initialize flags to 0 for each observation */

  do i = 1 to dim(mall_flag);

    mall_flag[i] = 0;

  end;


  /* Set the appropriate flag based on BizType */

  if upcase(strip(BizType)) = "LUXURY MALL" then Mall_Luxury = 1;

  else if upcase(strip(BizType)) = "NEIGHBORHOOD MALL" then Mall_Neighborhood = 1;

  else if upcase(strip(BizType)) = "OUTLET MALL" then Mall_Outlet = 1;

  else if upcase(strip(BizType)) = "MULTIPLEX" then Mall_Multiplex = 1;

  else if upcase(strip(BizType)) = "GROCERY" then Mall_Grocery = 1;

  else if upcase(strip(BizType)) = "ELECTRONICS BAZAAR" then Mall_Electronics = 1;


  /* Use RETAIN to make a running total of branches seen so far (ordered by dataset) */

  retain RunningTotalBranches 0;

  RunningTotalBranches + NumBranches;


  /* Create a size category for the business based on number of branches */

  length SizeCategory $12;

  if NumBranches <= 2 then SizeCategory = "Micro";

  else if 3 <= NumBranches <= 5 then SizeCategory = "Small";

  else if 6 <= NumBranches <= 9 then SizeCategory = "Medium";

  else SizeCategory = "Large";


  drop i;

run;

proc print data=del_celeb_bus_flags;

run;

OUTPUT:

ObsCelebIDCelebNameBusinessNameBizTypeFamilyOwnerNumBranchesMall_LuxuryMall_NeighborhoodMall_OutletMall_MultiplexMall_GroceryMall_ElectronicsRunningTotalBranchesSizeCategory
11Arjun MehraMehra Mall & CoLuxury MallMehra Family61000006Medium
22Riya ChopraChopra Neighborhood MallNeighborhood MallChopra Family30100009Small
33Kabir SinghSingh OutletsOutlet MallSingh Brothers800100017Medium
44Tara BhandariBhandari MultiplexesMultiplexBhandari Family400010021Small
55Nikhil GroverGrover GrocersGroceryGrover Family1200001033Large
66Ananya RaoRao Electronics BazaarElectronics BazaarRao Family700000140Medium
77Vikram SethiSethi Luxury PlazaLuxury MallSethi Family510000045Small
88Meena KhuranaKhurana NeighborhoodNeighborhood MallKhurana Family201000047Micro
99Rohit AhujaAhuja OutletsOutlet MallAhuja Group600100053Medium
1010Pooja MalhotraMalhotra MultiplexMultiplexMalhotra Family300010056Small
1111Ishaan VermaVerma SupergrocersGroceryVerma Family900001065Medium
1212Sana BediBedi Electronics HubElectronics BazaarBedi Family100000166Micro


3) PROC SUMMARY: summarize number of observations and branch totals by BizType

proc summary data=del_celeb_bus nway;

  class BizType;

  var NumBranches;

  output out=summary_by_type

         n(NumBranches)=CountObs

         sum(NumBranches)=TotalBranches

         mean(NumBranches)=AvgBranches

         median(NumBranches)=MedianBranches;

run;

proc print data=del_celeb_bus;

run;

OUTPUT:

ObsCelebIDCelebNameBusinessNameBizTypeFamilyOwnerNumBranches
11Arjun MehraMehra Mall & CoLuxury MallMehra Family6
22Riya ChopraChopra Neighborhood MallNeighborhood MallChopra Family3
33Kabir SinghSingh OutletsOutlet MallSingh Brothers8
44Tara BhandariBhandari MultiplexesMultiplexBhandari Family4
55Nikhil GroverGrover GrocersGroceryGrover Family12
66Ananya RaoRao Electronics BazaarElectronics BazaarRao Family7
77Vikram SethiSethi Luxury PlazaLuxury MallSethi Family5
88Meena KhuranaKhurana NeighborhoodNeighborhood MallKhurana Family2
99Rohit AhujaAhuja OutletsOutlet MallAhuja Group6
1010Pooja MalhotraMalhotra MultiplexMultiplexMalhotra Family3
1111Ishaan VermaVerma SupergrocersGroceryVerma Family9
1212Sana BediBedi Electronics HubElectronics BazaarBedi Family1


4) PROC UNIVARIATE on NumBranches to see distribution (skew, moments, basic stats) 

proc univariate data=del_celeb_bus cibasic;

  var NumBranches;

  histogram NumBranches / kernel;

run;

OUTPUT:

The UNIVARIATE Procedure

Variable: NumBranches

Moments
N12Sum Weights12
Mean5.5Sum Observations66
Std Deviation3.17661913Variance10.0909091
Skewness0.57174504Kurtosis0.02535508
Uncorrected SS474Corrected SS111
Coeff Variation57.7567114Std Error Mean0.91701095
Basic Statistical Measures
LocationVariability
Mean5.500000Std Deviation3.17662
Median5.500000Variance10.09091
Mode3.000000Range11.00000
  Interquartile Range4.50000

Note: The mode displayed is the smallest of 2 modes with a count of 2.

Basic Confidence Limits Assuming Normality
ParameterEstimate95% Confidence Limits
Mean5.500003.481677.51833
Std Deviation3.176622.250305.39351
Variance10.090915.0638629.08997
Tests for Location: Mu0=0
TestStatisticp Value
Student's tt5.997747Pr > |t|<.0001
SignM6Pr >= |M|0.0005
Signed RankS39Pr >= |S|0.0005
Quantiles (Definition 5)
LevelQuantile
100% Max12.0
99%12.0
95%12.0
90%9.0
75% Q37.5
50% Median5.5
25% Q13.0
10%2.0
5%1.0
1%1.0
0% Min1.0
Extreme Observations
LowestHighest
ValueObsValueObs
11269
2876
31083
32911
44125

The UNIVARIATE Procedure


5) PROC FREQ on BizType and FamilyOwner to inspect categorical distributions 

proc freq data=del_celeb_bus;

  tables BizType FamilyOwner / nocum nopercent;

run;

OUTPUT:

The FREQ Procedure

BizTypeFrequency
Electronics Bazaar2
Grocery2
Luxury Mall2
Multiplex2
Neighborhood Mall2
Outlet Mall2
FamilyOwnerFrequency
Ahuja Group1
Bedi Family1
Bhandari Family1
Chopra Family1
Grover Family1
Khurana Family1
Malhotra Family1
Mehra Family1
Rao Family1
Sethi Family1
Singh Brothers1
Verma Family1

6) PROC SQL with subquery: find celebrities whose NumBranches > average for their BizType 

proc sql;

  create table above_avg_per_type as

  select a.*

  from del_celeb_bus as a

  where a.NumBranches > (

      select mean(b.NumBranches)

      from del_celeb_bus as b

      where b.BizType = a.BizType

    )

  order by a.BizType, a.NumBranches desc;

quit;

proc print data=above_avg_per_type;

run;

OUTPUT:

ObsCelebIDCelebNameBusinessNameBizTypeFamilyOwnerNumBranches
16Ananya RaoRao Electronics BazaarElectronics BazaarRao Family7
25Nikhil GroverGrover GrocersGroceryGrover Family12
31Arjun MehraMehra Mall & CoLuxury MallMehra Family6
44Tara BhandariBhandari MultiplexesMultiplexBhandari Family4
52Riya ChopraChopra Neighborhood MallNeighborhood MallChopra Family3
63Kabir SinghSingh OutletsOutlet MallSingh Brothers8


7) PROC SQL: find maximum branches and the celebrity owning that business per type (subquery + join)

proc sql;

  create table max_branches_per_type as

  select t.BizType, t.CelebName, t.BusinessName, t.NumBranches

  from del_celeb_bus as t

  where t.NumBranches = (

    select max(s.NumBranches) 

    from del_celeb_bus as s 

    where s.BizType = t.BizType

  )

  order by t.BizType;

quit;

proc print data=max_branches_per_type;

run;

OUTPUT:

ObsBizTypeCelebNameBusinessNameNumBranches
1Electronics BazaarAnanya RaoRao Electronics Bazaar7
2GroceryNikhil GroverGrover Grocers12
3Luxury MallArjun MehraMehra Mall & Co6
4MultiplexTara BhandariBhandari Multiplexes4
5Neighborhood MallRiya ChopraChopra Neighborhood Mall3
6Outlet MallKabir SinghSingh Outlets8


8) Macro to create PDF report for a given mall type: %mall_report(type=) 

%macro mall_report(type=);

  /* sanitize type variable for matching */

  %let _type = %upcase(%sysfunc(strip(&type.)));


  /* create PDF filename dynamically (placed in current working directory) */

  ods pdf file="mall_report_&_type..pdf" style=journal;


  title "Mall Report for &type.";

  footnote "Generated by %sysfunc(date(), date9.)";


  proc print data=del_celeb_bus;

    where upcase(BizType) = "&_type.";

    var CelebID CelebName BusinessName FamilyOwner NumBranches;

    title2 "Businesses for type: &type.";

  run;


  proc sql;

    select count(*) as CountObs,

           sum(NumBranches) as TotalBranches,

           mean(NumBranches) as AvgBranches,

           median(NumBranches) as MedianBranches

    from del_celeb_bus

    where upcase(BizType) = "&_type.";

  quit;


  proc sql;

    select a.CelebName, a.BusinessName, a.NumBranches

    from del_celeb_bus as a

    where upcase(a.BizType) = "&_type." and a.NumBranches > (

      select mean(b.NumBranches)

      from del_celeb_bus as b

      where upcase(b.BizType) = "&_type."

    );

  quit;


  ods pdf close;

  title;

  footnote;

%mend mall_report;


Example of running the macro for 'Outlet Mall' 

%mall_report(type=Outlet Mall);

OUTPUT:

Mall Report for Outlet Mall

Businesses for type: Outlet Mall

ObsCelebIDCelebNameBusinessNameFamilyOwnerNumBranches
33Kabir SinghSingh OutletsSingh Brothers8
99Rohit AhujaAhuja OutletsAhuja Group6

Mall Report for Outlet Mall

Businesses for type: Outlet Mall

CountObsTotalBranchesAvgBranchesMedianBranches
21477

Mall Report for Outlet Mall

Businesses for type: Outlet Mall

CelebNameBusinessNameNumBranches
Kabir SinghSingh Outlets8








To Visit My Previous Online Streaming Flatform Dataset:Click Here
To Visit My Previous Statistical Evaluation Of Clinical Trials:Click Here
To Visit My Previous Unlocking Retail Insights Dataset:Click Here
To Visit My Previous Sas Interview Questions-1:Click Here





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

PLEASE FOLLOW OUR TELEGRAM CHANNEL CLICK HERE

PLEASE FOLLOW OUR FACEBOOK PAGE  CLICK HERE

PLEASE FOLLOW OUR INSTAGRAM PAGE CLICK HERE

No comments:

Post a Comment