0Pricing
Pandas & NumPy Academy · Lekcja

Wykrywanie i obsługa wartości odstających

Identyfikuj wartości odstające za pomocą reguły IQR i wyników Z, decyduj, czy je ograniczyć, usunąć lub oznaczyć, oraz dokumentuj te decyzje.

Wykrywanie i obsługa wartości odstających to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Czym jest wartość odstająca?

Wartość odstająca to punkt danych, który znacznie różni się od pozostałej części zbioru danych. Wartości odstające mogą być prawidłowe (np. pojedynczy klient korporacyjny z zamówieniem na 500 000 USD w zbiorze, w którym średnia wartość zamówienia wynosi 100 USD) albo błędne (np. ujemna cena lub literówka, przez którą wartość 120 zmieniła się w 12 000). Pierwszym krokiem postępowania z wartościami odstającymi jest ustalenie, czy skrajna wartość jest rzeczywista i ma znaczenie, czy też wynika z problemu z jakością danych — sposób postępowania w obu przypadkach znacznie się różni.

import pandas as pd
import numpy as np

df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())

Wizualne wykrywanie wartości odstających: wykres pudełkowy

Wykres pudełkowy to najszybsze narzędzie wizualne do wykrywania wartości odstających. Pudełko obejmuje rozstęp międzykwartylowy (IQR, Q1–Q3), wąsy sięgają do 1,5×IQR, a punkty poza wąsami są rysowane osobno jako podejrzane wartości odstające. Użyj df['revenue'].plot(kind='box') lub sns.boxplot() z biblioteki Seaborn, aby natychmiast zobaczyć wartości odstające bez ręcznego obliczania progów.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()

Metoda przedziałów IQR

Metoda przedziałów IQR oblicza rozstęp międzykwartylowy i wyznacza granice na poziomie Q1 − 1,5×IQR oraz Q3 + 1,5×IQR. Wartości poza tymi granicami oznacza się jako odstające. Mnożnik 1,5 jest standardowy dla umiarkowanych wartości odstających; wartości 3,0 należy używać wyłącznie dla skrajnych wartości odstających. Ta metoda jest odporna: w przeciwieństwie do wyników Z nie zakłada rozkładu normalnego.

Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')

Metoda wyniku Z do wykrywania wartości odstających

Wynik Z określa, ile odchyleń standardowych dzieli daną wartość od średniej. Wartość, dla której |Z| > 3, jest tradycyjnie uznawana za odstającą; obejmuje to 99,7% danych o rozkładzie normalnym. Wyniki Z są jednak wrażliwe na wartości odstające, które próbują wykryć — skrajne wartości przesuwają średnią i zwiększają odchylenie standardowe, potencjalnie maskując inne wartości odstające.

mean = df['revenue'].mean()
std = df['revenue'].std()

df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]

print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())

Oznaczanie a usuwanie wartości odstających

Nigdy nie usuwaj wartości odstających bez udokumentowania i uzasadnienia tej decyzji. Najpierw oznacz je za pomocą kolumny logicznej (is_outlier), a następnie przeanalizuj, czy wykazują wspólny wzorzec (ten sam region, ten sam produkt, ten sam dzień). Jeśli są prawidłowe, pozostaw je i uwzględnij jawnie w modelu. Jeśli wynikają z błędów, usuń je i zapisz liczbę usuniętych wierszy w ścieżce audytu potoku.

df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)

print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())

Ograniczanie wartości odstających (winsoryzacja)

Ograniczanie (czyli winsoryzacja) zastępuje wartości wykraczające poza granice samymi wartościami granicznymi, zamiast usuwać cały wiersz. Zachowuje to wszystkie wiersze w zbiorze danych, jednocześnie zmniejszając zniekształcenie powodowane przez wartości odstające w modelach liniowych i statystykach podsumowujących. Użyj clip(lower=, upper=), aby zastosować ograniczenia w jednej zwektoryzowanej operacji.

df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)

print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())

Transformacja logarytmiczna dla danych prawoskośnych

