Kendall's W concordance calculator for ranked data
Kendall's W measures how consistently two or more raters rank the same set of items.
Run — free
Supply one row per rater and one column per item, and the calculator returns a coefficient from zero to one. Zero indicates no overall concordance, while one indicates complete agreement. The calculation supports tied positions when they are entered as average ranks, applies the standard tie correction, and reports whether ties were present. This makes the result useful for expert panels, judging systems, preference studies, and reliability checks where the observations are rankings rather than measurements.
Arrange the ranking matrix correctly
Enter the data as a rectangular matrix. Each row represents one rater, each column represents the same item across all rows, and each cell is that rater's rank for that item. Column order therefore matters: if the first column means proposal A for one rater, it must mean proposal A for every rater. For n items, an untied row normally contains the integers from 1 through n exactly once, where 1 is the highest or lowest preference according to your chosen convention. Either direction works, but every rater must use the same direction. The calculator requires at least two raters and at least two items. Every row must have equal length, contain only finite numbers, and sum to n(n+1)/2. That sum check catches common transcription errors, missing items, and rank scales that were not converted into proper ranks before analysis. Keep a separate item key so the matrix remains auditable after entry.
Handle tied items with average ranks
When a rater considers several items equal, assign each tied item the average of the positions those items occupy. For example, if two items share second and third place, both receive rank 2.5, and the next item receives rank 4. Do not enter 2 for both and then continue with 3, because that changes the row's rank total and no longer represents a standard ranking. The calculator detects repeated rank values and applies Kendall's tie correction to the denominator. That adjustment matters because ties reduce the amount of discrimination a rater contributes. A panel in which every rater ties every item contains no ranking information at all, so W is undefined and the calculator returns an input error. Before interpreting a result, also confirm that ties reflect genuine equal judgments rather than rounded measurements or an incomplete ranking procedure. Preserve decimal average ranks instead of rounding them to whole numbers.
Interpret concordance in context
Kendall's W ranges from 0 to 1. Values near 1 show that raters give similar relative positions to the items, while values near 0 show little shared ordering. The coefficient is descriptive: there is no universal boundary that automatically turns a value into weak, moderate, or strong agreement. Appropriate expectations depend on the number of raters, the number of items, the decision stakes, and how difficult the judgments are. W also says nothing about whether the panel's preferred order is correct; a group can agree perfectly and still rely on poor evidence. Use the coefficient alongside the original rank matrix, information about the raters, and a documented ranking protocol. If inferential significance is needed, perform an appropriate chi-square or permutation test separately, because this capability returns the concordance coefficient itself rather than a p-value or confidence interval. Report the matrix dimensions and tie policy beside W for reproducibility.
What you can do with it
Check an expert panel
Measure whether specialists independently rank proposals, risks, or research priorities in a consistent order.
Audit competition judging
Quantify concordance among judges before combining their rankings into an overall result.
Assess preference reliability
Compare repeated or parallel rankings of products, concepts, candidates, or policy options.
FAQ
What does the calculator cost?
It costs $0.002 per API request and can also run free in the browser.
What do zero and one mean?
Zero represents no overall concordance in the rank sums, while one represents complete agreement among raters.
Can the rankings contain ties?
Yes. Enter tied positions as average ranks; the calculation automatically applies the standard tie correction.
Why must every row have the same length?
Each rater must rank the same items, with columns consistently identifying those items across the matrix.
Does the result include a p-value?
No. The result is Kendall's W coefficient only; significance testing requires a separate procedure chosen for the study design.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/stat/kendall-w \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"rankings":[[1,2,3,4],[1,2,3,4],[2,1,3,4]]}'const res = await fetch("https://api.kit.forhosting.com/stat/kendall-w", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"rankings": [
[
1,
2,
3,
4
],
[
1,
2,
3,
4
],
[
2,
1,
3,
4
]
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/stat/kendall-w",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"rankings": [
[
1,
2,
3,
4
],
[
1,
2,
3,
4
],
[
2,
1,
3,
4
]
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/stat/kendall-w", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"rankings":[[1,2,3,4],[1,2,3,4],[2,1,3,4]]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"rankings":[[1,2,3,4],[1,2,3,4],[2,1,3,4]]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/stat/kendall-w", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"rankings": [
[
1,
2,
3,
4
],
[
1,
2,
3,
4
],
[
2,
1,
3,
4
]
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "stat.kendall_w",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_raters | 500 |
max_items | 500 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |