survey-analysis について
ServiceNow のアンケートや評価回答を分析するスキルです。顧客満足度、従業員エンゲージメント、サービス品質を把握したいチーム向けに、設問別統計、時系列比較、組織別分析と改善案を提供します。
主な機能
- 01アンケート得点と回答の集計
- 02期間ごとの傾向比較
- 03部門やグループ別の結果分析
- 04平均値・中央値・分布の算出
- 05得点傾向に基づく改善案
活用シーン
- 01CSAT アンケート結果の分析
- 02従業員エンゲージメントの推移確認
- 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_definition | GET | アンケート/評価の定義を照会する |
/api/now/table/asmt_metric | GET | アンケートの質問とメトリックを取得する |
/api/now/table/asmt_assessment_instance | GET | 完了済みアンケートのインスタンスを照会する |
/api/now/table/asmt_assessment_instance_question | GET | 個々の質問への回答を取得する |
/api/now/table/survey_response | GET | レガシーアンケートの回答データにアクセスする |
/api/now/table/asmt_metric_result | GET | 事前に集計されたメトリック結果を照会する |
ベストプラクティス
- 回答の最小しきい値を設定する: 回答数が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- 従業員の感情分析