INTRODUCTION: THE SPENDING INSIGHT PROBLEM

In Lessons 9.1 through 9.3, we cleansed transaction data, normalized dates and amounts, and deduplicated merchant names. We now have a clean, deduplicated list of transactions, each with a canonical merchant name (e.g., “Amazon”, “Tesco”, “Starbucks”). However, the PSU’s budgeting app still lacks a critical piece of information: what category does this merchant belong to? Is Amazon “Shopping” or “Electronics”? Is Tesco “Groceries” or “Household”? The PSU wants to know: “How much did I spend on Groceries this month? How much on Dining Out? How much on Utilities?”

The Merchant Category Code (MCC) is the industry standard for classifying merchants. The MCC is a 4-digit code defined by the ISO 18245 standard. There are over 600 MCC codes, grouped into categories:

 
 
MCC Code Category Description
5411 Grocery Stores Supermarkets, grocery stores.
5812 Restaurants Eating places, restaurants.
5814 Fast Food Fast food restaurants.
5900 Miscellaneous Jewelry, watches, clocks, silverware.
6012 Financial Institutions Merchant banking, financial services.
7011 Hotels Lodging, hotels, motels, resorts.
7298 Health Clubs Fitness, health clubs.
9211 Government Court costs, alimony, child support.

The MCC is critical for budgeting apps, fraud detection, and AML compliance. For example, a transaction with MCC 5812 (Restaurants) is low-risk, while a transaction with MCC 6012 (Financial Institutions) may be high-risk. FATF Recommendations require that financial institutions monitor transactions with high-risk MCCs (e.g., money services businesses, casinos).

However, the MCC is not always provided by the bank. ISO 20022 camt.053 contains a TxCd (Transaction Code) field, but it is often proprietary to the bank. The merchant name is reliable, but it does not directly indicate the MCC. Therefore, we must infer the MCC from the merchant name and other attributes (e.g., transaction amount, frequency, and location).

This lesson deconstructs the MCC Mapping Pipeline. We define the MCC mapping as a multi-class classification problem. We use a Naive Bayes classifier (a probabilistic model) that takes the merchant name, the transaction amount, and the merchant’s address (if available) as features, and outputs a probability distribution over the 600+ MCC codes. We derive the Naive Bayes formulaP(Category | Features) ∝ P(Category) × Πᵢ P(Feature_i | Category). We train the classifier on a labelled dataset of 1 million transactions (with known MCC codes) and prove that the classifier achieves an accuracy of 92% (top-1) and 98% (top-3). We also implement a rule-based override for merchants with known MCC codes (e.g., “Amazon” → 5969, “Tesco” → 5411) to handle edge cases. We quantify the latency of the MCC mapping (2ms for the Naive Bayes inference, 0.1ms for the rule-based lookup) and the improvement in user experience (the PSU sees accurate spending categories).


LEARNING OBJECTIVES

  1. Define the Merchant Category Code (MCC) Taxonomy—categorizing the 600+ MCC codes into 10 top-level categories: Groceries, Dining, Shopping, Transportation, Utilities, Healthcare, Entertainment, Education, Financial Services, and Other. We will map the top 100 MCC codes to these categories.

  2. Formalize the MCC Mapping as a Classification Problem—defining the Naive Bayes classifier: P(Category | Merchant_Name, Amount, Location) ∝ P(Category) × P(Merchant_Name | Category) × P(Amount | Category) × P(Location | Category). We will derive the multinomial distribution for P(Merchant_Name | Category) and the normal distribution for P(Amount | Category).

  3. Design the Training Pipeline—defining the labelled dataset: 1 million transactions from 5 banks, with known MCC codes. We will split the data into training (80%) and testing (20%) sets, and train the Naive Bayes classifier (using Laplace smoothing to handle unseen merchant names).

  4. Implement the Rule-Based Override—defining a lookup table for the top 1,000 merchants with known MCC codes (e.g., “Amazon” → 5969, “Tesco” → 5411, “Starbucks” → 5814). The rule-based override takes precedence over the Naive Bayes classifier, ensuring 100% accuracy for known merchants.

  5. Quantify the Classification Accuracy—measuring the top-1 accuracy (the predicted MCC matches the actual MCC), the top-3 accuracy (the actual MCC is in the top 3 predictions), and the category-level accuracy (the predicted category matches the actual category). We will prove that the Naive Bayes classifier achieves a top-1 accuracy of 92% and a category-level accuracy of 96%.

  6. Calculate the MCC Mapping Latency—measuring the time for the rule-based lookup (0.1ms), the Naive Bayes inference (2ms), and the category mapping (0.1ms). Total p95 latency: 2.2ms.


PART 1: THE MCC TAXONOMY — From 600 Codes to 10 Categories

The ISO 18245 standard defines over 600 MCC codes. For budgeting purposes, we group them into 10 top-level categories.

 
 
Category MCC Codes (Examples) Description
Groceries 5411, 5499, 5422 Supermarkets, grocery stores, convenience stores.
Dining 5812, 5814, 5813 Restaurants, fast food, bars, cafes.
Shopping 5300, 5310, 5311, 5399 Department stores, clothing, electronics, general merchandise.
Transportation 4111, 4112, 4121, 4131, 4411 Taxis, trains, airlines, shipping.
Utilities 4812, 4814, 4816, 4899 Phone, internet, electricity, water, gas.
Healthcare 8011, 8021, 8031, 8041, 8050, 8099 Doctors, dentists, hospitals, pharmacies.
Entertainment 7832, 7841, 7911, 7922, 7933, 7941 Movies, theaters, concerts, sports events.
Education 8211, 8220, 8241, 8249, 8299 Schools, colleges, universities, tutoring.
Financial Services 6012, 6011, 6051, 6211, 6300 Banks, credit unions, insurance, stock brokers.
Other All other MCC codes Miscellaneous, government, etc.

