質問: Python、機械学習についてここ1週間くらいでやりはじめた初心者です。 とても初歩的な質問で申し訳ありませんが、何卒お願いします。 Pythonを使ってロジスティック回帰分析をしようと思っています。 以下のようなユーザーデータを持っています。 年齢・性別・年収と、購入したかどうかの0or1のフラグです。 > > ユーザid, 年齢, 性別, 年収, 購入フラグ > > 1 , 30, 男, 500, 1 > > 2 , 40, 女, 400, 0 > > ・・・ > > > 年齢低いほど購入されてる?年収高いほど購入される? みたいなことをロジスティック回帰で分析しようと思っています。 これ自体はscikit-learnで出来そうということはネットで見てわかるのですが、 その影響度合いがどれくらい強いか?を出す方法が見当たりませんでした。 P値みたいな話だとおもうのですが、、、 良きやりかたを知っている方、教えて頂けますと幸いです・・
回答: このデータの分析は、Kaggleの初心者向けの有名な課題「Titanic : Machine Learning from Disaster」のタイタニック号の乗客の生存予測とよく似ているので、タイタニック号のデータを使って、ロジスティック回帰分析を簡単にやってみると次のようになります。まず、データマイニングをします。Pclassは、船室の等級で1等、2等、3等があって1等が上級です。 ``` import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression def load_file_train(): train_df = pd.read_csv("../input/train.csv") cols = ["Pclass", "Sex", "Age"] #男性を1、女性を0に設定 train_df["Sex"] = train_df["Sex"].apply(lambda sex:1 if sex=="male" else 0) #年齢がないデータの年齢を平均年齢にする train_df["Age"] = train_df["Age"].fillna(train_df["Age"].mean()) train_df["Fare"] = train_df["Fare"].fillna(train_df["Fare"].mean()) survived = train_df["Survived"].values data = train_df[cols].values return survived, data survived,data_train = load_file_train() model = LogisticRegression() model.fit(data_train, survived) ``` 分析の計算はすべてscikit-learnがやってくれるので、学習用データを入力するとモデルが作成されます。 モデルが適当かどうかは、準備したデータの20%〜30%程度をテストデータにしておいて、次のようにpredictkコマンドで予測させて、評価・検証をします。 ``` predicted = model.predict(data_test) ``` 例えば、1等船室の20歳の女性の生存確率は、predict_probaで次のようにして計算できます。 ``` model.predict_proba([[1, 0, 20]]) ``` 船室の等級、性別、年齢と生存確率の相関については、coef_で表示でき次のようになり、船室の等級が上位、女性、年齢は若いほど生存確率が高かったということになります。 ``` model.coef_ array([[-0.97924449, -2.4057234 , -0.02413822]]) ``` モデルを立てて予測をするまでの必要はなく、年齢、年収の影響度合いがどれくらい強いかを調べたいのであれば、重回帰分析の方がP値を求めることができるので適していると思います。 重回帰分析をする場合には、年齢と年収を階級区分にして、グループ集計をして購入割合を計算してから分析します。また、グループ集計をした結果をmatplotlibでグラフにしてやるとデータの内容についての理解が深まります。