AIでアンケートを分析する方法|複数選択の人数・件数・分母を確認

架空8件で有効回答7人・無回答1人・延べ選択12件を検算。分母別の割合、100%超、無料で試す範囲と説明案を分けます。

AIものさし編集部

AIでアンケートを分析するときは、質問が単一回答か複数選択か、割合の分母は誰かを先に決めます。複数選択では、一人が複数の項目を選べるため、項目別の割合を足すと100%を超えることがあります。合計を100%へそろえるために値を変えないでください。

この記事では、架空の研修アンケート8件から、回答者数、未回答数、選択件数を分けて計算します。Pythonの集計はローカルで確認しましたが、AIサービスへの投入や実際の受講者調査は行っていません。

まず質問と、次に決めることを固定する

質問は「次回の研修で補ってほしい内容を、いくつでも選んでください」です。選択肢Aは基本操作、Bは事例、Cは質疑とします。結果は、次回の内容を検討するための材料です。この質問だけで各内容の効果や、実施すべき優先順位が決まるとはしません。

Googleフォームの公式説明でも、ラジオボタンは一つを選ぶ形式、チェックボックスは複数を選べる形式として区別されています。集計前に、設問と実際の回答形式を確認してください。Google公式:質問の形式(新しいタブで開く)

今回は1行が一人の回答で、IDは重複せず、R03以外はこの質問へ回答したという架空条件です。R03の無回答は、どの内容も不要と答えた意味には変えません。

表は横にスクロールできます

回答ID選んだ項目
R01A、B
R02B
R03無回答
R04A、C
R05A、B、C
R06A
R07C
R08B、C

実データでは、再回答、同じ人の重複、質問が表示されなかった人、明示的な「該当なし」も区別します。元データの空欄を、AIが一律に「希望なし」へ置き換えないようにします。

回答者数と、選択された延べ件数を分ける

全体は8人、この質問に少なくとも一つ答えた人は7人、無回答は1人です。Aを選んだ人はR01・R04・R05・R06の4人です。BはR01・R02・R05・R08、CはR04・R05・R07・R08で、それぞれ4人です。

項目を選んだ延べ件数は4 + 4 + 4 = 12件です。12人が回答したのではありません。例えばR05は一人ですが、A・B・Cの各項目へ1件ずつ加わります。

表は横にスクロールできます

数えるもの今回の値意味
全回答者8人この架空一覧の人数
質問への有効回答者7人一つ以上選択した人
質問への無回答者1人何も選ばなかった行
延べ選択件数12件すべての項目の選択数の合計

「有効」の条件は今回の集計で定めたものです。すべての調査で空欄を同じように除外してよい、という共通ルールではありません。

どの割合かを、列名へ書く

有効回答者7人を分母にすると、各項目は4 ÷ 7で約57.1%です。全回答者8人なら4 ÷ 8 = 50%。延べ選択12件を分母にすると4 ÷ 12で約33.3%です。

表は横にスクロールできます

項目選択者数有効回答者7人のうち全回答者8人のうち延べ選択12件のうち
A:基本操作4人約57.1%50%約33.3%
B:事例4人約57.1%50%約33.3%
C:質疑4人約57.1%50%約33.3%

「何人がその項目を希望したか」という問いなら、回答者を分母にした割合を使い、どの回答者を含めたかを示します。「選択全体の中で占める割合」なら延べ選択が分母です。後者を、受講者の何割が希望したかという説明へ使いません。

有効回答者を分母にした3項目の割合は、丸め前では合計約171.4%になります。複数選択なので、それだけで計算誤りとは言えません。各行を57.1%に丸めてから足すと171.3%になるため、合計は丸め前の値から計算します。延べ選択を分母にした割合は、丸め前なら合計100%ですが、各行を33.3%と表示すると99.9%になります。表示の丸めと計算値を分けます。

計算は元IDと選択肢を残して照合する

次は掲載8件を数える例です。空のリストを今回の無回答として扱います。Counterは項目の出現数を数えるために使います。Python公式:Counter(新しいタブで開く)

from collections import Counter
from fractions import Fraction as F

