A z-score, also called a standard score, places a raw numeric value on a common scale by showing how many standard deviations it sits above or below its distribution mean. Compute it by subtracting the mean from the raw value and dividing by the standard deviation: z = (value − mean) / standard deviation. Positive scores are above the mean, negative scores are below it, and zero is at the mean. section 11.3 section 19.4.1
Standardizing with z-scores makes unlike measures comparable and adds context that raw values lack. It is especially useful when values span years whose schedules, rules, or styles of play differ, or when variables use different scales. For NBA payrolls and wins, standardization lets both measures share an axis; for historical scoring, it compares players with their own season’s league context rather than treating every era alike. section 11.4.2 section 14.2.6 section 19.0
Use z-scores in a practical workflow:
- Choose a numeric variable and the population to compare, such as all teams in one season or all players in a given year. section 14.2.6 section 19.4.1
- Calculate the group mean and standard deviation, then create a new standardized variable with the z-score formula. section 11.3 section 19.4.1
- Interpret the sign and distance: a score of −0.8 is 0.8 standard deviations below that group’s mean, while 5.6 is far above it. section 19.4.1
- Check the result: a z-score vector should have a mean near 0 and variance near 1; grouping and rounding can prevent exact values. section 19.4.1
Standardize scoring within each year
To compare points per game across changing NBA seasons, calculate each player’s score relative to the mean and standard deviation for that same year. In R, group by Year and create z_ppg with mutate(). A 1950 average of 3.8 PPG becomes −0.8, whereas 23.4 PPG becomes 5.6, revealing each player’s standing within that season rather than comparing raw totals across eras. section 19.4.1
dat2 %>% group_by(Year) %>% mutate(z_ppg = round((PPG - mean(PPG)) / sd(PPG), digits = 1)) -> dat4a head(dat4a, n = 3) ## # A tibble: 3 × 5 ## # Groups: Year [1] ## Year Player PPG Year_Player z_ppg ## <fct> <chr> <dbl> <chr> <dbl> ## 1 1950 Al Guokas 3.8 1950 Al Guokas -0.8 ## 2 1950 Alex Groza 23.4 1950 Alex Groza 5.6 ## 3 1950 Alex Hannum* 7.5 1950 Alex Hannum* 0.4 tail(dat4a, n = 3) ## # A tibble: 3 × 5 ## # Groups: Year [1] ## Year Player PPG Year_Player z_ppg ## <fct> <chr> <dbl> <chr> <dbl> ## 1 1999 Walt Williams 9.3 1999 Walt Williams 0.5 ## 2 1999 Walter McCarty 5.7 1999 Walter McCarty -0.2 ## 3 1999 Will Perdue 2.4 1999 Will Perdue -0.9
This R listing groups records by year and creates a rounded z-score for points per game, so each season supplies its own comparison baseline. section 19.4.1
Z-scores also prepare variables for multivariate analysis. Standardized payroll and win totals can be compared in a Cleveland dot plot, where the gap between their z-scores shows whether wins exceed or trail spending relative to league averages. They are also used before examining payroll-and-win patterns with K-means clustering. section 11.4.2 section 11.5.2
A z-score is a relative measure, not a raw performance total. A historically lower scoring average can rank as more exceptional after adjustment for its era’s mean and variability; for example, the cited comparisons give George Mikan’s 1950 average a higher standardized score than Wilt Chamberlain’s 1962 average. section 20.8







