Standard deviation normalization puts raw measurements on a scale based on their spread. It divides each value by the standard deviation and, unlike the z-score method, does not subtract the mean. section 19.4.2
The technique helps compare historical measurements when league conditions change. For NBA scoring, different rules and playing styles altered points per game across eras, so raw averages can mislead. section 19.0 section 20.8
A practical R workflow is:
- Group observations by the relevant factor, such as Year. section 19.4.2
- Create a normalized value by dividing each raw measurement by its group’s standard deviation. section 19.4.2
- Select the largest normalized value within each group to identify the annual leader. section 19.4.2
- Plot the selected values to compare normalized leaders across years. section 19.4.2
NBA scoring across eras
Grouping player scoring by year and calculating sd_ppg = PPG / sd(PPG) produces a year-specific comparison. The resulting chart again highlights George Mikan’s 1950 season, Neal Johnston’s 1954 season, and Allen Iverson’s 1998–99 season as prominent outliers. section 19.4.2
dat2 %>% group_by(Year) %>% mutate(sd_ppg = round((PPG / sd(PPG)), digits = 1)) -> dat5a head(dat5a, n = 3) ## # A tibble: 3 × 5 ## # Groups: Year [1] ## Year Player PPG Year_Player sd_ppg ## <fct> <chr> <dbl> <chr> <dbl> ## 1 1950 Al Guokas 3.8 1950 Al Guokas 1.2 ## 2 1950 Alex Groza 23.4 1950 Alex Groza 7.5 ## 3 1950 Alex Hannum* 7.5 1950 Alex Hannum* 2.4 tail(dat5a, n = 3) ## # A tibble: 3 × 5 ## # Groups: Year [1] ## Year Player PPG Year_Player sd_ppg ## <fct> <chr> <dbl> <chr> <dbl> ## 1 1999 Walt Williams 9.3 1999 Walt Williams 2 ## 2 1999 Walter McCarty 5.7 1999 Walter McCarty 1.2 ## 3 1999 Will Perdue 2.4 1999 Will Perdue 0.5
Use the listing to inspect the grouped mutation, resulting tibble, and normalized scoring values before selecting annual maxima. section 19.4.2
