394.Which city’s billboards give high revenue but secretly deliver low ROI—and why? A Complete Sas Analytics Project

Which city’s billboards give high revenue but secretly deliver low ROI—and why?A Complete Sas Analytics Project

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HERE IN THIS PROJECT WE USED THESE SAS STATEMENTS —
DATA STEP | PROC SQL |  PROC PRINT | PROC SGPLOT | MACROS | PROC CORR | PROC MEANS | PROC FREQ | PROC UNIVARIATE | APPEND | PROC SORT | MERGE | PROC TRANSPOSE | PROC DATASETS DELETE | DATA FUNCTIONS

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. INTRODUCTION

Outdoor advertising through billboards is one of the oldest yet most powerful marketing channels. Companies invest millions of rupees every year to place advertisements on highways, cities, and high-traffic areas.

However, not all billboards perform equally.

Some generate:

·       High exposure

·       Strong brand recall

·       Excellent ROI

Others:

·       Sit in low-traffic areas

·       Are overpriced

·       Show suspicious revenue patterns (fraud risk)

This project simulates a real-world billboard analytics system using SAS, focusing on:

·       Revenue analysis

·       ROI computation

·       Utilization classification

·       Fraud detection

·       Time-based analytics

·       SQL + DATA step integration

·       Macro-driven automation

2. BUSINESS CONTEXT

Why companies analyze billboard data?

Business leaders want answers to:

·       Which city billboards generate maximum ROI?

·       Which ad types perform better (Digital vs Static)?

·       Are some billboards reporting fake revenue?

·       Should we renew contracts or terminate them?

·       How does traffic affect revenue?

·       How long should ads be displayed?

This analysis supports:

·       Marketing strategy

·       Budget optimization

·       Fraud prevention

·       Vendor performance review

3. TABLE OF CONTENTS

1.     Dataset Creation

2.     Variable Explanation

3.     Date Handling (MDY, INTCK, INTNX)

4.     Data Cleaning (Character + Numeric functions)

5.     PROC SQL Analytics

6.     PROC FREQ & PROC MEANS

7.     PROC UNIVARIATE (Distribution checks)

8.     Correlation Analysis (PROC CORR)

9.     Visualization (PROC SGPLOT)

10.  Utilization Classification Macro

11.  Fraud Detection Macro

12.  Dataset Appending & Transposing

13.  SET, MERGE operations

14.  PROC DATASETS Delete

15.  Business Insights

16.  Interview-oriented Explanation

17. Conclusion

4. DATASET CREATION

data billboard_raw;

    length Billboard_ID $6 City $15 Ad_Type $10 Vendor $15;

    input Billboard_ID $ City $ Traffic_Count Ad_Type $ Exposure_Time Revenue Cost

          Start_Date :date9. End_Date   :date9. Vendor $;

    format Start_Date End_Date date9.;

datalines;

BB001 Hyderabad 120000 Digital 15 850000 500000 01JAN2025 31JAN2025 MediaOne

BB002 Mumbai 180000 Digital 20 1500000 900000 01JAN2025 31JAN2025 AdVision

BB003 Delhi 95000 Static 10 420000 300000 01JAN2025 31JAN2025 BrandMax

BB004 Chennai 110000 Static 12 480000 350000 01JAN2025 31JAN2025 MediaOne

BB005 Bengaluru 160000 Digital 18 980000 600000 01JAN2025 31JAN2025 AdVision

BB006 Pune 70000 Static 8 210000 180000 01JAN2025 31JAN2025 LocalAds

BB007 Kolkata 90000 Digital 14 530000 400000 01JAN2025 31JAN2025 BrandMax

BB008 Ahmedabad 60000 Static 7 190000 170000 01JAN2025 31JAN2025 LocalAds

BB009 Jaipur 50000 Static 6 160000 140000 01JAN2025 31JAN2025 LocalAds

BB010 Kochi 75000 Digital 10 310000 250000 01JAN2025 31JAN2025 MediaOne

