Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में ग्राहक मंथन (Customer Churn) की भविष्यवाणी

हर व्यवसाय ग्राहक की वफादारी पर निर्भर करता है। ग्राहक से दोहराया जाने वाला व्यवसाय व्यावसायिक लाभप्रदता के लिए आधारशिला में से एक है। इसलिए ग्राहक के व्यवसाय छोड़ने का कारण जानना महत्वपूर्ण है। ग्राहकों का दूर जाना ग्राहक मंथन के रूप में जाना जाता है। पिछले रुझानों को देखकर हम यह आंक सकते हैं कि कौन से कारक ग्राहक मंथन को प्रभावित करते हैं और कैसे भविष्यवाणी करें कि कोई विशेष ग्राहक व्यवसाय से दूर जाएगा। इस लेख में हम पिछले रुझानों का अध्ययन करने के लिए ML एल्गोरिदम का उपयोग करेंगे और फिर आंकेंगे कि कौन से ग्राहक मंथन करने की संभावना रखते हैं।

डेटा तैयारी

एक उदाहरण के रूप में हम इस लेख के लिए टेलीकॉम ग्राहक मंथन पर विचार करेंगे। स्रोत डेटा कागल पर उपलब्ध है। डेटा डाउनलोड करने का URL नीचे दिए गए प्रोग्राम में उल्लिखित है। हम CSV फाइल को पायथन प्रोग्राम में लोड करने के लिए Pandas लाइब्रेरी का उपयोग करते हैं और कुछ नमूना पंक्तियों को देखते हैं।

उदाहरण

import pandas as pd
# Telco-Customer-Churn.csv डेटासेट लोड करना
# https://www.kaggle.com/blastchar/telco-customer-churn
datainput = pd.read_csv('E:\\Telecom_customers.csv')
print("Given input data :\n", datainput)

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

Given input data :
   customerID gender SeniorCitizen ... MonthlyCharges TotalCharges Churn
0  7590-VHVEG Female             0 ...         29.85       29.85    No
1  5575-GNVDE   Male             0 ...         56.95     1889.5    No
2  3668-QPYBK   Male             0 ...         53.85      108.15   Yes
3  7795-CFOCW   Male             0 ...         42.30     1840.75   No
4  9237-HQITU Female             0 ...         70.70      151.65   Yes
...          ...    ...           ... ...          ...         ...   ...
7038 6840-RESVB   Male             0 ...         84.80     1990.5    No
7039 2234-XADUH Female             0 ...        103.20     7362.9    No
7040 4801-JZAZL Female             0 ...         29.60      346.45   No
7041 8361-LTMKD   Male             1 ...         74.40      306.6    Yes
7042 3186-AJIEK   Male             0 ...        105.65     6844.5    No
[7043 rows x 21 columns]

मौजूदा पैटर्न का अध्ययन

अब हम डेटासेट का अध्ययन करते हैं ताकि मंथन होने के मौजूदा पैटर्न ढूंढ सकें। हम उन कॉलम्स को भी ड्रॉप करते हैं जो स्थिति को प्रभावित नहीं करते। उदाहरण के लिए, कस्टमर ID कॉलम का इस बात पर प्रभाव नहीं पड़ेगा कि ग्राहक छोड़ता है या नहीं, इसलिए हम ड्रॉप या पॉप मेथड का उपयोग करके ऐसे कॉलम्स को ड्रॉप करते हैं। फिर दिए गए डेटासेट में मंथन के प्रतिशत को दिखाने वाला चार्ट प्लॉट करते हैं।

उदाहरण 2

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
# Telco-Customer-Churn.csv डेटासेट लोड करना
# https://www.kaggle.com/blastchar/telco-customer-churn
datainput = pd.read_csv('E:\\Telecom_customers.csv')
print("Given input data :\n", datainput)
# कॉलम ड्रॉप करना
datainput.drop(['customerID'], axis=1, inplace=True)
datainput.pop('TotalCharges')
datainput['OnlineBackup'].unique()
data = datainput['Churn'].value_counts(sort=True)
chroma = ["#BDFCC9", "#FFDEAD"]
rcParams['figure.figsize'] = 9, 9
explode = [0.2, 0.2]
plt.pie(data, explode=explode, colors=chroma, autopct='%1.1f%%', shadow=True, startangle=180)
plt.title('Percentage of Churn in the given Data')
plt.show()

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

