
परिचय
पिछले 10–15 वर्षों में डिजिटल तकनीकों की प्रगति के साथ, मार्केटिंग रणनीतियाँ काफी बदल गई हैं। प्रसिद्ध ब्रांडों और छोटे बाज़ारों ने लेनदेन, ग्राहक खरीद, प्राथमिकताएँ, क्रय शक्ति, खरीद गतिविधि, जनसांख्यिकी, समीक्षाएँ आदि पर बहुत सारा डेटा एकत्र किया है। यह सारा डेटा मार्केटर्स को ग्राहक व्यवहार के अलग-अलग चरणों में समझने में मदद कर सकता है—कुछ खरीदने के इरादे से लेकर वास्तविक खरीद तक और स्थायी ग्राहक बनने तक। यहीं डेटा साइंस की संभावनाएँ सामने आती हैं।
डेटा साइंस मार्केटिंग के बिग डेटा को क्रियाशील इनसाइट्स में बदल देता है, भले ही कभी-कभी पहली नज़र में यह कम सहज लगे—जैसे कुछ अप्रकट उपभोक्ता व्यवहार पैटर्न और सह-अवस्थितियाँ। परिणामस्वरूप, मार्केटर्स अपने लक्षित दर्शकों की स्पष्ट तस्वीर देख सकते हैं, नए ग्राहकों को आकर्षित और मौजूदा को बनाए रख सकते हैं, अपनी मार्केटिंग रणनीतियों को अनुकूलित कर सकते हैं, कंपनी की दृश्यता बढ़ा सकते हैं, अधिक सफल विज्ञापन अभियानों का निर्माण कर सकते हैं, नए चैनलों को शामिल कर सकते हैं, और बदले में कंपनी के राजस्व को उल्लेखनीय रूप से अधिकतम कर सकते हैं।
मार्केटिंग में डेटा साइंस के सबसे सामान्य उपयोग मामलों में से एक है कस्टमर चर्न रेट का पूर्वानुमान। आइए इस विषय पर विस्तार से चर्चा करें।
मार्केटिंग में डेटा साइंस का उपयोग मामला: कस्टमर चर्न रेट प्रेडिक्शन
कस्टमर चर्न वह प्रवृत्ति है जिसमें ग्राहक उस सेवा की अपनी सदस्यता रद्द कर देते हैं जिसका वे उपयोग कर रहे थे, और इस प्रकार वे उस सेवा के ग्राहक रहना बंद कर देते हैं। कस्टमर चर्न रेट एक पूर्वनिर्धारित समय अंतराल में चर्न हुए ग्राहकों का प्रतिशत होता है। यह कस्टमर ग्रोथ रेट के विपरीत है जो नए ग्राहकों को ट्रैक करता है।
कस्टमर चर्न रेट ग्राहक संतुष्टि और कंपनी के समग्र कारोबारी स्वास्थ्य का बहुत महत्वपूर्ण सूचक है। स्वाभाविक चर्न, जो किसी भी व्यवसाय में होता है, या कुछ सेवाओं में मौसमी चर्न के अलावा, ऐसे अन्य कारक भी हैं जो संकेत देते हैं कि कंपनी में कुछ गलत हो गया है और उसे ठीक किया जाना चाहिए। ये कारक हैं:
- ग्राहक सहायता का अभाव या उसकी निम्न गुणवत्ता,
- नकारात्मक ग्राहक अनुभव,
- बेहतर शर्तों या मूल्य निर्धारण रणनीति वाले प्रतिस्पर्धी की ओर जाना,
- ग्राहकों की प्राथमिकताओं में बदलाव,
- लंबे समय से जुड़े ग्राहक संतुष्ट महसूस नहीं करते,
- सेवा ग्राहकों की अपेक्षाओं पर खरी नहीं उतरी,
- वित्तीय समस्याएँ,
- ग्राहकों के भुगतान पर धोखाधड़ी सुरक्षा।
उच्च कस्टमर चर्न रेट किसी भी कंपनी के लिए निम्न कारणों से एक गंभीर समस्या है:
- यह कंपनी के राजस्व नुकसान से सहसंबद्ध होती है।
- नए ग्राहकों को हासिल करने में मौजूदा ग्राहकों को बनाए रखने की तुलना में कहीं अधिक पैसा लगता है। यह खासकर अत्यधिक प्रतिस्पर्धी बाज़ारों में सही है।
- यदि खराब ग्राहक सेवा के कारण चर्न हो रहा है, तो असंतुष्ट पूर्व-ग्राहकों द्वारा सोशल मीडिया या रिव्यू वेबसाइट्स पर छोड़ी गई नकारात्मक समीक्षाओं के कारण कंपनी की प्रतिष्ठा को भारी नुकसान पहुँच सकता है।
सभी सब्सक्रिप्शन-आधारित सेवाओं के लिए ग्राहक बनाए रखना व्यवसाय रणनीति का एक महत्वपूर्ण घटक है। कस्टमर चर्न रेट का पूर्वानुमान लगाने और संबंधित निवारक कदम उठाने के लिए, ग्राहक व्यवहार (खरीद अंतराल, ग्राहक बने रहने की कुल अवधि, रद्दीकरण, फॉलो-अप कॉल और संदेश, ऑनलाइन गतिविधि) पर जानकारी एकत्र करना और विश्लेषण करना आवश्यक है और यह पता लगाना कि कौन-से गुण और उनके संयोजन उन ग्राहकों की विशेषता हैं जिनके छोड़ने का जोखिम अधिक है। यह पहले से जानना कि कौन-से ग्राहक जल्द ही चर्न कर सकते हैं—खासकर उच्च राजस्व या लंबे समय से जुड़े ग्राहकों के मामले में—कंपनी को उन पर विशेष रूप से ध्यान केंद्रित करने और उन्हें रुकने के लिए मनाने की एक प्रभावी रणनीति विकसित करने में मदद कर सकता है। इस दृष्टिकोण में ऐसे ग्राहकों को कॉल कर विशेष उपहार, छूट, समान कीमत पर सब्सक्रिप्शन अपग्रेड या अन्य कोई अनुकूलित अनुभव की पेशकश शामिल हो सकती है।
तकनीकी रूप से, कस्टमर चर्न प्रेडिक्शन मशीन लर्निंग की एक सामान्य वर्गीकरण समस्या है, जहाँ ग्राहकों को चर्न के जोखिम के संदर्भ में "हाँ" या "नहीं" का लेबल दिया जाता है। आइए इस उपयोग मामले को Python में वास्तविक दुनिया के डेटा पर देखते हैं।
हम दूरसंचार के बिज़नेस मॉडल में चर्न का मॉडल बनाएँगे, जहाँ ग्राहक एक मास्टर एग्रीमेंट के अंतर्गत किसी दूरसंचार कंपनी के साथ एकाधिक सेवाएँ रख सकते हैं। डेटासेट में साफ़ किए गए ग्राहक गतिविधि के फीचर्स और एक चर्न लेबल शामिल है जो यह निर्दिष्ट करता है कि ग्राहक ने चर्न किया या नहीं।
आइए डेटा देखें और चर्न रेट का वितरण जाँचें:
import pandas as pd
telcom = pd.read_csv('telco.csv')
print(f'Number of customers: {telcom.shape[0]:,}\n'
f'Churn values: {set(telcom['Churn'])}\n\n'
f'Churn distribution, %:\n{round(telcom.groupby(['Churn']).size()/telcom.shape[0]*100).convert_dtypes()}')
Number of customers: 7,032
Churn values: {0, 1}
Churn distribution, %:
Churn
0 73
1 27
dtype: float64
27% ग्राहकों ने चर्न किया है, जो काफ़ी अधिक दर है। हालाँकि, पिछले डेटा साइंस उपयोग मामले की तुलना में, इस डेटासेट में गंभीर क्लास असंतुलन की समस्या नहीं दिखती।
अब, हम मशीन लर्निंग तकनीकों को आगे लागू करने के लिए डेटा का प्री-प्रोसेसिंग करेंगे ताकि चर्न प्रेडिक्शन किया जा सके। इसमें डेटा को प्रशिक्षण और परीक्षण सेटों में विभाजित करना और फीचर्स तथा टार्गेट वेरिएबल्स निकालना शामिल है:
from sklearn.model_selection import train_test_split
target = ['Churn']
custid = ['customerID']
cols = [col for col in telcom.columns if col not in custid + target]
X = telcom[cols]
y = telcom[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
पहला मॉडलिंग एल्गोरिद्म जो हम चर्न लेबल की भविष्यवाणी और परिणामों की शुद्धता का आकलन करने के लिए उपयोग करेंगे, वह एक साधारण लॉजिस्टिक रिग्रेशन क्लासिफिकेशन मॉडल है:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
lr = LogisticRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.8009
इसके बाद, अपनी लॉजिस्टिक रिग्रेशन मॉडल में एक और फ़ंक्शन जोड़ते हैं—स्केल किए गए डेटा पर L1 रेग्युलराइजेशन के साथ इसे चलाना ताकि मॉडल बिल्डिंग के साथ-साथ फीचर चयन भी किया जा सके। C पैरामीटर (जो रेग्युलराइजेशन स्ट्रेंथ का व्युत्क्रम है) के विभिन्न मान मॉडल की सटीकता को प्रभावित करते हैं। अभी के लिए, C मान 0.025 रखते हैं:
lr = LogisticRegression(penalty='l1', C=0.025, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7969
अब, हम L1 रेग्युलराइजेशन के लिए C पैरामीटर को ट्यून करेंगे ताकि इष्टतम मान खोजा जा सके जो मॉडल की जटिलता को कम करे और साथ ही अच्छा प्रदर्शन बनाए रखे। इस उद्देश्य से, हम अलग-अलग C मानों पर इटरेट करेंगे, प्रत्येक पर लॉजिस्टिक रिग्रेशन के इंस्टैंस बनाएँगे, और प्रदर्शन मीट्रिक्स की गणना करेंगे।
सूची C पहले से ही पैरामीटर के संभावित मानों के साथ बनाई गई है। l1_metrics ऐरे 3 कॉलमों के साथ बनाया गया है—पहला C मानों के लिए, और अगले दो नॉन-ज़ीरो कोएफ़िशिएंट की गिनती और मॉडल के एक्यूरेसी स्कोर के प्लेसहोल्डर के रूप में। आइए इस दृष्टिकोण को आज़माएँ:
C Non-Zero Coeffs Accuracy
0 1.0000 23.0 0.801479
1 0.5000 22.0 0.799204
2 0.2500 21.0 0.802048
3 0.1000 20.0 0.802617
4 0.0500 18.0 0.802048
5 0.0250 13.0 0.796928
6 0.0100 5.0 0.790102
7 0.0050 3.0 0.783276
8 0.0025 2.0 0.745734
हम देखते हैं कि कम C मान नॉन-ज़ीरो कोएफ़िशिएंट्स (अर्थात् मॉडलिंग के लिए फीचर्स) की संख्या को घटाते हैं और मॉडल की जटिलता कम करते हैं, लेकिन साथ ही मॉडल की सटीकता भी घटती है। लगता है कि 0.05 का C मान इष्टतम है: यह फीचर्स की संख्या को 18 तक घटा देता है, जबकि बिना रेग्युलराइज़्ड मॉडल से थोड़ा अधिक एक्यूरेसी स्कोर देता है।
अब, एक और मॉडलिंग एल्गोरिद्म आज़माते हैं—डिसीज़न ट्री मॉडल:
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7275
ओवरफिटिंग से बचते हुए अधिक सटीक मॉडल चुनने के लिए, हम ट्री डेप्थ (max_depth पैरामीटर) को ट्यून कर सकते हैं और उसका इष्टतम मान पहचान सकते हैं। तकनीकी रूप से, यह प्रक्रिया ऊपर लॉजिस्टिक रिग्रेशन के C पैरामीटर के चयन जैसी ही है: यहाँ हम max_depth के कई मानों पर इटरेट करेंगे, प्रत्येक पर एक डिसीज़न ट्री फिट करेंगे, और फिर प्रदर्शन मीट्रिक्स की गणना करेंगे।
सूची depth_list पहले से पैरामीटर के संभावित मानों के साथ बनाई गई है। depth_tuning ऐरे 2 कॉलमों के साथ बनाया गया है—पहला डेप्थ कैंडिडेट्स से भरा है, और दूसरा एक्यूरेसी स्कोर के लिए प्लेसहोल्डर है। आइए इस दृष्टिकोण को लागू कर इष्टतम ट्री डेप्थ खोजें:
depth_list = list(range(2, 15))
depth_tuning = np.zeros((len(depth_list), 2))
depth_tuning[:, 0] = depth_list
for index in range(len(depth_list)):
clf = DecisionTreeClassifier(max_depth=depth_list[index])
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
depth_tuning[index, 1] = accuracy_score(y_test, predictions)
col_names = ['Max_Depth', 'Accuracy']
print(pd.DataFrame(depth_tuning, columns=col_names))
Max_Depth Accuracy
0 2.0 0.756542
1 3.0 0.783276
2 4.0 0.782708
3 5.0 0.791809
4 6.0 0.778157
5 7.0 0.780432
6 8.0 0.757110
7 9.0 0.762230
8 10.0 0.763936
9 11.0 0.752560
10 12.0 0.745165
11 13.0 0.732651
12 14.0 0.727531
अतः, अधिक डेप्थ के साथ एक्यूरेसी स्कोर पहले बढ़ता है और फिर घटने लगता है। max_depth = 5 पर ट्री सबसे अधिक एक्यूरेसी स्कोर दिखाता है, इसलिए हम इसे इष्टतम ट्री डेप्थ मान सकते हैं।
लॉजिस्टिक रिग्रेशन और डिसीज़न ट्री मॉडलों के लिए सर्वोत्तम पैरामीटर मानों की पहचान करने के बाद, आइए उन मॉडलों का पुनर्निर्माण करें और फिर वे मुख्य कारक पहचानें और व्याख्या करें जो चर्न को ऊपर या नीचे ले जा रहे हैं।
लॉजिस्टिक रिग्रेशन मॉडल के लिए, हम परिणामी कोएफ़िशिएंट्स के एक्सपोनेंट्स निकालेंगे और जाँचेंगे:
# Reconstructing the best model
lr = LogisticRegression(penalty='l1', C=0.05, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
# Combining feature names and coefficients into one dataframe
feature_names = pd.DataFrame(X_train.columns, columns=['Feature'])
log_coef = pd.DataFrame(np.transpose(lr.coef_), columns=['Coefficient'])
coefficients = pd.concat([feature_names, log_coef], axis=1)
# Calculating exponents of the coefficients
coefficients['Exp_Coefficient'] = np.exp(coefficients['Coefficient'])
# Removing coefficients that are equal to zero
coefficients = coefficients[coefficients['Coefficient']!=0]
print(coefficients.sort_values(by=['Exp_Coefficient']))
Feature Coefficient Exp_Coefficient
21 tenure -0.907750 0.403431
4 PhoneService_Yes -0.820517 0.440204
17 Contract_Two year -0.595271 0.551413
8 TechSupport_Yes -0.418254 0.658195
16 Contract_One year -0.414158 0.660896
5 OnlineSecurity_Yes -0.412228 0.662173
6 OnlineBackup_Yes -0.143100 0.866667
3 Dependents_Yes -0.039299 0.961463
7 DeviceProtection_Yes -0.017465 0.982687
11 PaperlessBilling_Yes 0.071389 1.073999
1 SeniorCitizen_Yes 0.097904 1.102857
19 PaymentMethod_Electronic check 0.188533 1.207477
22 MonthlyCharges 0.901454 2.463182
हम देखते हैं कि चर्न की संभावना पर सबसे बड़ा प्रभाव tenure फीचर का है। सामान्यतः, 1 से कम कोएफ़िशिएंट एक्सपोनेंट्स संभावनाओं को घटाते हैं, जबकि 1 से बड़े उन्हें बढ़ाते हैं।
डिसीज़न ट्री मॉडल के लिए, हम if-else नियम निकालकर उनका प्लॉट बनाएँगे:
# Reconstructing the best model
clf = DecisionTreeClassifier(max_depth=5)
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
from sklearn import tree
import graphviz
# Exporting a graphviz object from the trained decision tree
exported = tree.export_graphviz(decision_tree=clf,
out_file=None,
feature_names=cols,
precision=1,
class_names=['Not churn', 'Churn'],
filled=True)
graph = graphviz.Source(exported)
display(graph)

हमें एक अच्छा दिखने वाला डिसीज़न ट्री विज़ुअलाइज़ेशन मिला है, जिसकी व्याख्या ऊपर से शुरू होने वाले if-else नियमों के सेट के रूप में की जा सकती है। यहाँ भी हम देखते हैं कि ग्राहक का tenure चर्न को प्रभावित करने वाला सबसे महत्वपूर्ण वेरिएबल है। डिसीज़न ट्री को अधिक लेयर्स के साथ बनाया जा सकता है, और इससे अन्य वेरिएबल्स पर और अधिक इनसाइट्स मिलेंगी।
आगे के संभावित कदमों में, हम मॉडल पैरामीटर्स को और समायोजित कर सकते हैं, ट्रेन/टेस्ट स्प्लिटिंग के अलग-अलग तरीकों का उपयोग कर सकते हैं, अन्य मशीन लर्निंग एल्गोरिद्म लागू और तुलना कर सकते हैं, और मॉडल प्रदर्शन का आकलन करने के लिए विभिन्न स्कोर प्रकारों का विश्लेषण कर सकते हैं।
यदि आप कस्टमर चर्न रेट प्रेडिक्शन और मार्केटिंग में डेटा साइंस के अन्य अनुप्रयोगों में गहराई से जाना चाहते हैं, तो Machine Learning for Marketing in Python पर यह कोर्स एक अच्छी शुरुआत हो सकती है।