BB011 Vizag 68000 Static 7 200000 180000 01JAN2025 31JAN2025 BrandMax

BB012 Indore 82000 Digital 11 360000 260000 01JAN2025 31JAN2025 AdVision

BB013 Surat 72000 Static 8 220000 190000 01JAN2025 31JAN2025 LocalAds

BB014 Bhopal 65000 Static 7 180000 170000 01JAN2025 31JAN2025 LocalAds

BB015 Coimbatore 88000 Digital 12 410000 300000 01JAN2025 31JAN2025 MediaOne

BB016 Noida 140000 Digital 16 760000 500000 01JAN2025 31JAN2025 AdVision

;

run;

proc print data=billboard_raw;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_Date
1BB001HyderabadDigitalMediaOne1200001585000050000001JAN202531JAN2025
2BB002MumbaiDigitalAdVision18000020150000090000001JAN202531JAN2025
3BB003DelhiStaticBrandMax950001042000030000001JAN202531JAN2025
4BB004ChennaiStaticMediaOne1100001248000035000001JAN202531JAN2025
5BB005BengaluruDigitalAdVision1600001898000060000001JAN202531JAN2025
6BB006PuneStaticLocalAds70000821000018000001JAN202531JAN2025
7BB007KolkataDigitalBrandMax900001453000040000001JAN202531JAN2025
8BB008AhmedabadStaticLocalAds60000719000017000001JAN202531JAN2025
9BB009JaipurStaticLocalAds50000616000014000001JAN202531JAN2025
10BB010KochiDigitalMediaOne750001031000025000001JAN202531JAN2025
11BB011VizagStaticBrandMax68000720000018000001JAN202531JAN2025
12BB012IndoreDigitalAdVision820001136000026000001JAN202531JAN2025
13BB013SuratStaticLocalAds72000822000019000001JAN202531JAN2025
14BB014BhopalStaticLocalAds65000718000017000001JAN202531JAN2025
15BB015CoimbatoreDigitalMediaOne880001241000030000001JAN202531JAN2025
16BB016NoidaDigitalAdVision1400001676000050000001JAN202531JAN2025

5. VARIABLE EXPLANATION

Variable

Meaning

Billboard_ID

Unique billboard identifier

City

Location of billboard

Traffic_Count

Avg daily vehicles

Ad_Type

Digital / Static

Exposure_Time

Display duration per hour

Revenue

Revenue generated

Cost

Cost of billboard

Start_Date

Campaign start

End_Date

Campaign end

Vendor

Advertising vendor


6. DERIVED VARIABLES (ROI, DAYS, CLEANING)

data billboard_clean;

    set billboard_raw;


    /* Character Cleaning */

    City = propcase(strip(City));

    Vendor = upcase(trim(Vendor));

    Ad_Type = upcase(strip(Ad_Type));


    /* Date Calculations */

    Campaign_Days = intck('day', Start_Date, End_Date) + 1;

    Next_Renewal = intnx('month', End_Date, 1);


    /* ROI Calculation */

    ROI_Percentage = ((Revenue - Cost) / Cost) * 100;


    /* Exposure Efficiency */

    Exposure_Efficiency = Traffic_Count * Exposure_Time;


    format Next_Renewal date9.;

run;

proc print data=billboard_clean;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_Efficiency
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000

·  STRIP / TRIM → remove unwanted spaces

·  PROPERCASE / UPCASE → reporting consistency

·  INTCK → campaign duration

·  INTNX → renewal planning

·  ROI → key business KPI

 7. PROC SQL ANALYTICS

proc sql;

    create table city_summary as

    select City,

           count(*) as Total_Billboards,

           sum(Revenue) as Total_Revenue format=comma12.,

           avg(ROI_Percentage) as Avg_ROI format=8.2

    from billboard_clean

    group by City;

quit;

proc print data=city_summary;

run;

OUTPUT:

