Business Analytics & Data Science

B02 · Introductory

Data Cleaning and Preparation

12 lessons

B02 · Module 3, lesson 3 · Lesson 8 of 12

Skewed data and transformations

Order values, hotel bills and study hours pile up at the low end and stretch out in a long tail. Learn to measure that skew, to see when it distorts summaries, outlier rules and models, and to transform a variable, read the results back in real units, and know when to leave it alone.

About 75 minutes

Before you start

You will be able to

  • Calculate the sample skewness of a small dataset with the adjusted Fisher–Pearson coefficient and interpret its sign.
  • Explain how skewness distorts means, outlier rules and models.
  • Transform a skewed variable with a log, log(1 + x), square root or Box–Cox transformation, choosing one that suits its values.
  • Interpret results after a log transformation, including log differences as approximate percentage changes and back-transformed means as geometric means.
  • Decide when a variable should not be transformed.

Review first

  • Outliers and impossible values — You need the median, quartiles and outlier rules; this lesson shows why those rules over-flag long tails and how transformations help.
  • Using the natural logarithm (ln) and the exponential (eˣ) on a calculator or in a spreadsheet.

Fictional case A fictional coffee business founded by Ana Lim. It starts as a catering and barista-training service, opens its own cafés and an online shop for beans, and plans a canned cold brew.

The idea

Fictional case

Lantern’s marketing lead wants to offer free delivery on orders “above the average order value”. In a sample of six recent orders, worth $20, $22, $25, $28, $35 and $80, the average is $35. But four of the six orders are below $30, and the median order is $26.50. The single $80 office order has pulled the average up to a level that only two of the six customers reached. A threshold set at the mean would look generous on paper and feel out of reach to most customers.

Lantern’s order values are skewed: most orders cluster at the low end and a few stretch out far to the right. Skewness describes this lack of symmetry. A symmetric distribution, like the weights of bags from a well-calibrated filling machine, looks the same on both sides of its centre. A skewed one has a long tail on one side.

  • Right-skewed (positively skewed): a long tail of large values. Order values, incomes, house prices, hotel bills, insurance claims, time until a machine fails and weekly study hours are usually right-skewed, because they can’t go below zero but can grow very large.
  • Left-skewed (negatively skewed): a long tail of small values. Scores on an easy test, where most people score near the maximum, and the share of a month that subscribers stay active, where most stay all month, are usually left-skewed.

The mean is pulled towards the long tail, because every value counts in proportion to its size; the median only cares about order. So in right-skewed data the mean usually sits above the median, and in left-skewed data below it. “Usually” matters: OpenStax’s Introductory Statistics points out that the pattern has exceptions, especially in discrete data, so check the histogram rather than relying on the rule.

Schematic histograms. Left: order totals pile up at low values with a long right tail, and the mean sits to the right of the median. Right: the same kind of data after a log transformation, which pulls in the tail and leaves a roughly symmetric shape.

Why skewness matters

  • Summaries mislead. The mean of a right-skewed variable describes almost nobody, as Lantern’s $35 shows. The median and quartiles describe the typical customer far better.
  • Outlier rules flag too much. The fences and z-scores of the previous lesson assume roughly symmetric data. On a long right tail they flag many perfectly genuine large values: if the logs of order totals were normal with a standard deviation of 1, about 7.8% of genuine orders would lie above the upper Tukey fence, against 0.35% for normal data. An analyst who deletes “outliers” from skewed data deletes real customers.
  • Some models struggle. Methods that minimise squared errors, such as linear regression, let a few huge values dominate the fit, and the usual confidence intervals and tests assume errors that are roughly normal with constant spread. A skewed outcome often produces skewed errors whose spread grows with the size of the prediction.
  • The process may be multiplicative. Prices, revenues and populations tend to change by percentages rather than fixed amounts. On their original scale such variables look skewed; on a log scale the percentage changes become equal steps.

A transformation applies the same function to every value, re-expressing the variable on a new scale. The useful ones for right skew, such as the logarithm and the square root, keep the order of the values but compress large values more than small ones, pulling the long tail in towards the rest. The skill is choosing one that suits the data, and then reading the results back in units that people care about.

In depth

Measuring skewness

Skewness is measured from the cubed deviations from the mean. Cubing keeps the sign of each deviation and exaggerates large ones, so a long tail on the right produces a large positive total and a long tail on the left a large negative one. This course, like Excel’s SKEW function and pandas’ skew(), uses the adjusted Fisher–Pearson coefficient described in the NIST/SEMATECH e-Handbook:

G1=n(n−1)n−2⋅g1,g1=m3m23/2,mk=1n∑i=1n(xi−xˉ)kG_1 = \dfrac{\sqrt{n(n-1)}}{n-2}\cdot g_1, \qquad g_1 = \dfrac{m_3}{m_2^{3/2}}, \qquad m_k = \dfrac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^k

Here m2m_2 and m3m_3 are the average squared and cubed deviations (dividing by nn), and g1g_1 is the plain Fisher–Pearson coefficient. The factor n(n−1)/(n−2)\sqrt{n(n-1)}/(n-2) corrects for small samples and approaches 1 as nn grows. Symmetric data give values near 0; positive values mean right skew and negative values left skew. There is no universal cut-off for “highly” skewed: compare the value before and after a transformation, and always look at the histogram.

Because it cubes deviations, skewness is itself very sensitive to extreme values. In Lantern’s six orders (worked example below), the $80 order’s cube, 453=91,12545^3 = 91{,}125, is larger than the total of all six cubes, 84,210: one order is the skewness. Fix errors and impossible values before measuring it.

The logarithm

The log transformation replaces each value xx with ln⁡x\ln x. It turns multiplication into addition: values that differ by the same ratio end up the same distance apart. $10, $20, $40, $80 and $160 each double the one before, so their natural logs (2.303, 2.996, 3.689, 4.382, 5.075) are equally spaced, 0.693 apart (that is, ln⁡2\ln 2). A right-skewed variable whose values vary by percentages becomes roughly symmetric. The base doesn’t matter for the shape: log⁡10x\log_{10} x and log⁡2x\log_2 x are just ln⁡x\ln x multiplied by a constant.

The log has one strict requirement: every value must be positive. The log of zero is undefined (it heads to minus infinity) and so is the log of a negative number. Order totals and hotel bills are positive; study hours, units returned or days absent often include zeros; profit can be negative. Those need other tools.

Log(1 + x), the square root and the reciprocal

The log1p transformation, ln⁡(1+x)\ln(1 + x), adds 1 before taking the log, so a zero becomes 0 instead of being undefined. For large xx it behaves like ln⁡x\ln x; for small xx it is close to xx itself. Programming libraries provide it as a function, log1p, which is also more accurate than computing log(1 + x) directly when xx is tiny. For six students reporting 0, 1, 2, 4, 9 and 30 study hours a week, the skewness falls from 2.06 to 0.54 after log(1 + x).

The “1” is not neutral, though: it is one unit of whatever the column measures. Record the same students’ study time in minutes (0, 60, 120, 240, 540, 1,800) and log(1 + x) maps the zero to 0 and everyone else to between 4.1 and 7.5, making the student who studies nothing a new extreme value: the skewness becomes −1.34. Log(1 + x) works best for counts and for units in which 1 is small compared with typical non-zero values.

The square-root transformation, x\sqrt{x}, is milder than the log and handles zeros naturally; it is a common choice for counts such as orders per day or rooms cleaned per shift. For the study hours above it reduces the skewness from 2.06 to 1.10, less than log(1 + x) does. The reciprocal, 1/x1/x, is stronger than the log; it reverses the order of the values (the largest becomes the smallest), so analysts use −1/x-1/x to keep the order, and it is undefined at zero. It suits rates such as “hours per order”, whose reciprocal “orders per hour” may be the more natural measure anyway.

Box–Cox: choosing the strength from the data

Log, square root and reciprocal are members of one family of power transformations. Box and Cox (1964) wrote the family so that it changes smoothly with a single parameter λ\lambda (lambda):

x(λ)={xλ−1λ,λ≠0ln⁡x,λ=0x^{(\lambda)} = \begin{cases} \dfrac{x^{\lambda} - 1}{\lambda}, & \lambda \neq 0 \\[6pt] \ln x, & \lambda = 0 \end{cases}

With λ=1\lambda = 1 the shape is unchanged (the values are only shifted by 1); λ=0.5\lambda = 0.5 behaves like a square root; λ=0\lambda = 0 is the log; λ=−1\lambda = -1 gives 1−1/x1 - 1/x, a reciprocal that keeps the order. The Box–Cox transformation estimates λ\lambda from the data, choosing the value that makes the transformed data look most nearly normal: scikit-learn’s PowerTransformer uses maximum likelihood, and the NIST/SEMATECH e-Handbook’s Box–Cox normality plot picks the λ\lambda that maximises the correlation of a normal probability plot. Like the log, Box–Cox requires strictly positive values. For data with zeros or negatives, the Yeo–Johnson transformation (Yeo and Johnson, 2000), also in PowerTransformer, extends the same idea.

Transformations for right-skewed data, from mildest to strongest
TransformationFormulaAllowed valuesTypical use
Square rootx\sqrt{x}x ≥ 0Counts with zeros; mild skew
Log(1 + x)ln⁡(1+x)\ln(1 + x)x > −1Counts or amounts with zeros
Logln⁡x\ln xx > 0Money, sizes, anything that changes by percentages
Reciprocal−1/x-1/xx ≠ 0 (usually x > 0)Severe skew; rates such as time per unit
Box–Cox(xλ−1)/λ(x^\lambda - 1)/\lambdax > 0Let the data choose the strength
Yeo–JohnsonBox–Cox-like, defined for all xAny xData with zeros and negatives, such as profit

For left-skewed data, one option is to reflect the values first (subtract each from a number just above the maximum), transform, and remember that the order is reversed.

Reading results after a log transformation

Two facts let you translate log-scale results back into business language. First, a difference in logs is close to a percentage change when the change is small: ln⁡(42/40)=0.0488\ln(42/40) = 0.0488, close to the true 5% increase. The approximation fails for large changes: ln⁡(60/40)=0.405\ln(60/40) = 0.405, against a true increase of 50%. The exact conversion is ed−1e^{d} - 1. Log differences also add up neatly: a rise from $40 to $44 is +0.0953+0.0953 and the fall back to $40 is −0.0953-0.0953, whereas the percentages, +10% and −9.1%, don’t cancel.

Second, the back-transformed mean is a geometric mean. If you average the logs and convert the average back with exe^{x}, you get the geometric mean, (x1x2⋯xn)1/n\left(x_1 x_2 \cdots x_n\right)^{1/n}, not the ordinary (arithmetic) mean. For $10, $20, $40, $80 and $160 the mean of the logs is 3.689 and e3.689=40e^{3.689} = 40, while the arithmetic mean is $62. The geometric mean is never larger than the arithmetic mean, and the gap grows with the skew. So a model fitted to log(order value) and converted back predicts something closer to a typical order than to an average one; anyone who needs totals, such as revenue, must account for that.

When not to transform

  • When the audience needs real units. “The mean log order value is 3.49” means nothing to a manager. Report medians, quartiles and percentages in dollars; transform inside the analysis, not in the slide.
  • When the original units are the point. Totals add up only in the original units: revenue is the number of orders times the arithmetic mean order value. Forecasting revenue from a geometric mean understates it.
  • For tree-based models. A decision tree splits on thresholds such as “total above $400”. A log transformation keeps the order of the values, so the same split exists as “log total above ln 400” and puts the same rows on each side: nothing changes except readability.
  • When the skew is mild or the model’s errors are already well behaved. In regression, what matters is the shape of the residuals, not of every input. Check them before transforming.
  • To hide errors. A log makes a 999-bag typo look less extreme without making it any less wrong. Fix errors and impossible values first; transform genuine skew only.

In a spreadsheet or pandas

  • Spreadsheet: LN(x), LN(1 + x) and SQRT(x) in a new column; SKEW(range) for the adjusted Fisher–Pearson coefficient; EXP(AVERAGE(log column)) or GEOMEAN(range) for the geometric mean.
  • pandas: np.log(s), np.log1p(s) and np.sqrt(s) transform a column; s.skew() measures skewness; PowerTransformer(method='box-cox') from scikit-learn estimates λ (use method='yeo-johnson' when there are zeros or negatives).

Formulas

Sample skewness (adjusted Fisher–Pearson coefficient)

G1=n(n−1)n−2⋅m3m23/2G_1 = \dfrac{\sqrt{n(n-1)}}{n-2}\cdot\dfrac{m_3}{m_2^{3/2}}
G1G_1
Sample skewness: positive for a long right tail, negative for a long left tail
nn
Number of values (at least 3)
m2m_2
Mean squared deviation from the mean, dividing by nsquared units
m3m_3
Mean cubed deviation from the mean, dividing by ncubed units

Assumes. The same definition as Excel’s SKEW and pandas’ skew(). Near 0 for symmetric data.

Positive: long right tail. Negative: long left tail. Very sensitive to a single extreme value.

Log and log(1 + x) transformations

y=ln⁡x(x>0),y=ln⁡(1+x)(x>−1)y = \ln x \quad (x > 0), \qquad y = \ln(1 + x) \quad (x > -1)
xx
The original valueunits of the variable
yy
The transformed valuelog units

Equal ratios in x become equal differences in y; the base of the log changes only the scale.

Box–Cox transformation

x(λ)=xλ−1λ (λ≠0),x(0)=ln⁡xx^{(\lambda)} = \dfrac{x^{\lambda} - 1}{\lambda}\ (\lambda \neq 0), \qquad x^{(0)} = \ln x
xx
The original value, strictly positiveunits of the variable
λ\lambda
The power, estimated from the (training) data

Assumes. All values positive; for zeros or negatives use Yeo–Johnson.

Geometric mean

GM=(∏i=1nxi)1/n=exp⁡ ⁣(1n∑i=1nln⁡xi)\text{GM} = \left(\prod_{i=1}^{n} x_i\right)^{1/n} = \exp\!\left(\dfrac{1}{n}\sum_{i=1}^{n}\ln x_i\right)
xix_i
Positive valuesunits of the variable
GM\text{GM}
Geometric mean: the back-transformed mean of the logsunits of the variable
nn
Number of values

Never larger than the arithmetic mean; equal only when all values are equal.

Log difference and percentage change

d=ln⁡xnewxold,percentage change=(ed−1)×100%d = \ln\dfrac{x_{\text{new}}}{x_{\text{old}}}, \qquad \text{percentage change} = (e^{d} - 1) \times 100\%
xnew, xoldx_{\text{new}},\ x_{\text{old}}
The new and old valuesunits of the variable
dd
Difference between the logs of the new and old valueslog units

For small changes, 100 × d is close to the percentage change; for large ones use the exact formula.

Worked examples

A first example: The skewness of six Lantern orders

Fictional figures

Six Lantern online orders were worth $20, $22, $25, $28, $35 and $80. Calculate the adjusted Fisher–Pearson skewness and compare the mean with the median.

  1. Mean =210÷6=35= 210 \div 6 = 35; median =(25+28)÷2=26.5= (25 + 28) \div 2 = 26.5. Deviations from the mean: −15, −13, −10, −7, 0, 45.
  2. Squared deviations: 225, 169, 100, 49, 0, 2,025, total 2,568, so m2=2,568÷6=428m_2 = 2{,}568 \div 6 = 428.
  3. Cubed deviations: −3,375, −2,197, −1,000, −343, 0, 91,125, total 84,210, so m3=84,210÷6=14,035m_3 = 84{,}210 \div 6 = 14{,}035.
  4. g1=14,035÷4281.5=14,035÷8,854.5=1.585g_1 = 14{,}035 \div 428^{1.5} = 14{,}035 \div 8{,}854.5 = 1.585.
  5. Adjust for the sample size: G1=6×54×1.585=1.369×1.585=2.17G_1 = \dfrac{\sqrt{6 \times 5}}{4} \times 1.585 = 1.369 \times 1.585 = 2.17.

Answer. Skewness G₁ = 2.17: strongly right-skewed. The mean ($35) is well above the median ($26.50).

What it means. Almost all the skewness comes from the one $80 order. Before transforming, check that it is genuine; if it is, the free-delivery threshold should be set from the distribution of household orders (the median and upper quartile), not from a mean that one office order inflates.

A harder example: Logs, symmetry and the geometric mean

Fictional figures

A battery-storage installer’s five most recent projects cost $10k, $20k, $40k, $80k and $160k. Show that a log transformation makes them perfectly symmetric, and compare the back-transformed mean of the logs with the ordinary mean.

  1. On the original scale: arithmetic mean =310÷5=62= 310 \div 5 = 62 ($62k), median $40k, skewness G1=1.33G_1 = 1.33. Right-skewed.
  2. Take natural logs: 2.303, 2.996, 3.689, 4.382, 5.075. Each is 0.693 (=ln⁡2= \ln 2) above the previous one because each cost is double the previous one, so the logs are evenly spaced and their skewness is 0.
  3. Mean of the logs: (2.303+2.996+3.689+4.382+5.075)÷5=3.689(2.303 + 2.996 + 3.689 + 4.382 + 5.075) \div 5 = 3.689. Back-transform: e3.689=40e^{3.689} = 40.
  4. Check directly: (10×20×40×80×160)1/5=102,400,0001/5=40(10 \times 20 \times 40 \times 80 \times 160)^{1/5} = 102{,}400{,}000^{1/5} = 40. The back-transformed mean is the geometric mean, $40k.

Answer. After the log the costs are symmetric (skewness 0). The back-transformed mean is the geometric mean, $40k, well below the arithmetic mean of $62k.

What it means. If the installer modelled log(project cost) and reported the back-transformed average as “the average project”, it would quote $40k, a typical project, and anyone budgeting for five projects from it would plan $200k instead of the $310k actually spent. Report which mean you mean.

Applied: a business decision: Forecasting Harborview’s booking revenue

Fictional figures

A sample of eight Harborview bookings had totals of $180, $220, $260, $300, $360, $450, $600 and $1,500. The revenue manager expects 400 bookings next month and asks for a revenue forecast. A colleague suggests using the back-transformed mean of log(total), “because the data are skewed”. Compare the options.

  1. Arithmetic mean =3,870÷8=483.75= 3{,}870 \div 8 = 483.75; median =(300+360)÷2=330= (300 + 360) \div 2 = 330; geometric mean (back-transformed mean of the logs) =381.67= 381.67. Skewness is 2.32 on the original scale and 1.24 after the log: reduced, not removed.
  2. Revenue is a total, and a total is count × arithmetic mean: 400×483.75=193,500400 \times 483.75 = 193{,}500.
  3. Using the geometric mean: 400×381.67=152,670400 \times 381.67 = 152{,}670, which is $40,830 too low. Using the median: 400×330=132,000400 \times 330 = 132{,}000, lower still.
  4. Where the log does help: a model predicting one booking’s total from its length of stay and room type is better fitted to log(total), because the errors are more symmetric there. Its predictions, converted back with eˣ, estimate a typical booking and must be adjusted upwards before being summed into revenue.

Answer. Forecast revenue with the arithmetic mean: about $193,500. The geometric mean would understate it by about $40,800 and the median by $61,500.

What it means. Skewness changes which summary describes a typical booking, not how totals add up. Use the median to tell marketing what a typical guest spends, the arithmetic mean for anything that will be summed, and the log scale inside models.

Explore

Harborview’s booking totals. Switch between no transformation, the log, log(1 + x) and the square root. Watch the skewness and the number of values the 1.5 × IQR rule flags: on the original scale the long tail produces many flags, and the stronger transformations bring most of those genuine bookings back inside the fences.

Loading the interactive…

Northfield’s weekly study hours. The data dictionary allows zero hours, so this explorer offers log(1 + x) and the square root, which stay defined at zero, rather than the plain log. Compare how much each reduces the skewness.

Loading the interactive…

Pick an old and a new price. For small changes the log difference × 100 tracks the percentage change closely; push the new price far from the old one and watch the two separate.

Loading the interactive…

Common mistakes

  • “Skewed data are wrong and need fixing.”

    Skewness is usually a true feature of the business: most customers buy a little and a few buy a lot. Transform when a method needs roughly symmetric data, but keep the original column, and never treat long-tail values as errors just because they are far from the mean.

  • “Just take the log.”

    The log is undefined at zero and for negative values, so a column with zero study hours or negative profit will produce errors or minus infinity. Use log(1 + x) or the square root for zeros (minding the units), and Yeo–Johnson for negatives.

  • “The back-transformed mean is the average.”

    Converting the mean of the logs back with eˣ gives the geometric mean, which is always at or below the arithmetic mean. For Harborview’s bookings it is $381.67 against $483.75; using it for a revenue forecast understates revenue by about a fifth.

  • “A log difference of 0.4 means a 40% increase.”

    Only small log differences approximate percentage changes. A log difference of 0.405 is a 50% increase (e^0.405 − 1 = 0.5). Convert with eᵈ − 1 whenever the change is more than a few per cent.

  • “Transform everything before any model.”

    Tree-based models are unaffected by order-preserving transformations, reports need real units, and totals only add up on the original scale. Transform for a reason (symmetric errors, multiplicative effects, a method that needs it) and say why.

Guided practice

Work through these with hints when you need them. Every hint and every worked solution is there to be used.

Loading four questions…

On your own

No hints this time. Answer, check, and read the feedback; the solution appears once you have answered or if you ask for it. Your first answers count toward mastery.

Loading six questions…

In practice

Lantern’s free-delivery decision now starts from the distribution, not the mean. The analyst plots household order values, sees the long right tail, and reports the median ($26.50 in the sample) and the upper quartile. Marketing sets the threshold a little above the median so that a customer can reach it by adding one bag, and tracks how the share of orders above it changes. The office orders are flagged and excluded from this decision, because they have their own delivery terms.

When Lantern later models what drives order value (subscription, region, promotion), the analyst fits the model to log(order value). Coefficients then read as approximate percentage effects (“a promotion is associated with orders about 8% larger”), which is how the business thinks about prices anyway, and the errors are closer to symmetric. For the finance team’s revenue forecast, though, the analyst switches back to the original scale and the arithmetic mean, because revenue is a sum.

At Harborview, the revenue manager uses the median booking total to describe a typical stay, the arithmetic mean for revenue planning, and log(total) inside the demand model. At Northfield, study hours are self-reported and the data dictionary allows zero, so the analyst uses log(1 + hours) in a model of grades rather than a plain log that would fail on the first student who reports none, checks that hours are recorded in hours rather than minutes, and reports raw medians by programme to the academic board. A clothing brand analysing days between a customer’s first and second purchase, a variable with a long right tail and no zeros, would use the log for modelling and percentiles for reporting.

Knowledge check

Six questions, one attempt each, no hints. Score 80% or more to complete the lesson; you can take it again at any time.

Loading six questions…

Summary

  • Skewness measures asymmetry: right-skewed data have a long tail of large values (mean usually above the median), left-skewed data a long tail of small values.
  • This course uses the adjusted Fisher–Pearson coefficient G₁ = √(n(n − 1)) ÷ (n − 2) × m₃ ÷ m₂^1.5, as in Excel’s SKEW and pandas’ skew(); it is very sensitive to single extreme values.
  • Skewness makes means unrepresentative, makes outlier rules flag genuine values, and can give models skewed errors.
  • The log needs positive values; log(1 + x) and the square root handle zeros (the 1 depends on the units); Box–Cox chooses the power from positive data; Yeo–Johnson handles negatives.
  • After a log, small differences are approximately percentage changes (exactly eᵈ − 1) and back-transformed means are geometric means, below the arithmetic mean.
  • Don’t transform for reports, totals or tree-based models, or to disguise errors; estimate any fitted transformation on training data only.

Key formulas

Terms introduced

Skewness
A measure of the asymmetry of a distribution: positive for a long right tail, negative for a long left tail, near 0 for symmetric data.
Right-skewed
Having a long tail of large values; the mean is usually above the median. Also called positively skewed.
Left-skewed
Having a long tail of small values; the mean is usually below the median. Also called negatively skewed.
Log transformation
Replacing each value x with ln x (or a log to another base); it needs positive values and turns equal ratios into equal differences.
Log1p transformation
Replacing each value x with ln(1 + x), so that zeros become 0; its effect depends on the units of x.
Square-root transformation
Replacing each value x with √x; a milder correction for right skew that handles zeros.
Box–Cox transformation
The power transformation (x^λ − 1) ÷ λ, or ln x when λ = 0, with λ estimated from strictly positive data to make them as close to normal as possible.
Geometric mean
The nth root of the product of n positive values, equal to the back-transformed mean of their logs; never larger than the arithmetic mean.

Sources

  1. NIST/SEMATECH e-Handbook of Statistical Methods, section 1.3.5.11, “Measures of Skewness and Kurtosis”. itl.nist.gov/div898/handbook/eda/section3/eda35b.htm
  2. NIST/SEMATECH e-Handbook of Statistical Methods, section 1.3.3.6, “Box-Cox Normality Plot”. itl.nist.gov/div898/handbook/eda/section3/boxcoxno.htm
  3. Box, G. E. P. & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society, Series B, 26(2), 211–252. doi:10.1111/j.2517-6161.1964.tb00553.x.
  4. Illowsky, B., Dean, S. et al. (2023). Introductory Statistics 2e, section 2.6, “Skewness and the Mean, Median, and Mode”. OpenStax. openstax.org/books/introductory-statistics/pages/2-6-skewnes…
  5. scikit-learn developers. API reference: sklearn.preprocessing.PowerTransformer (Box–Cox and Yeo–Johnson; cites Yeo, I.-K. & Johnson, R. A. (2000), Biometrika, 87(4), 954–959). scikit-learn.org/stable/modules/generated/sklearn.preprocess…
  6. NumPy documentation: numpy.log1p. numpy.org/doc/2.0/reference/generated/numpy.log1p.html