Tuesday, 13 January 2026

369.DIGITAL TRANSACTIONS FRAUD RISK ANALYSIS USING SAS

DIGITAL TRANSACTIONS FRAUD RISK ANALYSIS USING SAS

HERE IN THIS PROJECT WE USED THESE SAS STATEMENTS PROC SQL | PROC MEANS | PROC FREQ | PROC SGPLOT | MACROS | INTCK | INTNX | MDY | MERGE | SET | APPEND | TRANSPOSE

1. Introduction – Why Digital Transaction Analytics Matters

In today’s digital economy, billions of financial transactions happen every day through:

1.UPI

2.Credit Cards

3.Debit Cards

4.Net Banking

5.Mobile Wallets

6.Crypto platforms

**With the explosion of online payments, fraud detection has become one of the most critical analytics use cases in the world.

**Banks, fintech companies, and payment gateways continuously analyze:

1.Transaction amount

2.Time of transaction

3.Platform used

4.Risk patterns

5.User behavior

**In this blog, we will build a complete SAS-based Digital Transactions Analytics System that mimics how real financial institutions detect fraud risk.

We will use:

1.DATA Step

2.PROC SQL

3.PROC MEANS

4.PROC FREQ

5.PROC SGPLOT

6.Macros

7.INTCK, INTNX, MDY

8.MERGE, SET, APPEND, TRANSPOSE


2. Creating the Digital Transactions Dataset

We first create a raw dataset of transactions.

Structure

Each transaction contains:

Variable

Meaning

Transaction_ID

Unique transaction number

Transaction_Type

UPI, Card, Wallet, etc

Platform

GooglePay, PhonePe, Paytm, BankApp

Amount

Transaction amount

Trans_Date

Date of transaction

Trans_Time

Time of transaction

Fraud_Risk

Risk score (0–100)


Data Creation

data digital_txn_raw;

    format Trans_Date date9.;

    input Transaction_ID Transaction_Type:$15. Platform:$15. Amount Trans_Date :date9. 

          Trans_Time $ Fraud_Risk;

    datalines;

1 UPI GooglePay 1200 05JAN2025 09:12 25

2 Card Paytm 45000 05JAN2025 23:45 88

3 Wallet PhonePe 3200 06JAN2025 11:15 30

4 UPI BankApp 15000 06JAN2025 02:30 75

5 NetBanking BankApp 78000 07JAN2025 01:10 92

6 Card GooglePay 5600 07JAN2025 14:05 40

7 Wallet Paytm 300 07JAN2025 03:40 60

8 UPI PhonePe 2200 08JAN2025 19:20 20

9 Card BankApp 92000 08JAN2025 00:50 95

10 NetBanking GooglePay 41000 09JAN2025 22:15 85

11 UPI PhonePe 600 09JAN2025 10:10 15

12 Wallet Paytm 1800 10JAN2025 18:30 25

13 Card GooglePay 75000 10JAN2025 23:59 90

14 UPI BankApp 1300 11JAN2025 09:05 18

15 NetBanking PhonePe 55000 11JAN2025 01:40 89

;

run;

proc print data=digital_txn_raw;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_Risk
105JAN20251UPIGooglePay120009:1225
205JAN20252CardPaytm4500023:4588
306JAN20253WalletPhonePe320011:1530
406JAN20254UPIBankApp1500002:3075
507JAN20255NetBankingBankApp7800001:1092
607JAN20256CardGooglePay560014:0540
707JAN20257WalletPaytm30003:4060
808JAN20258UPIPhonePe220019:2020
908JAN20259CardBankApp9200000:5095
1009JAN202510NetBankingGooglePay4100022:1585
1109JAN202511UPIPhonePe60010:1015
1210JAN202512WalletPaytm180018:3025
1310JAN202513CardGooglePay7500023:5990
1411JAN202514UPIBankApp130009:0518
1511JAN202515NetBankingPhonePe5500001:4089

3. Creating Date-Based Intelligence Using MDY, INTNX, INTCK

MDY() – Create financial reporting month

data digital_dates;

    set digital_txn_raw;

    Report_Month = mdy(month(Trans_Date),1,year(Trans_Date));

    format Report_Month monyy7.;

run;

proc print data=digital_dates;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_Month
105JAN20251UPIGooglePay120009:1225JAN2025
205JAN20252CardPaytm4500023:4588JAN2025
306JAN20253WalletPhonePe320011:1530JAN2025
406JAN20254UPIBankApp1500002:3075JAN2025
507JAN20255NetBankingBankApp7800001:1092JAN2025
607JAN20256CardGooglePay560014:0540JAN2025
707JAN20257WalletPaytm30003:4060JAN2025
808JAN20258UPIPhonePe220019:2020JAN2025
908JAN20259CardBankApp9200000:5095JAN2025
1009JAN202510NetBankingGooglePay4100022:1585JAN2025
1109JAN202511UPIPhonePe60010:1015JAN2025
1210JAN202512WalletPaytm180018:3025JAN2025
1310JAN202513CardGooglePay7500023:5990JAN2025
1411JAN202514UPIBankApp130009:0518JAN2025
1511JAN202515NetBankingPhonePe5500001:4089JAN2025


INTNX – Generate next review date

data digital_dates2;

    set digital_dates;

    Review_Date = intnx('day',Trans_Date,7,'same');

    format Review_Date date9.;

run;

proc print data=digital_dates2;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_MonthReview_Date
105JAN20251UPIGooglePay120009:1225JAN202512JAN2025
205JAN20252CardPaytm4500023:4588JAN202512JAN2025
306JAN20253WalletPhonePe320011:1530JAN202513JAN2025
406JAN20254UPIBankApp1500002:3075JAN202513JAN2025
507JAN20255NetBankingBankApp7800001:1092JAN202514JAN2025
607JAN20256CardGooglePay560014:0540JAN202514JAN2025
707JAN20257WalletPaytm30003:4060JAN202514JAN2025
808JAN20258UPIPhonePe220019:2020JAN202515JAN2025
908JAN20259CardBankApp9200000:5095JAN202515JAN2025
1009JAN202510NetBankingGooglePay4100022:1585JAN202516JAN2025
1109JAN202511UPIPhonePe60010:1015JAN202516JAN2025
1210JAN202512WalletPaytm180018:3025JAN202517JAN2025
1310JAN202513CardGooglePay7500023:5990JAN202517JAN2025
1411JAN202514UPIBankApp130009:0518JAN202518JAN2025
1511JAN202515NetBankingPhonePe5500001:4089JAN202518JAN2025


INTCK – Calculate days between transaction and review

data digital_dates3;

    set digital_dates2;

    Days_To_Review = intck('day',Trans_Date,Review_Date);

run;

proc print data=digital_dates3;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_MonthReview_DateDays_To_Review
105JAN20251UPIGooglePay120009:1225JAN202512JAN20257
205JAN20252CardPaytm4500023:4588JAN202512JAN20257
306JAN20253WalletPhonePe320011:1530JAN202513JAN20257
406JAN20254UPIBankApp1500002:3075JAN202513JAN20257
507JAN20255NetBankingBankApp7800001:1092JAN202514JAN20257
607JAN20256CardGooglePay560014:0540JAN202514JAN20257
707JAN20257WalletPaytm30003:4060JAN202514JAN20257
808JAN20258UPIPhonePe220019:2020JAN202515JAN20257
908JAN20259CardBankApp9200000:5095JAN202515JAN20257
1009JAN202510NetBankingGooglePay4100022:1585JAN202516JAN20257
1109JAN202511UPIPhonePe60010:1015JAN202516JAN20257
1210JAN202512WalletPaytm180018:3025JAN202517JAN20257
1310JAN202513CardGooglePay7500023:5990JAN202517JAN20257
1411JAN202514UPIBankApp130009:0518JAN202518JAN20257
1511JAN202515NetBankingPhonePe5500001:4089JAN202518JAN20257


4. Fraud Risk Classification Using Macro

Macro for Risk Evaluation

%macro risk_eval;

