224.DECADE-WISE ANALYSIS OF MURDER INVESTIGATIONS IN INDIA USING PROC FREQ | PROC SGPLOT | MACROS | STRING FUNCTIONS | CONDITIONAL FILTERING AND DYNAMIC VISUALIZATION TECHNIQUES IN SAS

DECADE-WISE ANALYSIS OF MURDER INVESTIGATIONS IN INDIA USING PROC FREQ | PROC SGPLOT | MACROS | STRING FUNCTIONS | CONDITIONAL FILTERING  AND DYNAMIC VISUALIZATION  TECHNIQUES IN SAS

 /*Constructs a fictional yet realistic‐looking dataset of murder investigations in India for the years 1900‑2025*/

1. Setting the Stage – Global OPTIONS

options nocenter nodate nonumber nosource

        linesize=160 pagesize=50

        fullstimer ;         /* track performance */


2. Crafting the Core Data Set 

2A.Custom formats for clarity

proc format;

   value $statfmt

      'OPEN'  = 'Investigation Open'

      'COLD'  = 'Unsolved/Cold Case'

      'CLSD'  = 'Solved – Closed';

   value severity 1='Low' 

                  2='Moderate' 

                  3='High'

                  4='Critical';

run;

Log:

NOTE: Format $STATFMT has been output.

NOTE: Format SEVERITY has been output.


NOTE: PROCEDURE FORMAT used (Total process time):

      real time           0.07 seconds

      user cpu time       0.00 seconds

      system cpu time     0.01 seconds

      memory              133.50k

      OS Memory           7124.00k

      Timestamp           14/09/2015 12:05:52 AM

      Step Count                        1  Switch Count  0


2B.Build the data set WORK.INDIA_MURDER_INVEST

data work.india_murder_invest;

   length Case_ID $10 State $20 City $18 Method $15

          Investigator $25 Status $4 ;

   format Case_Open_Date Case_Close_Date date9.

          Status $statfmt. Severity severity.;

   infile datalines dsd truncover;  /* allow commas inside fields */


   input Case_ID $ State :$20. City :$18. Year Method :$15. Victims Severity

         Investigator :$25. Status :$4. Close_Days ;


   /* Derive date fields ------------------------------------------------*/

   Case_Open_Date = mdy(1,1,Year); /* assume Jan‑01 of that year */

   if Close_Days ne . then

        Case_Close_Date = intnx('day',Case_Open_Date,Close_Days,'s'); 

 

   /* Build a composite location using CATX (adds a comma automatically) */

   Location = catx(', ', upcase(City), upcase(State));


   /* Flag for century using conditional (IFN) */

   length Century_Flag $4;

   Century_Flag = ifc(year(Case_Open_Date) < 2000,'20th','21st');


   /* Ensure Method trimmed and uppercase */

   Method = upcase(strip(Method));


   /* Auto‑assign missing Close_Days if status still OPEN */

   if Status='OPEN' then Close_Days=.;


   /* Keep only final set of vars in desired order */

   keep Case_ID State City Year Method Victims Severity

        Investigator Status Case_Open_Date Case_Close_Date

        Location Century_Flag Close_Days;


datalines;

IND001,West Bengal,Calcutta,1900,STABBING,1,2,Raja Mukherjee,CLSD,210

IND002,Maharashtra,Mumbai,1915,POISONING,2,3,Sara Deshmukh,COLD,.

IND003,Uttar Pradesh,Kanpur,1928,SHOOTING,1,3,Gopal Tiwari,CLSD,95

IND004,Tamil Nadu,Madras,1936,BLUNT FORCE,4,4,M. Subramaniam,COLD,.

IND005,Bihar,Patna,1944,ARSON,7,4,Lata Sinha,CLSD,300

IND006,Delhi,Delhi,1957,SHOOTING,3,3,Vikram Singh,OPEN,.

IND007,Karnataka,Bangalore,1962,STRANGULATION,1,2,Savitri Rao,CLSD,60

IND008,Gujarat,Ahmedabad,1971,DROWNING,2,2,Mehul Shah,CLSD,44

IND009,Kerala,Kochi,1978,POISONING,1,1,Rajani Menon,CLSD,15

IND010,Rajasthan,Jaipur,1984,SHOOTING,5,4,Mohit Rathore,COLD,.

IND011,Assam,Guwahati,1989,BLUNT FORCE,2,2,K. Gogoi,CLSD,120

IND012,Telangana,Hyderabad,1992,STABBING,3,3,Nandini Reddy,OPEN,.

IND013,Odisha,Bhubaneswar,1997,ARSON,4,3,Sanjay Mahapatra,CLSD,200

IND014,Madhya Pradesh,Bhopal,2001,SHOOTING,6,4,Priya Chaturvedi,CLSD,365

IND015,Punjab,Amritsar,2005,STRANGULATION,1,2,Harpreet Singh,COLD,.

IND016,Chhattisgarh,Raipur,2008,BLUNT FORCE,3,3,Shraddha Verma,CLSD,80

IND017,Haryana,Gurugram,2012,STABBING,2,3,Aryan Malik,CLSD,45

IND018,Delhi,New Delhi,2016,SHOOTING,5,4,Anita Khurana,OPEN,.

IND019,Tamil Nadu,Chennai,2018,POISONING,1,1,V. Ramesh,CLSD,30

IND020,Maharashtra,Pune,2019,ARSON,2,2,Ritika Kulkarni,CLSD,210

IND021,Uttar Pradesh,Noida,2020,BLUNT FORCE,4,4,Manoj Pandey,OPEN,.

IND022,Bihar,Gaya,2021,DROWNING,1,1,Shweta Prasad,CLSD,10

IND023,Karnataka,Mysuru,2022,STRANGULATION,1,2,Raghu Shetty,CLSD,35

IND024,Gujarat,Surat,2023,STABBING,3,3,Dipika Patel,OPEN,.

IND025,Telangana,Warangal,2025,SHOOTING,2,3,Sai Teja,OPEN,.

;

run;

proc print;run;

Output:

