HomeDescriptive StatisticsLeft Skewed vs Right Skewed Calculator | StatsUnlock

Left Skewed vs Right Skewed Calculator | StatsUnlock

Left Skewed vs Right Skewed Calculator

Paste comma-separated numbers or upload a CSV, and find out in one click whether each group is left skewed, right skewed or symmetric. You get the skewness coefficient (G1, g1, b1), its standard error, the D’Agostino skewness test, Pearson and Bowley skewness, plus a histogram, box plot, normal probability plot and skewness chart for every group.

DescriptiveSkewnessDistribution ShapeHistogram & Box PlotNormality CheckMulti-Group

⚡ 0. Quick Answer

Left skewed vs right skewed describes which way the long tail of a distribution points: a left skewed (negative) distribution has its tail on the left and mean < median, while a right skewed (positive) distribution has its tail on the right and mean > median.

Skewness measures lopsidedness, not spread. Income, waiting times and hospital stays are usually right skewed. Easy exam scores, age at death and 5-star ratings are usually left skewed. Skewness does not tell you about outliers on its own, or about two peaks, so always look at a histogram or box plot as well.

G1 = [n ÷ ((n − 1)(n − 2))] × Σ((x − x̄) ÷ s)³

Rule of thumb: G1 below −0.5 is left skewed, above +0.5 is right skewed, and between −0.5 and +0.5 is approximately symmetric. Beyond ±1 the skew is high. For example, hard exam scores give G1 = 1.72 (right skewed) and easy exam scores give G1 = −1.63 (left skewed).

Key takeaways

  • Left skewed vs right skewed is about the tail: the side with the long, thin tail names the skew, not the side with the peak.
  • In right skewed data the mean is usually above the median (here 50.35 vs 44.50); in left skewed data it is usually below (86.25 vs 90.00).
  • Skewness between −0.5 and +0.5 is approximately symmetric, 0.5 to 1 in size is moderate, and above 1 is high.
  • A skew is statistically real when the D’Agostino test gives p < 0.05, which needs n ≥ 8 and is stable from about n = 20.
  • On a box plot the long whisker shows the skew; on a normal probability plot right skew bends up at the right and left skew bends down at the left.

📚 1. What Is Left Skewed vs Right Skewed?

Skewness measures how asymmetric a distribution is. A symmetric distribution looks the same on both sides of its centre, like a bell curve. A skewed distribution has one side that stretches out further than the other. That stretched side is called the tail, and the tail gives the skew its name.

  • Right skewed (also called positively skewed or skewed to the right): most values sit on the low side and a few large values make a long tail to the right. Skewness is greater than 0.
  • Left skewed (also called negatively skewed or skewed to the left): most values sit on the high side and a few small values make a long tail to the left. Skewness is less than 0.
  • Symmetric: both tails are about the same length. Skewness is close to 0, and the mean, median and mode are close together.

What it actually measures. The moment skewness cubes each value’s distance from the mean. Cubing keeps the sign and makes far-away values count much more. So values far above the mean push the total up (right skew), and values far below the mean push it down (left skew). The result is divided by the standard deviation cubed, so skewness has no units. You can compare the skewness of exam scores with the skewness of incomes.

A worked one-liner: the hard exam scores 35, 36, 37, … 71, 88, 95 (n = 20) have mean 50.35 and median 44.50. The two scores of 88 and 95 drag the mean to the right. The adjusted skewness is G1 = 1.72, so these scores are highly right skewed.

Left skewed (negative)MeanMedianMode← tail points leftmean < median < modeSymmetric (normal)mean = median = modeskewness = 0Right skewed (positive)ModeMedianMeantail points right →mode < median < mean
Left skewed vs right skewed vs symmetric. In a right skewed curve the order is mode, then median, then mean. In a left skewed curve the order is reversed. The tail, not the peak, names the skew.

A memory trick. Think of the tail as a pointing finger. If the long tail points to the right (toward larger numbers), the data are skewed right. If it points to the left (toward smaller numbers), the data are skewed left. Many students get this backwards because they look at where the hump is. The hump of a right skewed histogram sits on the left.

Who uses this: teachers check whether a test was too easy (left skew) or too hard (right skew). Economists report median income because income is right skewed. Clinicians report median length of stay. Ecologists see right skew in animal movement, body mass and species counts. Quality engineers watch for skew that signals a process drifting against a limit. Every analyst checks skewness before a t-test, ANOVA or regression, because strong skew can bias those tests.

FeatureLeft skewed (negative)SymmetricRight skewed (positive)
Long tailPoints left, toward small valuesBoth sides equalPoints right, toward large values
Skewness valueBelow 0 (below −0.5 to matter)About 0 (−0.5 to 0.5)Above 0 (above 0.5 to matter)
Mean and medianMean usually below medianMean about equal to medianMean usually above median
Usual ordermean < median < modemean = median = modemode < median < mean
HistogramPeak on the right, bars trail off to the leftBell shapePeak on the left, bars trail off to the right
Box plotLong left whisker, median near Q3Equal whiskers, median centredLong right whisker, median near Q1
Normal probability plotConcave curve, bends down at the leftStraight lineConvex curve, bends up at the right
Typical examplesEasy test scores, age at death, star ratingsAdult height, measurement errorIncome, house prices, waiting times
Usual fixReflect, then log; or rank-based testsNone neededLog or square-root; or rank-based tests

Skewness is not the same as kurtosis. Skewness asks “which side has the longer tail?”; kurtosis asks “how heavy are the tails overall?”. This tool reports both, but the verdict is based on skewness.

🧮 2. Set Up Your Data

Group names are edited in each box below. Nothing is computed until you press Run Analysis.

Type or paste values separated by commas, for example 52, 48, 55, 61, 47. Spaces, tabs, semicolons and new lines also work, so a column copied from Excel is fine. Each box is one group (cluster).

Supports .csv, .txt, .xlsx and .xls. The first row is used as column names when it contains text.

Type one value per cell. Each column becomes a group, and you can rename the column headers. Empty cells are ignored, so groups can have different sizes.


📊 3. Results

Enter or load your data above, then press Run Analysis. The left skewed vs right skewed verdict for every group, the skewness coefficients, the D’Agostino test, four charts and ready-to-copy reporting sentences will appear here.

🧠 4. Interpretation of Results, In Detail

Run the calculator to fill this box with a plain-English reading of your own numbers: ___ is ___ skewed, G1 = ___, p = ___. The twelve sub-sections below explain every part of the output.

4.1 Reading the verdict: which way is the skew?

Start with the sign of the skewness. A positive value means right skewed: the data have a long tail toward larger numbers. A negative value means left skewed: the long tail points toward smaller numbers. A value near zero means the two tails balance.

The name always follows the tail, never the peak. A right skewed histogram has its tallest bars on the left and thin bars trailing off to the right. That is why “skewed right vs skewed left” confuses so many students: the bulk of the data sits on the opposite side to the name. In the worked example, most hard-test scores are between 35 and 55, but two students scored 88 and 95. Those two scores form the right tail, so the hard test is right skewed.

4.2 How big is the skew? Reading the size of G1

The size (absolute value) of the skewness tells you how lopsided the data are. This tool uses the common rule of thumb associated with Bulmer:

  • |G1| below 0.5: approximately symmetric. The mean is a fair summary.
  • |G1| from 0.5 to 1: moderately skewed. Report the median as well as the mean.
  • |G1| above 1: highly skewed. Lead with the median and IQR, and think about a transform before parametric tests.

Some textbooks are more lenient and treat values up to ±1, or even ±2, as acceptable for parametric tests (George and Mallery’s guideline). You can switch to the lenient bands in the settings. Whichever rule you use, name it in your methods so readers can judge.

4.3 Is the skew real? The standard error, z and the D’Agostino test

A sample can look skewed by chance, especially a small one. The standard error of skewness (SE) tells you how much skewness bounces around from sample to sample when the population is perfectly symmetric. For n = 20 it is 0.51, for n = 100 it is 0.24, and for n = 1000 it is 0.08.

Dividing G1 by its SE gives a z ratio. If |z| is above 1.96 the skew is significant at the 5% level. The D’Agostino skewness test refines this with a transformation that works well from n = 8 upward. It is the test behind scipy.stats.skewtest and R’s moments::agostino.test. A p-value below α means a sample this lopsided would be unusual if the population were symmetric.

Kim (2013) suggests a sample-size rule for the z ratio: use |z| > 1.96 below n = 50, |z| > 3.29 for n = 50 to 300, and judge the raw size of G1 (above 2 is substantial) for very large samples, where even trivial skew becomes significant.

4.4 Statistical significance vs practical importance

These two answer different questions. Significance asks “could this be chance?”; size asks “does it matter?”. With 600 values, a skew of 0.25 is significant (p = .012) but too small to change any decision. With 12 values, a skew of 1.1 can be non-significant even though the histogram is clearly lopsided. Always report both the size (G1) and the test (z and p), and let the size guide what you do.

4.5 The mean, median and mode: what they really tell you

The tail pulls the mean toward it, because the mean uses every value. The median barely moves. So in right skewed data the mean is usually above the median, and in left skewed data the mean is usually below it. That is why Pearson’s second coefficient, 3(mean − median) ÷ s, is a quick skewness check.

One warning: “mean > median means right skew” is a rule of thumb, not a law. Von Hippel (2005) showed it fails for many discrete distributions and for data with one long tail and one heavy short tail. When the mean-median order and G1 disagree, trust the histogram first, then G1, then the mean-median gap.

4.6 What the four charts show

Chart 1, the histogram. Bars left of the median are blue and bars right of the median are orange. The colour that stretches further marks the tail. The green curve is a normal distribution with the same mean and SD: where your bars rise above the curve on one side and fall below it on the other, you are seeing skew.

Skewed leftlong left whisker, median near Q3Symmetricwhiskers and halves equalSkewed rightlong right whisker, median near Q1Value
Box plot skewed left vs right. The long whisker and the position of the median inside the box show the direction of skew at a glance.

Chart 2, the box plot. In a right skewed box plot the right whisker is long and the median sits closer to Q1 (the left edge of the box). In a left skewed box plot the left whisker is long and the median sits closer to Q3. The orange diamond is the mean: it sits on the tail side of the median.

Left skewedconcave, bends down at the leftSymmetricpoints hug the lineRight skewedconvex, bends up at the right
Normal probability plot skewed right vs left. Right skew bends upward (convex), left skew bends downward (concave), symmetric data follow the dashed line.

Chart 3, the normal probability (Q-Q) plot. Each point pairs a sorted data value with the value a normal distribution would predict. For right skewed data the points curve up and away from the line at the top right, a convex “smile”. For left skewed data they drop below the line at the bottom left, a concave “frown”.

Chart 4, skewness compared. Bars above zero are right skewed and below zero are left skewed. The green band is the symmetric zone. The black error bar on G1 is a rough 95% interval (G1 ± 1.96 SE): if it crosses zero, the skew may be chance.

4.7 Why three skewness coefficients disagree

G1, Pearson Sk2 and Bowley look at different parts of the data. G1 is driven by the cube of the distances, so it is dominated by the most extreme values. Pearson Sk2 compares the mean and median. Bowley uses only the quartiles, so it ignores the outer 25% on each side completely.

When G1 is large but Bowley is near zero, the middle half of your data is balanced and one or two extreme values create the skew. When all three agree in sign, the skew runs through the whole distribution. The pilot dataset in the samples shows the extreme case: G1 is +2.59 but Bowley is −0.50, because one value of 48 creates all of the positive skew.

4.8 Comparing two or more groups: left skewed vs right skewed side by side

When one group leans left and another leans right, as with the easy and hard tests, their means are misleading in opposite ways. The easy test mean (86.25) sits below its median (90.00), and the hard test mean (50.35) sits above its median (44.50). The gap in means is 35.90 points, but the gap in medians is 45.50 points. Comparing means understates how different the two classes really were.

For groups with opposite skew, compare medians, use a rank-based test such as Mann-Whitney or Kruskal-Wallis, or transform each group in a way that suits its own direction. Do not apply one log transform to both: it will make the left skewed group even more skewed.

4.9 Outliers, small samples and two peaks

Skewness is very sensitive to outliers. A single typing error, such as 950 instead of 95, can turn a symmetric sample into a highly skewed one. Check the outlier count in the checks table before trusting any verdict. With fewer than 20 values, removing or adding one point can flip the sign.

