Pandas & NumPy Academy · Lekcja

Analiza jednowymiarowa

Analizuj każdą kolumnę niezależnie: twórz wykresy rozkładów dla danych liczbowych i liczności wartości dla danych kategorycznych, zwracając uwagę na wartości odstające i skośność.

Lekcja 2 z 413 kroki

Analiza jednowymiarowa 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 analiza jednowymiarowa?

Analiza jednowymiarowa bada jedną kolumnę naraz, w izolacji, pomijając zależności między kolumnami. Jej celem jest zrozumienie rozkładu każdej zmiennej, wykrycie wartości odstających, identyfikacja skośności oraz znalezienie problemów z jakością danych przed rozpoczęciem modelowania. Analiza jednowymiarowa przebiega inaczej dla kolumn numerycznych i kategorycznych — dla numerycznych potrzebne są wykresy rozkładu i statystyki podsumowujące, a dla kategorycznych — liczebności i proporcje kategorii.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()

print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)

Histogramy dla kolumn numerycznych

Należy utworzyć histogram dla każdej kolumny numerycznej, aby zobaczyć kształt jej rozkładu. Proszę zwrócić uwagę na symetrię i skośność (ogon po jednej stronie), modalność (jeden szczyt lub kilka) oraz oczywiste anomalia (wartości na skrajnych końcach, które wydają się nieprawdopodobne). W Pandas funkcja df.hist() szybko tworzy siatkę histogramów dla wielu kolumn bez konieczności pisania pętli, natomiast funkcja Seaborn histplot zapewnia większą kontrolę w przypadku pojedynczych kolumn.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()

Statystyki podsumowujące dla kolumn numerycznych

Dla każdej kolumny numerycznej należy obliczyć i porównać średnią z medianą. Gdy średnia jest znacznie większa od mediany, rozkład jest prawoskośny (ma długi prawy ogon, co często występuje w danych o dochodach i cenach). Gdy średnia jest mniejsza od mediany, rozkład jest lewoskośny. Należy także sprawdzić odchylenie standardowe w odniesieniu do średniej: odchylenie standardowe większe od średniej dla zmiennej nieujemnej wskazuje na dużą zmienność lub wartości odstające. Skośność można obliczyć bezpośrednio za pomocą df.skew().

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

summary = pd.DataFrame({
    'mean': numeric.mean(),
    'median': numeric.median(),
    'std': numeric.std(),
    'skewness': numeric.skew(),
    'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)

print(summary)

Wykresy pudełkowe do wykrywania wartości odstających

Wykresy pudełkowe są najszybszym narzędziem wizualnym do wykrywania wartości odstających w kolumnach numerycznych. Każdy punkt poza wąsami (w odległości większej niż 1.5×IQR od Q1 lub Q3) jest nanoszony osobno i oznaczany jako potencjalna wartość odstająca. Kolumna z wieloma takimi punktami wymaga zbadania: czy są to błędy wprowadzania danych, uzasadnione wartości skrajne, czy też oznaka rozkładu nienormalnego? Wykresy pudełkowe pokazują również prawą lub lewą skośność dzięki asymetrycznemu położeniu mediany wewnątrz pudełka.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 3, figsize=(14, 5))

for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
    df[[col]].boxplot(ax=ax)
    ax.set_title(f'Box Plot: {col}')

plt.tight_layout()
plt.show()

Liczebność wartości odstających na podstawie IQR

Metoda IQR (rozstępu międzykwartylowego) definiuje wartości odstające jako wartości mniejsze niż Q1 - 1.5×IQR lub większe niż Q3 + 1.5×IQR. Można obliczyć je programowo, aby zliczyć i przeanalizować wartości odstające w każdej kolumnie numerycznej bez tworzenia wykresów. Jest to przydatne w automatycznych potokach, w których trzeba rejestrować liczby anomalii zamiast generować wykresy. Decyzja dotycząca postępowania z wartościami odstającymi — usunąć je, ograniczyć czy oznaczyć — powinna być świadoma i oparta na wiedzy dziedzinowej.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1

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

outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])

Liczebności wartości w kolumnach kategorycznych

Dla każdej kolumny kategorycznej należy wywołać value_counts(), aby zobaczyć rozkład obserwacji między kategoriami. Zawsze proszę sprawdzić: czy jedna kategoria dominuje (>80%)? Powoduje to niezrównoważenie klas w zadaniach klasyfikacyjnych. Czy występują rzadkie kategorie mające tylko 1–2 obserwacje (literówki lub błędy wprowadzania danych)? Czy rozkład odpowiada oczekiwaniom biznesowym (np. czy kolumna „country” pokazuje większość zamówień z nieoczekiwanego kraju)?

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

for col in ['sex', 'embarked', 'class', 'who']:
    counts = df[col].value_counts(dropna=False)
    pct = (counts / len(df) * 100).round(1)
    result = pd.DataFrame({'count': counts, 'pct%': pct})
    print(f'\n--- {col} ---')
    print(result)

Wykresy słupkowe dla zmiennych kategorycznych