Obs Case_ID State City Method Investigator Status Case_Open_Date Case_Close_Date Severity Year Victims Close_Days Location Century_Flag
1 IND001 West Bengal Calcutta STABBING Raja Mukherjee Solved – Closed 01JAN1900 30JUL1900 Moderate 1900 1 210 CALCUTTA, WEST BENGAL 20th
2 IND002 Maharashtra Mumbai POISONING Sara Deshmukh Unsolved/Cold Case 01JAN1915 . High 1915 2 . MUMBAI, MAHARASHTRA 20th
3 IND003 Uttar Pradesh Kanpur SHOOTING Gopal Tiwari Solved – Closed 01JAN1928 05APR1928 High 1928 1 95 KANPUR, UTTAR PRADESH 20th
4 IND004 Tamil Nadu Madras BLUNT FORCE M. Subramaniam Unsolved/Cold Case 01JAN1936 . Critical 1936 4 . MADRAS, TAMIL NADU 20th
5 IND005 Bihar Patna ARSON Lata Sinha Solved – Closed 01JAN1944 27OCT1944 Critical 1944 7 300 PATNA, BIHAR 20th
6 IND006 Delhi Delhi SHOOTING Vikram Singh Investigation Open 01JAN1957 . High 1957 3 . DELHI, DELHI 20th
7 IND007 Karnataka Bangalore STRANGULATION Savitri Rao Solved – Closed 01JAN1962 02MAR1962 Moderate 1962 1 60 BANGALORE, KARNATAKA 20th
8 IND008 Gujarat Ahmedabad DROWNING Mehul Shah Solved – Closed 01JAN1971 14FEB1971 Moderate 1971 2 44 AHMEDABAD, GUJARAT 20th
9 IND009 Kerala Kochi POISONING Rajani Menon Solved – Closed 01JAN1978 16JAN1978 Low 1978 1 15 KOCHI, KERALA 20th
10 IND010 Rajasthan Jaipur SHOOTING Mohit Rathore Unsolved/Cold Case 01JAN1984 . Critical 1984 5 . JAIPUR, RAJASTHAN 20th
11 IND011 Assam Guwahati BLUNT FORCE K. Gogoi Solved – Closed 01JAN1989 01MAY1989 Moderate 1989 2 120 GUWAHATI, ASSAM 20th
12 IND012 Telangana Hyderabad STABBING Nandini Reddy Investigation Open 01JAN1992 . High 1992 3 . HYDERABAD, TELANGANA 20th
13 IND013 Odisha Bhubaneswar ARSON Sanjay Mahapatra Solved – Closed 01JAN1997 20JUL1997 High 1997 4 200 BHUBANESWAR, ODISHA 20th
14 IND014 Madhya Pradesh Bhopal SHOOTING Priya Chaturvedi Solved – Closed 01JAN2001 01JAN2002 Critical 2001 6 365 BHOPAL, MADHYA PRADESH 21st
15 IND015 Punjab Amritsar STRANGULATION Harpreet Singh Unsolved/Cold Case 01JAN2005 . Moderate 2005 1 . AMRITSAR, PUNJAB 21st
16 IND016 Chhattisgarh Raipur BLUNT FORCE Shraddha Verma Solved – Closed 01JAN2008 21MAR2008 High 2008 3 80 RAIPUR, CHHATTISGARH 21st
17 IND017 Haryana Gurugram STABBING Aryan Malik Solved – Closed 01JAN2012 15FEB2012 High 2012 2 45 GURUGRAM, HARYANA 21st
18 IND018 Delhi New Delhi SHOOTING Anita Khurana Investigation Open 01JAN2016 . Critical 2016 5 . NEW DELHI, DELHI 21st
19 IND019 Tamil Nadu Chennai POISONING V. Ramesh Solved – Closed 01JAN2018 31JAN2018 Low 2018 1 30 CHENNAI, TAMIL NADU 21st
20 IND020 Maharashtra Pune ARSON Ritika Kulkarni Solved – Closed 01JAN2019 30JUL2019 Moderate 2019 2 210 PUNE, MAHARASHTRA 21st
21 IND021 Uttar Pradesh Noida BLUNT FORCE Manoj Pandey Investigation Open 01JAN2020 . Critical 2020 4 . NOIDA, UTTAR PRADESH 21st
22 IND022 Bihar Gaya DROWNING Shweta Prasad Solved – Closed 01JAN2021 11JAN2021 Low 2021 1 10 GAYA, BIHAR 21st
23 IND023 Karnataka Mysuru STRANGULATION Raghu Shetty Solved – Closed 01JAN2022 05FEB2022 Moderate 2022 1 35 MYSURU, KARNATAKA 21st
24 IND024 Gujarat Surat STABBING Dipika Patel Investigation Open 01JAN2023 . High 2023 3 . SURAT, GUJARAT 21st
25 IND025 Telangana Warangal SHOOTING Sai Teja Investigation Open 01JAN2025 . High 2025 2 . WARANGAL, TELANGANA 21st

3. First Glimpse – PROC PRINT | PROC FREQ

3A.PROC PRINT to eyeball the first few cases

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

   title "Snapshot of Indian Murder Investigations (First 10 Rows)";

   var Case_ID Year State City Method Victims Severity Status;

run;

Output:

Snapshot of Indian Murder Investigations (First 10 Rows)

Obs Case_ID Year State City Method Victims Severity Status
1 IND001 1900 West Bengal Calcutta STABBING 1 Moderate Solved – Closed
2 IND002 1915 Maharashtra Mumbai POISONING 2 High Unsolved/Cold Case
3 IND003 1928 Uttar Pradesh Kanpur SHOOTING 1 High Solved – Closed
4 IND004 1936 Tamil Nadu Madras BLUNT FORCE 4 Critical Unsolved/Cold Case
5 IND005 1944 Bihar Patna ARSON 7 Critical Solved – Closed
6 IND006 1957 Delhi Delhi SHOOTING 3 High Investigation Open
7 IND007 1962 Karnataka Bangalore STRANGULATION 1 Moderate Solved – Closed
8 IND008 1971 Gujarat Ahmedabad DROWNING 2 Moderate Solved – Closed
9 IND009 1978 Kerala Kochi POISONING 1 Low Solved – Closed
10 IND010 1984 Rajasthan Jaipur SHOOTING 5 Critical Unsolved/Cold Case