Two peaks are a different problem. A bimodal distribution can have skewness near zero and still look nothing like a bell curve. The tool reports the bimodality coefficient; values above 0.555 suggest two peaks (Pfister et al., 2013). Strong skew also pushes the coefficient up, so the tool only warns about two peaks when |G1| is below 0.75. If you see two humps in Chart 1, split the groups rather than describe one skewness.

4.10 Kurtosis, the companion number

Excess kurtosis (G2) describes how heavy both tails are compared with a normal curve. It is 0 for a normal distribution, positive when the tails are heavy, and negative when they are light. High skewness usually comes with positive kurtosis, because one heavy tail also raises tail weight. For a full kurtosis analysis use the leptokurtic vs platykurtic calculator listed in the related tools.

4.11 What skewness means for your next analysis

Mild skew (|G1| below 1) rarely harms t-tests or ANOVA once each group has 30 or more values, because the sampling distribution of the mean becomes close to normal. Strong skew with small groups is a problem: confidence intervals become lopsided and p-values become unreliable. In that case you can transform (log or square root for right skew; reflect then log for left skew), use a rank-based test, use a generalised linear model with a gamma or log-normal family, or bootstrap.

4.12 Common mistakes this calculator prevents

  • Naming the skew after the peak instead of the tail.
  • Mixing up G1 (Excel SKEW) and g1 (Excel SKEW.P, SciPy default) and reporting two different numbers for the same data.
  • Calling a skew of 0.3 “skewed” because it is significant in a huge sample.
  • Trusting the mean vs median order alone, which can mislead with discrete or bounded data.
  • Forgetting that blanks, text or “n/a” codes in a column change n. The tool lists every ignored entry.
  • Log-transforming left skewed data, which makes it worse.

✍ 5. How to Write Your Results in Research

Skewness usually appears in two places in a paper: the Methods, where you say how you checked distribution shape, and the Results, where you report the numbers. The five templates below fill in automatically after you run the analysis. Edit the wording to fit your study, but keep the numbers.

▶ Run the analysis above to auto-fill all five examples with your results.

Example 1, APA 7th Edition
Skewness of ___ was assessed with the adjusted Fisher-Pearson coefficient (G1) and the D’Agostino test. For ___, the distribution was ___ skewed (G1 = ___, SE = ___, z = ___, p = ___; M = ___, Mdn = ___, SD = ___, n = ___).
📌 Key conventions for this style
  • Italicise statistical symbols in the final paper: G1, SE, z, p, M, Mdn, SD, n.
  • Give p to two or three decimals with no leading zero (p = .003), and write p < .001 for very small values.
  • Report skewness to two decimals, with its SE.
  • Name the test: D’Agostino skewness test, or z = G1 / SE.
Example 2, Thesis / Dissertation
Distribution shape was examined before inferential analysis. Scores for ___ ranged from ___ to ___, with a median of ___ (IQR ___ to ___) and a mean of ___ (SD ___). The adjusted skewness coefficient was ___ (SE ___, z = ___), indicating ___.
📌 Key conventions for this style
  • Explain which skewness formula you used, because Excel, SPSS, R and Python give different values.
  • State the threshold you used to call data skewed, and cite it.
  • Say what you did about the skew: transform, rank-based test, or nothing, and why.
  • Put the histograms or Q-Q plots in an appendix and refer to them.
Example 3, Plain-Language Summary
In ___, most values were on the ___ side, with a few ___ values stretching the tail to the ___. The typical value was ___, while the average was ___.
📌 Key conventions for this style
  • Avoid the word “skewness” and all symbols.
  • Use “typical value” for the median and “average” for the mean.
  • Describe the tail in words: “a few very large values”.
  • Give units every time a number appears.
Example 4, Structured Abstract / Poster
Shape: ___, ___ skewed, G1 ___ (SE ___), p ___, Mdn ___ [IQR ___], n = ___. Methods: skewness by adjusted Fisher-Pearson G1; D’Agostino test, two-sided.
📌 Key conventions for this style
  • Keep one line per group.
  • Use square brackets for the IQR so it is not mistaken for a confidence interval.
  • On a poster, show one small histogram per group next to the numbers.
  • Keep decimals consistent across groups.
Example 5, Replication / Pre-Registration
Planned shape assessment: for each group we will compute the adjusted skewness G1 with its standard error and the D’Agostino skewness test (two-sided, α = ___). A group will be called right or left skewed when |G1| ≥ ___. Observed values: ___.
📌 Key conventions for this style
  • Fix the threshold and the formula before you see the data.
  • Say in advance what you will do if the skew passes the threshold.
  • Record the quartile method (type 7 here) so Bowley skewness can be reproduced.
  • Name the software and version.

5.1 Methods wording

Say three things in your methods: which skewness formula you used, how you judged it, and what you planned to do if data were skewed. For example: “Skewness was quantified with the adjusted Fisher-Pearson coefficient (G1; Joanes & Gill, 1998) and tested with the D’Agostino skewness test (D’Agostino et al., 1990). Distributions with |G1| ≥ 0.5 were treated as skewed; for these, medians and interquartile ranges are reported and group comparisons used the Mann-Whitney U test.”

5.2 The results sentence

Lead with the direction in words, then the numbers. Good: “Hard-test scores were right skewed (G1 = 1.72, SE = 0.51, z = 3.00, p = .003).” Weak: “Skewness was 1.722.” The weak version forces the reader to know that positive means right, and it gives no idea whether 1.722 is large or could be chance.

For two groups with opposite skew, put them in one sentence so the contrast is clear: “Easy-test scores were left skewed (G1 = −1.63, p = .004) whereas hard-test scores were right skewed (G1 = 1.72, p = .003).”

5.3 Tables and figures

In a descriptive table, add a column for skewness and, if space allows, its SE. Report mean (SD) for symmetric variables and median [IQR] for skewed ones, and say which is which in a footnote. For figures, a histogram or a box plot with raw points shows skew far better than a bar chart of means. Weissgerber et al. (2015) showed that bar graphs of means hide exactly the shape problems that skewness describes.

5.4 The discussion sentence

Explain what the skew means in your field. For example: “The left skew in easy-test scores reflects a ceiling effect: many students reached the maximum, so the test could not separate the strongest students.” Or: “Right skew in length of stay is driven by a small number of complicated cases, which matters for bed planning because the mean overstates the typical stay.”

5.5 Reporting checklist

  • ✓ Direction in words: left skewed, right skewed or approximately symmetric.
  • ✓ The coefficient with its name (G1, g1 or b1) and two decimals.
  • ✓ The SE, z or the D’Agostino p-value, and n.
  • ✓ Mean and median, so the reader sees the gap.
  • ✓ The threshold you used and its source.
  • ✓ What you did about it: transformation, non-parametric test, or a reason to do nothing.
  • ✓ A histogram, box plot or Q-Q plot in the paper or supplement.

∑ 6. Formulas Used

These are the exact formulas this left skewed vs right skewed calculator uses. Every card ends with the worked numbers for the hard-test scores, so you can check each step by hand.

①
Adjusted Fisher-Pearson Skewness, G1 (Excel SKEW)
G1 = [n ÷ ((n − 1)(n − 2))] × Σ((xᵢ − x̄) ÷ s)³ = g1 × √[n(n − 1)] ÷ (n − 2)
G1Sample skewness, unitless. Positive = right skewed, negative = left skewed
xᵢ, x̄Each value and the sample mean, in the units of the data
sSample standard deviation with n − 1 (Excel STDEV.S)
nNumber of values. Needs n ≥ 3
Use forThe default in Excel SKEW, SPSS, SAS, Stata and pandas .skew()
ExampleHard test: g1 = 1.5901, √(20 × 19) ÷ 18 = 1.0830, so G1 = 1.7220
②
Moment Skewness, g1 (Excel SKEW.P), and b1
mₖ = Σ(xᵢ − x̄)ᵏ ÷ n  ·  g1 = m₃ ÷ m₂3/2  ·  b1 = g1 × ((n − 1) ÷ n)3/2
m₂Second central moment, the variance with divisor n, in squared units
m₃Third central moment, in cubed units. Its sign sets the direction of skew
g1Moment skewness, unitless. SciPy skew() default and R moments::skewness
b1Used by Minitab and by R e1071 type 3
RuleFor the same data |b1| < |g1| < |G1|. The gap shrinks as n grows
ExampleHard test: m₂ = 265.0275, m₃ = 6860.5282, g1 = 1.5901
③
Standard Error of Skewness and the z Ratio
SE = √[6n(n − 1) ÷ ((n − 2)(n + 1)(n + 3))]  ·  z = G1 ÷ SE
SEHow much G1 varies between samples from a symmetric population, unitless
zStandardised skewness. Compare with ±1.96 for α = 0.05
nSample size. SE = 0.51 at n = 20, 0.24 at n = 100
RuleKim (2013): |z| > 1.96 for n < 50, |z| > 3.29 for n from 50 to 300
ExampleHard test: SE = 0.5121, z = 1.7220 ÷ 0.5121 = 3.3627
④
D’Agostino Skewness Test (scipy skewtest)
Y = g1√[(n+1)(n+3) ÷ 6(n−2)]  ·  β₂ = 3(n²+27n−70)(n+1)(n+3) ÷ [(n−2)(n+5)(n+7)(n+9)]  ·  W² = √[2(β₂−1)] − 1  ·  δ = 1 ÷ √(ln W)  ·  α = √[2 ÷ (W²−1)]  ·  Z = δ ln[Y÷α + √((Y÷α)²+1)]
YScaled skewness. It equals the z ratio of card ③ exactly
β₂, W², δ, αConstants that depend only on n and reshape Y into a normal score
ZTest statistic, compared with the standard normal curve; p = 2 × P(N(0,1) > |Z|)
Requiresn ≥ 8. Below that the tool falls back to the z ratio
ExampleHard test: Y = 3.3627, β₂ = 3.5778, W² = 1.2706, Z = 3.0036, p = 0.0027
⑤
Pearson’s Skewness Coefficients
Sk1 = (x̄ − Mode) ÷ s  ·  Sk2 = 3(x̄ − Mdn) ÷ s
Sk2Median-based skewness, unitless, usually between −3 and 3
MdnThe median, the middle value once sorted
ModeMost frequent value. Sk1 is only shown when there is exactly one mode
WhyThe tail drags the mean away from the median, so the gap measures skew
ExampleHard test: 3(50.35 − 44.50) ÷ 16.7026 = 1.0507
⑥
Bowley (Quartile) and Kelly Skewness
Bowley = (Q₃ + Q₁ − 2Mdn) ÷ (Q₃ − Q₁)  ·  Kelly = (P₉₀ + P₁₀ − 2Mdn) ÷ (P₉₀ − P₁₀)
Q₁, Q₃First and third quartiles, type 7 method (Excel QUARTILE.INC, R default)
P₁₀, P₉₀10th and 90th percentiles, same method
RangeAlways between −1 and +1
WhyRobust: the outer values do not count, so one outlier cannot dominate it
ExampleHard test: (52.00 + 39.75 − 89.00) ÷ 12.25 = 0.2245
⑦
Decision Rules for Left vs Right Skew
Left: G1 ≤ −0.5  ·  Symmetric: |G1| < 0.5  ·  Right: G1 ≥ 0.5  ·  High: |G1| > 1  ·  BC = (G1² + 1) ÷ [G2 + 3(n−1)² ÷ ((n−2)(n−3))]
DirectionThe sign of G1. Positive = tail on the right, negative = tail on the left
SizeBulmer-style bands: 0.5 and 1. The lenient option uses 1 and 2
SignificanceD’Agostino p < α, or |z| > 1.96 when n < 8
G2Excess kurtosis (Excel KURT), 0 for a normal curve
BCBimodality coefficient. Above 0.555 hints at two peaks, where skewness alone misleads

🔀 7. Skewness Calculation Flowchart, Step by Step

This flowchart shows how to decide left skewed vs right skewed, step by step, from a raw column of numbers to a tested verdict. Every box uses the same worked example as the Excel, R and Python sections: the 20 hard-test scores (35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 50, 51, 55, 62, 71, 88, 95). The easy-test totals are given in the final box.