ObsCityTotal_BillboardsTotal_RevenueAvg_ROI
1Ahmedabad1190,00011.76
2Bengaluru1980,00063.33
3Bhopal1180,0005.88
4Chennai1480,00037.14
5Coimbatore1410,00036.67
6Delhi1420,00040.00
7Hyderabad1850,00070.00
8Indore1360,00038.46
9Jaipur1160,00014.29
10Kochi1310,00024.00
11Kolkata1530,00032.50
12Mumbai11,500,00066.67
13Noida1760,00052.00
14Pune1210,00016.67
15Surat1220,00015.79
16Vizag1200,00011.11

Business Use:

  • Identify top revenue cities
  • City-wise ROI benchmarking

 8. PROC FREQ – AD TYPE DISTRIBUTION

proc freq data=billboard_clean;

    tables Ad_Type*City / nocol norow;

run;

OUTPUT:

The FREQ Procedure

Frequency
Percent
Table of Ad_Type by City
Ad_TypeCity
AhmedabadBengaluruBhopalChennaiCoimbatoreDelhiHyderabadIndoreJaipurKochiKolkataMumbaiNoidaPuneSuratVizagTotal
DIGITAL
0
0.00
1
6.25
0
0.00
0
0.00
1
6.25
0
0.00
1
6.25
1
6.25
0
0.00
1
6.25
1
6.25
1
6.25
1
6.25
0
0.00
0
0.00
0
0.00
8
50.00
STATIC
1
6.25
0
0.00
1
6.25
1
6.25
0
0.00
1
6.25
0
0.00
0
0.00
1
6.25
0
0.00
0
0.00
0
0.00
0
0.00
1
6.25
1
6.25
1
6.25
8
50.00
Total
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
1
6.25
16
100.00

·  Understand Digital vs Static adoption

·  City-level ad strategy

 


9. PROC MEANS – STATISTICAL SUMMARY

proc means data=billboard_clean n mean min max sum;

    var Revenue Cost ROI_Percentage Traffic_Count;

run;

OUTPUT:

The MEANS Procedure

VariableNMeanMinimumMaximumSum
Revenue
Cost
ROI_Percentage
Traffic_Count
16
16
16
16
485000.00
336875.00
33.5169429
95312.50
160000.00
140000.00
5.8823529
50000.00
1500000.00
900000.00
70.0000000
180000.00
7760000.00
5390000.00
536.2710868
1525000.00

·  High-level KPI summary

·  Management dashboards

10. PROC UNIVARIATE – DISTRIBUTION & OUTLIERS

proc univariate data=billboard_clean;

    var ROI_Percentage Revenue;

    histogram ROI_Percentage;

run;

OUTPUT:

The UNIVARIATE Procedure

Variable: ROI_Percentage

Moments
N16Sum Weights16
Mean33.5169429Sum Observations536.271087
Std Deviation20.8943348Variance436.573228
Skewness0.47865089Kurtosis-0.9526861
Uncorrected SS24522.7658Corrected SS6548.59843
Coeff Variation62.33962Std Error Mean5.22358371
Basic Statistical Measures
LocationVariability
Mean33.51694Std Deviation20.89433
Median34.58333Variance436.57323
Mode.Range64.11765
  Interquartile Range30.96241
Tests for Location: Mu0=0
TestStatisticp Value
Student's tt6.416465Pr > |t|<.0001
SignM8Pr >= |M|<.0001
Signed RankS68Pr >= |S|<.0001
Quantiles (Definition 5)
LevelQuantile
100% Max70.00000
99%70.00000
95%70.00000
90%66.66667
75% Q346.00000
50% Median34.58333
25% Q115.03759
10%11.11111
5%5.88235
1%5.88235
0% Min5.88235
Extreme Observations
LowestHighest
ValueObsValueObs
5.882351440.00003
11.111111152.000016
11.76471863.33335
14.28571966.66672
15.789471370.00001


The UNIVARIATE Procedure

Histogram for ROI_Percentage


The UNIVARIATE Procedure

Variable: Revenue