3B.PROC FREQ for categorical distributions

proc freq data=work.india_murder_invest order=freq;

   tables State*Status severity*Status / nocum nopercent;

   title "State vs Status and Severity vs Status Profiles";

run;

Output:

State vs Status and Severity vs Status Profiles

The FREQ Procedure

Frequency
Row Pct
Col Pct
Table of State by Status
State Status
Solved – Closed Investigation
Open
Unsolved/Cold
Case
Total
Bihar
2
100.00
13.33
0
0.00
0.00
0
0.00
0.00
2
 
 
Delhi
0
0.00
0.00
2
100.00
33.33
0
0.00
0.00
2
 
 
Gujarat
1
50.00
6.67
1
50.00
16.67
0
0.00
0.00
2
 
 
Karnataka
2
100.00
13.33
0
0.00
0.00
0
0.00
0.00
2
 
 
Maharashtra
1
50.00
6.67
0
0.00
0.00
1
50.00
25.00
2
 
 
Tamil Nadu
1
50.00
6.67
0
0.00
0.00
1
50.00
25.00
2
 
 
Telangana
0
0.00
0.00
2
100.00
33.33
0
0.00
0.00
2
 
 
Assam
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Chhattisgarh
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Haryana
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Kerala
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Madhya Pradesh
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Odisha
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Punjab
0
0.00
0.00
0
0.00
0.00
1
100.00
25.00
1
 
 
Rajasthan
0
0.00
0.00
0
0.00
0.00
1
100.00
25.00
1
 
 
Uttar Pradesh
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Uttar Pradesh
0
0.00
0.00
1
100.00
16.67
0
0.00
0.00
1
 
 
West Bengal
1
100.00
6.67
0
0.00
0.00
0
0.00
0.00
1
 
 
Total
15
6
4
25

Frequency
Row Pct
Col Pct
Table of Severity by Status
Severity Status
Solved – Closed Investigation
Open
Unsolved/Cold
Case
Total
High
4
44.44
26.67
4
44.44
66.67
1
11.11
25.00
9
 
 
Moderate
6
85.71
40.00
0
0.00
0.00
1
14.29
25.00
7
 
 
Critical
2
33.33
13.33
2
33.33
33.33
2
33.33
50.00
6
 
 
Low
3
100.00
20.00
0
0.00
0.00
0
0.00
0.00
3
 
 
Total
15
6
4
25

4. Summaries – PROC MEANS | PROC SUMMARY

4A.Central‑tendency checks with PROC MEANS

proc means data=work.india_murder_invest

           n nmiss mean median min max std maxdec=1;

   class Status;

   var Victims Close_Days;

   title "Victims and Close_Days by Investigation Status";

run;

Output:

Victims and Close_Days by Investigation Status

The MEANS Procedure

Status N Obs Variable N N Miss Mean Median Minimum Maximum Std Dev
Solved – Closed 15
Victims
Close_Days
15
15
0
0
2.3
121.3
2.0
80.0
1.0
10.0
7.0
365.0
1.9
110.4
Unsolved/Cold Case 4
Victims
Close_Days
4
0
0
4
3.0
.
3.0
.
1.0
.
5.0
.
1.8
.
Investigation Open 6
Victims
Close_Days
6
0
0
6
3.3
.
3.0
.
2.0
.
5.0
.
1.0
.

 4B.Alternative view using PROC SUMMARY + OUTPUT statement

proc summary data=work.india_murder_invest completetypes;

   class Century_Flag Status;

   var Victims;

   output out=work.century_summary

          mean=Avg_Victims

          sum =Tot_Victims

          n   =Count;