Start or result Data step Calculation step Yes or no check
Start Raw scores 20 hard-test scores in %, one student per value
1
Put every value in one column 42, 48, 35, 51, 38, 62, 45, 40, 88, 37, 44, 55, 39, 47, 71, 36, 43, 50, 95, 41
CheckIs any cell blank, text or a missing-value code?
YesDelete it, never type 0. A fake zero creates a false left tail.
NoKeep every value. Here all 20 are real scores.
2
Count, add, find the mean and median n, Σx, x̄ = Σx ÷ n, Mdn n = 20, Σx = 1007, x̄ = 50.35, Mdn = 44.50
3
Square and cube each deviation m₂ = Σ(x − x̄)² ÷ n  ·  m₃ = Σ(x − x̄)³ ÷ n m₂ = 5300.55 ÷ 20 = 265.0275; m₃ = 137210.565 ÷ 20 = 6860.5282
4
Divide to get moment skewness g1 = m₃ ÷ m₂1.5 6860.5282 ÷ 4314.5590 = 1.5901
5
Adjust for sample size G1 = g1 × √[n(n − 1)] ÷ (n − 2) 1.5901 × 1.0830 = 1.7220 (Excel SKEW gives the same)
CheckIs |G1| at least 0.5?
YesSkewed. The sign names it: G1 = +1.72, so right skewed, and above 1, so high.
NoCall it approximately symmetric and report mean and SD.
6
Find the standard error and z SE = √[6n(n−1) ÷ ((n−2)(n+1)(n+3))], z = G1 ÷ SE SE = 0.5121, z = 1.7220 ÷ 0.5121 = 3.3627
CheckDo you have at least 8 values?
YesRun the D’Agostino test in step 7. Here n = 20.
No, stopThe test is not valid. Report G1 and SE only, and treat the verdict as provisional.
7
Run the D’Agostino skewness test Z = δ ln[Y÷α + √((Y÷α)² + 1)] δ = 2.8899, α = 2.7187, Z = 3.0036, p = 0.0027
Result Hard test: G1 = 1.72, SE = 0.51, Z = 3.00, p = .003 Highly right skewedSignificant Easy test, same steps: G1 = −1.63, Z = −2.88, p = .004, highly left skewed. Rule: |G1| ≥ 0.5 skewed, ≥ 1 high; sign gives direction; p < 0.05 means not chance.

Check any box yourself: the Excel sheet in Section 9, the R script in Section 10 and the Python script in Section 11 all return G1 = 1.7220, g1 = 1.5901, SE = 0.5121 and Z = 3.0036 for the hard test, and G1 = −1.6308 for the easy test.

📝 8. How to Use This Calculator

  1. Enter your data. In the Paste / Type tab, type or paste comma-separated numbers into a group box, for example 52, 48, 55, 61, 47. New lines, tabs and spaces also work.
  2. Name each group. Click the group name above each box and type a meaningful name such as Easy test. The name flows into the results table, all four charts and the report.
  3. Add more groups to compare. Press Add group to compare left skewed vs right skewed groups side by side. Each box has its own Clear and Remove button.
  4. Or upload a CSV or Excel file. On the Upload tab choose a file, then click the columns you want. Every selected column is loaded as its own group.
  5. Or type into the manual table. On the Manual Entry tab, each column is a group. Rename the headers, add rows or columns, then press Use this table.
  6. Try a sample dataset. Ten built-in datasets cover right skew (income, waiting time), left skew (easy tests, age at death, ratings), symmetric data and a messy pilot study.
  7. Choose your settings. Pick the skewness formula (G1 matches Excel SKEW), the size bands, the significance level, the histogram bins, decimals and units.
  8. Press Run Analysis. Nothing is calculated until you press the button, and changing any input clears old results so you never read stale numbers.
  9. Read the verdict and checks. Each group gets a coloured verdict card, the coefficients, the D’Agostino test and a list of data checks such as outliers and small samples.
  10. Use the charts and export. Read the histogram, box plot, normal probability plot and skewness chart, copy a reporting template from Section 5, and download the Doc or PDF report.

📈 9. How to Calculate Skewness in Excel (Left vs Right Skewed)

Excel can tell you whether data are left skewed or right skewed with one function, SKEW. What trips people up is everything around it: Excel has two skewness functions that give different numbers, it has no built-in p-value for skewness, and the Analysis ToolPak reports skewness without a standard error. This section shows each step on the hard-test scores with the spreadsheet on screen.

The whole thing in one line: with your numbers in A2:A21, type =SKEW(A2:A21) and press Enter. A positive answer means right skewed, a negative answer means left skewed. The hard test gives 1.7220.

9.1 The functions you need

You wantExcel functionNote
Skewness, adjusted G1=SKEW(A2:A21)Matches SPSS, SAS, pandas and this tool’s default
Skewness, moment g1=SKEW.P(A2:A21)Matches SciPy’s default and R moments::skewness. Excel 2013 and later
Excess kurtosis=KURT(A2:A21)0 for a normal curve
Mean and median=AVERAGE(A2:A21), =MEDIAN(A2:A21)Mean above median hints right skew
Sample SD=STDEV.S(A2:A21)Use .S, not .P, for Pearson’s coefficient
Quartiles=QUARTILE.INC(A2:A21,1)Same method as R type 7 and NumPy
Count of numbers=COUNT(A2:A21)Use COUNT, not COUNTA, which counts text too
Normal tail area=NORM.S.DIST(z,TRUE)Turns a z value into a p-value
ToolPak summaryData → Data Analysis → Descriptive StatisticsReports SKEW and KURT. The Analysis ToolPak must be enabled first under File → Options → Add-ins

9.2 Step by step

1 Put each group in its own column

Type a name in row 1 and the values underneath. Here the easy test is in column A and the hard test in column B, 20 scores each. Keep blanks blank; never type 0 for a missing value.

Xscores.xlsx - ExcelB2fx42AB1Easy testHard test2954239248488355975169038785628934597840

Easy test in A2:A21, hard test in B2:B21. Only the first eight rows are shown. The steps below copy the hard test into column A of a new sheet.

2 Get n, the mean and the median first

=COUNT(A2:A21)=AVERAGE(A2:A21)=MEDIAN(A2:A21)=STDEV.S(A2:A21)

Putting the mean beside the median is the free first check: a mean well above the median points to a right tail.

Xscores.xlsx - ExcelC3fx=AVERAGE(A2:A21)ABC1Hard testStatisticValue242n20348Mean50.35435Median44.5551SD16.7026638Min35762Max95

n = 20, mean 50.35 in C3, median 44.5 in C4, SD 16.7026. The mean is 5.85 points above the median, the first sign of right skew.

3 Calculate skewness with SKEW, then the SE and z

=SKEW(A2:A21)=SKEW.P(A2:A21)=SQRT(6*20*19/(18*21*23))=C2/C4

SKEW gives G1, SKEW.P gives g1. The third formula is the standard error for n = 20; replace the 20, 19, 18, 21 and 23 with n, n − 1, n − 2, n + 1 and n + 3 for your data.

Xscores.xlsx - ExcelC2fx=SKEW(A2:A21)ABC1Hard testStatisticValue242SKEW1.7220348SKEW.P1.5901435SE0.5121551z3.3627638p (z test)0.0008

SKEW = 1.7220, SKEW.P = 1.5901, SE = 0.5121, z = 3.3627. The p in C6 comes from =2*(1-NORM.S.DIST(ABS(C5),TRUE)).

4 Run the D’Agostino skewness test in eight cells

=SKEW.P(A2:A21)*SQRT((C2+1)*(C2+3)/(6*(C2-2)))=3*(C2^2+27*C2-70)*(C2+1)*(C2+3)/((C2-2)*(C2+5)*(C2+7)*(C2+9))=SQRT(2*(C4-1))-1=1/SQRT(LN(SQRT(C5)))=SQRT(2/(C5-1))=C6*ASINH(C3/C7)=2*(1-NORM.S.DIST(ABS(C8),TRUE))

Put =COUNT(A2:A21) in C2, then the seven formulas above in C3 to C9 in that order. ASINH is Excel’s shortcut for ln[y + √(y² + 1)].

Xscores.xlsx - ExcelC8fx=C6*ASINH(C3/C7)ABC1Hard testStepValue242n20348Y3.3627435beta23.5778551W21.2706638delta2.8899762alpha2.7187845Z3.0036940p0.0027

Y = 3.3627, β₂ = 3.5778, W² = 1.2706, δ = 2.8899, α = 2.7187, Z = 3.0036 in C8 and p = 0.0027 in C9, identical to R and Python.

5 Add the robust quartile skewness

=QUARTILE.INC(A2:A21,1)=(C4+C2-2*C3)/(C4-C2)=3*(AVERAGE(A2:A21)-MEDIAN(A2:A21))/STDEV.S(A2:A21)

Bowley skewness only uses the quartiles, so it tells you whether the middle half of the data is lopsided too.

Xscores.xlsx - ExcelC5fx=(C4+C2-2*C3)/(C4-C2)ABC1Hard testStatisticValue242Q139.75348Median44.5435Q352551Bowley0.2245638Pearson Sk21.0507762KURT2.3861

Q1 = 39.75, median 44.5, Q3 = 52, Bowley = 0.2245, Pearson Sk2 = 1.0507, KURT = 2.3861. All positive, so the right skew runs through the whole distribution.

9.3 The awkward cases

Excel gives skewness but no p-value. Neither SKEW nor the ToolPak tests it. Use the z ratio from step 3 for a quick answer, or the eight-cell D’Agostino chain from step 4 for the proper test. The quick z ratio is a little too generous in small samples: for the hard test it gives p = 0.0008, while the D’Agostino test gives 0.0027.

SKEW or SKEW.P? SKEW is the sample statistic most journals and SPSS users expect. SKEW.P treats your data as the whole population. For n = 20 they differ by about 8%; for n = 200 by under 1%.

The SKEW.P trap. SKEW.P is not “more correct” because it says P. It is the biased moment estimate. Report SKEW (G1) unless your field asks for g1, and always say which one you used. The tool’s first settings box lets you match either.

Fewer than 3 values. SKEW returns #DIV/0! with fewer than three numbers or when every value is the same. That is correct: skewness is undefined there.

9.4 Why your Excel answer might differ from R or Python

SituationWhat happensFix
Python scipy.stats.skew(x)Gives g1 (1.5901), not Excel’s SKEW (1.7220)Use skew(x, bias=False), or compare with SKEW.P
R e1071::skewness(x)Default type 3 gives b1 (1.4723)Use type = 2 to match Excel SKEW
R moments::skewness(x)Gives g1 (1.5901)Compare with SKEW.P, or adjust by √[n(n − 1)] ÷ (n − 2)
pandas Series.skew()Gives G1 (1.7220), same as ExcelNo fix needed
p from the z ratio vs D’Agostino0.0008 vs 0.0027 for the hard testThey are different tests. Report which one you used
SciPy skewtest on perfectly symmetric dataReturns z = 1.04 when g1 is exactly 0, because SciPy replaces y = 0 with 1Treat it as z = 0. R and this tool return 0
Blank cells or text in the rangeExcel skips them, so n is smaller than you thinkCheck COUNT first
Quartiles differ for BowleyQUARTILE.EXC and SPSS use a different methodUse QUARTILE.INC, which matches R type 7 and NumPy
ToolG1 (adjusted)g1 (moment)Skewness test
Excel=SKEW(rng)=SKEW.P(rng)Build it, step 4
Google Sheets=SKEW(rng)=SKEW.P(rng)Same cell chain
Re1071::skewness(x, type = 2)moments::skewness(x)moments::agostino.test(x)
Python SciPyskew(x, bias=False)skew(x)skewtest(x)
Python pandass.skew()not built inuse SciPy
SPSSAnalyze → Descriptive Statistics → Explore gives skewness (G1) with its standard error

9.5 Making a left vs right skewed histogram and box plot in Excel

  1. Select one column of values, then Insert → Charts → Statistic → Histogram (Excel 2016 and later).
  2. Right-click the horizontal axis, choose Format Axis, and set a bin width that gives 5 to 10 bars. Too many bars hide the tail.
  3. For a box plot select both columns, then Insert → Statistic → Box and Whisker. Excel draws the mean as an ×; it sits on the tail side of the median line.
  4. Add the skewness to the chart title, for example “Hard test, G1 = 1.72”, so readers do not have to guess.
  5. Set the gap width to 0% on a histogram so the bars touch, which is what reviewers expect.

Charts 1 and 2 in Section 3 draw both plots for every group automatically, with the mean, median and fences marked.

9.6 Excel errors you will probably hit

Excel showsWhyFix
#DIV/0! from SKEWFewer than 3 numbers, or every value identicalCheck COUNT and that the values vary
#NAME? from SKEW.PExcel 2010 or olderUse =SKEW(rng)*(n-2)/SQRT(n*(n-1))
#NUM! in the D’Agostino chainn is below 8, so LN gets a non-positive valueThe test needs n ≥ 8
#VALUE!Text or units typed in a cellKeep units in the header only
Skewness flips sign after an editOne extreme value dominates a small sampleCheck outliers; report Bowley as well
Green triangles in cell cornersNumbers stored as text and skippedSelect the column, click the warning icon, Convert to Number

📈 10. How to Calculate Skewness in R (Left vs Right Skewed)

R has no skewness function in base R, so people install a package and are then surprised that e1071, moments and psych give three different numbers. The script below needs no packages. It computes G1 (Excel SKEW), g1, the standard error, the D’Agostino test, Pearson and Bowley skewness for every group, prints a plain-English verdict, and saves one publication-ready figure at 300 dpi with histograms, box plots and a normal probability plot.

Copy the whole block. It runs top to bottom in RStudio, VS Code or plain Rscript. Change only the groups <- list(...) lines to use your own data.

10.1 The complete script

R, base only, saves skewness_plot.png

# ============================================================
# Left skewed vs right skewed: skewness, D'Agostino test and
# one publication-ready figure (histograms, box plot, Q-Q plot)
# StatsUnlock - https://statsunlock.com/left-skewed-vs-right-skewed/
# Base R only. No packages to install.
# ============================================================

# ---- 1. Your data -------------------------------------------
# Replace with your own groups, or read a CSV:
#   df <- read.csv("data.csv")
#   groups <- list("Easy test" = na.omit(df$easy), "Hard test" = na.omit(df$hard))
groups <- list(
  "Easy test" = c(95, 92, 88, 97, 90, 85, 93, 78, 96, 89,
                  62, 91, 94, 87, 70, 98, 90, 83, 55, 92),
  "Hard test" = c(42, 48, 35, 51, 38, 62, 45, 40, 88, 37,
                  44, 55, 39, 47, 71, 36, 43, 50, 95, 41)
)
alpha <- 0.05
units <- "%"

# ---- 2. Skewness functions ----------------------------------
skew_g1 <- function(x) {                 # moment skewness = Excel SKEW.P
  d <- x - mean(x)
  mean(d^3) / mean(d^2)^1.5
}
skew_G1 <- function(x) {                 # adjusted = Excel SKEW, SPSS, SAS
  n <- length(x)
  skew_g1(x) * sqrt(n * (n - 1)) / (n - 2)
}
se_skew <- function(n) sqrt(6 * n * (n - 1) / ((n - 2) * (n + 1) * (n + 3)))
dagostino <- function(x) {               # same as moments::agostino.test
  n <- length(x)
  if (n < 8) return(c(Z = NA, p = NA))
  y  <- skew_g1(x) * sqrt((n + 1) * (n + 3) / (6 * (n - 2)))
  b2 <- 3 * (n^2 + 27 * n - 70) * (n + 1) * (n + 3) /
        ((n - 2) * (n + 5) * (n + 7) * (n + 9))
  w2 <- -1 + sqrt(2 * (b2 - 1))
  delta <- 1 / sqrt(log(sqrt(w2)))
  a  <- sqrt(2 / (w2 - 1))
  Z  <- delta * log(y / a + sqrt((y / a)^2 + 1))
  c(Z = Z, p = 2 * pnorm(-abs(Z)))
}

# ---- 3. Results for every group -----------------------------
res <- lapply(groups, function(x) {
  x  <- x[!is.na(x)]                     # drop missing values
  n  <- length(x)
  q  <- quantile(x, c(0.25, 0.5, 0.75))  # type 7, same as Excel
  G1 <- skew_G1(x)
  dz <- dagostino(x)
  list(n = n, mean = mean(x), median = median(x), sd = sd(x),
       g1 = skew_g1(x), G1 = G1, se = se_skew(n), z = G1 / se_skew(n),
       Z = unname(dz["Z"]), p = unname(dz["p"]),
       pearson2 = 3 * (mean(x) - median(x)) / sd(x),
       bowley = unname((q[3] + q[1] - 2 * q[2]) / (q[3] - q[1])))
})

for (nm in names(res)) {
  r <- res[[nm]]
  shape <- if (abs(r$G1) < 0.5) "approximately symmetric" else
    paste(if (abs(r$G1) > 1) "highly" else "moderately",
          if (r$G1 > 0) "right skewed (positive)" else "left skewed (negative)")
  sig <- if (!is.na(r$p) && r$p < alpha) "significant" else "not significant"
  cat(sprintf("\n%s  (n = %d)\n", nm, r$n))
  cat(sprintf("  mean = %.4f   median = %.4f   SD = %.4f\n", r$mean, r$median, r$sd))
  cat(sprintf("  G1 = %.4f   g1 = %.4f   SE = %.4f   z = %.4f\n", r$G1, r$g1, r$se, r$z))
  cat(sprintf("  D'Agostino Z = %.4f   p = %.4f\n", r$Z, r$p))
  cat(sprintf("  Pearson Sk2 = %.4f   Bowley = %.4f\n", r$pearson2, r$bowley))
  cat(sprintf("  Verdict: %s, %s at alpha = %.2f\n", shape, sig, alpha))
}

# ---- 4. One figure, four panels -----------------------------
cols <- c("#2563eb", "#ea580c", "#16a34a", "#9333ea")
png("skewness_plot.png", width = 3000, height = 2250, res = 300)
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 3, 1), family = "sans")

for (k in 1:2) {                         # panels 1 and 2: histograms
  x <- groups[[k]]; r <- res[[k]]
  hist(x, breaks = "Sturges", col = adjustcolor(cols[k], 0.35), border = cols[k],
       main = sprintf("%s: G1 = %.2f, p = %.3f", names(groups)[k], r$G1, r$p),
       xlab = sprintf("Value (%s)", units), ylab = "Frequency", las = 1, cex.main = 1)
  abline(v = r$mean,   col = "#c2410c", lwd = 2.4, lty = 2)
  abline(v = r$median, col = "#9333ea", lwd = 2.4)
  legend(if (r$G1 < 0) "topleft" else "topright", bty = "n", cex = 0.85, lwd = 2.4, lty = c(2, 1),
         col = c("#c2410c", "#9333ea"),
         legend = c(sprintf("Mean %.2f", r$mean), sprintf("Median %.2f", r$median)))
}

boxplot(groups, horizontal = TRUE, outline = FALSE, las = 1, col = "white",
        main = "Box plot: long whisker = tail side", cex.main = 1,
        xlab = sprintf("Value (%s)", units),
        ylim = range(unlist(groups)))
set.seed(42)                             # seed = reproducible jitter
for (k in seq_along(groups)) {
  x <- groups[[k]]
  points(x, k + runif(length(x), -0.15, 0.15), pch = 19,
         col = adjustcolor(cols[k], 0.6))
  points(res[[k]]$mean, k, pch = 23, bg = "#c2410c", col = "#c2410c", cex = 1.6)
}

qq <- lapply(groups, qqnorm, plot.it = FALSE)
plot(NULL, xlim = range(sapply(qq, function(q) range(q$x))),
     ylim = range(unlist(groups)), las = 1, main = "Normal probability plot",
     cex.main = 1, xlab = "Theoretical normal quantile",
     ylab = sprintf("Sample value (%s)", units))
for (k in seq_along(groups)) {
  points(qq[[k]]$x, qq[[k]]$y, pch = 19, col = cols[k])
  qqline(groups[[k]], col = cols[k], lty = 2)
}
legend("topleft", bty = "n", pch = 19, col = cols[seq_along(groups)],
       legend = names(groups), cex = 0.85)

dev.off()
cat("\nSaved skewness_plot.png\n")

Run it with Rscript skewness.R. It prints G1 = −1.6308 (Z = −2.8827, p = 0.0039) for the easy test and G1 = 1.7220 (Z = 3.0036, p = 0.0027) for the hard test, matching Excel and Python.

10.2 What each part does

Line or functionWhat it does, and why it is there
groups <- list(...)One named vector per group. The names become panel titles and labels. na.omit() in the CSV line drops missing values so n is honest.
skew_g1()The moment skewness: the mean of the cubed deviations divided by the variance (divisor n) to the power 1.5. Same as Excel SKEW.P and moments::skewness.
skew_G1()Multiplies g1 by √[n(n − 1)] ÷ (n − 2). This is Excel SKEW, SPSS, SAS and e1071::skewness(x, type = 2).
se_skew()The standard error of G1. It depends only on n, not on the data.
dagostino()The D’Agostino (1970) skewness test, written out so you can see every constant. It returns the same Z and p as moments::agostino.test(). It returns NA when n < 8.
quantile(x, c(.25,.5,.75))Quartiles with R’s default type 7, identical to Excel QUARTILE.INC and NumPy. Needed for Bowley skewness.
lapply(groups, ...)Runs the same calculations on every group and returns a list of results, one per group.
if (abs(r$G1) < 0.5)The size rule: below 0.5 symmetric, 0.5 to 1 moderate, above 1 high. Change 0.5 and 1 to 1 and 2 for the lenient rule.
png(..., res = 300)Opens a 300 dpi file. Without res you get a blurry 72 dpi image that journals reject.
par(mfrow = c(2, 2))Splits the figure into a 2 by 2 grid of panels.
hist(..., breaks = "Sturges")Draws each histogram with Sturges bins, the same default as this tool, so the shapes match Chart 1.
boxplot(..., horizontal = TRUE, outline = FALSE)Horizontal box plots, so “right skewed” really points right. outline = FALSE stops outliers being drawn twice, because every point is added next.
set.seed(42)Fixes the random vertical jitter so the figure is reproducible.
qqnorm(..., plot.it = FALSE), qqline()Computes the normal probability plot points without drawing, so both groups can share one panel, then adds a reference line through the quartiles.
dev.off()Closes the file. Forgetting it leaves an empty or locked PNG, the most common R plotting error.

10.3 What the figure shows

The top two panels are histograms. The easy test piles up near 90 to 100 with a few low scores trailing left: the mean line (dashed) sits left of the median line, the picture of left skew. The hard test piles up near 40 with a tail running right to 95: the mean sits right of the median, the picture of right skew.

The bottom left panel puts the two box plots on one scale. The easy test has its long whisker and loose points on the left; the hard test has them on the right. The bottom right panel is the normal probability plot: the hard-test points bend up away from their line at the right end (convex), and the easy-test points bend down away from their line at the left end (concave).

10.4 Common R problems and fixes

SymptomCauseFix
could not find function "skewness"Base R has noneUse the functions in the script, or library(moments)
e1071 and Excel disagreee1071 defaults to type 3 (b1)e1071::skewness(x, type = 2)
moments and SPSS disagreemoments returns g1, SPSS returns G1Use skew_G1() from the script
Result is NAA missing value in the vectorx <- x[!is.na(x)] before calculating
agostino.test error about sample sizen is below 8Report G1 and SE only
The PNG is emptydev.off() never ranRun while (dev.cur() > 1) dev.off()
Legend covers the barsTail and legend on the same sideThe script already moves it; change "topleft" if needed

10.5 Useful one-liners

You wantR code
G1, Excel SKEWe1071::skewness(x, type = 2)
g1, Excel SKEW.Pmoments::skewness(x)
D’Agostino testmoments::agostino.test(x)
Skewness by grouptapply(df$value, df$group, function(v) e1071::skewness(v, type = 2))
Quick normal probability plotqqnorm(x); qqline(x)
Log transform for right skewskew_G1(log(x))
Reflect, then log, for left skewskew_G1(log(max(x) + 1 - x))
Bootstrap 95% CI for G1quantile(replicate(5000, skew_G1(sample(x, replace = TRUE))), c(.025, .975))

📈 11. How to Calculate Skewness in Python (Left vs Right Skewed)

In Python, scipy.stats.skew(x) is one line, but its default is the moment estimate g1, which disagrees with Excel, SPSS and pandas. The script below computes both, runs the D’Agostino test with scipy.stats.skewtest, prints a verdict for each group, and saves one 300 dpi figure with histograms, box plots and a normal probability plot.

Copy the whole block. Change only the groups = {...} lines. It runs in a terminal, VS Code, Spyder or Jupyter.
numpyarrays, quartiles
scipy.statsskew, skewtest, kurtosis, probplot
matplotlibthe figure

Install with pip install numpy scipy matplotlib if you do not already have them. Add pandas only if you use the CSV line.

11.1 The complete script

Python 3, saves skewness_plot.png

# ============================================================
# Left skewed vs right skewed: skewness, D'Agostino test and
# one publication-ready figure (histograms, box plot, Q-Q plot)
# StatsUnlock - https://statsunlock.com/left-skewed-vs-right-skewed/
# ============================================================
import numpy as np
from scipy import stats
import matplotlib
matplotlib.use("Agg")                     # draw to file, no window needed
import matplotlib.pyplot as plt

# ---- 1. Your data -------------------------------------------
# Replace with your own groups, or read a CSV:
#   import pandas as pd
#   df = pd.read_csv("data.csv")
#   groups = {c: df[c].dropna().to_numpy(float) for c in ["Easy test", "Hard test"]}
groups = {
    "Easy test": np.array([95, 92, 88, 97, 90, 85, 93, 78, 96, 89,
                           62, 91, 94, 87, 70, 98, 90, 83, 55, 92], dtype=float),
    "Hard test": np.array([42, 48, 35, 51, 38, 62, 45, 40, 88, 37,
                           44, 55, 39, 47, 71, 36, 43, 50, 95, 41], dtype=float),
}
alpha = 0.05
units = "%"

# ---- 2. Skewness for every group ----------------------------
def skew_report(x):
    x = x[~np.isnan(x)]                   # drop missing values
    n = len(x)
    g1 = stats.skew(x)                    # moment skewness = Excel SKEW.P
    G1 = stats.skew(x, bias=False)        # adjusted = Excel SKEW, SPSS, SAS
    se = np.sqrt(6 * n * (n - 1) / ((n - 2) * (n + 1) * (n + 3)))
    q1, med, q3 = np.percentile(x, [25, 50, 75])   # type 7, same as Excel
    out = dict(n=n, mean=x.mean(), median=med, sd=x.std(ddof=1),
               g1=g1, G1=G1, se=se, z=G1 / se,
               pearson2=3 * (x.mean() - med) / x.std(ddof=1),
               bowley=(q3 + q1 - 2 * med) / (q3 - q1),
               kurt=stats.kurtosis(x, bias=False))  # = Excel KURT
    if n >= 8:
        out["Z"], out["p"] = stats.skewtest(x)       # D'Agostino test
    else:
        out["Z"], out["p"] = np.nan, np.nan
    return out

results = {name: skew_report(x) for name, x in groups.items()}

for name, r in results.items():
    if abs(r["G1"]) < 0.5:
        shape = "approximately symmetric"
    else:
        size = "highly" if abs(r["G1"]) > 1 else "moderately"
        side = "right skewed (positive)" if r["G1"] > 0 else "left skewed (negative)"
        shape = f"{size} {side}"
    sig = "significant" if r["p"] < alpha else "not significant"
    print(f"\n{name}  (n = {r['n']})")
    print(f"  mean = {r['mean']:.4f}   median = {r['median']:.4f}   SD = {r['sd']:.4f}")
    print(f"  G1 = {r['G1']:.4f}   g1 = {r['g1']:.4f}   SE = {r['se']:.4f}   z = {r['z']:.4f}")
    print(f"  D'Agostino Z = {r['Z']:.4f}   p = {r['p']:.4f}")
    print(f"  Pearson Sk2 = {r['pearson2']:.4f}   Bowley = {r['bowley']:.4f}   kurtosis = {r['kurt']:.4f}")
    print(f"  Verdict: {shape}, {sig} at alpha = {alpha}")

# ---- 3. One figure, four panels -----------------------------
colors = ["#2563eb", "#ea580c", "#16a34a", "#9333ea"]
names = list(groups)
fig, ax = plt.subplots(2, 2, figsize=(10, 7.5))
rng = np.random.default_rng(42)           # seed = reproducible jitter

for k, name in enumerate(names[:2]):      # panels 1 and 2: histograms
    x, r, a = groups[name], results[name], ax[0, k]
    a.hist(x, bins="sturges", color=colors[k], alpha=0.35, edgecolor=colors[k])
    a.axvline(r["mean"], color="#c2410c", ls="--", lw=2, label=f"Mean {r['mean']:.2f}")
    a.axvline(r["median"], color="#9333ea", lw=2, label=f"Median {r['median']:.2f}")
    a.set_title(f"{name}: G1 = {r['G1']:.2f}, p = {r['p']:.3f}", fontsize=11, loc="left")
    a.set_xlabel(f"Value ({units})")
    a.set_ylabel("Frequency")
    a.legend(frameon=False, fontsize=9)

a = ax[1, 0]                              # panel 3: box plots with points
box_kw = dict(widths=0.5, showfliers=False, medianprops=dict(color="black", lw=2))
try:
    a.boxplot([groups[n] for n in names], orientation="horizontal", **box_kw)
except TypeError:                         # Matplotlib older than 3.10
    a.boxplot([groups[n] for n in names], vert=False, **box_kw)
for k, name in enumerate(names):
    x = groups[name]
    a.scatter(x, k + 1 + rng.uniform(-0.15, 0.15, len(x)),
              color=colors[k % 4], alpha=0.6, s=18, zorder=3)
    a.scatter(results[name]["mean"], k + 1, marker="D", color="#c2410c", s=50, zorder=4)
a.set_yticks(range(1, len(names) + 1))
a.set_yticklabels(names)
a.set_title("Box plot: long whisker = tail side", fontsize=11, loc="left")
a.set_xlabel(f"Value ({units})")

a = ax[1, 1]                              # panel 4: normal Q-Q plots
for k, name in enumerate(names):
    (osm, osr), (slope, icpt, _) = stats.probplot(groups[name], dist="norm")
    a.scatter(osm, osr, color=colors[k % 4], s=18, label=name)
    a.plot(osm, slope * osm + icpt, color=colors[k % 4], lw=1.2, ls="--")
a.set_title("Normal probability plot", fontsize=11, loc="left")
a.set_xlabel("Theoretical normal quantile")
a.set_ylabel(f"Sample value ({units})")
a.legend(frameon=False, fontsize=9)

fig.suptitle("Left skewed vs right skewed", fontsize=14, fontweight="bold")
fig.tight_layout()
fig.savefig("skewness_plot.png", dpi=300, bbox_inches="tight")
print("\nSaved skewness_plot.png")

Run it with python skewness.py. In Jupyter, delete the matplotlib.use("Agg") line and add plt.show() at the end to see the figure inline.

11.2 What each part does

Line or functionWhat it does, and why it is there
dtype=floatMakes every array floating point so no integer arithmetic can creep in.
x[~np.isnan(x)]Drops missing values. Without it, every statistic becomes nan.
stats.skew(x)The moment skewness g1 (default bias=True). Matches Excel SKEW.P, not SKEW.
stats.skew(x, bias=False)The adjusted G1. Matches Excel SKEW, SPSS, SAS and pandas.Series.skew().
np.sqrt(6*n*(n-1)/...)The standard error of skewness. SciPy does not report it, so it is computed here.
np.percentile(x, [25, 50, 75])Quartiles with the linear method, identical to Excel QUARTILE.INC and R type 7.
x.std(ddof=1)The sample SD. NumPy’s default ddof=0 is the population SD and would not match Excel STDEV.S.
stats.kurtosis(x, bias=False)Excess kurtosis matching Excel KURT.
stats.skewtest(x)The D’Agostino skewness test. Needs n ≥ 8. One quirk: with skewness exactly 0 it returns z ≈ 1.04 instead of 0, because it replaces 0 with 1 internally.
matplotlib.use("Agg")Draws straight to a file, so the script also works on servers with no screen.
default_rng(42)A seeded random generator for the jitter, so the figure is reproducible.
boxplot(..., orientation=...)Horizontal box plots. The try/except keeps it working on Matplotlib versions older than 3.10, which use vert=False.
stats.probplot(x, dist="norm")Returns the normal probability plot points and a fitted line for each group.
savefig(..., dpi=300, bbox_inches="tight")Saves at print quality and trims empty margins.

11.3 What the figure shows

The four panels match the R figure. The histograms show the easy test leaning left and the hard test leaning right, with the mean line pulled toward each tail. The box plots put both groups on one axis so you can see the long whiskers on opposite sides. On the normal probability plot, the hard-test points curve upward at the right end and the easy-test points curve downward at the left end. Matplotlib picks slightly different histogram edges from R, so bar heights can differ, but every number printed is identical.

11.4 Common Python problems and fixes

SymptomCauseFix
SciPy gives 1.5901, Excel gives 1.7220SciPy defaults to g1stats.skew(x, bias=False)
pandas and SciPy disagreepandas uses G1, SciPy uses g1Pass bias=False to SciPy
Result is nanMissing values in the arrayx = x[~np.isnan(x)], or nan_policy="omit"
skewtest warning about nFewer than 8 valuesReport G1 and SE only
SD does not match ExcelNumPy uses ddof = 0 by defaultx.std(ddof=1)
Figure is blank in JupyterThe Agg backend draws only to fileRemove the matplotlib.use line and call plt.show()
Deprecation warning about vertMatplotlib 3.11 or laterThe script already uses orientation first

11.5 Useful one-liners

You wantPython code
G1, Excel SKEWstats.skew(x, bias=False)
g1, Excel SKEW.Pstats.skew(x)
Skewness of every columndf.skew(numeric_only=True)
Skewness by groupdf.groupby("group")["value"].skew()
D’Agostino teststats.skewtest(x)
Log transform for right skewstats.skew(np.log(x), bias=False)
Reflect, then log, for left skewstats.skew(np.log(x.max() + 1 - x), bias=False)
Box-Cox, finds the best powery, lam = stats.boxcox(x)
Excel, R and Python agree exactly. For the hard test all three give G1 = 1.7220, g1 = 1.5901, SE = 0.5121, Z = 3.0036 and p = 0.0027. If yours disagree, the cause is almost always g1 vs G1: check bias=False in Python, type = 2 in e1071, or SKEW vs SKEW.P in Excel.

📋 12. Reference Tables

12.1 How to read the size of skewness

|Skewness|Standard rule (Bulmer)Lenient rule (George & Mallery)What to report
below 0.5Approximately symmetricAcceptableMean and SD
0.5 to 1Moderately skewedAcceptableMean and SD plus median
1 to 2Highly skewedModerateMedian and IQR first
above 2Highly skewedHighMedian and IQR; transform or rank-based test

What to conclude: the sign gives the direction (positive = right, negative = left) and these bands give the size. Name the rule you used. Kim (2013) and Blanca et al. (2013) discuss why real data rarely have skewness exactly 0.

12.2 Left skewed vs right skewed vs symmetric at a glance

ClueSkewed leftSymmetricSkewed right
Skewness signNegativeAbout 0Positive
Mean vs medianMean < median (usually)Mean ≈ medianMean > median (usually)
Mean, median, mode orderMean < median < modeAll equalMode < median < mean
Median − min vs max − medianLeft gap longerAbout equalRight gap longer
QuartilesQ2 − Q1 > Q3 − Q2EqualQ3 − Q2 > Q2 − Q1
Other namesNegatively skewed, skewed to the leftNormal-like, bell shapedPositively skewed, skewed to the right

What to conclude: if three or more clues point the same way, the direction is clear. If they disagree, look at the histogram and trust G1 over the mean-median order (von Hippel, 2005).

12.3 How skew looks in each graph

GraphSkewed left looks likeSkewed right looks like
HistogramTall bars on the right, short bars trailing leftTall bars on the left, short bars trailing right
Box plotLong left whisker; median nearer Q3; outliers on the leftLong right whisker; median nearer Q1; outliers on the right
Dot plotDots stacked high on the right, spread thinly to the leftDots stacked high on the left, spread thinly to the right
Stem-and-leaf plotLong leaves on the high stems, few leaves on the low stemsLong leaves on the low stems, few leaves on the high stems
Bar graph of frequenciesBars rise toward the right categoryBars fall away toward the right category
Normal probability plotConcave: points fall below the line at the left endConvex: points rise above the line at the right end
Density curvePeak on the right, tail to the leftPeak on the left, tail to the right

What to conclude: in every graph the tail, the sparse side, names the skew. A stem-and-leaf plot is a histogram turned on its side, so read it the same way.

12.4 Standard error of skewness and the smallest significant |G1|

nSE of skewness|G1| needed, α = 0.05 (1.96 × SE)|G1| needed, α = 0.01 (2.576 × SE)Note
80.7521.4741.937Smallest n for the D’Agostino test
100.6871.3471.770Very unstable
150.5801.1371.494Unstable
200.5121.0041.319Worked example size
300.4270.8371.100Common minimum
500.3370.6600.867Moderate
1000.2410.4730.622Good
2000.1720.3370.443Good
5000.1090.2140.281Large: tiny skew becomes significant
10000.0770.1520.199Very large: judge size, not p

