0Pricing
Pandas & NumPy Academy · Lekcja

Analiza dwu- i korelacyjna

Badaj zależności między parami kolumn za pomocą wykresów punktowych, pudełkowych i mapy cieplnej korelacji.

Analiza dwu- i korelacyjna to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 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.

Od jednej zmiennej do dwóch

Analiza dwuwymiarowa bada zależność między dokładnie dwiema kolumnami naraz. Po przeanalizowaniu każdej kolumny osobno (analiza jednowymiarowa) pojawia się pytanie: jak te dwie zmienne są ze sobą powiązane? Metoda analizy zależy od kombinacji typów zmiennych: numeryczna i numeryczna (wykres rozrzutu i korelacja), kategoryczna i numeryczna (wykres pudełkowy lub skrzypcowy) albo kategoryczna i kategoryczna (tabela krzyżowa i test chi-kwadrat). Każda kombinacja wymaga innej techniki.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Relationship types present in the dataset
print('Numeric columns:', df.select_dtypes('number').columns.tolist())
print('Categorical columns:', df.select_dtypes('object').columns.tolist())
print('Boolean columns:', df.select_dtypes('bool').columns.tolist())

Numeryczna i numeryczna: wykres rozrzutu

W przypadku dwóch zmiennych numerycznych podstawowym narzędziem analizy dwuwymiarowej jest wykres rozrzutu. Przedstawia on każdą obserwację jako punkt o współrzędnych (x, y), pokazując kierunek, siłę i postać zależności. Zawsze należy obejrzeć wykres przed obliczeniem współczynnika korelacji — korelacja równa 0 może nadal wskazywać silną nieliniową (krzywoliniową) zależność, której współczynnik nie wykrywa.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

sns.scatterplot(data=df, x='age', y='fare', alpha=0.4)
plt.title('Age vs. Fare — Is There a Linear Relationship?')
plt.xlabel('Age')
plt.ylabel('Fare ($)')
plt.show()

Współczynnik korelacji Pearsona

Współczynnik Pearsona r określa siłę i kierunek liniowej zależności między dwiema zmiennymi numerycznymi. Można go obliczyć za pomocą df[['col1', 'col2']].corr() lub scipy.stats.pearsonr(x, y), które zwraca także wartość p do testowania istotności. Wartość r zawsze należy analizować razem z wykresem rozrzutu — wysoka wartość r może wynikać z kilku wartości odstających, a ta sama wartość r może opisywać zupełnie różne kształty wykresu rozrzutu (słynny kwartet Anscombe'a dobrze to ilustruje).

import pandas as pd
import seaborn as sns
from scipy import stats

df = sns.load_dataset('titanic').dropna(subset=['age', 'fare'])

# Pearson correlation
r, p = stats.pearsonr(df['age'], df['fare'])
print(f'Pearson r = {r:.3f}, p-value = {p:.4f}')

# Spearman for robustness check
rho, p_sp = stats.spearmanr(df['age'], df['fare'])
print(f'Spearman rho = {rho:.3f}, p-value = {p_sp:.4f}')

Kategoryczna i numeryczna: wykresy pudełkowe i skrzypcowe

Gdy jedna zmienna jest kategoryczna, a druga numeryczna, pytanie brzmi: czy rozkład wartości numerycznych różni się między kategoriami? Do porównania należy użyć wykresu pudełkowego lub wykresu skrzypcowego. Na przykład: czy status przeżycia wpływa na zapłaconą cenę biletu? Czy klasa pasażera wpływa na wiek? Wykresy te natychmiast pokazują, czy przynależność do kategorii wiąże się z wyższymi lub niższymi wartościami zmiennej numerycznej.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

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

sns.boxplot(data=df, x='class', y='fare',
            order=['First', 'Second', 'Third'], ax=axes[0])
axes[0].set_title('Fare by Passenger Class')

sns.violinplot(data=df, x='survived', y='age',
               inner='quartile', ax=axes[1])
axes[1].set_title('Age Distribution by Survival')

plt.tight_layout()
plt.show()

Statystyki GroupBy dla zmiennej kategorycznej i numerycznej

Wizualne porównanie należy uzupełnić numerycznymi statystykami grup za pomocą groupby. Dla każdej kategorii proszę obliczyć średnią, medianę i liczebność, aby określić różnice widoczne na wykresach. Należy zwrócić uwagę na kategorie, w których średnia i mediana znacznie się różnią (co wskazuje na wartości odstające w obrębie grupy), oraz sprawdzić, czy liczebności grup są zrównoważone — bardzo małe grupy (<5 obserwacji) sprawiają, że porównania są niewiarygodne.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

stats = df.groupby('class')['fare'].agg(['mean', 'median', 'std', 'count'])
stats.columns = ['Mean Fare', 'Median Fare', 'Std Fare', 'Count']
print(stats.round(2))

print('\nSurvival rate by class:')
print(df.groupby('class')['survived'].mean().round(3))

Kategoryczna i kategoryczna: tabele krzyżowe

W przypadku dwóch zmiennych kategorycznych należy użyć pd.crosstab(df['var1'], df['var2']), aby utworzyć tabelę częstości pokazującą, ile obserwacji przypada na każdą kombinację kategorii. Tabelę można normalizować według wierszy lub kolumn za pomocą normalize='index' lub normalize='columns', aby uzyskać proporcje zamiast liczebności. Stanowi to podstawę do badania, czy dwie zmienne kategoryczne są niezależne, czy też powiązane.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Frequency table
counts = pd.crosstab(df['class'], df['survived'])
counts.columns = ['Died', 'Survived']
print('Counts:')
print(counts)

# Row-normalised proportions (survival rate per class)
props = pd.crosstab(df['class'], df['survived'], normalize='index')
props.columns = ['Died', 'Survived']
print('\nSurvival Rate per Class:')
print(props.round(3))

Wizualizacja tabel krzyżowych jako map cieplnych

Tabelę krzyżową można przekształcić w mapę cieplną, aby natychmiast wizualnie porównać częstości w komórkach. Jest ona łatwiejsza do szybkiego przejrzenia niż wydrukowana tabela, gdy występuje wiele kombinacji kategorii. Każdą komórkę należy opisać jej wartością za pomocą annot=True i wybrać sekwencyjną mapę kolorów (np. 'YlOrRd'), ponieważ wszystkie wartości są nieujemne. Mapy cieplne proporcji znormalizowanych według wierszy skutecznie pokazują rozkład warunkowy jednej kategorii przy założeniu innej.

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

df = sns.load_dataset('titanic')
props = pd.crosstab(df['class'], df['sex'], normalize='index')

sns.heatmap(props, annot=True, fmt='.2f', cmap='YlOrRd')
plt.title('Gender Mix by Passenger Class (Row %)')
plt.xlabel('Sex')
plt.ylabel('Class')
plt.show()

Test niezależności chi-kwadrat

Test niezależności chi-kwadrat sprawdza, czy dwie zmienne kategoryczne są statystycznie niezależne. scipy.stats.chi2_contingency(crosstab) zwraca statystykę chi-kwadrat, wartość p, liczbę stopni swobody oraz częstości oczekiwane. Mała wartość p (zwykle < 0.05) oznacza statystycznie istotną zależność między dwiema zmiennymi — rozkład jednej zmiennej zmienia się systematycznie wraz z drugą.

import pandas as pd
import seaborn as sns
from scipy.stats import chi2_contingency

df = sns.load_dataset('titanic')

# Test if passenger class and survival are independent
crosstab = pd.crosstab(df['class'], df['survived'])
chi2, p, dof, expected = chi2_contingency(crosstab)

print(f'Chi-squared: {chi2:.2f}')
print(f'P-value: {p:.6f}')
print(f'Degrees of freedom: {dof}')
print(f'\nConclusion: {"Significant association" if p < 0.05 else "No significant association"}')

Pełna macierz korelacji dla kolumn numerycznych

Zamiast analizować pary pojedynczo, należy obliczyć pełną macierz korelacji dla wszystkich kolumn numerycznych i przedstawić ją jako mapę cieplną. Umożliwia to jednoczesne wykrycie silnie skorelowanych par zmiennych. Wysokie korelacje między niezależnymi cechami (współliniowość) mogą powodować problemy w modelach regresji — wczesna wiedza o nich pozwala usunąć lub połączyć nadmiarowe cechy przed modelowaniem.

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

df = sns.load_dataset('titanic')
corr = df.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
            cmap='coolwarm', vmin=-1, vmax=1,
            linewidths=0.5, square=True)
plt.title('Correlation Matrix — Titanic Numeric Columns')
plt.tight_layout()
plt.show()

Interakcje między podgrupami

Czasami zależność między dwiema zmiennymi znacznie różni się w poszczególnych podgrupach — jest to zjawisko znane jako paradoks Simpsona. Na przykład korelacja między wiekiem a ceną biletu może być dodatnia wśród pasażerów pierwszej klasy, ale ujemna wśród pasażerów trzeciej klasy. Analizę dwuwymiarową należy zawsze segmentować według kluczowych zmiennych kategorialnych (używając hue w Seaborn lub osobnych agregacji groupby), aby sprawdzić, czy zależność jest spójna, czy odwraca się w poszczególnych podgrupach.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

# Scatter coloured by passenger class
sns.scatterplot(
    data=df.dropna(subset=['age', 'fare']),
    x='age',
    y='fare',
    hue='class',
    alpha=0.5,
    palette='deep'
)
plt.title('Age vs Fare — Does Class Change the Relationship?')
plt.legend(title='Class')
plt.yscale('log')  # log scale due to fare skewness
plt.show()

Dokumentowanie wyników analizy dwuwymiarowej

Po zakończeniu analizy dwuwymiarowej należy udokumentować najważniejsze ustalenia: które pary cech są skorelowane (i jak silnie), czy zmienne kategorialne wskazują istotne różnice między grupami w wartościach liczbowych oraz czy występują interakcje lub paradoksy między podgrupami. Wnioski te powinny wpływać na decyzje dotyczące wyboru cech — w przypadku silnie skorelowanych par cech może być konieczne usunięcie jednej z nich, a silne predyktory kategorialne zmiennej docelowej należy oznaczyć jako dane wejściowe o wysokim priorytecie na potrzeby modelowania.

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat analizy dwuwymiarowej i analizy korelacji z tego урокu.

Podsumowanie lekcji

W tej lekcji poznali Państwo: wykresy rozrzutu i współczynnik r Pearsona służą do analizowania zależności liczbowo-liczbowych, wykresy pudełkowe/skrzyńcowe i groupby umożliwiają porównywanie zmiennych liczbowych między kategoriami, a tabele krzyżowe z testami chi-kwadrat mierzą zależność między zmiennymi kategorialnymi. Następnie omówimy sposób zebrania wyników EDA w ustrukturyzowanym raporcie podsumowującym.

Często zadawane pytania

Czy lekcja „Analiza dwu- i korelacyjna” jest bezpłatna?

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

Badaj zależności między parami kolumn za pomocą wykresów punktowych, pudełkowych i mapy cieplnej korelacji. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Analiza dwu- i korelacyjna”?

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