run;

Output:

Obs Century_Flag Status _TYPE_ _FREQ_ Avg_Victims Tot_Victims Count
1     0 25 2.68000 67 25
2   Solved – Closed 1 15 2.33333 35 15
3   Unsolved/Cold Case 1 4 3.00000 12 4
4   Investigation Open 1 6 3.33333 20 6
5 20th   2 13 2.76923 36 13
6 21st   2 12 2.58333 31 12
7 20th Solved – Closed 3 8 2.37500 19 8
8 20th Unsolved/Cold Case 3 3 3.66667 11 3
9 20th Investigation Open 3 2 3.00000 6 2
10 21st Solved – Closed 3 7 2.28571 16 7
11 21st Unsolved/Cold Case 3 1 1.00000 1 1
12 21st Investigation Open 3 4 3.50000 14 4

5. Deep‑Dive Queries – PROC SQL

PROC SQL: quickest close times by city

proc sql feedback;

   create table fastest_closures as

   select putn(Close_Days, 'comma8.') as Min_Close label='Fastest Closure (days)',

          City,

          State,

          Year

   from work.india_murder_invest

   where Close_Days is not null

     and Close_Days = (select min(Close_Days) from work.india_murder_invest where Close_Days is not null)

   order by Close_Days;

quit;

proc print;run;

Output:

Obs Min_Close City State Year
1 10 Gaya Bihar 2021

6. Building Reusable Analysis – A Macro with Functions Inside

Macro %REPORT_BY_METHOD – summarise for any given murder method

%macro report_by_method(method=);


   %let upmethod = %upcase(&method);   /* Convert input to uppercase */

   %let cleanmethod = %sysfunc(compress(&upmethod, , 'kad')); /* Remove non-alphanum */


   title "== &upmethod Method – Decade Snapshot ==";


   proc freq data=work.india_murder_invest noprint;

      where strip(upcase(Method)) = "&upmethod";

      tables Year / out=work.&cleanmethod._byyear;

   run;


   proc sgplot data=work.&cleanmethod._byyear;

      series x=Year y=COUNT / markers;

      yaxis label="Case Count";

      xaxis label="Year";

      title "Temporal Trend for &upmethod Cases";

   run;


%mend;

%report_by_method(method=SHOOTING)

Output:


%report_by_method(method=POISONING)

Output:



%report_by_method(method=STABBING)

Output:



7. Reshaping for Reporting – PROC TRANSPOSE | PROC REPORT

 7A.Wide format for cross‑tab report

proc transpose data=work.india_murder_invest

               out=work.t_wide prefix=Victims_;

   by State notsorted;

   id Status;

   var Victims;

run;

proc print;run;

Output:

Obs State _NAME_ Victims_Solved___Closed Victims_Unsolved_Cold_Case Victims_Investigation_Open
1 West Bengal Victims 1 . .
2 Maharashtra Victims . 2 .
3 Uttar Pradesh Victims 1 . .
4 Tamil Nadu Victims . 4 .
5 Bihar Victims 7 . .
6 Delhi Victims . . 3
7 Karnataka Victims 1 . .
8 Gujarat Victims 2 . .
9 Kerala Victims 1 . .
10 Rajasthan Victims . 5 .
11 Assam Victims 2 . .
12 Telangana Victims . . 3
13 Odisha Victims 4 . .
14 Madhya Pradesh Victims 6 . .
15 Punjab Victims . 1 .
16 Chhattisgarh Victims 3 . .
17 Haryana Victims 2 . .
18 Delhi Victims . . 5
19 Tamil Nadu Victims 1 . .
20 Maharashtra Victims 2 . .
21 Uttar Pradesh Victims . . 4
22 Bihar Victims 1 . .
23 Karnataka Victims 1 . .
24 Gujarat Victims . . 3
25 Telangana Victims . . 2

  7B.Present the transposed table

proc report data=work.t_wide nowd

      headline headskip split='/';

   column State Victims_Solved___Closed Victims_Unsolved_Cold_Case Victims_Investigation_Open;

   define State / group 'State/UT';

   define Victims_Solved___Closed / analysis sum 'Solved';

   define Victims_Unsolved_Cold_Case / analysis sum 'Cold';

   define Victims_Investigation_Open / analysis sum 'Open';

   compute after;

      line "Note: Summaries auto-generated via PROC TRANPOSE + PROC REPORT.";

   endcomp;

   title  "Victim Counts by Investigation Status – State Wise";

run;

Output:

Victim Counts by Investigation Status – State Wise

State
UT
Solved Cold Open
Assam 2 . .
Bihar 8 . .
Chhattisgarh 3 . .
Delhi . . 8
Gujarat 2 . 3
Haryana 2 . .
Karnataka 2 . .
Kerala 1 . .
Madhya Pradesh 6 . .
Maharashtra 2 2 .
Odisha 4 . .
Punjab . 1 .
Rajasthan . 5 .
Tamil Nadu 1 4 .
Telangana . . 5
Uttar Pradesh 1 . .
Uttar Pradesh . . 4
West Bengal 1 . .
Note: Summaries auto-generated via PROC TRANPOSE + PROC REPORT.

8. Advanced Formatting – PROC FORMAT with PICTURE

Build a PICTURE format to show closure days as Yr+Mo+Dy

proc format;

   picture days2ymd (round)

      0-<366           ='000' (mult=1)

      366-<732         ='0Y 000' (prefix='1Y ')

      732-high         ='>1Y';

run;


data work.closure_fmt;

   set work.india_murder_invest;

   CloseFmt = put(Close_Days, days2ymd.);

run;


proc print data=work.closure_fmt (obs=8);

   var Case_ID Close_Days CloseFmt;

   title  "Custom PICTURE Format Example";

run;

Output:

Custom PICTURE Format Example

Obs Case_ID Close_Days CloseFmt
1 IND001 210 210
2 IND002 . .
3 IND003 95 95
4 IND004 . .
5 IND005 300 300
6 IND006 . .
7 IND007 60 60
8 IND008 44 44

9. Final Output - PROC EXPORT

proc export data=work.india_murder_invest

            outfile="india_murder_invest.csv"

            dbms=csv replace;

   putnames=yes;

run;

Log:

NOTE: The file 'india_murder_invest.csv' is:

      Filename=C:\sas folder\SASFoundation\9.4\india_murder_invest.csv,

      RECFM=V,LRECL=32767,File Size (bytes)=0,

      Last Modified=28 June 2025 16:06:04,

      Create Time=28 June 2025 16:06:04


NOTE: 26 records were written to the file 'india_murder_invest.csv'.

      The minimum record length was 103.

      The maximum record length was 140.

NOTE: There were 25 observations read from the data set WORK.INDIA_MURDER_INVEST.

NOTE: DATA statement used (Total process time):

      real time           0.07 seconds

      user cpu time       0.01 seconds

      system cpu time     0.01 seconds

      memory              8086.18k

      OS Memory           34804.00k

      Timestamp           14/09/2015 12:13:34 AM

      Step Count                        20  Switch Count  0


25 records created in india_murder_invest.csv from WORK.INDIA_MURDER_INVEST.


NOTE: "india_murder_invest.csv" file was successfully created.

NOTE: PROCEDURE EXPORT used (Total process time):

      real time           1.42 seconds

      user cpu time       0.03 seconds

      system cpu time     0.12 seconds

      memory              8086.18k

      OS Memory           34804.00k

      Timestamp           14/09/2015 12:13:34 AM

      Step Count                        20  Switch Count  7





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


Comments

Popular posts from this blog

409.Can We Build a Reliable Emergency Services Analytics & Fraud Detection System in SAS While Identifying and Fixing Intentional Errors?

397.If a satellite has excellent signal strength but very high latency, can it still deliver good quality communication? Why or why not?A Sas Study

401.How Efficient Are Global Data Centers? A Complete SAS Analytics Study