responses = [
    ("R01", ["A", "B"]), ("R02", ["B"]), ("R03", []),
    ("R04", ["A", "C"]), ("R05", ["A", "B", "C"]),
    ("R06", ["A"]), ("R07", ["C"]), ("R08", ["B", "C"]),
]
allowed = {"A", "B", "C"}
ids = [row_id for row_id, _ in responses]
if len(set(ids)) != len(ids):
    raise ValueError("duplicate response ID")
for row_id, choices in responses:
    if len(set(choices)) != len(choices):
        raise ValueError("same option repeated within a response")
    if not set(choices) <= allowed:
        raise ValueError("unknown option")

counts = Counter(c for _, choices in responses for c in choices)
valid = sum(bool(choices) for _, choices in responses)
missing = len(responses) - valid
selections = sum(counts.values())
assert (len(responses), valid, missing, selections) == (8, 7, 1, 12)
assert counts == {"A": 4, "B": 4, "C": 4}
for option in ("A", "B", "C"):
    print(option, counts[option], F(counts[option], valid),
          F(counts[option], len(responses)),
          F(counts[option], selections))

出力の分数は各項目で4/7、1/2、1/3です。パーセント表示は最後に作ります。このコードは掲載例の構造を前提にした集計で、任意のCSVの型や必須列を検証する読込器ではありません。

一人の選択肢にAが二つ入った場合、黙って2件へ増やしたり、勝手に片方を削除したりせず、この例ではエラーとして戻します。重複が再回答の展開など別の意味を持つなら、その構造を確認してから規則を決めます。全員が無回答なら、今回の有効回答者・延べ選択を分母にする割合は計算できません。0%で埋めず、その理由を示します。

無料で小さく試す場合も、集計と説明を分ける

費用をかけずに確認範囲を作るなら、先に手元で少数の架空データを集計し、利用できるAIへ集計表から説明案を頼む方法があります。ファイル添付や分析機能を使えるか、無料枠の上限は製品・利用時の条件で確認します。本稿では特定サービスの無料枠で何件処理できるかを実測していません。

表を渡す場合は、人数、無回答、延べ選択、分母を一緒に示します。回答の原文や個人情報を全部渡さなくても、今回のような件数の説明案は集計表を入力にできます。ただし、集計表を正しく作れたかの確認は手元で残します。

次の複数選択アンケートの集計表から、短い説明案を作ってください。
全回答者8人、有効回答者7人、無回答1人、延べ選択12件です。
A・B・Cはそれぞれ4人が選択しました。
有効回答者を分母にした割合と、延べ選択を分母にした割合を混ぜないでください。
割合の合計を100%にするための再配分はしないでください。
分かるのはこの架空回答者の選択状況であり、原因や施策の効果は推測しないでください。
出力:観察した件数と割合、分母、分からないこと、次に確認する問い。

説明例は「8人中7人が回答し、A・B・Cは各4人が選択。有効回答者の約57.1%ずつで、複数選択のため合計は100%を超える」です。「全受講者の希望が同じ」「基本操作を増やせば満足度が上がる」といった結論は、この表からは出しません。

次の行動は、回答数だけで確定しない

今回は3項目の選択者数が同じです。件数だけで優先順位は付けられません。次回の研修の目的、各内容に必要な時間、受講者が困っている具体的な場面などを確認し、必要なら追加質問を作ります。

共有する表には、設問、複数選択であること、対象人数、無回答、各割合の分母、集計日を添えます。元IDが必要な検算用の表と、受け手へ共有する集計表の範囲も分けます。

AIには件数表の説明や確認事項の整理を頼み、集計条件と、回答から言える範囲を人が確認します。合計が100%を超えたことだけを直すのではなく、何を分母として何を数えた結果かを説明できる状態にしてください。

参考資料

公式資料の確認日:2026年10月20日。8件は独自の架空データです。掲載Pythonと分母別の計算をローカルで照合しました。実際の回答者、AIサービス、無料枠での処理件数、分析精度、施策効果、画面表示は検証していません。

次に読む・使う

この記事の次に必要な情報へ進めます。