テレコミュニケーションの顧客解約データ分析(2)

タスク3顧客が潜在的な損失ターゲットであるかどうかを判断する方法は?

データセットの基本的な背景と機能間の関係の分析は、
以前のブログ投稿「テレコム顧客損失データの分析(1)」で見ることができます。

データセットの入力と前処理(後続のすべてのプログラムの基礎):

import seaborn as sns
import pandas as pd
import numpy as np
Te_data = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
Te_data.replace(to_replace=r'^\s*$',value=np.nan,regex=True,inplace=True)
Te_data.dropna(axis=0, how='any', inplace=True)
Te_data['TotalCharges'] = pd.to_numeric(Te_data['TotalCharges'])

以下のトピックを入力してください。
7000を超えるサンプルの場合、これらのサンプルデータを使用して、教師あり機械学習モデルをトレーニングできます。これにより、モデルは、顧客が潜在的なチャーンオブジェクトであるかどうかを入力特徴に基づいて予測できます。チャーンの可能性があるオブジェクトについては、それらを保持するためにタイムリーな対策を講じることで、将来のチャーンの可能性を効果的に減らすことができます。
タスク2(ブログの投稿:テレコム顧客チャーンデータの分析(1)を参照)では、分析を通じてチャーンに密接に関連する10個の入力フィーチャが取得されます。以下では、これらの入力フィーチャを使用してモデリング作業を実行します。これらの10の入力特性には、高齢者であるかどうか、契約期間、使用年数、支払い方法、月額使用量、ネットワークサービスを使用するかどうか、ネットワークサービスを使用するときにネットワークセキュリティ、ネットワークバックアップ、機器保護を採用するかどうかが含まれます。 3.テクニカルサポート。

3.1特徴エンジニアリング特徴エンジニアリング
の目的は、データを表現する正しい方法を見つけることです。入力フィーチャと出力フィーチャのデータコンテンツとデータタイプに応じて、現在の10個の入力フィーチャを4つのカテゴリに分類しました。
(1)最初のフィーチャのデータコンテンツは、「はい」または「いいえ」です。現在このタイプの特性に属している変数は、高齢者であるか、失われたかです。エンコードする0-1変数を直接採用できます。このうち、「1」は「はい」を表し、「0」は「いいえ」を表します。

SeniorCitizen=list(Te_data['SeniorCitizen'])
Churn=list(Te_data['Churn'])
#将Churn转化为0-1变量
for i in range(Te_data.shape[0]):
    if Churn[i]=='Yes':
        Churn[i] = 1
    else :
        Churn[i] = 0

(2)2番目のタイプの特性のデータタイプは離散的であり、そのデータコンテンツは公称属性です。公称属性は、データ値がオブジェクトを区別するのに十分な情報のみを提供し、順序や数値計算の重要性がないことを意味します。現在このタイプの機能に属している変数は、契約期間とネットワークサービスを使用するかどうかです。このような変数は、仮想変数を構築するためのワンホットな方法でエンコードされます。

Contract=Te_data['Contract']
Contract_dummies=pd.get_dummies(Contract)
InternetService=Te_data['InternetService']
InternetService_dummies=pd.get_dummies(InternetService)

(3)3番目のタイプのフィーチャのデータタイプとデータコンテンツ属性は、2番目のタイプのフィーチャと同じです。ただし、含まれる情報の内容を表現するには0-1の変数でエンコードするだけで十分です。そのため、仮想変数を使用して各カテゴリを表す必要がなく、冗長な機能になります。このような機能には、支払い方法、ネットワークセキュリティを使用するかどうか、ネットワークバックアップ、デバイス保護、およびネットワークサービスを使用する際のテクニカルサポートが含まれます。0-1変数を使用する支払方法の特性の理由は、支払に電子小切手が使用される場合のみ、解約率が大幅に異なるためです(下の図に示すタスク2で分析)。したがって、支払い方法のこの機能は、それが電子小切手ユーザーか非電子小切手ユーザーかを区別する必要があるだけです。ユーザーがネットワークサービスを持っていることに基づいて、ネットワークセキュリティ、ネットワークバックアップ、デバイス保護、テクニカルサポートなどの追加サービス機能は、ユーザーが追加サービスを所有しているかどうかを区別するだけでよく、ネットワークサービスのユーザーであることを示す必要はありません。 、したがって、0-1変数もエンコードに使用されます。
ここに画像の説明を挿入

#将PaymentMethod ,OnlineSecurity,OnlineBackup,DeviceProtection ,TechSupport 转化为0-1编码
PaymentMethod=list(Te_data['PaymentMethod'])
OnlineSecurity=list(Te_data['OnlineSecurity'])
OnlineBackup=list(Te_data['OnlineBackup'])
DeviceProtection=list(Te_data['DeviceProtection'])
TechSupport=list(Te_data['TechSupport'])
for i in range(Te_data.shape[0]):
    if PaymentMethod[i]=='Electronic check':
        PaymentMethod[i] = 1
    else :
        PaymentMethod[i] = 0
        
    if OnlineSecurity[i]=='Yes':
        OnlineSecurity[i] = 1
    else :
        OnlineSecurity[i] = 0

    if OnlineBackup[i]=='Yes':
        OnlineBackup[i] = 1
    else :
        OnlineBackup[i] = 0

    if DeviceProtection[i]=='Yes':
        DeviceProtection[i] = 1
    else :
        DeviceProtection[i] = 0

    if TechSupport[i]=='Yes':
        TechSupport[i] = 1
    else :
        TechSupport[i] = 0

(4)4番目の特徴のデータ型は数値であり、そのデータ内容には、順序と加算および減算演算の数値的な意味があります。
このタイプの特性に現在属している変数は、使用年数、月次消費量です。連続特徴の離散化手法を採用するつもりです。その理由は、離散化された特徴が異常なデータに対してよりロバストであり、過剰適合のリスクを低減し、モデルがより安定し、予測効果がより良くなるからです。
データの離散化はビニング操作とも呼ばれ、その方法は教師付きビニング(カイ2乗ビニング、最小エントロピービニング)と教師なしビニング(等周波数ビニング、等尺性ビニング)に分かれています。今回の操作では、教師なしビニングで等周波数ビニングを使用します。

tenure=list(Te_data['tenure'])
tenure_cats=pd.qcut(tenure,6)
tenure_dummies=pd.get_dummies(tenure_cats)

MonthlyCharges=list(Te_data['MonthlyCharges'])
MonthlyCharges_cats=pd.qcut(MonthlyCharges,5)
MonthlyCharges_dummies=pd.get_dummies(MonthlyCharges_cats)

最後に、モデルの23の入力フィーチャと1つの出力フィーチャが取得されます。

#模型输出y
Churn_y=np.array(Churn).reshape(-1,1)

#模型输入x
SeniorCitizen_x=np.array(SeniorCitizen).reshape(-1,1)
Contract_x=Contract_dummies.values
InternetService_x=InternetService_dummies.values
PaymentMethod_x=np.array(PaymentMethod).reshape(-1,1)
OnlineSecurity_x=np.array(OnlineSecurity).reshape(-1,1)
OnlineBackup_x=np.array(OnlineBackup).reshape(-1,1)
DeviceProtection_x=np.array(DeviceProtection).reshape(-1,1)
TechSupport_x=np.array(TechSupport).reshape(-1,1)
tenure_x=tenure_dummies.values
MonthlyCharges_x=MonthlyCharges_dummies.values

X=np.concatenate([SeniorCitizen_x,Contract_x,InternetService_x,PaymentMethod_x,OnlineSecurity_x,\ OnlineBackup_x,DeviceProtection_x,TechSupport_x,tenure_x,MonthlyCharges_x],axis=1)

3.2モデルの構築
機械学習モデルとして、決定木の古典的なバイナリ分類モデルを使用してみてください。デシジョンツリーの利点は、モデルが理解しやすく、視覚化できることと、出力結果に大きな影響を与える機能をよりよく理解できることです。しかし、欠点も非常に明白であり、それは過剰適合しやすく、一般化のパフォーマンスが低いです。

#数据导入
import pandas as pd
import numpy as np
data_frame=pd.read_excel("Save_X.xlsx")
X=np.array(data_frame.values[:,1:])
data_frame2=pd.read_excel("Save_y.xlsx")
y=np.array(data_frame2.values[:,1])
#模型训练
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
x_train, x_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
tree = DecisionTreeClassifier(max_depth=6,random_state=0)
tree.fit(x_train,y_train)
print("training set score:{:.3f}".format(tree.score(x_train, y_train)))
print("test set score:{:.3f}".format(tree.score(x_test, y_test)))
print("Feature importances : \n{}".format(tree.feature_importances_))

処理したフィーチャーをExcelシートに保存し、モデリング時にそれらを読み戻しました。sklearnライブラリのDecisionTreeClassifierモデルがモデリングとトレーニングに使用されます。ツリーの深さは6に設定され、トレーニングセットの適合度は0.805、テストセットの適合度は0.798であり、現在の入力フィーチャがモデルターゲットを説明していることを示しますより強力で優れた予測効果。

3.3結果の視覚化と結論
さらに、予測モデルの各入力特徴の重要度インデックスを取得し、次の図に示すように視覚化します。

#特征重要性可视化
import matplotlib.pyplot as plt
def plot_feature_importance(model):
    n_features = data_frame.shape[1]
    plt.barh(range(n_features-1),model.feature_importances_,align='center')
    plt.yticks(range(n_features-1),data_frame.columns[1:])
    plt.xlabel('Features importance')
    plt.ylabel('feature')
plot_feature_importance(tree)
plt.show()

ここに画像の説明を挿入
モデルの決定により大きな影響を与える指標には、契約期間が「月間」であるかどうか、顧客が光ファイバーネットワークのユーザーであるかどうか、顧客が4か月未満使用されたかどうか、顧客が支払い方法として電子小切手を使用するかどうかなどがあります。チャーン顧客とチャーン以外の顧客の違いをより適切に反映できるため、モデルは正しい分類を行うことができます。モデルの意思決定プロセスをさらに理解するために、意思決定ツリーを視覚化することもできます。

#决策树可视化
from sklearn.tree import export_graphviz
export_graphviz(tree,out_file='te_tree.dot',class_names=['Churn_no','Churn_yes'],feature_names=data_frame.columns[1:],impurity=False,filled=True)

import graphviz
with open("te_tree.dot") as f:
    dot_graph=f.read()
graph=graphviz.Source(dot_graph)
graph.render("tree")

決定ツリーが大きすぎるため、部分的なサブツリーのみを表示し、これらのサブツリーの決定プロセスから導き出すことができる結論を確認します。
ここに画像の説明を挿入
最初のサブツリーが、ネットワークサービスユーザーの分類機能を持つユーザーグループから発展するかどうかほら 赤いグリッドと白いグリッドはチャーンのない顧客を表し、青いグリッドはチャーンの顧客を表します。ネットワークサービスのユーザーは、高齢者でない限り失われた顧客になる可能性が高く、ネットワークセキュリティの追加サービスを申請することが明らかになります。非ネットワークサービスのユーザーは、高齢者でない限り失われた顧客になる可能性が低くなります。電子小切手で支払うユーザー。上記の分析に基づいて、運用上の推奨事項を示します
。1)若いユーザーがネットワークサービスのユーザーである場合、基本的なネットワークの問題による顧客の損失を防ぐために、ネットワークセキュリティの追加サービスを推奨できます。

ここに画像の説明を挿入
2番目のサブツリーは、耐用年数が4か月から14か月であるかどうかの分類特性を持つユーザーグループから作成されます。同じ赤いグリッドと白いグリッドはチャーンを持たない顧客を表し、青いグリッドはチャーンした顧客を表します。耐用年数が4か月から14か月の顧客は、月間消費量が58.92元から79.15元の範囲に達しない限り、失われた顧客になる可能性が高く、さらに、耐用年数は14か月から29か月の間です。お客さま間も紛失しやすいです。上記の分析に基づいて、運用上の推奨事項を示します
。2)耐用年数が29か月未満の顧客の場合、損失が発生する可能性が高くなり、維持戦略と運用戦略に引き続き投資する必要があります。

ここに画像の説明を挿入
3番目のサブツリーは、ネットワークセキュリティサービスユーザーの分類された機能のユーザーグループから作成されます。顧客がネットワークセキュリティサービスを申請した場合、高齢者でない限り彼は逃げない可能性が高く、ネットワークセキュリティサービスを申請しなかった顧客は、テクニカルサポートを申請しない限り失われた顧客になる可能性が高くなります。 。上記の分析に基づいて、運用上の推奨事項を以下に示します
。3)高齢者の顧客グループは常に解約しやすい顧客であり、サービスのニーズにタイムリーに注意を払い、理解する必要があります。

最後に、ツリー全体の観点から、いくつかの結論を導き出すこともできます
。4)契約期間が短いほど、ユーザーを失う可能性が高くなります。したがって、電気通信会社がプロモーション作業を行う場合は、できる限り新規ユーザーとの長期契約に署名する必要があります。
5)光ファイバーネットワーク技術を使用するユーザーは、他のサービスを使用するユーザーよりも解約する傾向があります。このサービスの現在の問題に注意を払い、タイムリーに改善する必要があります。

さらに、モデルの予測精度をさらに向上させたい場合は、リフティングツリーなどの改善された一連のモデルを使用できます。

顧客の生涯価値の指標に関心がある場合は、引き続き次のブログ投稿を参照してください:Telecom Customer Loss Data Analysis(3)

オリジナルの記事を2件公開 Likes0 Visits15

おすすめ

転載: blog.csdn.net/gdben_user/article/details/105653763