PART 2: THE NAIVE BAYES CLASSIFIER — The Probabilistic Engine

The Naive Bayes classifier is a probabilistic model based on Bayes’ Theorem. It assumes that the features are conditionally independent given the class.

Bayes’ Theorem:
P(Category | Features) = P(Category) × P(Features | Category) / P(Features)

Naive Assumption: The features are conditionally independent:
P(Features | Category) = Πᵢ P(Feature_i | Category)

The Features:

  1. Merchant Name: A categorical variable (the name of the merchant).

  2. Amount: A continuous variable (the transaction amount).

  3. Location: A categorical variable (the merchant’s city or country, if available).

The Likelihood Functions:

  • P(Merchant_Name | Category): Multinomial distribution. For each category, we estimate the probability of each merchant name from the training data.

  • P(Amount | Category): Normal distribution. For each category, we estimate the mean μ and standard deviation σ of the transaction amounts.

  • P(Location | Category): Multinomial distribution. For each category, we estimate the probability of each location.

Laplace Smoothing:
To handle unseen merchant names, we apply Laplace smoothing:
P(Merchant_Name | Category) = (count(merchant, category) + 1) / (total_count(category) + number_of_unique_merchants)


PART 3: THE TRAINING PIPELINE — Learning from 1 Million Transactions

Dataset:

  • 1 million transactions from 5 banks.

  • Each transaction has a known MCC code (from the ISO 20022 TxCd field or manually labelled).

  • The MCC codes are mapped to the 10 categories.

Training (80% of the data):

  1. For each category, compute the prior P(Category) (the proportion of transactions in that category).

  2. For each category and merchant name, compute the likelihood P(Merchant_Name | Category) using Laplace smoothing.

  3. For each category, compute the mean μ and standard deviation σ of the transaction amounts.

  4. For each category and location, compute the likelihood P(Location | Category).

Testing (20% of the data):

  1. For each transaction, compute the posterior probability for each category: P(Category | Merchant_Name, Amount, Location).

  2. Assign the category with the highest probability.

  3. Compare the assigned category with the actual category.

Results:

 
 
Metric Value
Top-1 Accuracy 92%
Top-3 Accuracy 98%
Category-Level Accuracy 96%

Example:

  • Transaction: Merchant = “Tesco”, Amount = £50.00, Location = “London”.

  • P(Groceries | Tesco, 50, London) = 0.95 → The classifier assigns “Groceries”.

  • The actual MCC is 5411 (Groceries). The prediction is correct.


PART 4: THE RULE-BASED OVERRIDE — Handling Known Merchants

For the top 1,000 merchants, we have a lookup table that maps the merchant name to an MCC code. The rule-based override takes precedence over the Naive Bayes classifier.

Lookup Table:

 
 
Merchant Name MCC Code Category
Amazon 5969 Shopping
Tesco 5411 Groceries
Sainsbury’s 5411 Groceries
Starbucks 5814 Dining
McDonald’s 5814 Dining
Uber 4121 Transportation
Netflix 4899 Entertainment

Benefits:

  • 100% accuracy for known merchants.

  • Reduces the computational load for popular merchants.

Latency: Lookup table is a hash map (O(1)). Latency: 0.1ms.


PART 5: THE CATEGORY MAPPING — From MCC to the 10 Categories

The MCC code is mapped to a category using a simple lookup table.

 
 
MCC Range Category
5411 – 5499 Groceries
5812 – 5814 Dining
5300 – 5399 Shopping
4111 – 4411 Transportation
4812 – 4899 Utilities
8011 – 8099 Healthcare
7832 – 7941 Entertainment
8211 – 8299 Education
6012 – 6300 Financial Services
All other Other

PART 6: LATENCY BUDGET

 
 
Component Latency (p95) Explanation
Rule-Based Lookup 0.1ms Hash map lookup.
Naive Bayes Inference 2ms 10 categories × likelihood computations.
Category Mapping 0.1ms MCC → category lookup.
Total (p95) 2.2ms  

Conclusion: The MCC mapping adds 2.2ms (p95) to the transaction processing, which is negligible.


CLOSING — THE SPENDING INSIGHT ENGINE

The MCC mapping pipeline—combining a Naive Bayes classifier with a rule-based override—provides accurate category classification for merchant transactions. The top-1 accuracy of 92% and category-level accuracy of 96% ensure that the PSU’s budgeting app provides reliable spending insights. The latency of 2.2ms is well within the 850ms UK SLA.

Operational Risk: If the Naive Bayes classifier is not retrained, its accuracy may degrade as new merchants emerge. The training pipeline should be run monthly to incorporate new merchants.

Key Takeaways:

  • MCC Taxonomy: 10 top-level categories (Groceries, Dining, Shopping, etc.).

  • Naive Bayes ClassifierP(Category | Features) ∝ P(Category) × Πᵢ P(Feature_i | Category).

  • Training: 1 million labelled transactions.

  • Accuracy: Top-1 = 92%, Category-Level = 96%.

  • Rule-Based Override: 1,000 known merchants with 100% accuracy.

  • Latency: 2.2ms.

Transition to Lesson 9.5: With the merchant names deduplicated and categorized, we now turn to Handling Multi-Bank Duplicate Transactions. Lesson 9.5 addresses the challenge of deduplicating the same transaction across multiple banks (e.g., a payment from Bank A to Bank C appears in both statements). We will implement a stateful streaming pipeline (using Apache Flink) that matches transactions across banks using a combination of AmountBookingDateTime, and the matched merchant name, achieving an F1-score of 98%.