One column, eight numbers you actually need
Somebody hands you a CSV and asks a reasonable question: what do the numbers in this column look like? Not a dashboard, not a model — a feel for the distribution. The answer is a handful of numbers that statisticians settled on generations ago: the center (mean, median), the spread (standard deviation, range), the shape (quartiles), and the holes (missing values). Computing them should take seconds. Instead, the usual ritual is opening a spreadsheet, scrolling the column to make sure nothing weird is in row 4,001, and hand-rolling formulas whose parentheses you will misplace once.
This tool does the whole pass in one motion. Paste the file, pick a column, and get the full profile: count, sum, mean, median, min, max, quartiles, interquartile range, both standard deviations, and — the part every other tool forgets — how many cells were empty or non-numeric. Text columns get their own profile too, because half the columns in a real CSV are not numbers, and knowing the distinct count and longest value is genuinely useful.
We kept the report honest about denominators and methods, because statistics become lies the moment the context is lost. A mean computed over 400 of 500 rows is a different statement than one computed over all of them, and the tool phrases the difference visibly rather than in a footnote nobody reads.
The rest of this guide is the documentation we wish every stats tool shipped: the formulas written out, worked examples you can verify by hand (please do — trust in statistics should be earned), the quartile method debate explained, and the classic ways descriptive numbers mislead when the data is dirty.
Running statistics on a column
The tool sits above this text. The standard run takes about thirty seconds, most of it spent choosing the column.
Load the CSV
Paste the text or pick a file. The parser follows RFC 4180 — quoted fields, embedded commas and all — and detects the delimiter, so European semicolon exports and tab-separated logs both work.
Choose the column
Headers appear in a dropdown. The tool detects each column's type (numeric, text, mixed) and previews it, so you know what you are about to profile.
Review the type report
For numeric columns you will see how many cells parsed as numbers, how many were empty, and how many were non-numeric oddities like TBD or $1,200. This is the honesty pass — it happens before any statistic is computed.
Read the statistics
The full profile renders instantly: central tendency, spread, quartiles, outlier bounds, and the missing/non-numeric counts. Numbers display with sensible precision, not 15 decimal places of floating-point noise.
Export or continue
Copy the summary for a report, or jump straight to a related operation — filter rows by the outlier bounds you just learned, or extract the column for cleaning elsewhere.
A rhythm worth adopting: profile every numeric column of any new file before you build anything on top of it. Two minutes of profiling catches impossible values, silent blanks and unit mixtures — the three problems that ruin every analysis that meets them unprepared.
The math, written out
Every statistic here is textbook arithmetic, and each one is stated exactly so you can reproduce it. Given a numeric column with n values x₁ through xₙ, and the sum of all values written as Σx:
| Statistic | Formula | What it tells you |
|---|---|---|
| Sum | Σx | Total of all values |
| Mean (x̄) | Σx ÷ n | Center of mass — where the values balance |
| Median | Middle value of the sorted column; average of the two middle values when n is even | Center of rank — half the values sit above it |
| Min / Max | Smallest and largest values | The extremes, literally |
| Range | Max − Min | Total spread, dominated by extremes |
| Sample variance (s²) | Σ(xᵢ − x̄)² ÷ (n − 1) | Average squared distance from the mean |
| Sample stddev (s) | √s² | Spread in the same units as the data |
| Population stddev (σ) | √(Σ(xᵢ − x̄)² ÷ n) | Spread, if your rows are the whole population |
| Q1, Q2, Q3 | Values at positions 0.25(n−1), 0.5(n−1), 0.75(n−1) in sorted order, with linear interpolation | The quartiles that boxplots are drawn from |
| IQR | Q3 − Q1 | Spread of the middle 50% — robust to outliers |
The median deserves its one-sentence explanation of mechanics, since it is the statistic people trust least when they cannot see inside the box: the column is sorted, and the middle element (or the average of the two middle elements when n is even) is returned. That is all. It costs a sort, which is why some tools skip it on big data — this tool does not, because medians are often the only honest center for skewed business data like income, session duration or file sizes.
Quartile positions under linear interpolation: with n sorted values, Q1 sits at position 0.25(n−1), counting from zero. If that position is a whole number, the value there is the answer. If it falls between two order statistics, the result interpolates linearly between them. This is the method NumPy and pandas use by default, which makes it the de facto standard for people who compute statistics in code; spreadsheets with Tukey's hinges can differ slightly on small n, and the tool labels its method so comparisons across tools never surprise you.
Worked example: a year of revenue
Twelve months of revenue for a small product line. Small enough to check by hand, real enough to mean something. Run the numbers yourself as you read — that is the point of a worked example.
Input
month,revenue 2026-01,1240 2026-02,1180 2026-03,1350 2026-04,1290 2026-05,1490 2026-06,1520 2026-07,1470 2026-08,1610 2026-09,1585 2026-10,1720 2026-11,1690 2026-12,1890
Output
n = 12 (no missing, no non-numeric) Sum = 18,035 Mean = 18,035 ÷ 12 = 1,502.92 Median = (1,490 + 1,520) ÷ 2 = 1,505.00 Min = 1,180 · Max = 1,890 · Range = 710 Q1 = 1,335.00 · Q3 = 1,630.00 · IQR = 295 Sample stddev = 211.88 · Population stddev = 202.86
How the interesting ones were obtained. The sum is the twelve values added: 18,035. The mean divides by 12, giving 1,502.92 (the tool keeps full precision internally and only rounds for display). The median sorts the column — 1,180, 1,240, 1,290, 1,350, 1,470, 1,490, 1,520, 1,585, 1,610, 1,690, 1,720, 1,890 — and since 12 is even, averages the 6th and 7th sorted values: (1,490 + 1,520) ÷ 2 = 1,505.
The quartiles interpolate. Q1's position is 0.25 × (12 − 1) = 2.75, which lands three-quarters of the way from the 3rd sorted value (1,290) to the 4th (1,350): 1,290 + 0.75 × 60 = 1,335. Q3's position is 0.75 × 11 = 8.25, a quarter of the way from the 9th value (1,610) to the 10th (1,690): 1,610 + 0.25 × 80 = 1,630. The standard deviations come from the squared deviations around the mean: their total is 493,822.92, so the sample variance is 493,822.92 ÷ 11 = 44,892.99 and the sample standard deviation is its square root, 211.88. Every figure above is reproducible with a calculator and patience, which is the standard a statistics tool should be held to.
Also worth reading from this table: mean and median nearly agree (1,502.92 vs 1,505), which says the distribution is roughly symmetric, and the standard deviation of about 212 says a typical month sits within ±212 of 1,500 — a monthly wobble of roughly 14 percent. That is a calm revenue line. When the mean pulls far above the median instead, you are looking at right-skewed data, and the median is the honest center to quote.
Quartiles and outliers: the 1.5×IQR rule
Quartiles earn their keep through the outlier rule that boxplots are drawn from. The fences sit at Q1 − 1.5×IQR and Q3 + 1.5×IQR; values outside the fences are flagged as outliers. The multiplier 1.5 is convention — inherited from John Tukey's exploratory data analysis — not law, but it has survived decades because it flags roughly the right number of points in bell-shaped data without requiring you to assume normality.
Input
values 4 8 15 16 23 42
Output
n = 6 · Sum = 108 · Mean = 18.00 Median = (15 + 16) ÷ 2 = 15.5 Q1 = 9.75 (position 0.25×5 = 1.25, between 8 and 15: 8 + 0.25×7) Q3 = 21.25 (position 0.75×5 = 3.75, between 16 and 23: 16 + 0.75×7) IQR = 11.5 · Fences: 9.75 − 17.25 = −7.5 and 21.25 + 17.25 = 38.5 Outliers: 42 (above the upper fence of 38.5)
One value, 42, lands outside the upper fence, and the arithmetic shows exactly why: the middle half of this data spans only 11.5 units, so anything past 38.5 is unusually far from the pack by this column's own standards. The revenue example, by contrast, has fences at 892.5 and 2,072.5 with no outliers — a distribution behaving itself.
A caution that belongs next to any outlier rule: an outlier is a question, not a verdict. In revenue data, an outlier is often the best month you ever had; in a lab sensor log, it is a loose cable. The tool's job is to point at the row; the human job is deciding whether it belongs in the analysis. When you want to pull the flagged rows out and look at them, CSV Filter Rows takes a threshold expression and does exactly that.
Type detection and missing values
Before any statistic is computed, each column is classified. Numeric columns parse cleanly as integers or decimals, including scientific notation (1.5e3), leading plus or minus signs, and thousands separators like 1,234.50 — a form CSV parsers themselves must protect from comma-splitting, which RFC 4180 quoting does. Text columns contain anything else. Mixed columns, the realistic case, get both reports: the numeric statistics over the numeric cells, and a count of the rest.
Missing values come in more costumes than people expect, and the report separates them. An empty cell is the honest blank. A cell containing whitespace is a stealth blank that naive tools read as a value. A cell with the string NA, N/A, null, NULL, — or - is a documented blank — conventions that exported data uses to say nothing politely. The tool counts each kind and excludes all of them from computation, stating the working denominator: mean over 400 of 500 rows is reported as exactly that.
| Cell content | Classification | Treatment |
|---|---|---|
| (empty) | Missing | Excluded, counted as missing |
| Missing | Whitespace-only — excluded, counted | |
| N/A, NA, null, NULL | Missing (documented blank) | Excluded, counted, listed by marker |
| 1,234.50 | Numeric | Parsed after unquoting; separators honored |
| $1,200.00 | Numeric-ish | Currency stripped, parsed, noted in report |
| TBD, 12k, 3+ | Non-numeric | Set aside and counted — never guessed |
Why this stubbornness matters: coercing weird cells to zero bends the mean downward; coercing them to the column mean hides the problem entirely; dropping rows silently changes every denominator in the report. All three are common behaviors in friendlier-looking tools, and all three produce confident wrong numbers. We would rather hand you a count of oddities and let you clean deliberately — with CSV Filter Rows for removing junk and the CSV Value Frequency Counter for seeing exactly which odd strings appear and how often.
When the numbers mislead
Descriptive statistics are exact; their interpretation is where things go wrong. The classic failure modes, each with its tell:
- The mean of a skewed column: a handful of huge values drags the mean while the median barely moves. Session times, invoice amounts and city populations all behave this way. Tell: mean noticeably above median.
- Units mixed in one column: one export in dollars, three months appended in euros. The statistics compute anyway — they are just about a meaningless mixture. Tell: min/max that span implausible magnitudes, or a long tail you cannot explain.
- A dashed zero entered as text: 0 and - are different cells, and a column of dashes is a column of zeros somebody could not enter. Tell: documented-blank count suspiciously high.
- Row duplication inflating everything: a duplicated sync export counts each record twice, doubling sums and shifting means toward whatever duplicated. Tell: run the CSV Deduplicator when sums look 2x-odd; it takes a minute.
- Percentages versus fractions: 0.05 and 5 meaning five percent in the same column produce a stddev full of nonsense. Tell: min near 0 and max near 100 alongside values near 0.01.
- Outliers that are typos: an extra zero typed into 1,500 makes 15,000, which the IQR rule will faithfully flag. The statistics are correct; the data is not.
Who reaches for column stats
The audience splits into people who need the numbers and people who need the numbers fast.
- Students in intro statistics courses verifying hand-computed homework — the worked-example habit scales up to real assignments, and checking quartiles against the tool builds exactly the right suspicion of black boxes.
- Data analysts doing first-pass profiling of a new file before it touches a notebook or database.
- Finance and ops staff summarizing columns of transactions, headcounts or inventory counts for a quick report, without rebuilding a pivot each time.
- QA and test engineers characterizing load-test outputs and sensor logs — medians and IQRs communicate latency and jitter better than means ever do.
- Teachers summarizing exam scores: quartiles translate directly into grade bands, and the missing-count catches the students whose rows never made it into the export.
- Researchers on small datasets who want statistics without a stats-package install, and who rightly want to see the formulas they are running.
If your need goes beyond description — inference, regression, significance — you want a real statistics environment. This page computes the descriptive layer that everything else builds on, and it does that layer with the formulas printed on the label.
Sample versus population: the stddev trap
The single most common question we receive about this tool is why it shows two standard deviations. The answer is a fork in statistical road that textbooks bury and spreadsheets hide behind function names: STDEV.S versus STDEV.P in Excel, std(ddof=1) versus std(ddof=0) in pandas.
Use the sample standard deviation when your rows are a sample of some larger process — twelve months standing in for the business's ongoing performance, 400 surveyed customers standing in for all of them. Dividing by n−1 (the Bessel correction) compensates for the fact that a sample's own mean sits closer to the sample's values than the true population mean does, which would otherwise systematically underestimate spread. Use the population standard deviation when the rows are literally everything you care about — all twelve months that exist of this year, all employees on the roster. Then dividing by n is the honest computation.
The practical difference fades with size: on the twelve-value revenue example, sample 211.88 versus population 202.86 — a five percent gap worth knowing about; on 5,000 rows the gap is about one part in 5,000. But on the small samples where people actually eyeball stddevs, the choice changes the story, so the tool refuses to choose for you. It shows both, labeled, every time.
Excel versus pandas versus this page
Three familiar routes to the same numbers, each with a genuine niche:
| Route | Effort | Where it shines | Where it bites |
|---|---|---|---|
| Excel formulas | One formula per statistic | Already installed; auditable cell by cell | Quartile method differences; blanks coerced to zero by AVERAGE-adjacent habits; copy-paste range errors |
| Python/pandas describe() | One line after setup | Repeatable, scriptable, scales to huge files | Requires an environment; silent NaN handling can exclude more than you think |
| This tool | Paste and read | Zero setup; missing/non-numeric reporting built in; nothing uploaded | One column at a time; descriptive statistics only |
If you are comparing results across routes, the two reconciliations to check are the quartile method (interpolation versus hinges) and the blank-cell policy (excluded versus coerced). Get those two aligned and the three routes agree to the last displayed digit — which is also a nice end-to-end validation that your CSV parsed identically everywhere. For the record: pandas and NumPy document the linear-interpolation default precisely, and the NIST/SEMATECH statistics handbook is the reference we recommend for the underlying definitions.
Local computation, nothing uploaded
Statistical profiling is often the first thing you run on data you have not yet decided how to handle — salary exports, medical trial numbers, unpublished research data. That is precisely the moment you do not want the file leaving your machine. This tool computes everything in the browser: the CSV never crosses the network, the numbers are assembled in your tab's memory, and closing the tab erases all of it. There is no upload endpoint at all, which is a stronger statement than any retention policy.
Local also means fast in the way that matters for iteration: no upload wait on a 40 MB export, no processing queue, no download round trip for the summary. Paste, read, move on. For repeated profiling across many files, that difference compounds into real time — and into the habit of actually checking columns before building on them, which was the point all along.
FAQ
The questions that arrive by email, answered once.
Which statistics does the tool compute?
For numeric columns: count, sum, mean, median, min, max, range, first and third quartiles, interquartile range, sample standard deviation, population standard deviation and the number of missing or non-numeric values. For text columns: row count, distinct count, shortest and longest value, and empty-cell count. Every number is computed from your exact rows — no sampling, no rounding along the way.
What is the difference between sample and population standard deviation?
The divisor. Sample standard deviation divides the squared deviations by n−1; population standard deviation divides by n. Use the sample version when your rows are a sample drawn from a larger process, and the population version when the rows are the entire population of interest. The tool reports both, and the difference shrinks as row count grows — on 12 values they differ noticeably, on 5,000 they barely do.
Which quartile method does it use?
Linear interpolation between order statistics — the same default used by NumPy's percentile function and pandas' quantile. Under this method the k-th quartile sits at position 0.25(n−1), 0.5(n−1) and 0.75(n−1) in the sorted data, interpolating between neighbors when the position falls between two values. Spreadsheets historically used Tukey's hinges instead, so Excel's QUARTILE may differ by a hair on small samples; the tool notes which method produced your numbers.
How does it treat cells that are not numbers?
They are counted and set aside, never coerced. A cell containing 1,200 or $12.00 or N/A is reported in the non-numeric count so you can decide whether to clean the column, rather than having the tool silently guess a value and quietly bend your mean. Totals are computed over the numeric rows only, and the report states that denominator explicitly.
How are empty cells handled?
Empty cells are missing values: excluded from every computation and reported as a separate missing count. The distinction matters — a column with 500 rows, 400 numeric values and 100 blanks has a mean computed over 400 values, not 500, and the tool says so rather than implying zeros.
Can it read numbers written as 1,234.50 or 12k?
Thousands separators in the form 1,234.50 are parsed after the CSV parser has correctly kept the field intact despite its commas. Currency symbols and trailing percent signs are recognized and stripped. Abbreviations like 12k or 1.2M are flagged as non-numeric rather than guessed, because expanding them requires assumptions the tool refuses to make silently.
How large a CSV can it profile?
A single pass with a fixed memory footprint means hundreds of thousands of rows profile in seconds on ordinary hardware. Median and quartiles require holding the numeric values in memory, which is the real limit: roughly a million numeric values per column stays comfortable on a current laptop.
Is my data uploaded to compute these statistics?
No. The arithmetic runs in your browser as JavaScript. There is no server round trip, no storage and no analytics on your file contents — load the page, disconnect your internet, and the statistics still compute.