पायथन में ग्राहक मंथन (Customer Churn) की भविष्यवाणी

डेटा प्रीप्रोसेसिंग

ML एल्गोरिदम द्वारा उपयोग के लिए डेटा तैयार करने के लिए, हम सभी फील्ड्स को लेबल करते हैं। हम टेक्स्टुअल वैल्यूज़ को न्यूमेरिक फ्लैग्स में भी बदलते हैं। उदाहरण के लिए, जेंडर कॉलम में वैल्यूज़ पुरुष और महिला के बजाय 0 और 1 में बदल जाती हैं। यह उन फील्ड्स को गणनाओं और एल्गोरिदम में उपयोग करने में मदद करता है जो इन फील्ड्स के मंथन वैल्यू पर प्रभाव का मूल्यांकन करेंगे। हम sklearn से LabelEncoder मेथड का उपयोग करते हैं।

उदाहरण 3

import pandas as pd
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
datainput['gender'] = label_encoder.fit_transform(datainput['gender'])
datainput['Partner'] = label_encoder.fit_transform(datainput['Partner'])
datainput['Dependents'] = label_encoder.fit_transform(datainput['Dependents'])
datainput['PhoneService'] = label_encoder.fit_transform(datainput['PhoneService'])
datainput['MultipleLines'] = label_encoder.fit_transform(datainput['MultipleLines'])
datainput['InternetService'] = label_encoder.fit_transform(datainput['InternetService'])
datainput['OnlineSecurity'] = label_encoder.fit_transform(datainput['OnlineSecurity'])
datainput['OnlineBackup'] = label_encoder.fit_transform(datainput['OnlineBackup'])
datainput['DeviceProtection'] = label_encoder.fit_transform(datainput['DeviceProtection'])
datainput['TechSupport'] = label_encoder.fit_transform(datainput['TechSupport'])
datainput['StreamingTV'] = label_encoder.fit_transform(datainput['StreamingTV'])
datainput['StreamingMovies'] = label_encoder.fit_transform(datainput['StreamingMovies'])
datainput['Contract'] = label_encoder.fit_transform(datainput['Contract'])
datainput['PaperlessBilling'] = label_encoder.fit_transform(datainput['PaperlessBilling'])
datainput['PaymentMethod'] = label_encoder.fit_transform(datainput['PaymentMethod'])
datainput['Churn'] = label_encoder.fit_transform(datainput['Churn'])
print("input data after label encoder :\n", datainput)
# फीचर्स (X) और लेबल (y) अलग करना
datainput["Churn"] = datainput["Churn"].astype(int)
y = datainput["Churn"].values
X = datainput.drop(labels=["Churn"], axis=1)
print("\nseparated X and y :")
print("y -", y)
print("X -", X)

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

input data after label encoder
   customerID  gender  SeniorCitizen ... MonthlyCharges TotalCharges Churn
0  7590-VHVEG       0              0 ...         29.85       29.85     0
1  5575-GNVDE       1              0 ...         56.95     1889.5     0
2  3668-QPYBK       1              0 ...         53.85      108.15    1
3  7795-CFOCW       1              0 ...         42.30     1840.75    0
4  9237-HQITU       0              0 ...         70.70      151.65    1
...          ...     ...            ... ...          ...         ...   ...
7038 6840-RESVB       1              0 ...         84.80     1990.5     0
7039 2234-XADUH       0              0 ...        103.20     7362.9     0
7040 4801-JZAZL       0              0 ...         29.60      346.45    0
7041 8361-LTMKD       1              1 ...         74.40      306.6     1
7042 3186-AJIEK       1              0 ...        105.65     6844.5     0
[7043 rows x 21 columns]
separated X and y :
y - [0 0 1 ... 0 1 0]
X -    customerID  gender ... MonthlyCharges TotalCharges
0  7590-VHVEG       0 ...         29.85       29.85
1  5575-GNVDE       1 ...         56.95     1889.5
2  3668-QPYBK       1 ...         53.85      108.15
3  7795-CFOCW       1 ...         42.30     1840.75
4  9237-HQITU       0 ...         70.70      151.65
...          ...     ... ...          ...         ...
7038 6840-RESVB       1 ...         84.80     1990.5
7039 2234-XADUH       0 ...        103.20     7362.9
7040 4801-JZAZL       0 ...         29.60      346.45
7041 8361-LTMKD       1 ...         74.40      306.6
7042 3186-AJIEK       1 ...        105.65     6844.5
[7043 rows x 20 columns]

