1.3 Vizualizarea datelor cu Matplotlib și Seaborn
Un grafic bun îți spune ce model să alegi, ce coloane contează și unde sunt valorile aberante. Programa cere șase tipuri de grafice plus interpretarea lor.
Teorie
Setup și anatomia unui grafic
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.read_csv("train.csv")
plt.figure(figsize=(8, 5)) # dimensiunea figurii
# ... desenul propriu-zis ...
plt.title("Titlu")
plt.xlabel("axa X"); plt.ylabel("axa Y")
plt.legend()
plt.show()
Grafice liniare — evoluții în timp
plt.plot(df["ziua"], df["temperatura"], label="temperatura")
plt.plot(df["ziua"], df["umiditate"], label="umiditate")
Interpretare: trend (crește/scade), sezonalitate (tipar repetitiv), salturi bruște (posibile erori de măsurare).
Grafice cu bare — comparații între categorii
medii = df.groupby("oras")["pret"].mean().sort_values()
plt.bar(medii.index, medii.values)
# sau: sns.barplot(data=df, x="oras", y="pret")
Interpretare: compară niveluri între categorii. Sortarea barelor face diferențele evidente dintr-o privire.
Histograme — distribuția unei variabile
plt.hist(df["pret"], bins=30)
# sau: sns.histplot(df["pret"], kde=True)
Interpretare: formă simetrică sau asimetrică (coadă lungă → ia în calcul logaritmarea), una sau mai multe „cocoașe" (mai multe grupuri în date), valori extreme izolate.
Scatter plot — relația dintre două variabile
plt.scatter(df["suprafata"], df["pret"], alpha=0.5)
# sau: sns.scatterplot(data=df, x="suprafata", y="pret", hue="oras")
Interpretare: nor în formă de linie → relație liniară (candidat pentru regresie
liniară); curbă → relație neliniară; nor difuz → variabile slab corelate. Parametrul
hue colorează după o a treia variabilă.
Box plot — mediană, cuartile, valori aberante
sns.boxplot(data=df, x="oras", y="pret")
Interpretare: linia din mijloc este mediana, cutia acoperă 50% din valori (Q1–Q3), punctele izolate sunt outlieri. Ideal pentru a compara distribuții între grupuri și a găsi valori suspecte.
Heatmap — matricea de corelație
corr = df.select_dtypes("number").corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm")
Interpretare: valori aproape de +1/−1 → legătură puternică (bun predictor sau coloană redundantă); aproape de 0 → legătură liniară slabă. Caută coloanele puternic corelate cu ținta — acelea sunt feature-urile importante.
Problemă rezolvată: explorarea unui set de date
Înainte de a prezice prețul unei case (vezi problema din lecția 2.1), explorăm datele vizual și decidem strategia.
Codul de explorare
import pandas as pd, seaborn as sns, matplotlib.pyplot as plt
df = pd.read_csv("train_data.csv")
fig, ax = plt.subplots(2, 2, figsize=(12, 9))
# 1. distribuția țintei
ax[0][0].hist(df["pret"], bins=30)
ax[0][0].set_title("Distribuția prețului")
# 2. corelații cu ținta
corr = df.select_dtypes("number").corr()
sns.heatmap(corr, annot=True, fmt=".2f", ax=ax[0][1])
# 3. cel mai corelat feature vs țintă
ax[1][0].scatter(df["suprafata"], df["pret"], alpha=0.4)
ax[1][0].set_title("Suprafață vs preț")
# 4. outlieri pe categorii
sns.boxplot(data=df, x="zona", y="pret", ax=ax[1][1])
plt.tight_layout(); plt.show()
Concluziile tipice: preț cu coadă lungă → logaritmăm ținta; suprafața corelată 0.8 cu prețul → feature principal; outlieri evidenți în boxplot → îi tratăm la curățare.
Probleme propuse
Pentru fiecare tip de grafic din lecție, scrie într-o propoziție ce întrebare despre date poate primi răspuns cu el. Apoi verifică-te cu secțiunile de interpretare.
Încarcă datasetul Iris (sns.load_dataset("iris")) și construiește: histograma
fiecărei caracteristici, scatter petal_length vs petal_width colorat pe
specii și heatmap-ul corelațiilor. Ce pereche de caracteristici separă cel mai bine speciile?
Generează 200 de valori normale și adaugă 5 valori aberante. Arată că boxplot-ul le scoate la iveală, apoi elimină-le cu regula IQR (sub Q1 − 1.5·IQR sau peste Q3 + 1.5·IQR).
Descarcă datele oricărei probleme tabelare de pe platformă și scrie un notebook de explorare cu cele 4 grafice din problema rezolvată + 3 concluzii în cuvinte.