data digital_risk;

    length risk_level $10.;

    set digital_dates3;

    if Fraud_Risk >= 80 then Risk_Level="HIGH";

    else if Fraud_Risk >= 40 then Risk_Level="MEDIUM";

    else Risk_Level="LOW";

run;

proc print data=digital_risk;

run;

%mend;


%risk_eval;

OUTPUT:

Obsrisk_levelTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_MonthReview_DateDays_To_Review
1LOW05JAN20251UPIGooglePay120009:1225JAN202512JAN20257
2HIGH05JAN20252CardPaytm4500023:4588JAN202512JAN20257
3LOW06JAN20253WalletPhonePe320011:1530JAN202513JAN20257
4MEDIUM06JAN20254UPIBankApp1500002:3075JAN202513JAN20257
5HIGH07JAN20255NetBankingBankApp7800001:1092JAN202514JAN20257
6MEDIUM07JAN20256CardGooglePay560014:0540JAN202514JAN20257
7MEDIUM07JAN20257WalletPaytm30003:4060JAN202514JAN20257
8LOW08JAN20258UPIPhonePe220019:2020JAN202515JAN20257
9HIGH08JAN20259CardBankApp9200000:5095JAN202515JAN20257
10HIGH09JAN202510NetBankingGooglePay4100022:1585JAN202516JAN20257
11LOW09JAN202511UPIPhonePe60010:1015JAN202516JAN20257
12LOW10JAN202512WalletPaytm180018:3025JAN202517JAN20257
13HIGH10JAN202513CardGooglePay7500023:5990JAN202517JAN20257
14LOW11JAN202514UPIBankApp130009:0518JAN202518JAN20257
15HIGH11JAN202515NetBankingPhonePe5500001:4089JAN202518JAN20257


5. Using PROC SQL for Business-Level Summaries

Fraud exposure by platform

proc sql;

create table platform_risk as

select Platform,

       count(*) as Transactions,

       sum(Amount) as Total_Amount,

       avg(Fraud_Risk) as Avg_Risk

from digital_risk

group by Platform;

quit;

proc print data=platform_risk;

run;

OUTPUT:

ObsPlatformTransactionsTotal_AmountAvg_Risk
1BankApp418630070.0000
2GooglePay412280060.0000
3Paytm34710057.6667
4PhonePe46100038.5000


6. PROC MEANS – Financial Statistics

proc means data=digital_risk mean min max sum;

    class Risk_Level;

    var Amount Fraud_Risk;

run;

OUTPUT:

The MEANS Procedure

risk_levelN ObsVariableMeanMinimumMaximumSum
HIGH6
Amount
Fraud_Risk
64333.33
89.8333333
41000.00
85.0000000
92000.00
95.0000000
386000.00
539.0000000
LOW6
Amount
Fraud_Risk
1716.67
22.1666667
600.0000000
15.0000000
3200.00
30.0000000
10300.00
133.0000000
MEDIUM3
Amount
Fraud_Risk
6966.67
58.3333333
300.0000000
40.0000000
15000.00
75.0000000
20900.00
175.0000000

-->Banks use this to understand:

1.Which risk band has highest money flow

2.How dangerous HIGH risk transactions are


7. PROC FREQ – Pattern Detection

proc freq data=digital_risk;

    tables Transaction_Type*Risk_Level / nocol norow;

run;

OUTPUT:

The FREQ Procedure

Frequency
Percent
Table of Transaction_Type by risk_level
Transaction_Typerisk_level
HIGHLOWMEDIUMTotal
Card
3
20.00
0
0.00
1
6.67
4
26.67
NetBanking
3
20.00
0
0.00
0
0.00
3
20.00
UPI
0
0.00
4
26.67
1
6.67
5
33.33
Wallet
0
0.00
2
13.33
1
6.67
3
20.00
Total
6
40.00
6
40.00
3
20.00
15
100.00

This tells us:

“Which transaction types generate most fraud?”


8. PROC SGPLOT – Visual Fraud Patterns

Amount vs Fraud Risk

proc sgplot data=digital_risk;

    scatter x=Amount y=Fraud_Risk;

    title "Transaction Amount vs Fraud Risk";