Liczebności wartości kategorycznych można wizualizować jako wykresy słupkowe za pomocą sns.countplot lub przez wywołanie value_counts().plot(kind='bar'). Należy posortować słupki od najczęstszych do najrzadszych, aby odbiorca od razu zobaczył dominujące kategorie. W przypadku zmiennych binarnych (tak/nie, mężczyzna/kobieta) można użyć wykresu kołowego — jednak dla więcej niż 3 kategorii wykresy słupkowe są zawsze czytelniejsze. Gdy nazwy kategorii są długie, etykiety znaczników należy obrócić o 45 stopni.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')

sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')

plt.tight_layout()
plt.show()

Wykrywanie skośności i stosowanie transformacji

Silnie prawoskośne kolumny numeryczne (skośność > 1.5) często korzystają z zastosowania transformacji logarytmicznej, która czyni je bardziej symetrycznymi. Jest to ważne w przypadku wielu testów statystycznych i niektórych algorytmów ML zakładających normalność. Należy zastosować np.log1p() (log(x+1), bezpieczne dla wartości bliskich zeru), a następnie ponownie sprawdzić skośność. Proszę porównać histogramy przed transformacją i po niej, aby potwierdzić, że rozkład stał się bardziej zbliżony do dzwonowego.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(10, 4))

sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')

log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')

plt.tight_layout()
plt.show()

Sprawdzanie kolumn o zerowej wariancji

Kolumna o zerowej wariancji (wszystkie wartości są identyczne) nie dostarcza żadnych informacji modelowi i powinna zostać usunięta. Kolumna o wariancji bliskiej zeru (99% wierszy ma tę samą wartość) jest podobnie bezużyteczna. Wariancję należy obliczyć za pomocą df.var() i odfiltrować odpowiednie kolumny. Należy także sprawdzić kolumny, dla których nunique() == len(df) — są to prawdopodobnie kolumny ID, których nie należy używać jako cech, ale które mogą być przydatne jako identyfikatory wierszy.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)

# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)

# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)

Automatyzacja analizy jednowymiarowej za pomocą pętli

Zamiast ręcznie powtarzać tę samą analizę dla każdej kolumny, proszę napisać pętlę iterującą po wszystkich kolumnach numerycznych i wyświetlającą kluczowe statystyki w uporządkowanym formacie. Ułatwia to szybkie przejrzenie dziesiątek kolumn i oznaczenie tych, które wymagają uwagi. Wynik można zapisać w pliku CSV jako część dziennika audytu potoku, który interesariusze mogą przejrzeć przed użyciem danych w modelowaniu.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

rows = []
for col in numeric.columns:
    s = df[col]
    Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
    IQR = Q3 - Q1
    n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
    rows.append({
        'column': col,
        'missing_pct': round(s.isna().mean() * 100, 1),
        'mean': round(s.mean(), 2),
        'std': round(s.std(), 2),
        'skew': round(s.skew(), 2),
        'outliers': int(n_outliers)
    })

report = pd.DataFrame(rows)
print(report.to_string(index=False))

Dokumentowanie ustaleń z analizy jednowymiarowej

Po zakończeniu analizy jednowymiarowej należy systematycznie udokumentować ustalenia. Dla każdej kolumny proszę zanotować: kształt rozkładu (skośny, bimodalny, w przybliżeniu normalny), odsetek brakujących wartości i planowaną strategię imputacji, liczbę wartości odstających i decyzję dotyczącą ich obsługi (ograniczyć, usunąć, oznaczyć), a także wszelkie podejrzane wartości wymagające wyjaśnienia dziedzinowego. Dokumentacja ta staje się dziennikiem jakości danych, który kieruje etapami czyszczenia i chroni decyzje przed zapomnieniem lub późniejszym kwestionowaniem.

Szybki test

Sprawdź swoją wiedzę na temat analizy jednowymiarowej z tej lekcji.

Podsumowanie lekcji

W tej lekcji poznali Państwo: histogramy ujawniające kształt rozkładu kolumn numerycznych, wykresy pudełkowe i regułę IQR służące do identyfikowania wartości odstających oraz funkcję value_counts ujawniającą częstość kategorii w kolumnach kategorycznych. Automatyzacja tych kontroli w pętli tworzy wielokrotnego użytku raport jakości. Następnie przejdziemy do analizy dwuwymiarowej i analizy korelacji — poznawania zależności między parami kolumn.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Analiza jednowymiarowa” jest bezpłatna?

Tak — pełny tekst „Analiza jednowymiarowa” 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 „Analiza jednowymiarowa”?

Analizuj każdą kolumnę niezależnie: twórz wykresy rozkładów dla danych liczbowych i liczności wartości dla danych kategorycznych, zwracając uwagę na wartości odstające i skośność. Ć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 „Analiza jednowymiarowa”?

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. Lista kontrolna profilowania zbioru danych
  2. Analiza jednowymiarowa
  3. Analiza dwu- i korelacyjna
  4. Podsumowywanie wyników w raporcie
← Powrót do Pandas & NumPy Academy