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

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

ただいまの
回答率

90.01%

データの並びを比較して正答率(スコア)を算出する方法

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 335
退会済みユーザー

退会済みユーザー

あるデータを元に算出した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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

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

素直に正解率の計算でいいと思います。一致箇所の数を長さで割るだけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/11 00:09

    一致した箇所の箇所の数が同じでも、Aが右にずれるほどスコアが下がるので、それをどう考えるかが問題ですね。

    キャンセル

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.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる