Learn AI with Python · Lekcja

Przepływ EDA i profilowanie danych

df.info(), df.describe(), audyt brakujących wartości, sprawdzanie typów danych i analiza krotności.

Lekcja 1 z 413 kroki

Przepływ EDA i profilowanie danych to bezpłatna lekcja Learn AI with Python na CoddyKit. To lekcja 1 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 Learn AI with Python, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn AI with Python zawiera 4 lekcji w sumie.

Czym jest eksploracyjna analiza danych

Eksploracyjna analiza danych (EDA) to pierwszy etap pracy z każdym zbiorem danych przed przystąpieniem do modelowania. Jej celem jest zrozumienie struktury danych, wykrycie problemów i wyrobienie sobie intuicji.

Uporządkowana checklista wstępnego przeglądu EDA odpowiada na pytania: Jak duży jest zbiór danych? Jakie typy mają kolumny? Gdzie występują brakujące wartości? Czy są duplikaty? Jak rozkładają się wartości?

  • Wcześnie wykrywać problemy z jakością danych
  • Określać, które cechy wymagają czyszczenia
  • Formułować hipotezy do późniejszego sprawdzenia

Wczytywanie danych

Wszystko zaczyna się od wczytania obiektu DataFrame i szybkiego rzutu oka za pomocą head() oraz shape.

shape zwraca krotkę (rows, columns), dzięki czemu od razu wiadomo, z jaką skalą danych mamy do czynienia.

import pandas as pd

df = pd.read_csv("customers.csv")
print(df.shape)        # (10000, 8)
print(df.head())       # first 5 rows

df.info() — typy i liczby wartości niepustych

df.info() to najbardziej użyteczna pojedyncza komenda na początek. Wyświetla nazwę każdej kolumny, jej dtype oraz liczbę wartości niepustych.

Jeśli kolumna liczbowa ma typ object, oznacza to problem (pozostały tekst, przecinki lub symbole walut). Jeśli liczby wartości niepustych różnią się między kolumnami, oznacza to obecność brakujących danych.

df.info()
# <class pandas.DataFrame>
# RangeIndex: 10000 entries
# age      9800 non-null  float64
# city     10000 non-null object
# income   9500 non-null  float64

df.describe() — podsumowanie danych liczbowych

df.describe() podaje wartości count, mean, std, min, kwartyle (25/50/75%) i max dla każdej kolumny liczbowej.

Warto zwrócić uwagę na sygnały ostrzegawcze: wartość min równą -1 w kolumnie dotyczącej wieku, wartość max znacznie wyższą od 75. percentyla (wartość odstająca) albo średnią wyraźnie różniącą się od mediany (skośność).

print(df.describe())
# Use include="all" to also summarize categorical columns
print(df.describe(include="all"))

df.isnull().sum() — zliczanie brakujących wartości

Połączenie isnull() z sum() zlicza brakujące wartości dla każdej kolumny. Dodanie kolejnego .sum() pozwala obliczyć sumę łączną.

Warto przeliczyć je na procenty, aby ocenić skalę problemu: kolumnę, w której brakuje 60% wartości, może opłacać się usunąć, natomiast brakujące 2% łatwo uzupełnić.

print(df.isnull().sum())

missing_pct = df.isnull().sum() / len(df) * 100
print(missing_pct.sort_values(ascending=False))

df.duplicated().sum() — wyszukiwanie zduplikowanych wierszy

df.duplicated() zwraca serię wartości logicznych oznaczających wiersze będące dokładnymi kopiami wcześniejszego wiersza. Zsumowanie jej wartości pozwala policzyć liczbę duplikatów.

Za pomocą subset można ograniczyć wyszukiwanie duplikatów do kluczowych kolumn — jest to przydatne, gdy wartość id powinna być unikalna.

print(df.duplicated().sum())            # exact duplicate rows
print(df.duplicated(subset=["id"]).sum()) # duplicate ids

df = df.drop_duplicates()

value_counts() — częstości kategorii

value_counts() zlicza, jak często każda unikalna wartość występuje w kolumnie. To podstawowe narzędzie do analizy danych kategorycznych.

Użycie normalize=True pozwala wyświetlić proporcje zamiast wartości bezwzględnych, a dropna=False uwzględnia w zestawieniu również brakujące wartości.

print(df["city"].value_counts())
print(df["city"].value_counts(normalize=True))
print(df["city"].value_counts(dropna=False))

Sprawdzanie kardynalności

Kardynalność to liczba różnych wartości w kolumnie, zwracana przez nunique().

  • Niska kardynalność (kilka kategorii) → dobry przypadek do kodowania one-hot.
  • Wysoka kardynalność (tysiące unikalnych ciągów znaków, np. identyfikatory użytkowników) → zwykle nie jest użyteczną cechą bez dodatkowego przetwarzania.
for col in df.select_dtypes("object").columns:
    print(col, "->", df[col].nunique(), "unique")

Wykrywanie kolumn stałych i przypominających identyfikatory

Podczas profilowania warto zwrócić uwagę na dwa skrajne przypadki:

  • Kolumny stałe (nunique() == 1) nie zawierają żadnych informacji — należy je usunąć.
  • Kolumny przypominające identyfikatory (nunique() == len(df)) mają unikalną wartość w każdym wierszu i w większości modeli nie dostarczają użytecznych informacji.
n = len(df)
for col in df.columns:
    u = df[col].nunique()
    if u == 1:
        print(col, "is constant")
    elif u == n:
        print(col, "is ID-like")

dtypes i zużycie pamięci

Warto sprawdzić df.dtypes, aby potwierdzić, że kolumny są przechowywane prawidłowo, oraz df.memory_usage(deep=True), aby znaleźć kolumny zajmujące dużo pamięci.

Zmniejszenie typów liczbowych i konwersja ciągów znaków o niskiej kardynalności na typ category może znacznie ograniczyć zużycie pamięci w przypadku dużych zbiorów danych.

print(df.dtypes)
print(df.memory_usage(deep=True))

df["city"] = df["city"].astype("category")

Uniwersalny fragment kodu do profilowania

Całą checklistę można zamknąć w jednej funkcji pomocniczej, aby każdy nowy zbiór danych przechodził taki sam wstępny przegląd.

Warto uruchamiać ją zaraz po wczytaniu dowolnego obiektu DataFrame, aby od razu wykryć jego rozmiar, typy danych, braki, duplikaty i kardynalność.

def profile(df):
    print("Shape:", df.shape)
    print(df.info())
    print("Missing:\n", df.isnull().sum())
    print("Dupes:", df.duplicated().sum())
    for c in df.select_dtypes("object"):
        print(c, df[c].nunique(), "unique")

profile(df)

Szybkie sprawdzenie: brakujące wartości

Potrzebują Państwo odsetka brakujących wartości w każdej kolumnie.

Podsumowanie: checklista wstępnego przeglądu EDA

Mają już Państwo powtarzalną procedurę rozpoczynania pracy z dowolnym zbiorem danych:

  • shape i head() do sprawdzania rozmiaru i podglądu danych
  • info() do sprawdzania typów danych i liczb wartości niepustych
  • describe() do podsumowania danych liczbowych i wyszukiwania oznak wartości odstających
  • isnull().sum() do sprawdzania brakujących wartości
  • duplicated().sum() do wyszukiwania zduplikowanych wierszy
  • value_counts() i nunique() do sprawdzania częstości kategorii i kardynalności

W następnym kroku przyjrzymy się pojedynczym kolumnom za pomocą analizy jednowymiarowej.

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
53
Lekcje
225

Często zadawane pytania

Czy lekcja „Przepływ EDA i profilowanie danych” jest bezpłatna?

Tak — pełny tekst „Przepływ EDA i profilowanie danych” 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 Learn AI with Python, przejdź na CoddyKit PRO. Kurs Learn AI with Python zawiera 4 lekcji w sumie.

Co nauczysz się w „Przepływ EDA i profilowanie danych”?

df.info(), df.describe(), audyt brakujących wartości, sprawdzanie typów danych i analiza krotności. Ćwiczysz Learn AI with Python 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ąć Learn AI with Python?

Nie wymagamy żadnego doświadczenia. Learn AI with Python 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 1 z 4.

Ile czasu zajmuje lekcja „Przepływ EDA i profilowanie danych”?

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 Learn AI with Python?

Tak. Każda lekcja Learn AI with Python 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. Przepływ EDA i profilowanie danych
  2. Analiza jednowymiarowa
  3. Analiza dwu- i wielowymiarowa
  4. Analiza rozkładu cech i zmiennej docelowej
← Powrót do Learn AI with Python