mcpField
S
survey-analysis

survey-analysis

github.com/happy-technologies-llcデータ・データベース4142 回インストール2 日前に更新
リポジトリ

survey-analysis について

ServiceNow のアンケートや評価回答を分析するスキルです。顧客満足度、従業員エンゲージメント、サービス品質を把握したいチーム向けに、設問別統計、時系列比較、組織別分析と改善案を提供します。

主な機能

  1. 01アンケート得点と回答の集計
  2. 02期間ごとの傾向比較
  3. 03部門やグループ別の結果分析
  4. 04平均値・中央値・分布の算出
  5. 05得点傾向に基づく改善案

活用シーン

  1. 01CSAT アンケート結果の分析
  2. 02従業員エンゲージメントの推移確認
  3. 03部門の満足度低下の調査

MCP 対応

ServiceNow MCP ツールでアンケート定義、インスタンス、回答を検索し、集計、傾向分析、分類を実行して、レコードにレポートを記録します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill survey-analysis

インストール後、Claude Code で/survey-analysisを入力して読み込まれたか確認します。

詳細

アンケート分析

概要

このスキルでは、ServiceNow におけるアンケートおよび評価の回答を体系的に分析できます。次の内容を扱います。

  • asmt_assessment_instance と asmt_assessment_instance_question からアンケートのスコアを集計する
  • 詳細な内訳を把握するため、survey_response の個々の回答データを分析する
  • 評価結果を比較し、期間をまたいだ傾向を特定する
  • 部門、所在地、グループ、カスタムディメンションで回答をセグメント化する
  • 各質問について、統計的な要約(平均値、中央値、分布)を生成する
  • スコアのパターンに基づき、実行可能な改善案を作成する

使用する場面: 顧客満足度(CSAT)、従業員エンゲージメント、サービス品質に関するアンケート、または ServiceNow Performance Analytics の評価やアンケートで収集した評価データを分析する場合です。

提供価値: 生のアンケートデータを実行可能なインサイトに変換し、組織全体の問題になる前に注意が必要な領域を特定して、改善施策に向けたデータに基づく提案を行います。

前提条件

  • プラグイン: com.snc.assessment(Assessment and Survey)、com.snc.pa(Performance Analytics、任意)
  • ロール: assessment_admin、survey_admin、pa_admin、または admin
  • アクセス権: asmt_assessment_instance、asmt_assessment_instance_question、survey_response、および関連するメトリックテーブルへの読み取りアクセス
  • 知識: アンケートの構成、スコア尺度、組織階層に関する理解

手順

ステップ 1:アンケートまたは評価を特定する

アンケートの定義を見つけ、その構成を確認します。

MCP を使用する場合(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: asmt_metric_definition
  query: active=true^typeLIKEsurvey^ORtypeLIKEassessment
  fields: sys_id,name,description,type,category,state,evaluation_method,scale,number_of_responses
  limit: 20
  order_by: name

REST API を使用する場合:

GET /api/now/table/asmt_metric_definition?sysparm_query=active=true&sysparm_fields=sys_id,name,description,type,category,state,evaluation_method,scale,number_of_responses&sysparm_limit=20&sysparm_display_value=true

アンケートの質問/メトリックを取得する:

Tool: SN-Query-Table
Parameters:
  table_name: asmt_metric
  query: metric_definition=[definition_sys_id]^active=true
  fields: sys_id,name,question,datatype,weight,scale,min_value,max_value,order,category
  limit: 50
  order_by: order
ステップ 2:評価インスタンスを取得する

分析対象となる、完了済みアンケートのインスタンスを取得します。

MCP を使用する場合:

Tool: SN-Query-Table
Parameters:
  table_name: asmt_assessment_instance
  query: metric_type=[definition_sys_id]^state=complete^taken_on>=javascript:gs.monthsAgoStart(3)
  fields: sys_id,number,metric_type,user,taken_on,percent,state,group,department,trigger_id
  limit: 100
  order_by: -taken_on

REST API を使用する場合:

GET /api/now/table/asmt_assessment_instance?sysparm_query=metric_type=[definition_sys_id]^state=complete^taken_on>=javascript:gs.monthsAgoStart(3)&sysparm_fields=sys_id,number,metric_type,user,taken_on,percent,state,group,department&sysparm_limit=100&sysparm_display_value=true
ステップ 3:質問ごとにスコアを集計する

アンケートの各質問について、回答の分布を分析します。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  description: Aggregate survey scores by question
  script: |
    var definitionId = '[definition_sys_id]';
    var startDate = gs.monthsAgoStart(3);
    var results = { survey: '', period: 'Last 3 months', total_responses: 0, questions: [] };

    var def = new GlideRecord('asmt_metric_definition');
    def.get(definitionId);
    results.survey = def.name.toString();

    // Count total responses
    var countGa = new GlideAggregate('asmt_assessment_instance');
    countGa.addQuery('metric_type', definitionId);
    countGa.addQuery('state', 'complete');
    countGa.addQuery('taken_on', '>=', startDate);
    countGa.addAggregate('COUNT');
    countGa.query();
    if (countGa.next()) results.total_responses = parseInt(countGa.getAggregate('COUNT'));

    // Get questions
    var metrics = new GlideRecord('asmt_metric');
    metrics.addQuery('metric_definition', definitionId);
    metrics.addQuery('active', true);
    metrics.orderBy('order');
    metrics.query();

    while (metrics.next()) {
      var question = {
        name: metrics.name.toString(),
        question_text: metrics.question.toString(),
        responses: 0,
        avg_score: 0,
        min_score: 999,
        max_score: 0,
        distribution: {}
      };

      var qa = new GlideAggregate('asmt_assessment_instance_question');
      qa.addQuery('metric', metrics.sys_id);
      qa.addQuery('instance.state', 'complete');
      qa.addQuery('instance.taken_on', '>=', startDate);
      qa.addAggregate('AVG', 'value');
      qa.addAggregate('MIN', 'value');
      qa.addAggregate('MAX', 'value');
      qa.addAggregate('COUNT');
      qa.query();

      if (qa.next()) {
        question.responses = parseInt(qa.getAggregate('COUNT'));
        question.avg_score = parseFloat(qa.getAggregate('AVG', 'value')).toFixed(2);
        question.min_score = parseFloat(qa.getAggregate('MIN', 'value'));
        question.max_score = parseFloat(qa.getAggregate('MAX', 'value'));
      }

      // Score distribution
      var dist = new GlideAggregate('asmt_assessment_instance_question');
      dist.addQuery('metric', metrics.sys_id);
      dist.addQuery('instance.state', 'complete');
      dist.addQuery('instance.taken_on', '>=', startDate);
      dist.addAggregate('COUNT');
      dist.groupBy('value');
      dist.query();

      while (dist.next()) {
        question.distribution[dist.value.toString()] = parseInt(dist.getAggregate('COUNT'));
      }

      results.questions.push(question);
    }

    gs.info(JSON.stringify(results, null, 2));
ステップ 4:期間をまたいだ傾向を特定する

期間ごとのアンケート結果を比較し、改善または悪化を検出します。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  description: Compare survey scores across monthly periods
  script: |
    var definitionId = '[definition_sys_id]';
    var trends = { survey: '', monthly_scores: [] };

    var def = new GlideRecord('asmt_metric_definition');
    def.get(definitionId);
    trends.survey = def.name.toString();

    for (var i = 5; i >= 0; i--) {
      var monthStart = gs.monthsAgoStart(i);
      var monthEnd = gs.monthsAgoEnd(i);

      var ga = new GlideAggregate('asmt_assessment_instance');
      ga.addQuery('metric_type', definitionId);
      ga.addQuery('state', 'complete');
      ga.addQuery('taken_on', '>=', monthStart);
      ga.addQuery('taken_on', '<=', monthEnd);
      ga.addAggregate('AVG', 'percent');
      ga.addAggregate('COUNT');
      ga.query();

      var monthData = {
        period: new GlideDateTime(monthStart).getMonthLocalTime() + '/' + new GlideDateTime(monthStart).getYearLocalTime(),
        avg_score: 0,
        response_count: 0
      };

      if (ga.next()) {
        monthData.avg_score = parseFloat(ga.getAggregate('AVG', 'percent')).toFixed(1);
        monthData.response_count = parseInt(ga.getAggregate('COUNT'));
      }

      trends.monthly_scores.push(monthData);
    }

    // Calculate trend direction
    var scores = trends.monthly_scores.filter(function(m) { return m.response_count > 0; });
    if (scores.length >= 2) {
      var latest = parseFloat(scores[scores.length - 1].avg_score);
      var previous = parseFloat(scores[scores.length - 2].avg_score);
      trends.trend_direction = latest > previous ? 'Improving' : latest < previous ? 'Declining' : 'Stable';
      trends.change_percentage = ((latest - previous) / previous * 100).toFixed(1) + '%';
    }

    gs.info(JSON.stringify(trends, null, 2));
ステップ 5:部門またはグループでセグメント化する

組織のディメンションごとに結果を分類し、対象を絞ったインサイトを得ます。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  description: Segment survey results by department
  script: |
    var definitionId = '[definition_sys_id]';
    var segments = [];

    var ga = new GlideAggregate('asmt_assessment_instance');
    ga.addQuery('metric_type', definitionId);
    ga.addQuery('state', 'complete');
    ga.addQuery('taken_on', '>=', gs.monthsAgoStart(3));
    ga.addAggregate('AVG', 'percent');
    ga.addAggregate('COUNT');
    ga.groupBy('user.department');
    ga.orderByAggregate('AVG', 'percent');
    ga.query();

    while (ga.next()) {
      segments.push({
        department: ga.user.department.getDisplayValue() || 'Unknown',
        avg_score: parseFloat(ga.getAggregate('AVG', 'percent')).toFixed(1),
        response_count: parseInt(ga.getAggregate('COUNT'))
      });
    }

    gs.info(JSON.stringify(segments, null, 2));
ステップ 6:自由記述の回答を分析する

自由回答形式のアンケート回答からテーマを抽出します。

MCP を使用する場合:

Tool: SN-Query-Table
Parameters:
  table_name: asmt_assessment_instance_question
  query: instance.metric_type=[definition_sys_id]^metric.datatype=string^string_valueISNOTEMPTY^instance.taken_on>=javascript:gs.monthsAgoStart(3)
  fields: string_value,metric.name,instance.taken_on,instance.user.department
  limit: 100
  order_by: -instance.taken_on

REST API を使用する場合:

GET /api/now/table/asmt_assessment_instance_question?sysparm_query=instance.metric_type=[definition_sys_id]^metric.datatype=string^string_valueISNOTEMPTY^instance.taken_on>=javascript:gs.monthsAgoStart(3)&sysparm_fields=string_value,metric.name,instance.taken_on,instance.user.department&sysparm_limit=100&sysparm_display_value=true
ステップ 7:提案レポートを作成する

分析結果をまとめ、実行可能なレポートを作成します。

MCP を使用する場合:

Tool: SN-Add-Work-Notes
Parameters:
  table_name: asmt_metric_definition
  sys_id: [definition_sys_id]
  work_notes: |
    === SURVEY ANALYSIS REPORT ===
    Survey: IT Service Satisfaction Q1 2026
    Period: January - March 2026
    Total Responses: 342

    OVERALL SCORE: 78.4% (Previous quarter: 74.2%, +5.7%)

    QUESTION BREAKDOWN:
    1. Response Time Satisfaction: 72.3% (Low - needs attention)
    2. Resolution Quality: 85.1% (Good)
    3. Communication Clarity: 81.7% (Good)
    4. Overall Experience: 74.5% (Below target of 80%)

    DEPARTMENT SEGMENTS:
    - Engineering: 82.1% (Highest)
    - Sales: 71.3% (Lowest - declined 8% from Q4)
    - Marketing: 78.9% (Stable)
    - Finance: 76.2% (Improved +4%)

    KEY THEMES FROM COMMENTS:
    - Positive: Knowledge base improvements noted (23 mentions)
    - Negative: Long wait times for priority 3 tickets (31 mentions)
    - Negative: Inconsistent updates during resolution (18 mentions)

    RECOMMENDATIONS:
    1. Focus on P3 response times for Sales department (dedicated queue recommended)
    2. Implement automated status updates every 4 hours for open tickets
    3. Continue knowledge base investment (showing positive ROI)
    4. Schedule targeted follow-up survey for Sales department

    TREND: Improving (+5.7% QoQ)
    RISK: Sales department declining - escalate to VP Sales

ツールの使用方法

MCP ツールのリファレンス
ツール使用する場面
SN-Query-Tableアンケートの定義、インスタンス、質問、回答を照会する
SN-Get-Record特定のアンケートまたは評価の詳細を取得する
SN-Natural-Language-Searchキーワードまたは説明からアンケートを検索する
SN-Execute-Background-Script複雑な集計、傾向分析、セグメント化を行う
SN-Add-Work-Notes分析レポートをアンケートまたは評価のレコードに投稿する
REST API のリファレンス
エンドポイントメソッド用途
/api/now/table/asmt_metric_definitionGETアンケート/評価の定義を照会する
/api/now/table/asmt_metricGETアンケートの質問とメトリックを取得する
/api/now/table/asmt_assessment_instanceGET完了済みアンケートのインスタンスを照会する
/api/now/table/asmt_assessment_instance_questionGET個々の質問への回答を取得する
/api/now/table/survey_responseGETレガシーアンケートの回答データにアクセスする
/api/now/table/asmt_metric_resultGET事前に集計されたメトリック結果を照会する

ベストプラクティス

  • 回答の最小しきい値を設定する: 回答数が10件未満のセグメントから結論を導き出さないでください
  • 比較にはパーセンテージスコアを使用する: 生のスコアは尺度によって異なるため、調査間で比較できるようにパーセンテージに正規化します
  • 回答率を含める: 回答率が低い場合、調査への疲れや配布上の問題を示している可能性があります
  • 意味のあるセグメントに分ける: 組織の説明責任に沿った軸(部門、地域、サポートグループ)で分類します
  • 3期間以上にわたって傾向を追跡する: 単一期間の分析よりも、複数期間の傾向データのほうが信頼性は高くなります
  • 質問に適切な重み付けをする: すべての質問が同じ重要度とは限りません。複合スコアには加重平均を検討してください
  • 結果に基づいて行動する: すべての分析から、明確な担当者を定めた、少なくとも1つの実行可能な推奨事項を導き出してください
  • フィードバックを反映する: 改善状況を追跡するため、後続の調査分析で以前の推奨事項の進捗を確認してください

トラブルシューティング

評価インスタンスが見つからない

原因: 評価定義の sys_id が正しくないか、「complete」状態のインスタンスがありません 解決策: 状態フィルターを指定せずに asmt_assessment_instance をクエリし、すべてのインスタンスを確認してください。定義で別の state 値(例:「complete」ではなく「closed」)が使用されているか確認します。

質問のスコアがゼロになる

原因: asmt_assessment_instance_question の value フィールドに値が設定されていない可能性があります。評価によっては、結果が string_value または scaled_value に保存されます 解決策: 質問の datatype フィールドを確認し、適切な値の列をクエリしてください。尺度付きの質問には value ではなく scaled_value を使用します。

部門別の分類で「不明」と表示される

原因: 調査回答者のユーザーレコードで department フィールドが設定されていません 解決策: user.company、user.location、user.cost_center など、別のグループ化フィールドを試してください。

傾向分析に必要な履歴データがない

原因: 評価インスタンスがアーカイブされているか、調査が最近作成されました 解決策: 日付範囲を広げるか、インスタンスでテーブルローテーションが使用されているか確認してください。新しい調査では、傾向を把握するには少なくとも2~3期間分のデータが必要であることに留意してください。

例

例1:CSATスコアダッシュボード

入力: 「2026年第1四半期の顧客満足度調査の結果を分析してください」

処理: CSAT調査の評価インスタンスをクエリし、質問ごとに集計し、サポートグループ別に分類して、2025年第4四半期と比較し、ダッシュボード用の要約を作成します。

例2:従業員エンゲージメントの傾向

入力: 「過去6か月間の従業員エンゲージメントスコアの傾向を表示してください」

# Run the trend analysis from Step 4 with definitionId for employee engagement survey
# Output: Monthly scores with trend direction and percentage change
例3:低スコアの調査

入力: 「営業部門で満足度スコアが低下したのはなぜですか?」

# 1. Segment by department (Step 5) to confirm the drop
# 2. Drill into question-level scores for Sales respondents
# 3. Extract free-text responses from Sales (Step 6)
# 4. Cross-reference with incident/request data for Sales during the period
# 5. Generate targeted recommendations

関連スキル

  • reporting/trend-analysis - ServiceNow データ全般の傾向分析
  • reporting/executive-dashboard - 経営陣向けの要約ダッシュボードを作成
  • reporting/sla-analysis - 調査スコアとSLAパフォーマンスの相関分析
  • csm/sentiment-analysis - 顧客フィードバックの感情分析
  • hrsd/sentiment-analysis - 従業員の感情分析

コメント