こんにちは!神楽 朔です。
このノートは、SIGNATEの「銀行の顧客ターゲティング」練習問題を、プログラミング初心者でも理解できるように丁寧に解説するものです。
どんなお客さんが定期預金を契約してくれそうか、データから予測するAIを作ってみましょう!
STEP 0:準備しよう!
- Google Colabを開く: Googleアカウントでログインし、新しいノートブックを作成します。
-
データをアップロード: SIGNATEからダウンロードしたデータ(
train.csv
,test.csv
,submit_sample.csv
)を、Colabの画面左側にあるフォルダアイコンの場所にドラッグ&ドロップします。
STEP 1:ライブラリのインポート(道具を揃えよう!)
【このステップの目的】
これからデータ分析やAIモデル作りで使う「便利な道具(ライブラリ)」を、最初にまとめてパソコンに読み込ませます。料理でいう「包丁やまな板、フライパンをキッチンに用意する」のと同じです。
【コード】
# ---------------------------------------------
# 1. ライブラリのインポート
# ---------------------------------------------
# 細かい警告を非表示にするおまじない
import warnings
warnings.simplefilter('ignore')
# データ分析の必須道具
import pandas as pd
import numpy as np
# グラフ作成の道具
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語表示のため(!pip install japanize_matplotlib が必要)
%matplotlib inline
# AIモデル(機械学習)関連の道具
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score
from sklearn.preprocessing import StandardScaler # 数値データのスケールを揃える道具
STEP 2:データの読み込み(材料をまな板に乗せよう!)
【このステップの目的】
ダウンロードしたCSVファイルを読み込んで、分析しやすい表(DataFrame)の形にします。そして、どんなデータが入っているか、最初の数行を眺めてみましょう。
【コード】
# ---------------------------------------------
# 2. データの読み込み
# ---------------------------------------------
# 訓練データとテストデータを読み込む
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submit_sample = pd.read_csv('submit_sample.csv', header=None)
# どんなデータが入っているか確認!
print("--- 訓練データ (最初の5行) ---")
display(train.head())
print("\n--- データの基本情報 ---")
# .info()を使うと、各列のデータ型や欠損値の有無がわかる
train.info()
-
train.csv
: AIの学習用データ。「定期預金を契約したか(y
)」という正解ラベルが含まれています。 -
test.csv
: AIが予測するための本番テスト用データ。y
列はありません。 -
object
と表示されている列は「文字列」、int64
は「数値」のデータです。
STEP 3:データの可視化(材料を観察しよう!)
【このステップの目的】
グラフなどを使ってデータを「目で見て」、どんな特徴があるのかを探ります。これをEDA(探索的データ分析) と言います。どんなお客さんが契約してくれやすいか、傾向を掴んでみましょう。
【コード】
# ---------------------------------------------
# 3. データの可視化
# ---------------------------------------------
# 1. 契約した人(1)と、しなかった人(0)の人数を棒グラフで見る
plt.figure(figsize=(6, 4))
sns.countplot(x='y', data=train)
plt.title('契約(1) vs 非契約(0) の人数')
plt.show()
# 圧倒的に契約しなかった人(0)が多い「不均衡データ」だとわかります
# 2. どんな職業の人が契約しやすいか見てみる
plt.figure(figsize=(10, 5))
# groupby('job')['y'].mean() で、職業ごとに契約率(yの平均値)を計算
train.groupby('job')['y'].mean().sort_values(ascending=False).plot.bar()
plt.title('職業別の契約率')
plt.ylabel('契約率')
plt.show()
# student(学生)やretired(退職者)の契約率が高い傾向が見えますね
# 3. 年齢と契約の関係を箱ひげ図で見る
plt.figure(figsize=(6, 4))
sns.boxplot(x='y', y='age', data=train)
plt.title('契約有無と年齢の関係')
plt.show()
# 契約した人(1)の方が、年齢の中央値が少し高いようです
STEP 4:データの前処理(材料の下ごしらえをしよう!)
【このステップの目的】
AIは「学生」「既婚」のような文字列をそのまま学習できません。そこで、これらの文字列データを数値に変換する作業を行います。今回はOne-Hot Encoding(ワンホットエンコーディング)という手法を使います。
これは、「job
」のような1つの列を、「job_student
」「job_retired
」…のように、カテゴリーごとに0か1で表現する複数の列に分割する方法です。
【コード】
# ---------------------------------------------
# 4. データの前処理
# ---------------------------------------------
# 訓練データとテストデータを一旦結合して、まとめて前処理を行う
# これにより、訓練データにしかない/テストデータにしかないカテゴリがあってもエラーを防げる
all_data = pd.concat([train.drop('y', axis=1), test], axis=0)
# One-Hot Encoding を実行
# get_dummiesは、文字列の列を自動で探し出し、0/1の数値列に変換してくれる便利な関数
all_data_encoded = pd.get_dummies(all_data, drop_first=True)
# 処理が終わったら、再び訓練データとテストデータに分割
train_processed = all_data_encoded.iloc[:len(train)]
test_processed = all_data_encoded.iloc[len(train):]
# 正解ラベルを y として保存
y = train['y']
# 処理後のデータを確認
print("--- 前処理後のデータ (最初の5行) ---")
display(train_processed.head())
STEP 5:学習と評価(AIに特徴を覚えさせよう!)
【このステップの目的】
いよいよAIモデルの登場です。今回は「契約する確率」を予測するのに適したロジスティック回帰というモデルを使います。
- データを分割: 手持ちの訓練データを「練習問題(訓練用)」と「確認テスト(検証用)」に分けます。
- 学習と評価: AIに練習問題を解かせて(学習)、確認テストでどれくらいの実力か(精度)を評価します。
【コード】
# ---------------------------------------------
# 5. 学習・評価
# ---------------------------------------------
# 1. データを練習問題(訓練用)と確認テスト(検証用)に分ける
X_train, X_valid, y_train, y_valid = train_test_split(
train_processed, y, test_size=0.25, random_state=42, stratify=y
)
# 2. AIモデル(ロジスティック回帰)を準備
# class_weight='balanced'は、不均衡データに対応するための重要なおまじない
model = LogisticRegression(random_state=42, class_weight='balanced')
# 3. 練習問題で学習させる
model.fit(X_train, y_train)
# 4. 確認テストを解かせて、その精度を評価する
# predict_probaで「契約する確率」を予測
valid_proba = model.predict_proba(X_valid)[:, 1]
# roc_auc_scoreで、このコンペの評価指標であるAUCスコアを計算
score = roc_auc_score(y_valid, valid_proba)
print(f'AIモデルの精度 (AUCスコア): {score:.4f}')
AUCスコアは、0から1の値を取り、1に近いほど良いモデルとされます。0.8以上出ていれば、かなり良い精度と言えるでしょう。
STEP 6:予測と提出(本番のテストに挑戦しよう!)
【このステップの目的】
学習させたAIモデルに、答えのわからない「本番のテスト(テストデータ)」を解かせます。その解答(契約する確率)を、指定された形式のファイルにして提出します。
【コード】
# ---------------------------------------------
# 6. 予測・結果の提出
# ---------------------------------------------
# テストデータで「契約する確率」を予測
predictions = model.predict_proba(test_processed)[:, 1]
# 提出用のファイルを作成
submit_sample[1] = predictions
submit_sample.to_csv('my_submission.csv', header=None, index=False)
print('提出ファイル "my_submission.csv" を作成しました!')
print('Colabの左側フォルダからダウンロードして、SIGNATEに提出してみましょう!')
おわりに
お疲れ様でした!
これで、データの読み込みから特徴の観察(EDA)、AIが学習できる形へのデータ加工(前処理)、そしてモデルの学習と予測まで、データ分析の一連の流れをすべて体験することができました。
作成したmy_submission.csv
をSIGNATEに提出して、自分の作ったAIがどれくらいのスコアを出すか、ぜひ確認してみてください。
今回のチュートリアルは、あくまでスタート地点です。
より高いスコアを目指すなら、以下のような改善にチャレンジしてみるのも面白いでしょう。
-
特徴量の追加: 今回は使わなかった
balance
(預金残高)やduration
(通話時間)などの数値データも、学習に使ってみるとどうなるでしょうか?(ヒント:StandardScaler
という道具でスケールを揃えると、うまくいくかもしれません) -
モデルの変更:
ロジスティック回帰
の代わりに、コンペで人気のLightGBM
という、より強力なモデルを使ってみる。 -
EDAの深掘り: 月(
month
)や曜日(day
)と契約率の関係など、今回見なかったデータの特徴をさらに探ってみる。
データ分析の面白さは、このように「もっと良くするにはどうすればいいか?」と試行錯誤し、データと対話しながら精度を上げていく過程にあります。
この記事が、皆さんがデータサイエンスの世界でさらに探求を深めるための、確かな一歩となれば幸いです。