Mapy cieplne macierzy korelacji
Oblicz macierz korelacji za pomocą DataFrame.corr() i wizualizuj ją jako mapę cieplną z kodowaniem kolorami za pomocą sns.heatmap.
Mapy cieplne macierzy korelacji to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 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 macierz korelacji?
Macierz korelacji to kwadratowa tabela, w której element (i, j) zawiera współczynnik korelacji Pearsona między kolumną i a kolumną j. Wartości mieszczą się w zakresie od -1 (idealna ujemna korelacja liniowa) do +1 (idealna dodatnia), a 0 oznacza brak zależności liniowej. Na przekątnej zawsze znajduje się wartość 1 (zmienna jest doskonale skorelowana sama ze sobą). Macierze korelacji są pierwszym krokiem do zrozumienia, które zmienne zmieniają się wspólnie, przed zbudowaniem modelu.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Compute correlation matrix for numeric columns
tips = sns.load_dataset('tips')
corr = tips[['total_bill', 'tip', 'size']].corr()
print(corr.round(2))Obliczanie macierzy korelacji
Wywołaj DataFrame.corr(), aby obliczyć pary korelacji Pearsona dla wszystkich kolumn numerycznych. Parametr method określa rodzaj obliczanej korelacji: 'pearson' (domyślna, liniowa), 'spearman' (oparta na rangach, odporna na wartości odstające i nieliniowe zależności monotoniczne) lub 'kendall'. W przypadku skośnych danych finansowych lub danych zliczeniowych korelacja Spearmana często dostarcza więcej informacji niż korelacja Pearsona.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
numeric = tips.select_dtypes(include='number')
# Pearson vs Spearman
pearson = numeric.corr(method='pearson')
spearman = numeric.corr(method='spearman')
print('Pearson:')
print(pearson.round(2))
print('\nSpearman:')
print(spearman.round(2))Podstawowa mapa cieplna z sns.heatmap
sns.heatmap(data) przyjmuje tablicę dwuwymiarową lub DataFrame i renderuje ją jako siatkę kolorów — kolor każdej komórki koduje jej wartość liczbową. W przypadku macierzy korelacji ciepłe kolory (czerwony) zazwyczaj oznaczają korelację dodatnią, a chłodne kolory (niebieski) ujemną. Parametr annot=True wyświetla wartość liczbową wewnątrz każdej komórki, co jest niezbędne do dokładnego odczytywania mapy cieplnej korelacji.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
sns.heatmap(corr, annot=True, fmt='.2f')
plt.title('Correlation Heatmap — Tips Dataset')
plt.tight_layout()
plt.show()Wybór odpowiedniej mapy kolorów
W przypadku macierzy korelacji należy zawsze używać rozbieżnej mapy kolorów wyśrodkowanej na zerze: cmap='coolwarm', 'RdBu_r' lub 'vlag'. Mapy te używają jednego koloru dla wartości dodatnich, innego dla ujemnych oraz neutralnego środka dla zera. Należy unikać sekwencyjnych map kolorów (takich jak 'Blues') dla danych korelacyjnych, ponieważ uniemożliwiają one wizualne odróżnienie korelacji dodatnich od ujemnych. Ustaw vmin=-1, vmax=1, aby ograniczyć skalę kolorów do pełnego zakresu korelacji.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
sns.heatmap(
corr,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1,
vmax=1,
center=0
)
plt.title('Correlation Heatmap with Diverging Palette')
plt.tight_layout()
plt.show()Maskowanie górnego trójkąta
Ponieważ macierz korelacji jest symetryczna (corr[i,j] == corr[j,i]), wyświetlanie obu połówek jest zbędne. Użyj np.triu, aby utworzyć maskę górnego trójkąta, i przekaż ją do mask= w sns.heatmap. Zmniejsza to o połowę liczbę komórek, dzięki czemu wykres jest mniej przeładowany i łatwiejszy do odczytania. Można również zamaskować wartości na przekątnej (wszystkie równe 1.0), ponieważ nie niosą one żadnych informacji.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
# Mask the upper triangle (including diagonal)
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(
corr,
mask=mask,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1,
vmax=1
)
plt.title('Lower-Triangle Correlation Heatmap')
plt.tight_layout()
plt.show()Dostosowywanie adnotacji i rozmiaru komórek
Format adnotacji można kontrolować za pomocą fmt= (np. '.2f' dla dwóch miejsc po przecinku), a rozmiar czcionki za pomocą annot_kws={'size': 10}. Parametr linewidths dodaje cienkie linie między komórkami, ułatwiając odczyt dużych macierzy. Użyj square=True, aby wymusić kwadratowy kształt komórek niezależnie od wymiarów figury, co nadaje mapom cieplnym przejrzysty i zrównoważony wygląd.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Load a wider dataset for a more interesting heatmap
penguins = sns.load_dataset('penguins').select_dtypes('number')
corr = penguins.corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(
corr,
mask=mask,
annot=True,
fmt='.2f',
cmap='vlag',
vmin=-1,
vmax=1,
linewidths=0.5,
square=True,
annot_kws={'size': 10}
)
plt.title('Penguins Correlation Matrix')
plt.tight_layout()
plt.show()Grupowanie za pomocą clustermap
sns.clustermap() zmienia kolejność wierszy i kolumn za pomocą grupowania hierarchicznego, aby połączyć zmienne o podobnych wzorcach korelacji. Znacznie ułatwia to identyfikowanie bloków skorelowanych cech w dużych macierzach. Dendrogram na górnej i lewej osi pokazuje drzewo grupowania. Użyj method='ward' i metric='euclidean' jako rozsądnych wartości domyślnych dla grupowania opartego na korelacji.
import seaborn as sns
import matplotlib.pyplot as plt
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
sns.clustermap(
corr,
cmap='coolwarm',
vmin=-1,
vmax=1,
annot=True,
fmt='.2f',
figsize=(6, 6)
)
plt.suptitle('Clustered Correlation Matrix', y=1.02)
plt.show()Mapa cieplna danych z tabeli przestawnej
Mapy cieplne nie ograniczają się do macierzy korelacji — kodowanie kolorami przynosi korzyści w przypadku każdej dwuwymiarowej tabeli numerycznej. Często stosuje się wzorzec polegający na utworzeniu tabeli przestawnej (np. średniego napiwku według dnia i pory), a następnie zwizualizowaniu jej jako mapy cieplnej. Zamienia to gęstą tabelę liczb w łatwą do szybkiego przejrzenia siatkę kolorów, w której najwyższe i najniższe wartości są natychmiast widoczne.
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
tips = sns.load_dataset('tips')
# Pivot: average bill by day and time
pivot = tips.pivot_table(
values='total_bill',
index='day',
columns='time',
aggfunc='mean'
)
sns.heatmap(pivot, annot=True, fmt='.1f', cmap='YlOrRd')
plt.title('Average Bill by Day and Time')
plt.tight_layout()
plt.show()Interpretowanie wartości korelacji
Podczas interpretowania korelacji należy stosować następujące przybliżone przedziały: |r| < 0.2 = pomijalna, 0.2-0.4 = słaba, 0.4-0.6 = umiarkowana, 0.6-0.8 = silna, > 0.8 = bardzo silna. Korelacja nie mówi jednak nic o związku przyczynowym i może być pozorna (wynikać z przypadkowej współzależności spowodowanej trzecią zmienną zakłócającą). Analizę korelacji liczbowej należy zawsze uzupełniać wykresami punktowymi, aby sprawdzić, czy zależność rzeczywiście jest liniowa i nie wynika z wartości odstających.
import pandas as pd
import seaborn as sns
# Find the most correlated pairs
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
# Unstack to get pairs, remove self-correlations, sort
pairs = (corr
.unstack()
.reset_index()
.rename(columns={'level_0': 'var1', 'level_1': 'var2', 0: 'r'})
.query('var1 != var2')
.assign(abs_r=lambda df: df['r'].abs())
.sort_values('abs_r', ascending=False)
.drop_duplicates(subset='abs_r')
)
print(pairs.head(6).to_string(index=False))Mapy cieplne dużych zbiorów danych: wybieranie podzbiorów
W przypadku obiektów DataFrame z wieloma kolumnami pełna mapa cieplna korelacji staje się nieczytelna. Lepszym rozwiązaniem jest filtrowanie macierzy korelacji w celu pokazania tylko par, dla których |r| przekracza określony próg (np. 0.5), albo wybranie cech najsilniej skorelowanych ze zmienną docelową. Można również wybierać podzbiory według dziedziny — na przykład osobno przedstawiać korelacje między miarami finansowymi i operacyjnymi w biznesowym zbiorze danych.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Show only features with |r| > 0.4 with any other feature
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
# Filter columns that have at least one high correlation (excluding diagonal)
high_corr = (corr.abs() > 0.4).any(axis=1)
filtered = corr.loc[high_corr, high_corr]
mask = np.triu(np.ones_like(filtered, dtype=bool))
sns.heatmap(filtered, mask=mask, annot=True,
fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title('High-Correlation Subset')
plt.tight_layout()
plt.show()Zapisywanie map cieplnych do plików
Mapy cieplne często umieszcza się w raportach i prezentacjach. Po utworzeniu mapy cieplnej wywołaj plt.savefig('filename.png', dpi=150, bbox_inches='tight'), aby ją zapisać. Argument bbox_inches='tight' zapobiega obcinaniu etykiet osi. W raportach PDF użyj format='pdf'. W przypadku sns.clustermap figura jest przechowywana w zwróconym obiekcie: g = sns.clustermap(...); g.savefig('plot.png').
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
fig, ax = plt.subplots(figsize=(6, 5))
sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
cmap='coolwarm', vmin=-1, vmax=1,
linewidths=0.5, ax=ax)
ax.set_title('Correlation Heatmap')
# Save to file
plt.savefig('/tmp/correlation_heatmap.png', dpi=150, bbox_inches='tight')
plt.close()
print('Saved to /tmp/correlation_heatmap.png')Szybkie sprawdzenie
Sprawdź swoje zrozumienie map cieplnych korelacji z tego rozdziału.
Podsumowanie lekcji
W tej lekcji poznali Państwo: DataFrame.corr() oblicza korelacje parami, sns.heatmap renderuje je jako siatkę kolorów z rozbieżnymi mapami kolorów i adnotacjami, a maskowanie górnego trójkąta usuwa powtórzenia. Następnie zajmiemy się pełnym procesem eksploracyjnej analizy danych — systematyczną listą kontrolną do profilowania dowolnego nowego zbioru danych.
Często zadawane pytania
Czy lekcja „Mapy cieplne macierzy korelacji” jest bezpłatna?
Tak — pełny tekst „Mapy cieplne macierzy korelacji” 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 „Mapy cieplne macierzy korelacji”?
Oblicz macierz korelacji za pomocą DataFrame.corr() i wizualizuj ją jako mapę cieplną z kodowaniem kolorami za pomocą sns.heatmap. Ć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 4 z 4.
Ile czasu zajmuje lekcja „Mapy cieplne macierzy korelacji”?
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
- Wykresy rozkładu: histplot i kdeplot
- Wykresy kategoryczne: boxplot, barplot, violinplot
- Wykresy punktowe i wykresy par
- Mapy cieplne macierzy korelacji