KajoData / statystyka
Z-score i odchylenie standardowe: obliczenia oraz interpretacja
Pokazuję, co oznacza odległość od średniej, jak ją sprawdzić i kiedy z-score nie wystarcza do oceny rzadkości wyniku.

Wynik 500 punktów wygląda imponująco, dopóki nie zapytamy, ile można było zdobyć i jak poradzili sobie inni. Podobnie jest z czasem obsługi zgłoszenia, liczbą zamówień czy wynikiem egzaminu. Sama liczba często daje za mało kontekstu. Z-score pozwala opisać odległość wyniku od średniej w jednostkach odchylenia standardowego. Lubię tę miarę za prostotę, ale właśnie ta prostota potrafi uśpić czujność.
Pokażę obliczenie ręczne, krótki kod Pythona i kilka sytuacji, w których poprawnie policzona liczba prowadzi do błędnej interpretacji. Wszystkie dane liczbowe w przykładach są syntetyczne. Nie opisują prawdziwego egzaminu, firmy ani zespołu. Najważniejsze pytanie będzie wracało kilka razy: względem jakiej grupy i jakiego rozrzutu oceniamy ten wynik?
Co właściwie mówi z-score
Z-score odpowiada na pytanie: o ile odchyleń standardowych dana wartość leży powyżej albo poniżej wybranej średniej? Dla znanej średniej populacji i dodatniego odchylenia populacyjnego zapisuję to jako z = (x - μ) / σ. Litera x oznacza obserwację, μ średnią odniesienia, a σ odchylenie standardowe. W obliczeniach na próbie często podstawiamy oszacowania tych parametrów. Do tej różnicy jeszcze wrócę.
Najpierw odejmuję średnią. Dzięki temu zero staje się punktem odniesienia: wynik równy średniej ma z-score równy zero. Potem dzielę różnicę przez odchylenie standardowe, czyli miarę rozrzutu wyrażoną w tych samych jednostkach co dane. Punkty dzielone przez punkty tracą jednostkę. Otrzymuję liczbę, którą mogę odczytać jako odległość na wspólnej skali.
Dodatni znak oznacza wynik powyżej średniej, ujemny poniżej. Z-score równy dwa to dwa odchylenia powyżej punktu odniesienia, a minus pół to pół odchylenia poniżej. Sam znak nie ocenia jakości. Dodatni wynik dla liczby poprawnych odpowiedzi może cieszyć, ale dodatni wynik czasu oczekiwania może być sygnałem problemu. Kierunek pożądanej zmiany wynika z pytania biznesowego.
Przykład z wynikiem 500 punktów
Załóżmy, że w hipotetycznym teście średnia wynosi 300 punktów, odchylenie standardowe 50 punktów, a maksymalny wynik to 500. Osoba, która zdobyła 500, znajduje się 200 punktów powyżej średniej. Dzielę 200 przez 50 i otrzymuję cztery. Wynik leży cztery odchylenia standardowe powyżej średniej przy podanych parametrach odniesienia.
Nie wynika z tego jeszcze, jaki odsetek osób uzyskał mniej punktów. Nie znamy pełnego rozkładu ani liczebności grupy. Skala testu ma też górną granicę, więc nie można bez zastanowienia traktować jej jak nieograniczonego rozkładu normalnego. Obliczenie z-score jest poprawne, ale do stwierdzenia o rzadkości potrzebujemy dodatkowych informacji. To dobry moment, żeby oddzielić rachunek od wniosku.
Dla tej samej średniej i odchylenia wynik 250 daje minus jeden, a 350 daje plus jeden. Obie wartości leżą równie daleko od średniej, tylko po różnych stronach. Z-score nie mówi, że różnica między 250 i 350 jest mało ważna. Pozwala opisać tę różnicę na skali rozrzutu grupy, pozostawiając ocenę znaczenia osobie, która rozumie kontekst testu.
Odchylenie standardowe policzone od początku
Weźmy osiem obserwacji: 2, 4, 4, 4, 5, 5, 7, 9. Na potrzeby pierwszego obliczenia traktuję je jako całą populację, którą chcę opisać. Ich suma wynosi 40, więc średnia to pięć. Różnice względem średniej wynoszą kolejno minus trzy, minus jeden, minus jeden, minus jeden, zero, zero, dwa i cztery.
Gdybym po prostu zsumował te różnice, dodatnie i ujemne wartości zniosłyby się. Dlatego przy obliczaniu wariancji podnoszę różnice do kwadratu. Otrzymuję 9, 1, 1, 1, 0, 0, 4 i 16, razem 32. W wariancji populacyjnej dzielę 32 przez osiem, co daje cztery. Pierwiastek z czterech to odchylenie standardowe równe dwa.
Teraz każdą różnicę od średniej dzielę przez dwa. Dla dziewiątki otrzymuję dwa, dla dwójki minus półtora. Pełna tabela pozwala sprawdzić także powtórzenia: trzy czwórki muszą dostać identyczny wynik. Gdyby otrzymały różne wartości, szukałbym błędu w grupowaniu albo zastosowanych parametrach.
| Wartość | Liczba obserwacji | Z-score |
|---|---|---|
| 2 | 1 | -1.5 |
| 4 | 3 | -0.5 |
| 5 | 2 | 0 |
| 7 | 1 | 1 |
| 9 | 1 | 2 |
Średnia z-score dla tych ośmiu obserwacji wynosi zero, a ich odchylenie populacyjne jeden. To własność przekształcenia tego konkretnego zbioru jego własną średnią i dodatnim odchyleniem. Nowe obserwacje przeliczone starymi parametrami nie muszą mieć średniej zero. Ten szczegół okaże się ważny przy monitorowaniu procesu.
Populacja, próba i dwie poprawne liczby
Te same osiem liczb można potraktować jako próbę z szerszej populacji. Przy standardowym obliczeniu wariancji z próby dzielnik wynosi wtedy siedem zamiast ośmiu. Dostajemy wariancję 32/7 i odchylenie około 2,1381. Dziewiątka ma w takiej skali wynik około 1,8708. Różnica względem dwóch nie oznacza awarii kalkulatora. Zastosowaliśmy inną definicję skali odniesienia.
W Pythonie rozróżnienie jest jawne: statistics.pstdev oblicza odchylenie populacyjne, a statistics.stdev odchylenie z próby. Druga funkcja wymaga co najmniej dwóch wartości. Szczegóły opisuje dokumentacja modułu statistics. W raporcie zapisałbym wybór metody, bo sam napis „odchylenie standardowe” nie wyjaśnia tej różnicy.
Nie dobieram dzielnika po zobaczeniu wyniku, żeby obserwacja przekroczyła wygodny próg. Najpierw ustalam cel: opis zamkniętego zbioru, oszacowanie rozrzutu szerszej populacji czy przygotowanie cechy dla konkretnego algorytmu. Przykładowo StandardScaler w scikit-learn używa wariantu odpowiadającego ddof=0. Domyślne ustawienie narzędzia trzeba znać, a jego sens dopasować do zadania.
Krótki, sprawdzalny kod Pythona
Poniższy przykład korzysta tylko z biblioteki standardowej Pythona. Bloki uruchamiam kolejno w jednej sesji; można też połączyć je w jeden plik. Najpierw odtwarzam obliczenie ręczne. Zaokrąglam wyłącznie wartości wyświetlane, zachowując pełną precyzję w dalszych obliczeniach. Dzięki temu kontrola nie zależy od tego, ile miejsc po przecinku akurat chcę pokazać czytelnikowi.
# example: reference
from math import isclose, isfinite
from statistics import mean, pstdev, stdev
values = [2, 4, 4, 4, 5, 5, 7, 9]
center = mean(values)
scale = pstdev(values)
scores = [(value - center) / scale for value in values]
print(center, scale)
print(scores)
print(round(stdev(values), 4))
Pierwsza linia wyniku zawiera pięć i dwa. Lista to [-1.5, -0.5, -0.5, -0.5, 0.0, 0.0, 1.0, 2.0], a ostatnia liczba to 2.1381. Dla danych z pliku wcześniej sprawdziłbym typy, braki, jednostki i zakres. Ten etap szerzej pokazuję w podstawach Pythona i pandas. Sama funkcja statystyczna nie odgadnie znaczenia błędnie zapisanej wartości.
Teraz oddzielam parametry odniesienia od nowej obserwacji. Funkcja przyjmuje zwykłe liczby całkowite lub zmiennoprzecinkowe w zakresie tego ćwiczenia. Odrzuca wartości niefinitywne oraz niedodatnią skalę. Nie jest uniwersalnym walidatorem każdego możliwego typu liczbowego. Chodzi o czytelne zapisanie założeń, które przy ręcznym rachunku łatwo pozostawić w głowie.
# example: scoring
def z_score(value, center, scale):
if not all(isfinite(item) for item in (value, center, scale)):
raise ValueError("Expected finite numbers")
if scale <= 0:
raise ValueError("Scale must be positive")
return (value - center) / scale
print(z_score(500, 300, 50))
print(z_score(11, center, scale))
print(round(z_score(9, center, stdev(values)), 4))
Wyniki to 4.0, 3.0 i 1.8708. Jedenastkę porównujemy ze starym centrum równym pięć i skalą równą dwa. Nie dopisujemy jej automatycznie do danych użytych do wyznaczenia tych parametrów. Takie rozdzielenie pomaga utrzymać stały punkt odniesienia, gdy oceniamy kolejne obserwacje napływające po zakończeniu okresu bazowego.
Kiedy dzielenie nie ma sensu
Jeżeli wszystkie wartości wynoszą pięć, ich odchylenie standardowe jest zerowe. Dzielenie przez zero nie daje sensownego z-score. Nie zamieniałbym takiego wyniku po cichu na zero, bo zero sugeruje poprawne porównanie z istniejącą skalą. W tym przypadku brakuje właśnie skali. Oznaczyłbym wynik jako nieokreślony i wyjaśnił, że grupa odniesienia nie wykazuje zmienności.
Pusty zbiór nie pozwala wyznaczyć średniej, a pojedyncza obserwacja nie wystarcza do obliczenia odchylenia z próby. Brak pomiaru również nie jest zerem. Jeżeli pominięcie braków jest uzasadnione, zapisuję liczbę wykorzystanych obserwacji oraz regułę pomijania. W przeciwnym razie czytelnik może porównywać dwa wyniki policzone na zupełnie innych zakresach danych.
# example: checks
assert isclose(mean(scores), 0.0, abs_tol=1e-12)
assert isclose(pstdev(scores), 1.0)
assert z_score(5, center, scale) == 0
assert z_score(3, center, scale) == -1
assert pstdev([5, 5, 5]) == 0
Kontrole dotyczą konkretnych własności i znanych wyników. Nie udowadniają, że wybrana grupa dobrze reprezentuje rzeczywistość. Można napisać program, który przechodzi wszystkie testy arytmetyczne, a porównuje czasy obsługi reklamacji z czasami prostych zapytań. Poprawny kod i sensowna analiza wymagają osobnego sprawdzenia.
Standaryzacja nie tworzy rozkładu normalnego
Odjęcie średniej i podzielenie przez dodatnią stałą przesuwa oraz skaluje dane. Nie usuwa asymetrii, skupisk ani długiego ogona. Jeżeli większość obserwacji była niska, a kilka bardzo wysokich, taki układ pozostanie po standaryzacji. Zmieni się opis osi, ale kolejność obserwacji i ich względne odstępy zostaną zachowane.
Rozkład normalny ma określony kształt; jego standardowa wersja ma średnią zero i odchylenie jeden. Samo spełnienie tych dwóch warunków nie wystarcza, żeby dowolny zbiór był normalny. Definicję i własności opisuje NIST. Dlatego przed interpretacją prawdopodobieństw obejrzałbym rozkład, na przykład na histogramie.
Z-score równy dwa nie jest automatycznie 97,7. percentylem danych. Taki przybliżony odsetek poniżej wartości wynika z modelu standardowego rozkładu normalnego. W naszym ośmioelementowym zbiorze poniżej dziewiątki jest siedem obserwacji, czyli 87,5%, a nie 97,7%. Przy remisach dodatkowo trzeba określić konwencję rankingu. Odległość od średniej i pozycja w uporządkowanym zbiorze odpowiadają na różne pytania.
Dobierz grupę odniesienia do pytania
Załóżmy, że czas realizacji wynosi 12 minut. W syntetycznej grupie A średnia wynosi osiem, a odchylenie dwa, więc z-score wynosi dwa. W grupie B średnia wynosi dziesięć, a odchylenie cztery, więc z-score wynosi pół. Obserwacja się nie zmieniła. Zmieniło się porównanie, które jej nadajemy.
Jeżeli A obejmuje proste zgłoszenia, a B trudne reklamacje, wspólna średnia może ukryć istotną różnicę procesu. Podział na grupy powinien jednak wynikać z sensu zadania, a nie z chęci uzyskania atrakcyjnego wyniku. Zbyt drobne grupy dają mało obserwacji i niestabilne parametry. Przygotowałbym opis zakresu, okresu i kryteriów włączenia przed obliczeniem wskaźnika.
W porównaniu różnych egzaminów podobny z-score oznacza podobną odległość od średniej odpowiedniej grupy. Nie dowodzi równości umiejętności, trudności testów ani jakości pomiaru. W porównaniu zespołów nie usuwa różnic w zadaniach i zasobach. Wspólna jednostka matematyczna ułatwia czytanie liczb, ale nie naprawia automatycznie projektu porównania.

Duży wynik jest początkiem sprawdzania
Reguła „usuń wszystko poza trzema odchyleniami” może skasować właśnie te zdarzenia, które warto zrozumieć. Duża wartość może pochodzić z błędu jednostki, ale może też poprawnie opisywać wyjątkowe zdarzenie. NIST rozróżnia oznaczenie podejrzanej obserwacji od ustalenia, że jest błędna. Sam próg nie wykonuje za nas tej drugiej pracy.
Najpierw zajrzałbym do rekordu źródłowego: czy czas zapisano w minutach, czy sekundach, czy nie połączono kilku zdarzeń, czy identyfikator nie występuje dwukrotnie. Potem sprawdziłbym kontekst procesu. Jeśli rekord jest poprawny, zachowałbym go i rozważył sposób prezentacji lub metodę analizy mniej wrażliwą na skrajności. Decyzję o korekcie trzeba umieć odtworzyć.
Warto też pamiętać, że skrajna obserwacja wpływa na średnią i odchylenie użyte do wyliczenia jej własnego z-score. To nie jest niezależny sędzia stojący poza danymi. Szczególnie w małym zbiorze próg może zachowywać się inaczej, niż podpowiada intuicja z dużej, stabilnej populacji. Oględziny danych i czyszczenie według jawnych reguł pozostają potrzebne.
Stała baza i kolejne okresy
Jeżeli chcę wykrywać zmianę, zachowuję parametry okresu bazowego i stosuję je do kolejnych wartości. Gdybym każdego dnia od nowa wyznaczał średnią i odchylenie, codziennie przesuwałbym linijkę. Taki wynik może opisywać pozycję dnia w nowej grupie, ale odpowiada na inne pytanie niż odchylenie od wcześniejszego procesu.
Stała baza też wymaga opieki. Zmiana produktu, sezonu albo sposobu pomiaru może sprawić, że stare porównanie straci sens. Wtedy opisuję zmianę definicji i wersję parametrów. Nie mieszam bez komentarza wyników policzonych różnymi bazami. W raporcie obok z-score zostawiłbym oryginalną wartość, średnią, odchylenie i okres odniesienia.
W uczeniu maszynowym parametry skalowania wyznacza się na danych treningowych, a następnie stosuje do danych testowych. Obliczanie ich na całości przed podziałem może wprowadzić informację z testu do przygotowania modelu. Ten problem opisuje dokumentacja scikit-learn o wycieku danych. W tym artykule nie budujemy modelu, ale warto od początku rozdzielać ustalenie parametrów od ich użycia.
Wróć do oryginalnej jednostki
Czytelnik raportu może rozumieć, że wynik jest wysoki, a nadal nie wiedzieć, co ma z nim zrobić. Dlatego przy prezentacji wracam do jednostki pomiaru. Przekształcenie wzoru daje x = μ + z * σ. Dla naszej średniej pięć i odchylenia dwa wynik równy półtora odpowiada wartości osiem. To również kontrola rachunku: po przeliczeniu w obie strony powinniśmy wrócić do tej samej obserwacji, z dokładnością do błędów numerycznych.
Jeżeli rozmawiamy o czasie, odbiorca może potrzebować informacji o minutach przekroczenia, liczbie spraw i terminie wykonania, a nie tylko o pozycji względem historii. Próg operacyjny ustalony na 15 minut nie zmienia się automatycznie dlatego, że wzrósł rozrzut czasów. Wzrost odchylenia może obniżyć z-score dla tego samego opóźnienia. Bez oryginalnej wartości wyglądałoby to jak poprawa, choć klient nadal czeka równie długo. Wspólna prezentacja obu miar pozwala zauważyć taką sytuację.
Podobnie postępuję przy porównaniu kilku cech. Zanim dodam ich z-score do jednego wskaźnika, ustalam kierunek każdej skali, wagi i znaczenie wyniku. Sama standaryzacja nie wyjaśnia, dlaczego szybkość miałaby liczyć się tak samo jak jakość. Dwie cechy mogą też powtarzać prawie tę samą informację, zwiększając jej udział w sumie. Na początek pokazałbym je osobno, z krótkim opisem. Dopiero uzgodniony cel uzasadnia budowę jednego wyniku zbiorczego i ocenę tego, jak reaguje na zmianę każdej składowej.
Ćwiczenie: zmień jednostkę, zachowaj znaczenie
Pomnóż wszystkie osiem wartości oraz średnią i odchylenie przez dziesięć. Przewidź wynik dla dziewięćdziesiątki. Różnica od średniej wyniesie czterdzieści, a odchylenie dwadzieścia, więc z-score pozostanie równy dwa. To dobry test, czy rozumiesz rolę jednostki i czy kod nie miesza przeskalowanej obserwacji ze starymi parametrami.
Potem policz wynik jedenastki względem starej bazy, a osobno dopisz ją do zbioru i wyznacz nową średnią oraz odchylenie. Wyniki będą różne, bo zadasz dwa różne pytania. W opisie ćwiczenia zapisz, który wariant odpowiada porównaniu nowego pomiaru z historią. Nie wystarczy pokazać dwie liczby i wybrać tę, która wygląda bardziej przekonująco.
Na końcu spróbuj wyjaśnić swój wynik bez symboli: jaka wartość, względem jakiej grupy, jak daleko od średniej i czego jeszcze nie wiemy. Jeśli umiesz dopisać te cztery informacje, z-score staje się użyteczną częścią analizy. Jeśli zostaje sama liczba z kolorem czerwonym lub zielonym, wróciłbym do definicji porównania.
Najważniejsze w pigułce
Czy z-score wymaga rozkładu normalnego?
Do obliczenia odległości względem średniej i dodatniego odchylenia nie. Normalność jest dodatkowym założeniem, gdy korzystasz z prawdopodobieństw modelu normalnego.
Co oznacza ujemny z-score?
Wartość leży poniżej wybranej średniej odniesienia. Znak nie rozstrzyga, czy wynik jest dobry; to zależy od znaczenia mierzonej wielkości.
Co zrobić, gdy odchylenie wynosi zero?
Z-score jest wtedy nieokreślony. Oznacz ten przypadek jawnie i sprawdź grupę odniesienia zamiast zastępować wynik zerem.
Przy pracy nad artykułem użyto w zautomatyzowany sposób sztucznej inteligencji. Jeśli też chcesz tak umieć, sprawdź ten projekt.