Rozkłady przychodów i cen często są prawoskośne, z długim ogonem dużych wartości. Zastosowanie transformacji logarytmicznej za pomocą np.log1p() (logarytmu wartości powiększonej o 1, aby obsłużyć zera) kompresuje ogon i sprawia, że rozkład staje się bardziej symetryczny. Wiele modeli statystycznych i wizualizacji zakłada normalność, dlatego transformacja logarytmiczna kolumny przychodów przed modelowaniem często poprawia wyniki.

df['log_revenue'] = np.log1p(df['revenue'])

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()

Wartości odstające w wielu kolumnach

Podczas jednoczesnej analizy wielu kolumn oblicz programowo granice wartości odstających IQR dla wszystkich kolumn numerycznych. Iteruj po kolumnach numerycznych, obliczaj granice i przechowuj wyniki w słowniku. Dzięki temu możesz wygenerować pełny raport wartości odstających w kilku wierszach, zamiast ręcznie powtarzać obliczenia IQR dla każdej kolumny.

numeric_cols = df.select_dtypes(include=['number']).columns

outlier_report = {}
for col in numeric_cols:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
    outlier_report[col] = n_out

print(pd.Series(outlier_report).sort_values(ascending=False))

Dwuwymiarowe wartości odstające na wykresach punktowych

Niektóre punkty są odstające tylko w połączeniu z inną wartością: cena jednostkowa 10 USD jest normalna, ilość 500 jest nietypowa, ale nie niemożliwa, natomiast cena jednostkowa 10 USD i ilość 500 w przypadku produktu luksusowego budzą podejrzenia. Dwuwymiarowe wartości odstające pojawiają się na wykresach punktowych jako odizolowane punkty. Użyj df.plot.scatter('quantity', 'unit_price'), aby znaleźć punkty oddalone od głównego skupiska.

fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()

Dokumentowanie decyzji dotyczących wartości odstających

Każdą decyzję dotyczącą wartości odstających należy zarejestrować: kolumnę, metodę wykrywania, użyty próg, liczbę oznaczonych wierszy oraz zastosowane postępowanie (zachowanie, ograniczenie lub usunięcie). Taka dokumentacja chroni analityka podczas przeglądów kodu i audytów. Przechowuj ją w słowniku dziennika czyszczenia, który jest zapisywany razem z wynikowym zbiorem danych.

outlier_log = {
    'column': 'revenue',
    'method': 'IQR 1.5x',
    'lower_bound': round(lower, 2),
    'upper_bound': round(upper, 2),
    'rows_flagged': int(df['is_revenue_outlier'].sum()),
    'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
    print(f'{k}: {v}')

Zapisywanie zbioru danych po obróbce

Po oznaczeniu i przetworzeniu wartości odstających zapisz zaktualizowany DataFrame. Zachowaj kolumnę z oznaczeniem is_outlier w danych wynikowych, aby użytkownicy kolejnych etapów mogli wykluczać oznaczone wiersze w wybranych analizach. Zapisz wersję z ograniczonymi wartościami w kolumnie z jednoznacznym przyrostkiem (_capped) obok oryginału, aby można było odwrócić proces czyszczenia.

cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat analizy danych z tego rozdziału.

Podsumowanie lekcji

W tej lekcji nauczysz się: wykrywać wartości odstające za pomocą przedziałów IQR i wyników Z, decydować, czy wartości odstające oznaczać, ograniczać czy usuwać, a także stosować transformacje logarytmiczne do rozkładów prawoskośnych. Następnie zajmiemy się ujednolicaniem niespójnych etykiet kategorii w kolumnach tekstowych.

Często zadawane pytania

Czy lekcja „Wykrywanie i obsługa wartości odstających” jest bezpłatna?

Tak — pełny tekst „Wykrywanie i obsługa wartości odstających” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wykrywanie i obsługa wartości odstających”?

Identyfikuj wartości odstające za pomocą reguły IQR i wyników Z, decyduj, czy je ograniczyć, usunąć lub oznaczyć, oraz dokumentuj te decyzje. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wykrywanie i obsługa wartości odstających”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wykrywanie i usuwanie duplikatów
  2. Wykrywanie i obsługa wartości odstających
  3. Ujednolicanie niespójnych kategorii
  4. Walidacja schematu i asercje
← Powrót do Pandas & NumPy Academy