Moments
N16Sum Weights16
Mean485000Sum Observations7760000
Std Deviation370135.11Variance1.37E11
Skewness1.61902833Kurtosis2.61213494
Uncorrected SS5.8186E12Corrected SS2.055E12
Coeff Variation76.3165176Std Error Mean92533.7776
Basic Statistical Measures
LocationVariability
Mean485000.0Std Deviation370135
Median385000.0Variance1.37E11
Mode.Range1340000
  Interquartile Range440000
Tests for Location: Mu0=0
TestStatisticp Value
Student's tt5.241329Pr > |t|<.0001
SignM8Pr >= |M|<.0001
Signed RankS68Pr >= |S|<.0001
Quantiles (Definition 5)
LevelQuantile
100% Max1500000
99%1500000
95%1500000
90%980000
75% Q3645000
50% Median385000
25% Q1205000
10%180000
5%160000
1%160000
0% Min160000
Extreme Observations
LowestHighest
ValueObsValueObs
16000095300007
1800001476000016
19000088500001
200000119800005
210000615000002

·  Detect skewness

·  Identify abnormal ROI values

 

11. PROC CORR – RELATIONSHIP ANALYSIS

proc corr data=billboard_clean;

    var Traffic_Count Exposure_Efficiency Revenue ROI_Percentage;

run;

OUTPUT:

The CORR Procedure

4 Variables:Traffic_Count Exposure_Efficiency Revenue ROI_Percentage
Simple Statistics
VariableNMeanStd DevSumMinimumMaximum
Traffic_Count169531337416152500050000180000
Exposure_Efficiency161221563955883195450003000003600000
Revenue1648500037013577600001600001500000
ROI_Percentage1633.5169420.89433536.271095.8823570.00000
Pearson Correlation Coefficients, N = 16
Prob > |r| under H0: Rho=0
 Traffic_CountExposure_EfficiencyRevenueROI_Percentage
Traffic_Count
1.00000
 
0.98852
<.0001
0.96308
<.0001
0.89989
<.0001
Exposure_Efficiency
0.98852
<.0001
1.00000
 
0.98270
<.0001
0.88389
<.0001
Revenue
0.96308
<.0001
0.98270
<.0001
1.00000
 
0.89602
<.0001
ROI_Percentage
0.89989
<.0001
0.88389
<.0001
0.89602
<.0001
1.00000
 

·  Does traffic truly drive revenue?

·  Data-driven ad placement

 

12. PROC SGPLOT – VISUALIZATION

proc sgplot data=billboard_clean;

    scatter x=Traffic_Count y=Revenue;

    reg x=Traffic_Count y=Revenue;

run;

OUTPUT:

The SGPlot Procedure

->Visual justification for budget allocation

13. UTILIZATION CLASSIFICATION MACRO

%macro utilization;

data billboard_util;

    set billboard_clean;

length Utilization $8.;

    if Exposure_Efficiency > 2000000 then Utilization='HIGH';

    else if Exposure_Efficiency > 1000000 then Utilization='MEDIUM';

    else Utilization='LOW';

run;

proc print data=billboard_util;

run;

%mend;


%utilization;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_EfficiencyUtilization
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000MEDIUM
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000HIGH
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000LOW
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000MEDIUM
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000HIGH
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000LOW
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000MEDIUM
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000LOW
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000LOW
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000LOW
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000LOW
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000LOW
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000LOW
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000LOW
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000MEDIUM
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000HIGH

·  Automates performance tagging

·  Reusable logic

14. FRAUD DETECTION MACRO

%macro fraud_check;

data fraud_flags;

    set billboard_util;

    if ROI_Percentage > 60 or Revenue > 2000000 then Fraud_Flag='YES';

    else Fraud_Flag='NO';

run;

proc print data=fraud_flags;

run;

%mend;


%fraud_check;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_EfficiencyUtilizationFraud_Flag
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000MEDIUMYES
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000HIGHYES
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000LOWNO
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000MEDIUMNO
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000HIGHYES
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000LOWNO
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000MEDIUMNO
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000LOWNO
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000LOWNO
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000LOWNO
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000LOWNO
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000LOWNO
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000LOWNO
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000LOWNO
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000MEDIUMNO
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000HIGHNO

