データの並びを比較して正答率(スコア)を算出する方法
解決済
回答 4
投稿
- 評価
- クリップ 0
- VIEW 121
あるデータを元に算出したA,Bの集団があります。そのデータをスコア順で並べた時、理想(正解)は以下の様になります。
A,A,A,A,B,B,B,B
Aのデータは左に寄ってBのデータは右に寄るのが理想です。
しかし、実際にこのA,Bを並べてみると
B,A,A,B,A,A,B,B
の様に並んだとします。この時、正解の並びから実際に並んだAとBのスコア(正答率)を出したい時、どの様に計算すればよいかわかりません。
イメージとしては、正解の並び通りに並ぶとA,B共に正答率100%、Aが右かBが左にズレるほどスコアが小さくなり正答率が落ちる様にしたいです。
使用している言語はPythonです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
バブルソートしてスワップした回数を数えるのはいかがでしょうか(大きいほど正答率は低い)。
数え方はHow to count number of swaps in a bubble sort?が参考になるかと。
# 「スワップ率」
def swap_rate(l):
# 必要スワップ回数
def swap_count(l):
count = 0
for j in range(len(l)):
for i in range(1, len(l)-j):
if l[i-1] > l[i]:
count += 1
l[i-1], l[i] = l[i], l[i-1]
return count
# 最悪スワップ回数
def max_count(l):
from collections import Counter
c = Counter(l)
assert len(c.values()) == 2 # 2種類のみで構成されたリスト
l_len = len(l)
max_cnt = 1
for v in c.values():
max_cnt *= l_len - v
# 検算
#l2 = sorted(l,reverse=True)
#assert swap_count(l2) == max_cnt
return max_cnt
swap_cnt = swap_count(l)
max_cnt = max_count(l)
return 1 - (swap_cnt/max_cnt)
for s in ['AAAABBBB','BBBBAAAA','AAABABBB','BAAABBBA','BAABAABB']:
r = swap_rate(list(s))
print(s,r)
"""
AAAABBBB 1.0
BBBBAAAA 0.0
AAABABBB 0.9375
BAAABBBA 0.5625
BAABAABB 0.625
"""
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
ド単純で恐縮ですが。
基礎を100%として、
一番左にB もしくは 一番右にA がある場合⇒それぞれ -21.875 %
左から2番目にB もしくは 右から2番目にA がある場合⇒それぞれ -15.625 %
左から3番目にB もしくは 右から3番目にA がある場合⇒それぞれ -9.375 %
左から4番目にB もしくは 右から4番目にA がある場合⇒それぞれ -3.125 %
値は4番目と5番目の間(言わば4.5番目)を中央(0)としてその距離で取り、
全て足すとマイナス100%になるようにしています。
can110さんの例を借ります。
'AAAABBBB' 100%
'BBBBAAAA' 0% (100-21.875-15.625-9.375-3.125-3.125-9.375-15.625-21.875)
'AAABABBB' 93.75% (100-3.125-3.125)
'BAAABBBA' 50% (100-21.875-3.125-9.375-15.625)
'BAABAABB' 62.5% (100-21.875-3.125-3.125-9.375)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
素直に正解率の計算でいいと思います。一致箇所の数を長さで割るだけです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Bの位置が右側にあるほど高い値…ということで,
簡単に,データ列内のBの位置のindexの総和とかを考えるとどうでしょう.
(indexが0から始まるとして)
最良の
A,A,A,A,B,B,B,B の場合,総和は 4+5+6+7 = 22
最悪の
B,B,B,B,A,A,A,A の場合,総和は 0+1+2+3 = 6
↓
6~22の範囲を適当に正規化する
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる