SECTION 1: LEARNING OBJECTIVES
By the end of this lesson, you will be able to:
-
Define Customer Data Platforms (CDP) and their role in banking.
-
Understand the components of a 360° customer view.
-
Identify the key data sources for a CDP.
-
Design a customer data model for banking.
-
Implement customer identity resolution and data unification.
-
Apply customer segmentation using CDP data.
-
Measure CDP success using key metrics.
-
Develop a CDP strategy for a bank.
SECTION 2: WHAT IS A CUSTOMER DATA PLATFORM (CDP)?
2.1 Definition
Customer Data Platform (CDP) is a packaged software that creates a persistent, unified customer database that is accessible to other systems. It collects, integrates, and organises customer data from multiple sources to create a single, comprehensive view of each customer.
2.2 CDP vs Other Systems
| System | Data Type | Purpose | Unification |
|---|---|---|---|
| CRM | Sales and service data. | Customer relationship management. | Limited. |
| DMP | Anonymous data for targeting. | Audience segmentation. | Anonymous. |
| Data Lake | Raw data. | Storage and processing. | No. |
| CDP | Unified customer data. | Customer insights and personalisation. | Yes. |
2.3 CDP Capabilities
| Capability | Description | Banking Application |
|---|---|---|
| Data Ingestion | Collect data from multiple sources. | Core banking, CRM, digital channels. |
| Identity Resolution | Match customer records across sources. | Single customer view. |
| Customer Profile | Unified customer profile. | 360° customer view. |
| Segmentation | Create customer segments. | Targeting, personalisation. |
| Analytics | Customer insights and analytics. | Behavioural analysis, propensity modelling. |
| Activation | Share data with other systems. | Personalisation, marketing, risk. |
SECTION 3: THE 360° CUSTOMER VIEW
3.1 Components of a 360° View
┌─────────────────────────────────────────────────────────────────────────────┐ │ 360° CUSTOMER VIEW │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ DEMOGRAPHIC DATA │ │ │ │ Age, gender, income, location, occupation, education │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ RELATIONSHIP DATA │ │ │ │ Product holdings, account types, tenure, engagement │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ TRANSACTIONAL DATA │ │ │ │ Transaction history, spending patterns, payment behaviour │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ BEHAVIOURAL DATA │ │ │ │ Channel usage, app interactions, website visits, preferences │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ INTERACTION DATA │ │ │ │ Customer service, complaints, feedback, chatbot conversations │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ EXTERNAL DATA │ │ │ │ Credit bureau, social media, third-party, public records │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘
3.2 Identity Resolution
Identity resolution is the process of linking customer records from different sources to create a single, unified customer profile.
Identity Resolution Approaches:
| Approach | Description | Use Case |
|---|---|---|
| Deterministic | Matches based on unique identifiers (email, phone). | High confidence matching. |
| Probabilistic | Matches based on multiple attributes (name, address). | When unique IDs are unavailable. |
| Hybrid | Combination of deterministic and probabilistic. | Most common in banking. |
| Graph-Based | Uses relationship networks. | Complex customer relationships. |
SECTION 4: CDP DATA SOURCES IN BANKING
4.1 Internal Data Sources
| Source | Description | Key Data |
|---|---|---|
| Core Banking | Account and transaction data. | Balances, transactions, products. |
| CRM | Customer relationship data. | Interactions, service history. |
| Digital Channels | Online and mobile banking data. | App usage, website behaviour. |
| Call Centre | Voice and chat interactions. | Call records, sentiment. |
| Marketing | Campaign data. | Offers, responses, preferences. |
| Risk | Credit and fraud data. | Credit scores, risk ratings. |
4.2 External Data Sources
| Source | Description | Key Data |
|---|---|---|
| Credit Bureau | External credit data. | Credit scores, history. |
| Third-Party Data | Data from partners. | Purchase behaviour, demographics. |
| Social Media | Social media presence. | Engagement, sentiment. |
| Public Records | Publicly available data. | Property records, legal filings. |
SECTION 5: CDP IMPLEMENTATION
5.1 Implementation Phases
┌─────────────────────────────────────────────────────────────────────────────┐ │ CDP IMPLEMENTATION PHASES │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ Phase 1 Phase 2 Phase 3 Phase 4 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Data │ │ Identity │ │ Profile │ │ Activation│ │ │ │ Ingestion│ ──→ │ Resolution│ ──→ │ Building│ ──→ │ & Analytics│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ • Connect • Match • Build • Enable │ │ sources records profiles personalisation │ │ • Extract • Merge • Enrich • Power │ │ data duplicates with data analytics │ │ • Validate • Create • Segment • Activate │ │ data golden customers insights │ │ record │ │ │ └─────────────────────────────────────────────────────────────────────────────┘
5.2 CDP Success Metrics
| Metric | Description | Target |
|---|---|---|
| Data Coverage | % of customer data in CDP. | > 95% |
| Identity Resolution Rate | % of customer records resolved. | > 98% |
| Data Freshness | Time since last data update. | < 1 hour |
| Data Accuracy | % of data free from errors. | > 99% |
| CDP Adoption | % of teams using CDP. | > 80% |
| Time-to-Insight | Time to generate customer insights. | < 1 hour |
| Personalisation Rate | % of interactions personalised. | > 70% |
SECTION 6: IMPLEMENTATION IN PYTHON – CDP SIMULATION
# =================================================================== # MODULE 4, LESSON 2: CUSTOMER DATA PLATFORMS (CDP) AND 360° VIEWS # =================================================================== import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime, timedelta import warnings warnings.filterwarnings('ignore') print("="*70) print("CUSTOMER DATA PLATFORMS (CDP) AND 360° CUSTOMER VIEWS") print("="*70) # ---------------------------------------------------------------- # PART A: DATA SOURCE SIMULATION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART A: Simulating Data Sources") print("-"*60) # Simulate core banking data np.random.seed(42) n_customers = 1000 core_banking = pd.DataFrame({ 'customer_id': range(1, n_customers + 1), 'name': [f'Customer_{i}' for i in range(1, n_customers + 1)], 'age': np.random.normal(45, 15, n_customers).clip(18, 80).astype(int), 'income': np.random.gamma(5, 20, n_customers) + 20, 'account_balance': np.random.gamma(3, 100, n_customers).clip(0, 50000), 'account_type': np.random.choice(['Checking', 'Savings', 'Both'], n_customers, p=[0.3, 0.3, 0.4]), 'tenure_years': np.random.gamma(2, 5, n_customers).clip(0, 20).astype(int) }) # Simulate transaction data n_transactions = 10000 transactions = pd.DataFrame({ 'customer_id': np.random.choice(range(1, n_customers + 1), n_transactions), 'amount': np.random.lognormal(3, 1, n_transactions).clip(1, 1000), 'category': np.random.choice(['Groceries', 'Dining', 'Utilities', 'Entertainment', 'Shopping', 'Transport', 'Healthcare'], n_transactions), 'date': [datetime.now() - timedelta(days=np.random.randint(0, 365)) for _ in range(n_transactions)] }) # Simulate digital channel data digital = pd.DataFrame({ 'customer_id': np.random.choice(range(1, n_customers + 1), n_customers), 'app_visits': np.random.poisson(10, n_customers).clip(0, 50), 'web_visits': np.random.poisson(5, n_customers).clip(0, 30), 'last_active': [datetime.now() - timedelta(days=np.random.randint(0, 30)) for _ in range(n_customers)], 'device': np.random.choice(['iOS', 'Android', 'Web'], n_customers, p=[0.35, 0.45, 0.20]) }) print("Data Sources Simulated:") print(f"Core Banking: {len(core_banking)} customers") print(f"Transactions: {len(transactions)} transactions") print(f"Digital Channel: {len(digital)} customers") # ---------------------------------------------------------------- # PART B: DATA INGESTION AND UNIFICATION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART B: Data Ingestion and Unification") print("-"*60) class CustomerDataPlatform: """Simulate a Customer Data Platform.""" def __init__(self): self.sources = {} self.customer_profiles = {} self.unified_data = None def ingest_data(self, source_name, data): """Ingest data from a source.""" self.sources[source_name] = data print(f"Ingested {len(data)} records from {source_name}") def unify_customers(self): """Unify customer data from all sources.""" # Start with core banking as the base unified = self.sources.get('core_banking', pd.DataFrame()).copy() # Add transaction aggregates if 'transactions' in self.sources: tx_agg = self.sources['transactions'].groupby('customer_id').agg({ 'amount': ['count', 'sum', 'mean'], 'category': lambda x: x.mode()[0] if len(x) > 0 else None }).reset_index() tx_agg.columns = ['customer_id', 'tx_count', 'tx_sum', 'tx_avg', 'top_category'] unified = unified.merge(tx_agg, on='customer_id', how='left') # Add digital channel data if 'digital' in self.sources: unified = unified.merge(self.sources['digital'], on='customer_id', how='left') # Fill missing values unified = unified.fillna({ 'tx_count': 0, 'tx_sum': 0, 'tx_avg': 0, 'top_category': 'Unknown', 'app_visits': 0, 'web_visits': 0 }) # Create customer profile self.unified_data = unified self.customer_profiles = {row['customer_id']: row.to_dict() for _, row in unified.iterrows()} return unified # Create CDP cdp = CustomerDataPlatform() # Ingest data cdp.ingest_data('core_banking', core_banking) cdp.ingest_data('transactions', transactions) cdp.ingest_data('digital', digital) # Unify data unified = cdp.unify_customers() print(f"\nUnified Data: {len(unified)} customers, {len(unified.columns)} attributes") print("\nUnified Data Sample:") print(unified.head()) # ---------------------------------------------------------------- # PART C: 360° CUSTOMER VIEW # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART C: 360° Customer View") print("-"*60) def display_360_view(customer_id, unified_data): """Display a 360° view of a specific customer.""" customer = unified_data[unified_data['customer_id'] == customer_id] if len(customer) == 0: print(f"Customer {customer_id} not found") return print(f"\n--- 360° VIEW FOR CUSTOMER {customer_id} ---") print("\n1. DEMOGRAPHICS:") print(f" Name: {customer['name'].values[0]}") print(f" Age: {customer['age'].values[0]}") print(f" Income: ${customer['income'].values[0]:,.2f}") print("\n2. ACCOUNTS:") print(f" Account Type: {customer['account_type'].values[0]}") print(f" Balance: ${customer['account_balance'].values[0]:,.2f}") print(f" Tenure: {customer['tenure_years'].values[0]} years") print("\n3. TRANSACTION BEHAVIOUR:") print(f" Transaction Count: {customer['tx_count'].values[0]}") print(f" Total Spend: ${customer['tx_sum'].values[0]:,.2f}") print(f" Average Transaction: ${customer['tx_avg'].values[0]:,.2f}") print(f" Top Category: {customer['top_category'].values[0]}") print("\n4. DIGITAL ENGAGEMENT:") print(f" App Visits: {customer['app_visits'].values[0]}") print(f" Web Visits: {customer['web_visits'].values[0]}") print(f" Device: {customer['device'].values[0]}") print(f" Last Active: {customer['last_active'].values[0]}") # Display 360° view for a sample customer display_360_view(42, unified) # ---------------------------------------------------------------- # PART D: CUSTOMER SEGMENTATION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART D: Customer Segmentation") print("-"*60) # Create segmentation features unified['customer_value'] = unified['account_balance'] + unified['tx_sum'] unified['engagement_score'] = unified['app_visits'] + unified['web_visits'] # Segment customers def segment_customer(row): """Segment customers based on value and engagement.""" if row['customer_value'] > 50000 and row['engagement_score'] > 20: return 'High Value - High Engagement' elif row['customer_value'] > 50000 and row['engagement_score'] <= 20: return 'High Value - Low Engagement' elif row['customer_value'] <= 50000 and row['engagement_score'] > 20: return 'Low Value - High Engagement' else: return 'Low Value - Low Engagement' unified['segment'] = unified.apply(segment_customer, axis=1) segment_counts = unified['segment'].value_counts() print("Customer Segments:") print(segment_counts) # Segment profiles segment_profiles = unified.groupby('segment').agg({ 'age': 'mean', 'income': 'mean', 'account_balance': 'mean', 'tx_count': 'mean', 'tx_sum': 'mean', 'app_visits': 'mean', 'web_visits': 'mean' }).round(2) print("\nSegment Profiles:") print(segment_profiles) # Visualise fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # Segment Distribution ax = axes[0, 0] ax.pie(segment_counts.values, labels=segment_counts.index, autopct='%1.1f%%') ax.set_title('Customer Segment Distribution') # Value vs Engagement ax = axes[0, 1] scatter = ax.scatter(unified['customer_value'], unified['engagement_score'], c=unified['segment'].astype('category').cat.codes, alpha=0.6, cmap='viridis') ax.set_xlabel('Customer Value ($)') ax.set_ylabel('Engagement Score') ax.set_title('Customer Value vs Engagement') plt.colorbar(scatter, ax=ax, label='Segment') # Age by Segment ax = axes[1, 0] unified.boxplot(column='age', by='segment', ax=ax) ax.set_title('Age by Segment') ax.set_xlabel('') # Transaction Volume by Segment ax = axes[1, 1] unified.boxplot(column='tx_count', by='segment', ax=ax) ax.set_title('Transaction Count by Segment') ax.set_xlabel('') plt.tight_layout() plt.savefig('cdp_segmentation.png', dpi=300, bbox_inches='tight') plt.show() print("CDP segmentation visualisation saved as 'cdp_segmentation.png'") # ---------------------------------------------------------------- # PART E: CDP METRICS DASHBOARD # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART E: CDP Metrics Dashboard") print("-"*60) cdp_metrics = pd.DataFrame({ 'Metric': [ 'Data Coverage', 'Identity Resolution Rate', 'Data Freshness', 'Data Accuracy', 'CDP Adoption', 'Time-to-Insight', 'Personalisation Rate', 'Customer Data Quality' ], 'Current Value': [ '85%', '92%', '2.5 hours', '96%', '55%', '3.2 hours', '35%', '88%' ], 'Target Value': [ '> 95%', '> 98%', '< 1 hour', '> 99%', '> 80%', '< 1 hour', '> 70%', '> 95%' ], 'Status': ['🟡', '🟡', '🟡', '🟡', '🔴', '🔴', '🔴', '🟡'] }) print("CDP Metrics Dashboard:") print(cdp_metrics.to_string(index=False)) # ---------------------------------------------------------------- # PART F: CDP USE CASES IN BANKING # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART F: CDP Use Cases in Banking") print("-"*60) use_cases = { "Personalised Marketing": { "Description": "Targeted offers based on customer behaviour.", "Example": "Offer savings account to customers with high balances.", "Benefit": "Higher conversion rates." }, "Customer Retention": { "Description": "Identify and retain at-risk customers.", "Example": "Proactive engagement for low-engagement high-value customers.", "Benefit": "Reduced churn." }, "Cross-Sell": { "Description": "Recommend additional products.", "Example": "Offer credit card to customers with high transaction volume.", "Benefit": "Increased revenue." }, "Risk Assessment": { "Description": "Assess customer risk using unified data.", "Example": "Identify high-risk customers for monitoring.", "Benefit": "Better risk management." }, "Customer Service": { "Description": "360° view for service agents.", "Example": "Complete customer history for issue resolution.", "Benefit": "Faster, better service." }, "Fraud Detection": { "Description": "Detect fraud using unified data.", "Example": "Unusual activity across accounts.", "Benefit": "Reduced fraud losses." } } for use_case, details in use_cases.items(): print(f"\n{use_case}:") print(f" Description: {details['Description']}") print(f" Example: {details['Example']}") print(f" Benefit: {details['Benefit']}") # ---------------------------------------------------------------- # PART G: SUMMARY AND RECOMMENDATIONS # ---------------------------------------------------------------- print("\n" + "="*70) print("PART G: Summary and Recommendations") print("="*70) print(""" Customer Data Platforms – Key Takeaways: 1. A CDP creates a persistent, unified customer database. 2. 360° customer view includes demographic, transactional, behavioural, and interaction data. 3. Identity resolution matches customer records across sources. 4. CDP enables segmentation, personalisation, analytics, and activation. 5. Key data sources: core banking, transactions, digital channels, CRM. 6. Key metrics: data coverage, identity resolution, data freshness, accuracy. 7. Use cases: personalised marketing, retention, cross-sell, risk, fraud. Recommendations: - Build a CDP to unify customer data. - Implement identity resolution for a single customer view. - Use CDP data for segmentation and personalisation. - Enable real-time data updates. - Integrate CDP with marketing, sales, and service systems. - Measure and track CDP metrics. """) print("="*70) print("END OF LESSON 2 – MODULE 4") print("="*70)
SECTION 7: SUMMARY FOR THE DATA PRACTITIONER
-
Customer Data Platforms (CDP) create a unified, persistent customer database.
-
360° customer view integrates demographic, transactional, behavioural, and interaction data.
-
Identity resolution matches customer records across sources to create a single customer view.
-
CDP enables segmentation, personalisation, analytics, and activation across the organisation.
-
Key data sources include core banking systems, transactions, digital channels, and CRM.
-
Key metrics include data coverage, identity resolution rate, data freshness, and accuracy.
-
Use cases include personalised marketing, customer retention, cross-sell, risk assessment, and fraud detection.
SECTION 8: RECOMMENDED NEXT STEPS
-
Assess your organisation’s customer data capabilities.
-
Build a CDP to unify customer data.
-
Implement identity resolution for a single customer view.
-
Use CDP data for segmentation and personalisation.
-
Enable real-time data updates.
-
Integrate CDP with marketing, sales, and service systems.
-
Measure and track CDP metrics.
-
Prepare for Lesson 3: Predictive Analytics in Banking.