·  Detect suspicious revenue inflation

·  Vendor audit support

15. APPEND DATA 

Create A New Data 

data billboard_feb;

    length Billboard_ID $6 City $15 Ad_Type $10 Vendor $15;

    input Billboard_ID $ City $ Traffic_Count Ad_Type $ Exposure_Time Revenue Cost

          Start_Date :date9. End_Date   :date9. Vendor $;

    format Start_Date End_Date date9.;

datalines;

BB017 Hyderabad 125000 Digital 15 880000 520000 01FEB2025 28FEB2025 MediaOne

BB018 Mumbai 185000 Digital 20 1550000 920000 01FEB2025 28FEB2025 AdVision

BB019 Delhi 98000 Static 11 450000 310000 01FEB2025 28FEB2025 BrandMax

BB020 Chennai 115000 Static 13 500000 360000 01FEB2025 28FEB2025 MediaOne

;

run;

proc print data=billboard_feb;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_Date
1BB017HyderabadDigitalMediaOne1250001588000052000001FEB202528FEB2025
2BB018MumbaiDigitalAdVision18500020155000092000001FEB202528FEB2025
3BB019DelhiStaticBrandMax980001145000031000001FEB202528FEB2025
4BB020ChennaiStaticMediaOne1150001350000036000001FEB202528FEB2025

data billboard_feb_clean;

    set billboard_feb;


    City    = propcase(strip(City));

    Vendor  = upcase(strip(Vendor));

    Ad_Type = upcase(strip(Ad_Type));


    Campaign_Days = intck('day', Start_Date, End_Date) + 1;

    Next_Renewal  = intnx('month', End_Date, 1);


    ROI_Percentage = ((Revenue - Cost) / Cost) * 100;

    Exposure_Efficiency = Traffic_Count * Exposure_Time;


    format Next_Renewal date9.;

run;

proc print data=billboard_feb_clean;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_Efficiency
1BB017HyderabadDIGITALMEDIAONE1250001588000052000001FEB202528FEB20252801MAR202569.23081875000
2BB018MumbaiDIGITALADVISION18500020155000092000001FEB202528FEB20252801MAR202568.47833700000
3BB019DelhiSTATICBRANDMAX980001145000031000001FEB202528FEB20252801MAR202545.16131078000
4BB020ChennaiSTATICMEDIAONE1150001350000036000001FEB202528FEB20252801MAR202538.88891495000

proc append base=billboard_clean

            data=billboard_feb_clean

            force;

run;

proc print data=billboard_clean;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_Efficiency
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000
17BB017HyderabadDIGITALMEDIAONE1250001588000052000001FEB202528FEB20252801MAR202569.23081875000
18BB018MumbaiDIGITALADVISION18500020155000092000001FEB202528FEB20252801MAR202568.47833700000
19BB019DelhiSTATICBRANDMAX980001145000031000001FEB202528FEB20252801MAR202545.16131078000
20BB020ChennaiSTATICMEDIAONE1150001350000036000001FEB202528FEB20252801MAR202538.88891495000
  • Monthly campaign extension

16. TRANSPOSE FOR REPORTING

proc transpose data=city_summary out=city_transposed;

    by City NotSorted;

    var Total_Revenue Avg_ROI;

run;

proc print data=city_transposed;

run;

OUTPUT:

ObsCity_NAME_COL1
1AhmedabadTotal_Revenue190000.00
2AhmedabadAvg_ROI11.76
3BengaluruTotal_Revenue980000.00
4BengaluruAvg_ROI63.33
5BhopalTotal_Revenue180000.00
6BhopalAvg_ROI5.88
7ChennaiTotal_Revenue480000.00
8ChennaiAvg_ROI37.14
9CoimbatoreTotal_Revenue410000.00
10CoimbatoreAvg_ROI36.67
11DelhiTotal_Revenue420000.00
12DelhiAvg_ROI40.00
13HyderabadTotal_Revenue850000.00
14HyderabadAvg_ROI70.00
15IndoreTotal_Revenue360000.00
16IndoreAvg_ROI38.46
17JaipurTotal_Revenue160000.00
18JaipurAvg_ROI14.29
19KochiTotal_Revenue310000.00
20KochiAvg_ROI24.00
21KolkataTotal_Revenue530000.00
22KolkataAvg_ROI32.50
23MumbaiTotal_Revenue1500000.00
24MumbaiAvg_ROI66.67
25NoidaTotal_Revenue760000.00
26NoidaAvg_ROI52.00
27PuneTotal_Revenue210000.00
28PuneAvg_ROI16.67
29SuratTotal_Revenue220000.00
30SuratAvg_ROI15.79
31VizagTotal_Revenue200000.00
32VizagAvg_ROI11.11
  • Report-friendly format

17. SORT & MERGE EXAMPLE

proc sort data=billboard_util;by Billboard_ID;run;

proc print data=billboard_util;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_EfficiencyUtilization
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000MEDIUM
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000HIGH
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000LOW
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000MEDIUM
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000HIGH
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000LOW
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000MEDIUM
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000LOW
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000LOW
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000LOW
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000LOW
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000LOW
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000LOW
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000LOW
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000MEDIUM
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000HIGH

proc sort data=fraud_flags;by Billboard_ID;run;

proc print data=fraud_flags;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_EfficiencyUtilizationFraud_Flag
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000MEDIUMYES
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000HIGHYES
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000LOWNO
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000MEDIUMNO
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000HIGHYES
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000LOWNO
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000MEDIUMNO
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000LOWNO
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000LOWNO
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000LOWNO
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000LOWNO
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000LOWNO
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000LOWNO
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000LOWNO
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000MEDIUMNO
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000HIGHNO

data final_report;

    merge billboard_util 

          fraud_flags;

    by Billboard_ID;

run;

proc print data=final_report;

run;

OUTPUT:

ObsBillboard_IDCityAd_TypeVendorTraffic_CountExposure_TimeRevenueCostStart_DateEnd_DateCampaign_DaysNext_RenewalROI_PercentageExposure_EfficiencyUtilizationFraud_Flag
1BB001HyderabadDIGITALMEDIAONE1200001585000050000001JAN202531JAN20253101FEB202570.00001800000MEDIUMYES
2BB002MumbaiDIGITALADVISION18000020150000090000001JAN202531JAN20253101FEB202566.66673600000HIGHYES
3BB003DelhiSTATICBRANDMAX950001042000030000001JAN202531JAN20253101FEB202540.0000950000LOWNO
4BB004ChennaiSTATICMEDIAONE1100001248000035000001JAN202531JAN20253101FEB202537.14291320000MEDIUMNO
5BB005BengaluruDIGITALADVISION1600001898000060000001JAN202531JAN20253101FEB202563.33332880000HIGHYES
6BB006PuneSTATICLOCALADS70000821000018000001JAN202531JAN20253101FEB202516.6667560000LOWNO
7BB007KolkataDIGITALBRANDMAX900001453000040000001JAN202531JAN20253101FEB202532.50001260000MEDIUMNO
8BB008AhmedabadSTATICLOCALADS60000719000017000001JAN202531JAN20253101FEB202511.7647420000LOWNO
9BB009JaipurSTATICLOCALADS50000616000014000001JAN202531JAN20253101FEB202514.2857300000LOWNO
10BB010KochiDIGITALMEDIAONE750001031000025000001JAN202531JAN20253101FEB202524.0000750000LOWNO
11BB011VizagSTATICBRANDMAX68000720000018000001JAN202531JAN20253101FEB202511.1111476000LOWNO
12BB012IndoreDIGITALADVISION820001136000026000001JAN202531JAN20253101FEB202538.4615902000LOWNO
13BB013SuratSTATICLOCALADS72000822000019000001JAN202531JAN20253101FEB202515.7895576000LOWNO
14BB014BhopalSTATICLOCALADS65000718000017000001JAN202531JAN20253101FEB20255.8824455000LOWNO
15BB015CoimbatoreDIGITALMEDIAONE880001241000030000001JAN202531JAN20253101FEB202536.66671056000MEDIUMNO
16BB016NoidaDIGITALADVISION1400001676000050000001JAN202531JAN20253101FEB202552.00002240000HIGHNO
  • Consolidated analytics dataset