What to conclude: with 20 values a skewness under about 1.00 can be chance; with 500 values even 0.21 is significant. That is why size matters more than p in large samples. These are z-ratio cut-offs; the D’Agostino test is slightly stricter in small samples.

12.5 Which software gives which skewness

FormulaHard-test valueUsed by
G1, adjusted Fisher-Pearson1.7220Excel SKEW, SPSS, SAS, Stata (detail), pandas .skew(), SciPy bias=False, e1071 type 2, this tool’s default
g1, moment coefficient1.5901Excel SKEW.P, SciPy default, R moments::skewness, e1071 type 1
b11.4723Minitab, R e1071 type 3 (its default), psych::skew

What to conclude: the three always share the same sign, so they never disagree about left vs right. They only differ in size, by up to about 15% at n = 20 and under 1% at n = 1000 (Joanes & Gill, 1998).

12.6 Fixing skewed data before a parametric test

SkewTry firstStronger optionNo-transform option
Mild right (0.5 to 1)Square root, √xLog, ln(x + 1) if zerosWelch t-test or ANOVA with n ≥ 30 per group
Strong right (above 1)Log, ln(x)Reciprocal 1/x, or Box-CoxMann-Whitney, Kruskal-Wallis, gamma GLM
Mild left (−0.5 to −1)Square, x²Reflect then √: √(max + 1 − x)Rank-based tests
Strong left (below −1)Reflect then log: ln(max + 1 − x)Box-Cox on the reflected valuesRank-based tests, bootstrap the median

What to conclude: never log-transform left skewed data directly; it stretches the left tail further. After reflecting, the direction of effects flips, so say so when you report results (Box & Cox, 1964; Feng et al., 2014).

12.7 Real-world variables and their usual skew

Usually right skewedUsually left skewedUsually close to symmetric
Household income, wealthAge at death in rich countriesAdult height within one sex
House pricesScores on an easy testMeasurement error
Hospital length of stayProduct star ratingsBlood pressure in healthy adults
Reaction and waiting timesGestational age at birthIQ scores (by design)
Animal movement distances, body massPercentage of a task completedDaily temperature at one site
Insurance claims, city sizesRetirement ageSums of many small effects

What to conclude: a hard floor (zero, or a minimum) with no ceiling gives right skew; a hard ceiling (100%, 5 stars, a maximum lifespan) gives left skew. Micceri (1989) found most real psychological data are skewed to some degree.

📈 13. Example Results

Eight worked examples, from a clean textbook case to the situations that fool people. In every histogram, blue bars are below the median and orange bars are above it, the dashed line is the mean and the solid line is the median.

1
TEXTBOOK CASE

Skewed left vs skewed right, mirror images

Two groups that are exact reflections of each other.

A teaching set of 15 values on a 1 to 10 scale. The right skewed group is built by reflecting the left skewed group (11 − x), so the only thing that changes is the direction.

n = 15G1 = 1.48mean 3.20median 3.00highly right skewed
StatisticValueNote
n15Values used
Mean3.2000Pulled toward the tail
Median3.0000Middle value
SD2.1778Sample, n − 1
Skewness G11.4765Excel SKEW
Skewness g11.3245Excel SKEW.P
SE of skewness0.5801Depends only on n
z = G1 ÷ SE2.545|z| > 1.96 suggests real skew
D’Agostino Z2.4222Skewness test
D’Agostino p0.0154Two-sided
Pearson Sk20.27553(mean − median) ÷ s
Bowley0.0000Quartile skewness
Mirror group G1−1.4765Same size, opposite sign
Skewed left vs skewed right, mirror images1.03.05.07.09.070ValueMean 3.20Median 3.00
The right skewed version: blue bars (below the median) bunch up on the left and orange bars trail off to the right.

What it means: The skewed-right group has G1 = 1.4765 and the skewed-left group has G1 = −1.4765: exactly the same size with the opposite sign, because reflecting data flips the sign of skewness and nothing else. Both are highly skewed and both are significant (p = 0.0154). Note Bowley is 0 here because the quartiles sit evenly around the median; all the skew comes from the outer values.

How to write it: “Group R was right skewed (G1 = 1.48, SE = 0.58, p = .015) and its mirror, group L, was left skewed (G1 = −1.48).”

2
CLEARLY SIGNIFICANT

Household income is right skewed

The classic positively skewed variable.

Twenty household incomes in thousand USD from one neighbourhood survey.

n = 20G1 = 1.86mean 65.60median 46.50highly right skewed
StatisticValueNote
n20Values used
Mean65.6000Pulled toward the tail
Median46.5000Middle value
SD49.3477Sample, n − 1
Skewness G11.8589Excel SKEW
Skewness g11.7164Excel SKEW.P
SE of skewness0.5121Depends only on n
z = G1 ÷ SE3.630|z| > 1.96 suggests real skew
D’Agostino Z3.1780Skewness test
D’Agostino p0.0015Two-sided
Pearson Sk21.16113(mean − median) ÷ s
Bowley0.4110Quartile skewness
Household income is right skewed2269116163210120Value (thousand USD)Mean 65.60Median 46.50
A long right tail: three households above 100 pull the mean far above the median.

What it means: G1 = 1.86 is well above 1, so income is highly right skewed, and the D’Agostino test is clearly significant (p = 0.0015). The mean (65.6) is 19.1 thousand above the median (46.5), so 13 of the 20 households earn less than the “average”. Report the median.

How to write it: “Household income was highly right skewed (G1 = 1.86, SE = 0.51, D’Agostino z = 3.18, p = .001); median income was 46.5 thousand USD (IQR 34.50 to 75.25).”

3
BORDERLINE

Moderate right skew that may be chance

Large enough to notice, not quite significant.

Twenty commute times in minutes recorded by one office.

n = 20G1 = 0.94mean 18.75median 17.50moderately right skewed
StatisticValueNote
n20Values used
Mean18.7500Pulled toward the tail
Median17.5000Middle value
SD5.7754Sample, n − 1
Skewness G10.9443Excel SKEW
Skewness g10.8719Excel SKEW.P
SE of skewness0.5121Depends only on n
z = G1 ÷ SE1.844|z| > 1.96 suggests real skew
D’Agostino Z1.8344Skewness test
D’Agostino p0.0666Two-sided
Pearson Sk20.64933(mean − median) ÷ s
Bowley0.2000Quartile skewness
Moderate right skew that may be chance101622273370Value (minutes)Mean 18.75Median 17.50
A mild right tail: the bars thin out slowly toward 33 minutes.

What it means: G1 = 0.94 is in the moderate band (0.5 to 1), and the mean sits 1.25 minutes above the median. But the D’Agostino test gives p = 0.067, just above 0.05, so with only 20 values the skew could be sampling noise. Report it as moderate right skew that did not reach significance, and give both mean and median.

How to write it: “Commute time showed moderate positive skew (G1 = 0.94, SE = 0.51) that was not statistically significant (D’Agostino z = 1.83, p = .067).”

4
NULL RESULT

Adult height is close to symmetric

What “no skew” looks like.

Twenty adult heights in centimetres from one population.

n = 20G1 = 0.13mean 171.60median 171.50approximately symmetric
StatisticValueNote
n20Values used
Mean171.6000Pulled toward the tail
Median171.5000Middle value
SD6.6760Sample, n − 1
Skewness G10.1324Excel SKEW
Skewness g10.1222Excel SKEW.P
SE of skewness0.5121Depends only on n
z = G1 ÷ SE0.258|z| > 1.96 suggests real skew
D’Agostino Z0.2743Skewness test
D’Agostino p0.7838Two-sided
Pearson Sk20.04493(mean − median) ÷ s
Bowley0.0000Quartile skewness
Adult height is close to symmetric15816517217918660Value (cm)Mean 171.60Median 171.50
Blue and orange bars reach about equally far on each side; mean and median almost touch.

What it means: G1 = 0.13 is far inside the ±0.5 band, the mean (171.60) and median (171.50) differ by 0.10 cm, and the test is nowhere near significant (p = 0.784). The data are approximately symmetric, so the mean and SD are a fair summary.

How to write it: “Height was approximately symmetric (G1 = 0.13, SE = 0.51, p = .784); M = 171.6 cm, SD = 6.7.”

5
SMALL SAMPLE

A pilot study with only 7 values

Huge skewness, but too little data to trust it.

A pilot recorded nine entries: 12, 14, 13, n/a, 15, 11, a blank, 14 and 48. After dropping the blank and the n/a code, 7 values remain.

n = 7G1 = 2.59mean 18.14median 14.00highly right skewed
StatisticValueNote
n7Values used
Mean18.1429Pulled toward the tail
Median14.0000Middle value
SD13.2342Sample, n − 1
Skewness G12.5882Excel SKEW
Skewness g11.9969Excel SKEW.P
SE of skewness0.7937Depends only on n
z = G1 ÷ SE3.261|z| > 1.96 suggests real skew
D’Agostino Zn/aSkewness test
D’Agostino pn < 8, test not runTwo-sided
Pearson Sk20.93913(mean − median) ÷ s
Bowley−0.5000Quartile skewness
A pilot study with only 7 values112030394860ValueMean 18.14Median 14.00
Six values sit between 11 and 15, and one value of 48 makes the whole right tail.

What it means: G1 = 2.59 looks enormous, but it is created by a single value. The D’Agostino test needs at least 8 values, so it cannot run; the rough z ratio is 3.26. Bowley skewness is −0.50, the opposite sign, because the middle half is not right skewed at all. Check whether 48 is a typing error before saying anything about shape.

How to write it: “With n = 7, skewness (G1 = 2.59) was driven by a single extreme value and was not tested formally.”

6
SIGNIFICANT BUT TRIVIAL

Six hundred glucose readings

Significant does not mean important.

Six hundred fasting glucose readings in mg/dL from a screening programme.

n = 600G1 = 0.25mean 95.00median 94.67approximately symmetric
StatisticValueNote
n600Values used
Mean94.9991Pulled toward the tail
Median94.6650Middle value
SD7.7436Sample, n − 1
Skewness G10.2530Excel SKEW
Skewness g10.2524Excel SKEW.P
SE of skewness0.0998Depends only on n
z = G1 ÷ SE2.537|z| > 1.96 suggests real skew
D’Agostino Z2.5169Skewness test
D’Agostino p0.0118Two-sided
Pearson Sk20.12943(mean − median) ÷ s
Bowley0.0298Quartile skewness
Six hundred glucose readings7486981101221360Value (mg/dL)Mean 95.00Median 94.67
A nearly bell-shaped histogram with a barely visible right lean.

What it means: G1 = 0.25 is small, inside the symmetric band, yet the test says p = 0.012. With 600 values the standard error is only 0.100, so even a trivial lean becomes significant. The mean and median differ by just 0.33 mg/dL. Treat these data as approximately symmetric and use the mean.

How to write it: “Glucose showed slight positive skew (G1 = 0.25, SE = 0.10, p = .012) that was statistically significant but too small to affect the analysis.”

7
ASSUMPTION FAILURE

Five-star ratings: skew from a ceiling

When the scale, not the people, makes the skew.

Twenty-five customer reviews on a 1 to 5 star scale. Fifteen are 5 stars.

n = 25G1 = −1.82mean 4.32median 5.00highly left skewed
StatisticValueNote
n25Values used
Mean4.3200Pulled toward the tail
Median5.0000Middle value
SD1.0693Sample, n − 1
Skewness G1−1.8212Excel SKEW
Skewness g1−1.7101Excel SKEW.P
SE of skewness0.4637Depends only on n
z = G1 ÷ SE−3.928|z| > 1.96 suggests real skew
D’Agostino Z−3.3627Skewness test
D’Agostino p0.0008Two-sided
Pearson Sk2−1.90783(mean − median) ÷ s
Bowley−1.0000Quartile skewness
Five-star ratings: skew from a ceiling1.02.03.04.05.0150Value (stars)Mean 4.32Median 5.00
Bars pile up at 5 stars with a short tail toward 1 star. There are only five possible values.

What it means: G1 = −1.82 says highly left skewed and p = 0.0008, but the median equals Q3 (both 5), so Bowley hits its limit of −1. Skewness here mostly describes the ceiling of the scale. With so few distinct values, report the percentage of 5-star ratings and the median, and use rank-based tests rather than a t-test.

How to write it: “Ratings were bounded at the top of the scale and left skewed (G1 = −1.82); 15 of 25 reviews (60%) gave 5 stars, Mdn = 5.”

8
APPLIED

Age at death is left skewed

A real-world negatively skewed variable.

Ages at death of twenty adults in one district register.

n = 20G1 = −1.39mean 77.40median 79.50highly left skewed
StatisticValueNote
n20Values used
Mean77.4000Pulled toward the tail
Median79.5000Middle value
SD10.2618Sample, n − 1
Skewness G1−1.3862Excel SKEW
Skewness g1−1.2799Excel SKEW.P
SE of skewness0.5121Depends only on n
z = G1 ÷ SE−2.707|z| > 1.96 suggests real skew
D’Agostino Z−2.5381Skewness test
D’Agostino p0.0111Two-sided
Pearson Sk2−0.61393(mean − median) ÷ s
Bowley−0.1163Quartile skewness
Age at death is left skewed485970809170Value (years)Mean 77.40Median 79.50
Most deaths fall between 74 and 91, with a thin tail of early deaths to the left.

What it means: G1 = −1.39: highly left skewed and significant (p = 0.0111). The mean (77.4) is pulled 2.1 years below the median (79.5) by a few early deaths. For planning, the median describes a typical lifespan better, while the left tail is where prevention matters most.

How to write it: “Age at death was left skewed (G1 = −1.39, SE = 0.51, p = .011); median age was 79.5 years (IQR 73.50 to 84.25).”

🧪 14. Data Collection Protocol

Study design: a left skewed vs right skewed analysis needs independent measurements of one numeric variable on an interval or ratio scale, collected in one or more clearly defined groups. Skewness describes the shape of each group, so each group must be a real, single population.

  1. Decide which variable’s skewness you need, and why. Write down whether you are checking a test assumption, describing a population, or comparing the shape of groups. This decides your sample size and threshold.
  2. Define one unit of observation. One person, one plot, one day. Repeated readings of the same unit are not independent and make a small sample look large.
  3. Sample at random from each group. A convenience sample can create or hide skew; for example, surveying only daytime callers trims the long right tail of waiting times.
  4. Plan enough values to measure skewness reliably. Aim for at least 20 per group, and 50 or more if you want to compare left vs right skewed groups. The D’Agostino test needs at least 8.
  5. Record the full range. Do not cap, round or group values at collection time. Capping incomes at “100 or more” deletes the right tail you are trying to measure.
  6. Use a scale with enough resolution. A 1 to 5 rating gives only five distinct values, so skewness mostly reflects the ceiling or floor. Record a finer measure when you can.
  7. Keep missing values blank, never zero. A fake zero creates a false left tail and can flip a right skewed variable to symmetric.
  8. Write the outlier rule before collecting. Decide in advance how you will check extreme values (for example 1.5 × IQR fences) and when a value is an error rather than a real tail.
  9. Note known floors and ceilings. Zero, 100%, a maximum score. These predict the direction of skew and help readers judge it.
  10. Store one column per group with the group name in the first row, exactly as the layout below shows, ready to paste or upload for the skewness calculation.
Easy test (%)Hard test (%)Group C
954267
924871
883564

One column per group, one row per unit, numbers only below the header. Blank cells are ignored, so groups can have different sizes.

Minimum sample: 8 values per group for the D’Agostino test, 20 for a stable skewness estimate (SE = 0.51), and 100 or more if a moderate skew of 0.5 must be detected reliably (SE = 0.24).

Pre-registration: record the skewness formula (G1), the threshold (|G1| ≥ 0.5), the test (D’Agostino, α = 0.05), and what you will do if a group is skewed, before you look at the data.

Common collection mistakes:

  • Typing 0 for missing data, which manufactures a left tail.
  • Top-coding or capping values, which removes the right tail.
  • Mixing two populations in one column, which gives two peaks rather than a skew.
  • Counting repeat measurements as separate units.
  • Collecting too few values and then reading too much into the sign of skewness.

🎯 15. When to Use This Calculator

Use it whenever you need to know which way your data lean, how strongly, and whether that matters for the analysis you plan next.

Use it when:

  • ✓ You want to know if a variable is left skewed, right skewed or symmetric before choosing mean or median.
  • ✓ You are checking the normality assumption for a t-test, ANOVA or regression residuals.
  • ✓ You are comparing the shape of two or more groups, such as an easy and a hard version of a test.
  • ✓ You need a skewness value, its SE and a p-value to report in a paper or thesis.
  • ✓ You want to check whether a log or square-root transform actually removed the skew.

Do not use it when:

  • ✗ Your data are categories with no order. Skewness needs numbers.
  • ✗ You have fewer than about 8 values. Look at the raw numbers instead.
  • ✗ The histogram shows two peaks. Describe the two groups, not a skewness.
  • ✗ You need a full normality test. Use Shapiro-Wilk or the Kolmogorov-Smirnov test, which check skewness and kurtosis together.
  • ✗ You want to compare the centres of groups. Use a t-test, or Mann-Whitney if the groups are skewed.

Real-world examples:

  1. Education: a teacher finds the final exam left skewed (ceiling effect) and the mid-term right skewed (floor effect), and rescales the next test.
  2. Health: length of stay is right skewed, so a hospital reports median days rather than the mean in its annual report.
  3. Ecology: daily travel distance of a collared animal is right skewed, so movement models use a gamma or log-normal distribution.
  4. Business: product ratings are left skewed, so the team tracks the share of 1 and 2-star reviews rather than the mean rating.

Study design guidance: measure skewness on each group separately, never on pooled groups, because pooling two symmetric groups with different means can create apparent skew or two peaks. For regression, check the skewness of the residuals, not of the raw outcome.

Decision tree:

  • |G1| below 0.5 → treat as symmetric → t-test, ANOVA or regression as planned.
  • |G1| 0.5 to 1 and n ≥ 30 per group → parametric tests are usually fine → report median as well.
  • |G1| above 1 and right skewed → try log or square root → if still skewed, Mann-Whitney (2 groups) or Kruskal-Wallis (3 or more).
  • |G1| above 1 and left skewed → reflect, then log → or go straight to rank-based tests.
  • Groups skewed in opposite directions → compare medians with rank-based tests; do not transform both the same way.
  • Two peaks → split the data or use a mixture model.

🔧 16. Troubleshooting and Common Errors

The tool says right skewed but my histogram peak is on the left

Cause: This is correct. The peak is where most data sit; the tail is the long thin side.

Fix: Read the name from the tail. A right skewed histogram always has its peak on the left.

Excel SKEW and Python give different numbers

Cause: Excel SKEW is G1; SciPy skew() defaults to g1.

Fix: Use skew(x, bias=False) in Python, or SKEW.P in Excel, so both use the same formula.

Skewness flips sign when I add or remove one value

Cause: A small sample with one or two extreme values.

Fix: Check the outlier count, collect more data, and report Bowley skewness alongside G1.

Mean is above the median but skewness is negative

Cause: The mean-median rule fails for some discrete or oddly shaped data.

Fix: Trust the histogram and G1. Mention both numbers in your report.

The D’Agostino p-value shows n/a

Cause: Fewer than 8 values in that group.

Fix: Collect more data. The z ratio shown instead is rough and should not be reported as a formal test.

Fewer values used than I pasted

Cause: Text, units, n/a codes or blanks were ignored.

Fix: Read the orange warning box; it lists every ignored entry. Remove units such as kg from the cells.

Skewness is huge but Bowley is near zero

Cause: One or two extreme values cause all the skew; the middle half is balanced.

Fix: Check those values. If real, report both coefficients and use robust methods.

Symmetric verdict but the histogram looks odd

Cause: Two peaks can give skewness near 0.

Fix: Look at the bimodality coefficient. Above 0.555, split the groups.

Significant skew but G1 is only 0.2

Cause: Very large n makes the standard error tiny.

Fix: Judge size, not p. Below 0.5 you can treat the data as symmetric.

Log transform made my data worse

Cause: The data were left skewed; log stretches the left tail.

Fix: Reflect first: ln(max + 1 − x), and remember the direction of effects flips.

Charts do not appear

Cause: Chart.js was blocked or the page has not been run.

Fix: Allow cdnjs.cloudflare.com and press Run Analysis; numbers and tables still work without charts.

CSV columns are not offered on the Upload tab

Cause: The column has no numeric values, or numbers use a comma as decimal mark.

Fix: Use a full stop as the decimal mark, or paste the values into the first tab.

⚖ 17. Assumptions and Limitations

Assumptions

  1. Values are independent. Check the design: one value per unit. If values cluster (repeat readings, siblings, plots in one field), the SE is too small and the test finds skew too often (bias toward false positives).
  2. The variable is numeric on an interval or ratio scale. Check what the numbers mean. On ordinal scales skewness describes the coding, and the bias depends on the spacing you chose.
  3. Each group is one population. Check Chart 1 and the bimodality coefficient. Mixing groups biases skewness toward zero or toward the smaller group’s side.
  4. Enough values. Check n: at least 8 for the test, 20 for stable estimates. Small samples bias G1 toward zero on average and make its sign unreliable.
  5. No data errors in the tail. Check the outliers listed. A typing error in the tail inflates |G1|, biasing the verdict toward “highly skewed”.
  6. For the test, the sampling distribution is close to normal after the D’Agostino transform. This holds well from n = 8 upward; below that p-values are too small (bias toward false positives).

Limitations

  • Skewness is sensitive to outliers; one value can dominate it. Alternative: Bowley or the medcouple, which are robust (Brys et al., 2004).
  • It cannot detect two peaks or gaps. Alternative: look at the histogram and the bimodality coefficient, or fit a mixture model.
  • It is one number for a whole shape. Alternative: Q-Q plots, quantile plots, or the full five-number summary.
  • The D’Agostino test only checks skewness, not kurtosis or normality as a whole. Alternative: the D’Agostino-Pearson omnibus test, Shapiro-Wilk or Kolmogorov-Smirnov.
  • The size bands are conventions, not laws. Alternative: decide your threshold from the method you plan to use next and state it.
  • The tool assumes a simple random sample. Survey weights or clustered designs need weighted moments.
  • The tool does not compare skewness between groups formally. Alternative: bootstrap the difference in G1 (see the R one-liner in 10.5).

🏁 18. Conclusion

Telling left skewed vs right skewed data apart is one of the first and most useful checks in any analysis. The rule is simple once you remember it: the skew is named after the long tail, not after the peak. A right skewed distribution has a tail toward large values, a positive skewness, and a mean pulled above the median. A left skewed distribution has a tail toward small values, a negative skewness, and a mean dragged below the median.

Run the analysis to fill this space with four short blocks about your data: what was found (___ is ___ skewed, G1 = ___), what it means in practice, cautions, and next steps.

The size of the skew matters as much as its direction. Below 0.5 in absolute value the data are close enough to symmetric for the mean and standard deviation, and for most parametric tests. Between 0.5 and 1 the skew is moderate, so report the median as well. Above 1 the skew is high: lead with the median and IQR, show the shape in a figure, and consider a transform or a rank-based test.

Significance answers a separate question. The D’Agostino test tells you whether a sample this lopsided could come from a symmetric population by chance. In small samples a large skew can be non-significant, and in very large samples a tiny skew can be significant. Report both the coefficient with its standard error and the test, and let the size guide your decisions.

Finally, never trust a single number. Skewness can be created by one typing error, hidden by two peaks, or forced by the ceiling of a rating scale. Read it next to the histogram, the box plot and the normal probability plot, and check the outlier and bimodality warnings before you write it up. Use this left skewed vs right skewed calculator whenever you meet a new dataset, because knowing which way your data lean is the quickest way to choose the right summary and the right test.

❓ 19. Frequently Asked Questions

Q1. What is the difference between left skewed and right skewed?

Left skewed data have a long tail toward small values and negative skewness; most values sit on the high side. Right skewed data have a long tail toward large values and positive skewness; most values sit on the low side. The name always follows the tail, not the peak.

Q2. Is right skewed positive or negative?

Right skewed is positive skew, and left skewed is negative skew. A right skewed dataset has a skewness coefficient above 0; the hard-test scores on this page give G1 = 1.72. A left skewed dataset has a coefficient below 0; the easy-test scores give G1 = −1.63.

Q3. How do you tell if a histogram is skewed left or right?

Find the long, thin side of the histogram. If the bars trail off to the right with the peak on the left, it is skewed right. If they trail off to the left with the peak on the right, it is skewed left. The same reading works for a dot plot, a bar graph of frequencies and a stem-and-leaf plot.