run;

OUTPUT:

The SGPlot Procedure


-->High amounts clustering at high risk means fraud concentration.


9. MERGE – Joining Platform Risk Back

proc sort data=digital_risk; by Platform; run;

proc print data=digital_risk;

run;

OUTPUT:

Obsrisk_levelTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_MonthReview_DateDays_To_Review
1MEDIUM06JAN20254UPIBankApp1500002:3075JAN202513JAN20257
2HIGH07JAN20255NetBankingBankApp7800001:1092JAN202514JAN20257
3HIGH08JAN20259CardBankApp9200000:5095JAN202515JAN20257
4LOW11JAN202514UPIBankApp130009:0518JAN202518JAN20257
5LOW05JAN20251UPIGooglePay120009:1225JAN202512JAN20257
6MEDIUM07JAN20256CardGooglePay560014:0540JAN202514JAN20257
7HIGH09JAN202510NetBankingGooglePay4100022:1585JAN202516JAN20257
8HIGH10JAN202513CardGooglePay7500023:5990JAN202517JAN20257
9HIGH05JAN20252CardPaytm4500023:4588JAN202512JAN20257
10MEDIUM07JAN20257WalletPaytm30003:4060JAN202514JAN20257
11LOW10JAN202512WalletPaytm180018:3025JAN202517JAN20257
12LOW06JAN20253WalletPhonePe320011:1530JAN202513JAN20257
13LOW08JAN20258UPIPhonePe220019:2020JAN202515JAN20257
14LOW09JAN202511UPIPhonePe60010:1015JAN202516JAN20257
15HIGH11JAN202515NetBankingPhonePe5500001:4089JAN202518JAN20257


proc sort data=platform_risk; by Platform; run;

proc print data=platform_risk;

run;

OUTPUT:

ObsPlatformTransactionsTotal_AmountAvg_Risk
1BankApp418630070.0000
2GooglePay412280060.0000
3Paytm34710057.6667
4PhonePe46100038.5000


data digital_merge;

    merge digital_risk platform_risk;

    by Platform;

run;

proc print data=digital_merge;

run;

OUTPUT:

Obsrisk_levelTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_RiskReport_MonthReview_DateDays_To_ReviewTransactionsTotal_AmountAvg_Risk
1MEDIUM06JAN20254UPIBankApp1500002:3075JAN202513JAN20257418630070.0000
2HIGH07JAN20255NetBankingBankApp7800001:1092JAN202514JAN20257418630070.0000
3HIGH08JAN20259CardBankApp9200000:5095JAN202515JAN20257418630070.0000
4LOW11JAN202514UPIBankApp130009:0518JAN202518JAN20257418630070.0000
5LOW05JAN20251UPIGooglePay120009:1225JAN202512JAN20257412280060.0000
6MEDIUM07JAN20256CardGooglePay560014:0540JAN202514JAN20257412280060.0000
7HIGH09JAN202510NetBankingGooglePay4100022:1585JAN202516JAN20257412280060.0000
8HIGH10JAN202513CardGooglePay7500023:5990JAN202517JAN20257412280060.0000
9HIGH05JAN20252CardPaytm4500023:4588JAN202512JAN2025734710057.6667
10MEDIUM07JAN20257WalletPaytm30003:4060JAN202514JAN2025734710057.6667
11LOW10JAN202512WalletPaytm180018:3025JAN202517JAN2025734710057.6667
12LOW06JAN20253WalletPhonePe320011:1530JAN202513JAN2025746100038.5000
13LOW08JAN20258UPIPhonePe220019:2020JAN202515JAN2025746100038.5000
14LOW09JAN202511UPIPhonePe60010:1015JAN202516JAN2025746100038.5000
15HIGH11JAN202515NetBankingPhonePe5500001:4089JAN202518JAN2025746100038.5000


10. APPEND – Adding New Transactions

data new_txn;

    input Transaction_ID Transaction_Type $ Platform $ Amount Trans_Date :date9. Trans_Time $ Fraud_Risk;

    format Trans_Date date9.;

    datalines;

16 Card PhonePe 89000 12JAN2025 00:30 93

;

run;

proc print data=new_txn;

run;

OUTPUT:

ObsTransaction_IDTransaction_TypePlatformAmountTrans_DateTrans_TimeFraud_Risk
116CardPhonePe8900012JAN202500:3093


proc append base=digital_txn_raw 

            data=new_txn force;

run;

proc print data=digital_txn_raw;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_Risk
105JAN20251UPIGooglePay120009:1225
205JAN20252CardPaytm4500023:4588
306JAN20253WalletPhonePe320011:1530
406JAN20254UPIBankApp1500002:3075
507JAN20255NetBankingBankApp7800001:1092
607JAN20256CardGooglePay560014:0540
707JAN20257WalletPaytm30003:4060
808JAN20258UPIPhonePe220019:2020
908JAN20259CardBankApp9200000:5095
1009JAN202510NetBankingGooglePay4100022:1585
1109JAN202511UPIPhonePe60010:1015
1210JAN202512WalletPaytm180018:3025
1310JAN202513CardGooglePay7500023:5990
1411JAN202514UPIBankApp130009:0518
1511JAN202515NetBankingPhonePe5500001:4089
1612JAN202516CardPhonePe8900000:3093


11. SET – Rebuilding Master Table

data digital_master;

    set digital_txn_raw;

run;

proc print data=digital_master;

run;

OUTPUT:

ObsTrans_DateTransaction_IDTransaction_TypePlatformAmountTrans_TimeFraud_Risk
105JAN20251UPIGooglePay120009:1225
205JAN20252CardPaytm4500023:4588
306JAN20253WalletPhonePe320011:1530
406JAN20254UPIBankApp1500002:3075
507JAN20255NetBankingBankApp7800001:1092
607JAN20256CardGooglePay560014:0540
707JAN20257WalletPaytm30003:4060
808JAN20258UPIPhonePe220019:2020
908JAN20259CardBankApp9200000:5095
1009JAN202510NetBankingGooglePay4100022:1585
1109JAN202511UPIPhonePe60010:1015
1210JAN202512WalletPaytm180018:3025
1310JAN202513CardGooglePay7500023:5990
1411JAN202514UPIBankApp130009:0518
1511JAN202515NetBankingPhonePe5500001:4089
1612JAN202516CardPhonePe8900000:3093


12. PROC TRANSPOSE – Risk Profile by Platform

proc sql;

    create table risk_summary as

    select

           Platform,

           Risk_Level,

           sum(Amount) as Total_Amount

    from digital_risk

    group by Platform, Risk_Level;

quit;

proc print data=risk_summary;

run;

OUTPUT:

ObsPlatformrisk_levelTotal_Amount
1BankAppHIGH170000
2BankAppLOW1300
3BankAppMEDIUM15000
4GooglePayHIGH116000
5GooglePayLOW1200
6GooglePayMEDIUM5600
7PaytmHIGH45000
8PaytmLOW1800
9PaytmMEDIUM300
10PhonePeHIGH55000
11PhonePeLOW6000

proc transpose data=risk_summary out=risk_wide(drop=_name_);

    by Platform;

    id Risk_Level;

    var Total_Amount;

run;

proc print data=risk_wide;

run;

OUTPUT:

ObsPlatformHIGHLOWMEDIUM
1BankApp170000130015000
2GooglePay11600012005600
3Paytm450001800300
4PhonePe550006000.

This converts rows into columns for dashboarding.


13. Conclusion

We now built a complete Digital Transactions Fraud Analytics System using SAS using:

PROC SQL

PROC MEANS

PROC FREQ

PROC SGPLOT

MACROS

INTNX, INTCK, MDY

MERGE, APPEND, SET, TRANSPOSE


This project is suitable for:

SAS Programmer Interviews

SAS Programmer Job Seekers

SAS Analysts


Follow Us On : 


 


--->FOLLOW OUR BLOG FOR MORE INFORMATION.

--->PLEASE DO COMMENTS AND SHARE OUR BLOG.




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



No comments:

Post a Comment