डेटा प्रशिक्षण और परीक्षण

अब हम डेटासेट को दो भागों में विभाजित करते हैं। एक प्रशिक्षण के लिए और दूसरा परीक्षण के लिए। test_size पैरामीटर का उपयोग यह तय करने के लिए किया जाता है कि डेटासेट का कितना प्रतिशत केवल परीक्षण के लिए उपयोग किया जाएगा। यह अभ्यास हमें बनाए जा रहे मॉडल पर विश्वास हासिल करने में मदद करेगा। फिर हम लॉजिस्टिक रिग्रेशन एल्गोरिदम लागू करते हैं और अनुमानित वैल्यूज़ ढूंढते हैं।

उदाहरण

import pandas as pd
import warnings
warnings.filterwarnings("ignore")
from sklearn.linear_model import LogisticRegression
# पैंडास के साथ Telco-Customer-Churn.csv डेटासेट लोड करना
datainput = pd.read_csv('E:\\Telecom_customers.csv')
datainput.drop(['customerID'], axis=1, inplace=True)
datainput.pop('TotalCharges')
datainput['OnlineBackup'].unique()
# LabelEncoder()
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
datainput['gender'] = label_encoder.fit_transform(datainput['gender'])
datainput['Partner'] = label_encoder.fit_transform(datainput['Partner'])
datainput['Dependents'] = label_encoder.fit_transform(datainput['Dependents'])
datainput['PhoneService'] = label_encoder.fit_transform(datainput['PhoneService'])
datainput['MultipleLines'] = label_encoder.fit_transform(datainput['MultipleLines'])
datainput['InternetService'] = label_encoder.fit_transform(datainput['InternetService'])
datainput['OnlineSecurity'] = label_encoder.fit_transform(datainput['OnlineSecurity'])
datainput['OnlineBackup'] = label_encoder.fit_transform(datainput['OnlineBackup'])
datainput['DeviceProtection'] = label_encoder.fit_transform(datainput['DeviceProtection'])
datainput['TechSupport'] = label_encoder.fit_transform(datainput['TechSupport'])
datainput['StreamingTV'] = label_encoder.fit_transform(datainput['StreamingTV'])
datainput['StreamingMovies'] = label_encoder.fit_transform(datainput['StreamingMovies'])
datainput['Contract'] = label_encoder.fit_transform(datainput['Contract'])
datainput['PaperlessBilling'] = label_encoder.fit_transform(datainput['PaperlessBilling'])
datainput['PaymentMethod'] = label_encoder.fit_transform(datainput['PaymentMethod'])
datainput['Churn'] = label_encoder.fit_transform(datainput['Churn'])
# print("input data after label encoder :\n", datainput)
# फीचर्स (X) और लेबल (y) अलग करना
datainput["Churn"] = datainput["Churn"].astype(int)
Y = datainput["Churn"].values
X = datainput.drop(labels=["Churn"], axis=1)
# train_test_split मेथड
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
# LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, Y_train)
Y_pred = classifier.predict(X_test)
print("\npredicted values :\n", Y_pred)

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

predicted values :
[0 0 1 ... 0 1 0]

मूल्यांकन पैरामीटर्स ढूंढना

एक बार जब उपरोक्त चरण में सटीकता स्तर स्वीकार्य हो जाता है तो हम मॉडल के आगे मूल्यांकन के लिए विभिन्न पैरामीटर्स ढूंढते हैं। हम सटीकता और कन्फ्यूजन मैट्रिक्स का उपयोग अपने पैरामीटर्स के रूप में करते हैं यह आंकने के लिए कि यह मॉडल कितना सटीक व्यवहार कर रहा है। सटीकता मूल्य का उच्च प्रतिशत मॉडल को बेहतर फिट के रूप में सुझाता है। इसी तरह कन्फ्यूजन मैट्रिक्स ट्रू पॉजिटिव्स, ट्रू नेगेटिव्स, फाल्स पॉजिटिव्स और फाल्स नेगेटिव्स का मैट्रिक्स दिखाता है। फाल्स वैल्यूज़ की तुलना में ट्रू वैल्यूज़ का उच्च प्रतिशत बेहतर मॉडल का संकेत है।