Q4. How can you tell if a box plot is skewed left or right?

In a right skewed box plot the right whisker is longer and the median line sits closer to the left edge of the box (Q1). In a left skewed box plot the left whisker is longer and the median sits closer to Q3. Outliers usually appear on the tail side.

Q5. Where is the mean in a left skewed vs right skewed distribution?

The mean is pulled toward the tail. In right skewed data the mean is usually greater than the median, and in left skewed data it is usually less than the median. The usual order is mode, median, mean for right skew and mean, median, mode for left skew.

Q6. Is the mean always greater than the median in right skewed data?

Usually but not always. Von Hippel (2005) showed that the mean-median rule can fail for discrete data and for distributions with one long tail and one heavy short tail. When the mean-median order and the skewness coefficient disagree, trust the histogram and the coefficient.

Q7. What does a normal probability plot look like for skewed right vs left data?

For right skewed data the points bend upward away from the straight line at the right end, making a convex curve. For left skewed data the points bend downward below the line at the left end, making a concave curve. Symmetric data follow the line.

Q8. What skewness value is considered high?

A common rule is: below 0.5 in absolute value is approximately symmetric, 0.5 to 1 is moderately skewed, and above 1 is highly skewed. Some authors accept values up to 1 or 2 before calling data non-normal. State which rule you used.

Q9. What causes left skew and right skew?

Right skew usually comes from a hard lower limit with no upper limit, such as zero for waiting times or income. Left skew usually comes from a hard upper limit, such as 100% on an easy test, 5 stars on a rating, or a maximum lifespan. Outliers and mixed groups can also create skew.

Q10. What are examples of left skewed and right skewed data?

Right skewed: household income, house prices, hospital length of stay, reaction times, animal travel distances. Left skewed: scores on an easy exam, age at death in wealthy countries, product star ratings, gestational age at birth.

Q11. How do you test whether skewness is significant?

Divide the skewness G1 by its standard error, √[6n(n − 1) ÷ ((n − 2)(n + 1)(n + 3))]. If |z| is above 1.96 the skew is significant at the 5% level. The D’Agostino skewness test refines this and is valid from n = 8; this calculator runs it automatically.

Q12. Should I use the mean or the median for skewed data?

For approximately symmetric data use the mean and SD. For moderately skewed data report both. For highly skewed data lead with the median and interquartile range, because the mean is pulled toward the tail and no longer describes a typical value.

Q13. How do you fix right skewed or left skewed data?

For right skew try a square-root or log transform, or Box-Cox. For left skew reflect the data first, using max + 1 − x, then take a square root or log. If a transform is not sensible, use rank-based tests such as Mann-Whitney or Kruskal-Wallis.

Q14. Does skewness affect a t-test or ANOVA?

Mild skew has little effect once each group has about 30 or more values, because the mean becomes close to normal. Strong skew in small groups makes p-values and confidence intervals unreliable, especially when groups are skewed in opposite directions.

Q15. How do you calculate skewness in Excel?

Use =SKEW(A2:A21) for the adjusted G1 that SPSS and most journals expect, or =SKEW.P(A2:A21) for the moment coefficient g1. Excel has no skewness p-value, but Section 9 shows the standard error, the z ratio and the full D’Agostino test in eight cells.

Q16. How do you calculate skewness in R?

Base R has no skewness function. Use e1071::skewness(x, type = 2) to match Excel SKEW, moments::skewness(x) for g1, and moments::agostino.test(x) for the significance test. Section 10 has a complete base R script that needs no packages.

Q17. How do you calculate skewness in Python?

Use scipy.stats.skew(x, bias=False) to match Excel SKEW and pandas, or scipy.stats.skew(x) for g1. Use scipy.stats.skewtest(x) for the D’Agostino test. Section 11 has a complete script with a 300 dpi figure.

Q18. Why do Excel, SPSS, R and Python give different skewness values?

They use different formulas: G1 (Excel SKEW, SPSS, SAS, pandas), g1 (Excel SKEW.P, SciPy default, moments) and b1 (Minitab, e1071 default). All three always agree in sign, so they never disagree about left vs right, only about size in small samples.

Q19. What is the difference between skewness and kurtosis?

Skewness measures asymmetry: which side has the longer tail. Kurtosis measures tail weight on both sides compared with a normal curve. A distribution can be symmetric with heavy tails, or skewed with light tails. This calculator reports both but bases its verdict on skewness.

Q20. Can I use this calculator for my thesis or published research?

Yes for exploration, teaching and checking hand calculations. Every formula is shown and matches Excel, R and Python to four decimals. For formal submission, reproduce the numbers in your statistics software and cite it; you can also cite this tool using Section 20.

📑 20. Cite This Tool

APA 7th edition
StatsUnlock. (2026). Left skewed vs right skewed calculator [Interactive statistical tool]. https://statsunlock.com/left-skewed-vs-right-skewed/
BibTeX
@misc{statsunlock_skew_2026, title={Left Skewed vs Right Skewed Calculator}, author={{StatsUnlock}}, year={2026}, note={Interactive statistical tool}, url={https://statsunlock.com/left-skewed-vs-right-skewed/}}
Methods wording (auto-filled after you run the analysis)
Distribution shape was assessed with the StatsUnlock Left Skewed vs Right Skewed Calculator (2026). For each group we computed the adjusted Fisher-Pearson skewness coefficient (G1, as in Excel SKEW), its standard error, the D’Agostino skewness test (two-sided, α = 0.05), Pearson’s second skewness coefficient and Bowley’s quartile skewness, with quartiles by the type 7 method.

🔗 21. Related Tools

📖 22. Glossary of Terms

TermPlain-English meaning
BimodalHaving two peaks, usually because two groups are mixed. Skewness cannot describe it.
Bimodality coefficientA number built from skewness and kurtosis; above 0.555 suggests two peaks.
Bowley skewnessSkewness from the quartiles only, between −1 and 1. Robust to outliers.
Box plotA chart of the median, quartiles and whiskers. The longer whisker shows the skewed side.
Ceiling effectMany values at the top limit of a scale, which causes left skew.
D’Agostino testA significance test for skewness, valid from 8 values, used by SciPy skewtest.
Floor effectMany values at the bottom limit of a scale, which causes right skew.
G1The adjusted Fisher-Pearson skewness, given by Excel SKEW and SPSS.
g1The moment skewness, given by Excel SKEW.P and SciPy by default.
Interquartile range (IQR)Q3 minus Q1, the spread of the middle half of the data.
KurtosisHow heavy both tails are compared with a normal curve. Excess kurtosis is 0 for a normal curve.
Left skewedA long tail toward small values; negative skewness. Also called negatively skewed or skewed to the left.
MeanThe sum divided by n. Pulled toward the long tail.
MedianThe middle value once sorted. Barely moved by the tail.
Normal probability plotA Q-Q plot of the data against a normal curve. Skew makes the points bend away from the line.
OutlierA value far from the rest, often beyond 1.5 × IQR from the quartiles.
Pearson skewnessSkewness from the mean, median (or mode) and SD: 3(mean − median) ÷ s.
ReflectionTurning data around with max + 1 − x so left skew becomes right skew before a log transform.
Right skewedA long tail toward large values; positive skewness. Also called positively skewed or skewed to the right.
SkewnessA unitless measure of asymmetry. Positive is right skewed, negative is left skewed, 0 is symmetric.
Standard error of skewnessHow much skewness varies between samples of size n from a symmetric population.
SymmetricBoth halves look alike; skewness about 0 and mean about equal to median.
TailThe long, thin, stretched-out side of a distribution. It names the skew.

📚 23. References

These peer-reviewed articles support the methods in this left skewed vs right skewed calculator: the skewness formulas, the D’Agostino test, robust and quartile skewness, the mean-median rule, transformations and graphical checks.

  1. Altman, D. G., & Bland, J. M. (1996). Detecting skewness from summary information. BMJ, 313(7066), 1200. https://doi.org/10.1136/bmj.313.7066.1200
  2. Blanca, M. J., Arnau, J., López-Montiel, D., Bono, R., & Bendayan, R. (2013). Skewness and kurtosis in real data samples. Methodology, 9(2), 78–84. https://doi.org/10.1027/1614-2241/a000057
  3. Box, G. E. P., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society: Series B, 26(2), 211–243. https://doi.org/10.1111/j.2517-6161.1964.tb00553.x
  4. Brys, G., Hubert, M., & Struyf, A. (2004). A robust measure of skewness. Journal of Computational and Graphical Statistics, 13(4), 996–1017. https://doi.org/10.1198/106186004X12632
  5. D’Agostino, R. B. (1970). Transformation to normality of the null distribution of g1. Biometrika, 57(3), 679–681. https://doi.org/10.1093/biomet/57.3.679
  6. D’Agostino, R. B., Belanger, A., & D’Agostino, R. B., Jr. (1990). A suggestion for using powerful and informative tests of normality. The American Statistician, 44(4), 316–321. https://doi.org/10.1080/00031305.1990.10475751
  7. Doane, D. P., & Seward, L. E. (2011). Measuring skewness: A forgotten statistic? Journal of Statistics Education, 19(2). https://doi.org/10.1080/10691898.2011.11889611
  8. Feng, C., Wang, H., Lu, N., Chen, T., He, H., Lu, Y., & Tu, X. M. (2014). Log-transformation and its implications for data analysis. Shanghai Archives of Psychiatry, 26(2), 105–109. https://doi.org/10.3969/j.issn.1002-0829.2014.02.009
  9. Ghasemi, A., & Zahediasl, S. (2012). Normality tests for statistical analysis: A guide for non-statisticians. International Journal of Endocrinology and Metabolism, 10(2), 486–489. https://doi.org/10.5812/ijem.3505
  10. Groeneveld, R. A., & Meeden, G. (1984). Measuring skewness and kurtosis. Journal of the Royal Statistical Society: Series D (The Statistician), 33(4), 391–399. https://doi.org/10.2307/2987742
  11. Hyndman, R. J., & Fan, Y. (1996). Sample quantiles in statistical packages. The American Statistician, 50(4), 361–365. https://doi.org/10.1080/00031305.1996.10473566
  12. Joanes, D. N., & Gill, C. A. (1998). Comparing measures of sample skewness and kurtosis. Journal of the Royal Statistical Society: Series D (The Statistician), 47(1), 183–189. https://doi.org/10.1111/1467-9884.00122
  13. Kim, H.-Y. (2013). Statistical notes for clinical researchers: Assessing normal distribution (2) using skewness and kurtosis. Restorative Dentistry & Endodontics, 38(1), 52–54. https://doi.org/10.5395/rde.2013.38.1.52
  14. Krzywinski, M., & Altman, N. (2014). Visualizing samples with box plots. Nature Methods, 11(2), 119–120. https://doi.org/10.1038/nmeth.2813
  15. Micceri, T. (1989). The unicorn, the normal curve, and other improbable creatures. Psychological Bulletin, 105(1), 156–166. https://doi.org/10.1037/0033-2909.105.1.156
  16. Mishra, P., Pandey, C. M., Singh, U., Gupta, A., Sahu, C., & Keshri, A. (2019). Descriptive statistics and normality tests for statistical data. Annals of Cardiac Anaesthesia, 22(1), 67–72. https://doi.org/10.4103/aca.ACA_157_18
  17. Pfister, R., Schwarz, K. A., Janczyk, M., Dale, R., & Freeman, J. B. (2013). Good things peak in pairs: A note on the bimodality coefficient. Frontiers in Psychology, 4, 700. https://doi.org/10.3389/fpsyg.2013.00700
  18. von Hippel, P. T. (2005). Mean, median, and skew: Correcting a textbook rule. Journal of Statistics Education, 13(2). https://doi.org/10.1080/10691898.2005.11910556
  19. Weissgerber, T. L., Milic, N. M., Winham, S. J., & Garovic, V. D. (2015). Beyond bar and line graphs: Time for a new data presentation paradigm. PLOS Biology, 13(4), e1002128. https://doi.org/10.1371/journal.pbio.1002128
  20. Wilk, M. B., & Gnanadesikan, R. (1968). Probability plotting methods for the analysis of data. Biometrika, 55(1), 1–17. https://doi.org/10.1093/biomet/55.1.1
STATS UNLOCK · statsunlock.com · Left Skewed vs Right Skewed Calculator
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Statistical Models

Important Plots & Charts

Calculators and Converters