Per-column statistics with the definitions named: which of the nine quantile rules, sample and population deviation side by side, and why each cell was counted
Initializing in your browser…
View, sort and edit a CSV, with an undo stack that goes back exactly one step and a parse report that tells a broken quote from a ragged row
Convert both ways, converting a type only when it reads back the same, and naming every value that cannot
Format and validate against RFC 4180 by section, with output verified by reading it back
You want a statistical profile of a price column, and you want to be able to reproduce the numbers in R or Excel afterwards.
Column
Price: $1,299.99 $29.99 $79.99 $299.99 $149.99 $89.99
Summary
n 6 min 29.99 max 1299.99 sum 1949.94 mean 324.99 median 119.99 Q1 82.49 Q3 262.49 IQR 180 (quantile type 7) std dev sample 486.65 (divides by n-1) population 444.25 (divides by n) outliers 1, outside -187.51 to 532.49 (Tukey, 1.5 x IQR)
All six cells are read despite the currency symbol and the grouped thousands. Both standard deviations are given because the two answer different questions and differ by 9.5 percent at this sample size, and the quartiles name the definition used: switch it to type 6 and Q1 becomes 67.49, which is what Excel PERCENTILE.EXC would tell you. The one outlier is the 1299.99 laptop.
Upload a CSV and get a summary of every column: count, sum, min, max, mean, median, quartiles, both standard deviations, skewness, kurtosis and outliers. The difference from most such tools is that the numbers are labelled. There are nine published definitions of a quartile and two of a standard deviation, and this one tells you which it used and lets you change it.
Two numbers in an ordinary summary table have no single definition, and a tool that prints one without saying which is not reporting a measurement.
The standard deviation is the first. Dividing the sum of squared deviations by n gives the population deviation, which describes the numbers in front of you; dividing by n-1 gives the sample deviation, Bessel's correction, which estimates the population those numbers came from. Python names them pstdev and stdev, Excel names them STDEV.P and STDEV.S, and R's sd is the sample one. The gap matters at the sizes people paste into a browser: over the values 1 to n the population form is 29.3 percent lower at n=2, 13.4 percent at n=4 and 5.1 percent at n=10. This tool shows both, side by side, each labelled with its divisor. At n=1 the sample deviation is undefined because n-1 is zero, and it says so rather than printing 0.
The quartiles are the second. Hyndman and Fan catalogued nine definitions in 1996 and both R and NumPy implement all nine. Over the values 1, 2, 3, 4 they put Q1 anywhere between 1 and 1.75. You pick the definition from a menu, the page names it, and the downloaded report records it, so the number can be reproduced in whatever tool you take it to. Type 7 is the default because it is also the default of R, NumPy, Excel PERCENTILE.INC and Google Sheets.
Which cells count as numbers is stated too. A cell holding only a space is not a measurement of zero, Infinity is a spreadsheet error rather than a value to average, and 0x1F is a string in a CSV file even though JavaScript reads it as 31. Every cell is placed in exactly one of four categories, numeric, text, empty or whitespace, and those four are shown adding up to the row count. Cells that were not read as numbers are listed by reason with an example, so a column that unexpectedly has no statistics tells you why.
Formatted numbers are read rather than discarded: grouped thousands, a leading or trailing currency symbol, a trailing ISO 4217 code, a percent sign (divided by 100) and accounting parentheses for a negative. Because 1.234 is one thousand in Germany and one and a bit in the United States, the separator convention is inferred per column from which reading is consistent across the whole column, and when both readings work the tool says the column is ambiguous and names the cell that proves it rather than picking in silence.
The sum uses Neumaier compensated summation, so a long column does not drift: over 1e16 followed by a hundred 1s, plain left-to-right addition loses all one hundred, and where that drift is non-zero the page reports how large it was.
Get a statistical overview of a new dataset, including how many cells in each column are actually numbers, before committing to an analysis workflow.
Spot columns where a handful of cells are text, or empty, or hold only a space, and see exactly which values were skipped and why.
When a quartile here disagrees with one from R, Excel or pandas, switch the quantile definition until they match and you have found which convention the other tool used.
Count the values outside Tukey fences at 1.5 times the interquartile range, with the fence positions shown so the threshold is not a black box.
Both are shown. The sample form divides by n-1 and estimates the population the data came from; the population form divides by n and describes only the numbers present. Each tile names its divisor. At n=1 the sample form is reported as undefined rather than 0, because n-1 is zero.
Because there are nine published definitions of a sample quantile and they disagree on small samples. Hyndman and Fan catalogued them in 1996 and R and NumPy implement all nine. Pick the matching definition from the menu: type 7 is R, NumPy, Excel PERCENTILE.INC and Google Sheets; type 6 is Excel PERCENTILE.EXC, Minitab and SPSS; type 2 is the SAS default.
Every cell falls into exactly one of four categories and the page shows the four adding up to the row count: numeric, text, empty, and whitespace only. A cell holding a space or a tab is counted as whitespace, not as a measurement of zero, which is what Number() in JavaScript would make it.
Yes. Grouped thousands, a leading or trailing currency symbol, a trailing three-letter currency code, a trailing percent sign (which divides by 100) and accounting parentheses for negatives are all read. The currency symbol is recorded and never converted; this tool has no exchange rates.
It is labelled Mixed with the percentage of non-empty cells that are numbers, statistics are computed over the numeric cells only, and the text cells are listed by reason with an example so you can see what they were.
Because it is a string in a CSV file. JavaScript's Number() reads 0x1F as 31, 0b101 as 5 and 0o17 as 15, and Infinity as an actual infinity, all of which silently corrupt a mean. Those forms are refused by name and reported. A cell reading 007 is still read as 7, and flagged as carrying a leading zero.
Yes. Every column is selected by default and you can toggle any of them off. Changing the quantile definition or the number format afterwards recomputes instantly without reloading the file.
Rows and columns are parsed and transformed in memory in your browser. No record ever reaches a server.