18. PROC DATASETS DELETE

proc datasets library=work nolist;

    delete billboard_raw;

quit;

LOG:

NOTE: Deleting WORK.BILLBOARD_RAW (memtype=DATA).

·  Memory optimization

·  Production hygiene

19. BUSINESS INSIGHTS

·       Digital billboards show higher ROI

·       Traffic strongly correlates with revenue

·       Some vendors show suspicious ROI spikes

·       Low-traffic cities require cost renegotiation

·       Utilization classification simplifies decision-making

20. WHY THIS PROJECT IS STRONG

1. Uses SQL + DATA step
2. Macros for automation
3. Date functions (MDY, INTCK, INTNX)
4. Fraud logic
5. Business interpretation
6. End-to-end lifecycle

21. CONCLUSION

This project shows how advertising billboard data can be transformed into meaningful business insights using SAS. By combining clean data preparation, SQL analysis, statistical procedures, visualizations, macros, and fraud checks, we can clearly understand which billboards perform well, which waste money, and which may be risky.
Overall, the analysis helps businesses maximize ROI, optimize ad placement, control costs, and make confident, data-driven decisions instead of relying on guesswork.

This project mirrors a real advertising analytics system used by:

·       Media agencies

·       Marketing analytics teams

·       Audit departments


INTERVIEW QUESTIONS FOR YOU

·  What is a macro parameter?

·  What is %DO and %END?

·  What is %PUT?

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

About the Author:

SAS Learning Hub is a data analytics and SAS programming platform focused on clinical, financial, and real-world data analysis. The content is created by professionals with academic training in Pharmaceutics and hands-on experience in Base SAS, PROC SQL, Macros, SDTM, and ADaM, providing practical and industry-relevant SAS learning resources.


Disclaimer:

The datasets and analysis in this article are created for educational and demonstration purposes only. They do not represent BillBoard data.


Our Mission:

This blog provides industry-focused SAS programming tutorials and analytics projects covering finance, healthcare, and technology.


This project is suitable for:

·  Students learning SAS

·  Data analysts building portfolios

·  Professionals preparing for SAS interviews

·  Bloggers writing about analytics and smart cities

·  EV and energy industry professionals

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Follow Us On : 


 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--->Follow our blog for more SAS-based analytics projects and industry data models.

---> Support Us By Following Our Blog..

To deepen your understanding of SAS analytics, please refer to our other data science and industry-focused projects listed below:

1.Do high-budget movies really guarantee high profits, or is it just a myth?A Complete Sas Study

2.Are players with higher match consistency always the ones winning major tournaments?A Complete Sas Study

3.Is higher income really leading to better savings, or just higher spending?A Complete Sas Study

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

About Us | Contact Privacy Policy


Comments

Popular posts from this blog

379.CAN SAS DELIVER END-TO-END TLF (TABLES, LISTINGS, AND FIGURES) FOR INSURANCE CLAIMS ANALYSIS?

184.HOW TO CREATE MOCK SHELLS AND CLINICAL DATA LISTINGS IN SAS USING DATA NULL | PROC PRINT | PROC REPORT | PROC SORT | PROC COMPARE | ODS PDF | ODS RTF | ODS EXCEL | A COMPLETE STEP-BY-STEP GUIDE FOR CLINICAL SAS PROGRAMMERS

383.Which Pharma Distributors Are High-Risk? Can SAS Detect Delays, Temperature Violations, and Fraud?