【Python】機械学習で営業活動が成功し易い顧客を予測してみた

こんにちは、のっくんです。

今日は機械学習を使って営業活動(マーケティング)が成功するか予測するためのコードを書いていきたいと思います。

年齢や学歴、結婚の有無、年間の支出、持ち家の有無などの個人情報から、銀行口座を開設したか(yes or no)を与えて機械学習を行うことで、統計的に営業活動が成功しやすい人としにくい人をAIで判別します。

収入が無い人に銀行口座の開設を進めても意味がないことは人間でも分かりますが、機械学習では更に高度な複数の要素を分析するのが得意です。

予めAIで営業活動が成功しやすいクライアントを予想することで、営業チームはクライアントを絞って営業活動をすることができるので無駄な営業を省略しやすくなります。

企業にとっては無駄なリソースの削減ができ、集中して有望なクライアントにフォーカスできるので営業成績が上がることも間違いありません。

それでは実際にどうやってやるのか見ていきましょう。

データセット

使用するデータは以下の通り。

UCIマシンラーニングレポジトリからデータを取得します。

アカウント作成をしなくても自由に誰でもダウンロードできます。

https://archive.ics.uci.edu/ml/datasets/bank+marketing

データ数は45211で、属性は17個です。

データが提供されたのが2012年2月14日です。

以下が属性の1部です。

  • 年齢
  • 仕事
  • 結婚
  • 学歴
  • 債務履行の有無
  • 持ち家の有無
  • ローンの有無

ダウンロードしたデータのうち、bank_full.csvファイルを主に使っていきます。

データの読み込み

pandasにデータを読み込むときにはread_csv()を使います。

出力はこんな感じです。

属性情報の数が多いですね。

余談ですが、コードを書くときにはGoogle Colaboratoryを使っています。

Pandasの表がダークでカッコいいです。

Google Colabを使うとコーディングがクラウドでできるので、家でも会社でもコードがかけてとても便利です。

データの前処理

欠損したデータがないか確認します。

欠損地の有無はisnull()を使うと算出できます。

欠損データは無さそうですね。

良いデータセットです。

次に学習に必要なさそうな属性データ(過去のキャンペーン活動の日付など)を削除します。

うん、シンプルになりました。

ちなみに、アメリカの学歴は、

  • primary education, 小学校
  • secondary education, 中学〜高校
  • tertiary education, 大学、職業専門学校

となっています。

tertiary(ターシャリ)って何だろうと思って調べたら、「第3の」という意味らしいです。

3番目なので高校かと思いましたが、高校はセカンダリーになるみたい。

今回はこの8個の属性から、最後のy(定期預金の開設をしたかどうか)を予測するモデルを作っていきたいと思います。

ここで各カラムの型を見てみましょう。

型情報を得るには、dtypesで確認します。

「age」と「balance」以外は、objectという抽象的なものになっています。

object型はラベルなどの文字列を指す場合が多いです。

機械学習では、基本的に数値(整数型(int)もしくは浮動小数点数型(float))を扱うのでobject型を整数型に変更する必要があります。

pandasのfactorize()を使って整数型に変換します。

ラベルが例えば”yes”と”no”であれば、それぞれ1,0に変更します。

obuject型のカラム名をリストに含めて、繰り返し数値に変換するようにコードを書きます。

これでデータの準備が整いました。

機械学習

SVM

SVMを使って機械学習を行ってみます。

accuracy_scoreで正解率を求めています。

classification_reportでは、学習機がどのようにクラス分けしたかを表示してくれます。

正解率を見てみると、88.5%でした。

高精度、やったね!と喜びたいところですが、`classification_report’の内容を見ると1のprecisionが0.00になっています。

precisionというのは、精度を意味します。

つまり、学習器が0と予想した中で実際に0だった割合が89%、1と予想した中で実際に1だった割合が0%でした。

これでは実際に分類できているとは言えません。

例えば、0が5000個、1が100個あったとします。

全部のデータに対して0と答えれば、5000/5100 = 98%の割合で正解します。

これと同じことが今回の学習で起こっているかもしれません。

確認のために、ラベルの割合を見てみます。

マーケティング活動を行って、実際に銀行口座を開いてくれた人は僅かです。

ほとんどの人は開設していません。

つまり負例(0)が多く正例(1)が少ない状態です。

全て0と答えれば、39922/(39922+5289) =  88.3% で正解します。

このような学習データは釣り合っていないので不均衡データと呼ばれます。

オーバーサンプリング

今回ような極端に正例が少ない学習データに対してはオーバーサンプリングが有効です。

オーバーサンプリングには、SMOTEと呼ばれる手法を使います。

“SMOTE: synthetic minority over-sampling technique”は2002年の機械学習ジャーナルで発表されている実績のある手法です。

Pythonでは、imblearnパッケージの中にありますのでimportすることで使えるようになります。

正例と負例の数が同じになりました。

再度学習をかけてみます。

52%の精度でした。

2値分類なので当てずっぽうでも50%は達成できます。

もう少し精度が欲しいところですね。

ランダムフォレスト

今度はオーバーサンプリングしたデータに対してランダムフォレストを適用してみます。

82%まで精度が上がりました。

今回の学習データでは、SVMよりもランダムフォレストの方が精度が高いことが分かりました。

今回学習したモデルを使えば、お客様の個人情報からマーケティングが成功する可能性が高いお客様かどうかを判別することができます。

AIが判定したお客様にフォーカスして営業活動すれば成績が上がること間違いなしですね。

終わり。

参考

Machine Learning Classification with Python for Direct Marketing:

https://towardsdatascience.com/machine-learning-classification-with-python-for-direct-marketing-2da27906ddac