質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

249閲覧

正解率が最低となる説明変数の組み合わせを求めたい

takayoukey

総合スコア21

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/12/21 08:08

説明変数の影響を調べるため、正解率が最低となる説明変数の組み合わせを抽出したいです。

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 "説明変数1": ["A", "A", "A", "B", "B"], 5 "説明変数2": ["C", "C", "D", "D", "C"], 6 "説明変数3": ["E", "E", "F", "F", "E"], 7 "データ数": [10, 20, 30, 10, 10], 8 "正解数": [8, 8, 8, 4, 5], 9 "正解率": [0.8, 0.4, 0.8, 0.4, 0.5] 10}) 11 12group = df.groupby(["説明変数1", "説明変数2", "説明変数3"]).sum() 13group["正解率"] = group["正解数"] / group["データ数"] 14 15print(group) 16 17# データ数 正解数 正解率 18# 説明変数1 説明変数2 説明変数3 19# A C E 30 16 0.533333 20# D F 30 8 0.266667 21# B C E 10 5 0.500000 22# D F 10 4 0.400000

上記のコードで、元データに(A,C,E)の組み合わせは2つありますが、groupbyされて全ての組み合わせが抽出できます。
さらにここから説明変数を2つに限定したときの、最悪の組み合わせから順にソートされた結果が欲しいです。

2つの説明変数に限定すると
・組み合わせ(C,E):(16 + 5) / (30 + 10) = 0.525
・組み合わせ(D,F):(8 + 4) / (30 + 10) = 0.3
というパターンも考えられます。

最終的な出力としては下記のようにイメージしています。
・(A,D) = 0.266667
・(A,F) = 0.266667
・(D,F) = 0.3
・(B,D) = 0.4
・(B,F) = 0.4

欲を言えば、2つでなく3つ以上の場合を設定できたり、(A,D)と(A,F)のように一つの組み合わせ(A,D,F)が分解されているような場合は、(A,D)と(A,F)は表示されずに(A,D,F)が表示されるようになるとなお良いです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず書いてみました。
こんな感じでどうでしょうか。

Python

1import pandas as pd 2import itertools 3 4df = pd.DataFrame({ 5 "説明変数1": ["A", "A", "A", "B", "B"], 6 "説明変数2": ["C", "C", "D", "D", "C"], 7 "説明変数3": ["E", "E", "F", "F", "E"], 8 "データ数": [10, 20, 30, 10, 10], 9 "正解数": [8, 8, 8, 4, 5], 10 "正解率": [0.8, 0.4, 0.8, 0.4, 0.5] 11}) 12 13l = [] 14for grp in itertools.combinations(["説明変数1","説明変数2","説明変数3"], 2): 15 tmp = df.groupby(grp).sum().loc[:,['データ数', '正解数']] 16 tmp.index = tmp.index.rename(['説明変数A','説明変数B']) 17 l.append(tmp) 18group = pd.concat(l).sort_index() 19 20group["正解率"] = group["正解数"] / group["データ数"] 21print(group) 22# データ数 正解数 正解率 23#説明変数A 説明変数B 24#A C 30 16 0.533333 25# D 30 8 0.266667 26# E 30 16 0.533333 27# F 30 8 0.266667 28#B C 10 5 0.500000 29# D 10 4 0.400000 30# E 10 5 0.500000 31# F 10 4 0.400000 32#C E 40 21 0.525000 33#D F 40 12 0.300000

投稿2018/12/21 09:57

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問