उदाहरण

import pandas as pd
import warnings
warnings.filterwarnings("ignore")
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import confusion_matrix
# पैंडास के साथ Telco-Customer-Churn.csv डेटासेट लोड करना
datainput = pd.read_csv('E:\\Telecom_customers.csv')
datainput.drop(['customerID'], axis=1, inplace=True)
datainput.pop('TotalCharges')
datainput['OnlineBackup'].unique()
# LabelEncoder()
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
datainput['gender'] = label_encoder.fit_transform(datainput['gender'])
datainput['Partner'] = label_encoder.fit_transform(datainput['Partner'])
datainput['Dependents'] = label_encoder.fit_transform(datainput['Dependents'])
datainput['PhoneService'] = label_encoder.fit_transform(datainput['PhoneService'])
datainput['MultipleLines'] = label_encoder.fit_transform(datainput['MultipleLines'])
datainput['InternetService'] = label_encoder.fit_transform(datainput['InternetService'])
datainput['OnlineSecurity'] = label_encoder.fit_transform(datainput['OnlineSecurity'])
datainput['OnlineBackup'] = label_encoder.fit_transform(datainput['OnlineBackup'])
datainput['DeviceProtection'] = label_encoder.fit_transform(datainput['DeviceProtection'])
datainput['TechSupport'] = label_encoder.fit_transform(datainput['TechSupport'])
datainput['StreamingTV'] = label_encoder.fit_transform(datainput['StreamingTV'])
datainput['StreamingMovies'] = label_encoder.fit_transform(datainput['StreamingMovies'])
datainput['Contract'] = label_encoder.fit_transform(datainput['Contract'])
datainput['PaperlessBilling'] = label_encoder.fit_transform(datainput['PaperlessBilling'])
datainput['PaymentMethod'] = label_encoder.fit_transform(datainput['PaymentMethod'])
datainput['Churn'] = label_encoder.fit_transform(datainput['Churn'])
# print("input data after label encoder :\n", datainput)
# फीचर्स (X) और लेबल (y) अलग करना
datainput["Churn"] = datainput["Churn"].astype(int)
Y = datainput["Churn"].values
X = datainput.drop(labels=["Churn"], axis=1)
# train_test_split मेथड
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
# LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, Y_train)
Y_pred = classifier.predict(X_test)
# सटीकता
LR = metrics.accuracy_score(Y_test, Y_pred) * 100
print("\nThe accuracy score using the LR is -> ", LR)
# कन्फ्यूजन मैट्रिक्स
cm = confusion_matrix(Y_test, Y_pred)
print("\nconfusion matrix : \n", cm)

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

The accuracy score using the LR is -> 80.8374733853797
confusion matrix :
[[928 109]
 [161 211]]

वेरिएबल्स का वजन

अब हम आंकते हैं कि प्रत्येक फील्ड या वेरिएबल मंथन वैल्यू को कैसे प्रभावित करता है। इससे हमें उन विशिष्ट वेरिएबल्स को लक्षित करने में मदद मिलेगी जिनका मंथन पर अधिक प्रभाव पड़ता है और ग्राहक मंथन को रोकने के लिए उन वेरिएबल्स को संभालने का प्रयास करेंगे। इसके लिए हम अपने क्लासिफायर में गुणांकों को शून्य पर सेट करते हैं और प्रत्येक वेरिएबल के वजन प्राप्त करते हैं।

उदाहरण

import pandas as pd
import warnings
warnings.filterwarnings("ignore")
from sklearn.linear_model import LogisticRegression
# पैंडास के साथ डेटासेट लोड करना
datainput = pd.read_csv('E:\\Telecom_customers.csv')
datainput.drop(['customerID'], axis=1, inplace=True)
datainput.pop('TotalCharges')
datainput['OnlineBackup'].unique()
# LabelEncoder()
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
datainput['gender'] = label_encoder.fit_transform(datainput['gender'])
datainput['Partner'] = label_encoder.fit_transform(datainput['Partner'])
datainput['Dependents'] = label_encoder.fit_transform(datainput['Dependents'])
datainput['PhoneService'] = label_encoder.fit_transform(datainput['PhoneService'])
datainput['MultipleLines'] = label_encoder.fit_transform(datainput['MultipleLines'])
datainput['InternetService'] = label_encoder.fit_transform(datainput['InternetService'])
datainput['OnlineSecurity'] = label_encoder.fit_transform(datainput['OnlineSecurity'])
datainput['OnlineBackup'] = label_encoder.fit_transform(datainput['OnlineBackup'])
datainput['DeviceProtection'] = label_encoder.fit_transform(datainput['DeviceProtection'])
datainput['TechSupport'] = label_encoder.fit_transform(datainput['TechSupport'])
datainput['StreamingTV'] = label_encoder.fit_transform(datainput['StreamingTV'])
datainput['StreamingMovies'] = label_encoder.fit_transform(datainput['StreamingMovies'])
datainput['Contract'] = label_encoder.fit_transform(datainput['Contract'])
datainput['PaperlessBilling'] = label_encoder.fit_transform(datainput['PaperlessBilling'])
datainput['PaymentMethod'] = label_encoder.fit_transform(datainput['PaymentMethod'])
datainput['Churn'] = label_encoder.fit_transform(datainput['Churn'])
# print("input data after label encoder :\n", datainput)
# फीचर्स (X) और लेबल (y) अलग करना
datainput["Churn"] = datainput["Churn"].astype(int)
Y = datainput["Churn"].values
X = datainput.drop(labels=["Churn"], axis=1)
# train_test_split मेथड
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
# LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, Y_train)
Y_pred = classifier.predict(X_test)
# सभी वेरिएबल्स के वजन
wt = pd.Series(classifier.coef_[0], index=X.columns.values)
print("\nweight of all the variables :")
print(wt.sort_values(ascending=False))

आउटपुट

उपरोक्त कोड चलाने से हमें निम्न परिणाम मिलता है -

weight of all the variables :
PaperlessBilling      0.389379
SeniorCitizen         0.246504
InternetService       0.209283
Partner               0.067855
StreamingMovies       0.054309
MultipleLines         0.042330
PaymentMethod         0.039134
MonthlyCharges        0.027180
StreamingTV          -0.008606
gender               -0.029547
tenure               -0.034668
DeviceProtection     -0.052690
OnlineBackup         -0.143625
Dependents           -0.209667
OnlineSecurity       -0.245952
TechSupport          -0.254740
Contract             -0.729557
PhoneService         -0.950555
dtype: float64
  1. पायथन Bokeh: डेटा विज़ुअलाइज़ेशन (लाइन, सर्कल, बार चार्ट) पायथन Bokeh: डेटा विज़ुअलाइज़ेशन (लाइन, सर्कल, बार चार्ट)

    Bokeh परिचय Bokeh वेब ब्राउज़र के लिए इंटरैक्टिव डेटा विज़ुअलाइज़ेशन लाइब्रेरी है। यह HTML/JS आउटपुट उत्पन्न करता है जिसे ब्राउज़र में देखा जा सकता है। 1. लाइन प्लॉट from bokeh.io import show from bokeh.plotting import figure p = figure(plot_width=300, plot_height=300, title=Line Plot) p.line([2,

  1. पायथन में सांख्यिकीय सोच पायथन में सांख्यिकीय सोच

    सांख्यिकी ML और AI सीखने के लिए मौलिक है। चूंकि पायथन इन टेक्नोलॉजीज के लिए पसंद की भाषा है, हम देखेंगे कि सांख्यिकीय विश्लेषण को शामिल करने वाले पायथन प्रोग्राम कैसे लिखें। इस लेख में हम देखेंगे कि विभिन्न पायथन मॉड्यूल्स का उपयोग करके ग्राफ और चार्ट कैसे बनाएं। चार्ट की यह विविधता हमें डेटा का तेज

  1. पायथन में जनगणना डेटा का विश्लेषण पायथन में जनगणना डेटा का विश्लेषण

    जनगणना एक व्यवस्थित तरीके से दी गई जनसंख्या के बारे में जानकारी रिकॉर्ड करने के बारे में है। कैप्चर किए गए डेटा में विभिन्न श्रेणी की जानकारी शामिल होती है जैसे - जनसांख्यिकीय, आर्थिक, आवास विवरण आदि। यह अंततः सरकार को वर्तमान परिदृश्य को समझने और भविष्य के लिए योजना बनाने में मदद करता है। इस लेख मे