🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

3回答

2200閲覧

pythonによるデータ解析(ロジスティック解析)をしたのですが行き詰まってます・・

pickle

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2019/09/24 10:28

python初学者です。また、統計の勉強についても不足していると自覚しております。
今回はpythonによって手持ちのデータのロジスティック回帰分析を行っていた所、数カ所で行き詰まり、疑問が生じているので、ご回答頂けますと幸いです。

イメージ説明

こちらの画像にあるとおり、OUT[5]にあるようなdfというファイルを読み込み(実際のn数276)、
目的変数を"outcome"、説明変数を"sex","age","a","b",・・・,"m"としてロジスティック回帰分析をしたいと思っています。

In[7]のように正解率を出して、過学習が起きてないことを確認し、

イメージ説明

の様に各説明変数のオッズ比を出しました。(方法A)

また、別のサイトを参考に以下の様にコマンドを記述しても行いました。

イメージ説明

ここのcoef_の一つ一つに以下の様に計算すとオッズ比がでるのかと思います。(方法B)

イメージ説明

ここで幾つか疑問(行き詰まり)があります。

①方法Aと方法Bでは、それぞれの説明変数のオッズ比がずれている様なのですが、その理由がわかりません

②各説明係数のオッズ比を出す際のp値を出すことは出来ませんでしょうか?

③In[7]の部分で、"sex","age"を除いているのですが、それらを入れると以下の様なerrorが出てしまいます。
"sex"や"age"がfloat型でないからかと思いますが、こちらを解消する方法はありますでしょうか?
イメージ説明
イメージ説明

長文となり、申し訳ありませんが、ご回答頂けますと幸いです。
何卒宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

statsmodelsでやる場合は、デフォルト設定だとバイアス抜きのモデルになります。scikit-learnはデフォルトで足します。

statsmodelsの方でも足してあげると良いでしょう。

statsmodels.tools.tools.add_constant — statsmodels

あとは最適化の方法などが違ったり、正則化などの絡みで微妙にずれるでしょう。

p値はstatsmodelsではデフォルトで出ています。scikit-learnでは計算が必要です(とてもというほどでもないが面倒臭いのでおすすめしない。英語で調べると多分出てきます)。

投稿2019/09/24 10:55

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pickle

2019/09/24 15:48

そうなのですね、scikit-learnで複雑にやるより、simpleにpvalueも表示してくれるstatsmodelsを使用した方がよさそうですね。statsmodelsを使用して表示して、np.exp(result.params)としてオッズ比も出すことができました。ありがとうございました!
guest

0

ベストアンサー

1.オッズ比不一致の件
haytaka2049さんの通りで、statsmodelsは定数項(バイアス)がないモデルがデフォルトなので、結果として係数が相違します。(result.summaryをみると定数項がないことがわかります)

2.p値出力方法の件
scikitlearnのロジスティック回帰にはp値を出力する機能がないので自力実装が必要です。以下を参考にするといいかと思います。

https://gist.github.com/brentp/5355925

3.エラー対策
エラーの原因は性別が数値情報ではないことです。よって、男性を0、女性を1と数値に変換しておけばエラーは回避できると思います

投稿2019/09/24 19:09

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pickle

2019/09/25 12:28

1. haytaka2049さんにも指摘頂き、理解しました。★数学的な疑問となるかと思いますが、定数項を定めたロジスティック解析(scikitlearnを用いるか、定数項を定めてstatsmodelsを用いる)、または定数項を定めないロジスティック解析(statsmodelsをそのまま用いる)はどのように使い分けをすれば良いのでしょうか?ご存じでしたらご教授頂けますと幸いです。 2.参照ページありがとうございます。 3.基本的事項ですみません。理解しました。
R.Shigemori

2019/09/25 23:27

scikitlearnとstatsmodelsの相違はパラメーターの求め方です。scikitlearnはクロスエントロピー誤差をコストとして定義し、コストを最小化するパラメーターを探索します。一方、statsmodelsは最尤推定を用いています。最尤推定は所定の確率分布(ロジスティック回帰の場合はlogit分布)を前提に尤もらしさ(尤度)を最大化するパラメーターを探索します。 よって得られる結果に大差はないので、好みで使い分けばいいと思います。ただモジュールの機能でいうと、statsmodelsはRを意識した出来なので、統計屋的分析がやりたいのであればstatsmodelsのほうがいいでしょう。 定数項の要否ですが個人的には定数項ありで学習させて、P値を踏まえて外すというやりかたがいいと思います。これなら結構機械的でいろいろ悩む必要がないのではないでしょうか
pickle

2019/09/28 03:04

丁寧にご回答頂き、ありがとうございました!また、返信が遅くなり大変失礼致しました。 scikitlearnとstatsmodelsによる求め方の違い、使い分け、わかりやすくありがとうございます。 定数項についてもそのようにやってみます。色々とご教授頂き、誠にありがとうございました。今後ともご教授頂けますと幸いです。
guest

0

>"sex"や"age"がfloat型でないからかと思います
sex='M'→sex_m=1,sex_f=0
sex='F'→sex_m=0,sex_f=1
のように変換してやればエラーにならないかと思います。
one-hotエンコーディングで調べてみてください。

投稿2019/09/24 10:37

nandymak

総合スコア799

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pickle

2019/09/24 15:45

ご回答ありがとうございます。 完全な初心者でそこから調べつつですがやってみます、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問