Python для аналітики даних: Matplotlib, Seaborn та візуалізація для співбесід
Практичний посібник з візуалізації даних у Python за допомогою Matplotlib і Seaborn. Графіки, стилізація, субплоти та поширені питання на співбесідах для аналітичних посад у 2026 році.

Візуалізація даних у Python залишається однією з навичок, що найчастіше перевіряються на співбесідах з аналітики даних. Рекрутери очікують від кандидатів здатності створювати чисті та зрозумілі графіки з необроблених даних, а також пояснювати свої дизайнерські рішення під тиском часу.
Цей посібник охоплює Matplotlib 3.10 та Seaborn 0.13 — дві бібліотеки, що домінують у технічних раундах рекрутингу на позиції аналітиків даних та дата-сайєнтистів. Кожен приклад коду працює безпосередньо з Python 3.12+.
Більшість співбесід з аналітики даних включають раунд живого кодування, під час якого кандидат повинен створити візуалізацію з набору даних менш ніж за 15 хвилин. Наведені нижче патерни безпосередньо відповідають таким вправам.
Налаштування середовища для візуалізації даних у Python
Перед написанням будь-якого коду візуалізації середовище потребує правильних залежностей. Чисте віртуальне середовище дозволяє уникнути конфліктів версій між Matplotlib, Seaborn та їхніми спільними основами NumPy і Pandas.
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpyШвидка перевірка підтверджує коректність встановлення:
# verify_install.py
import matplotlib
import seaborn as sns
import pandas as pd
print(f"Matplotlib: {matplotlib.__version__}")
print(f"Seaborn: {sns.__version__}")
print(f"Pandas: {pd.__version__}")Після фіксації залежностей наступний крок зосереджується на основах Matplotlib — фундаменті кожного графіку Seaborn.
Основи Matplotlib: Figure, Axes та об'єктно-орієнтований API
Matplotlib пропонує два API: стейт-машину pyplot та об'єктно-орієнтований (OO) інтерфейс. OO API забезпечує явний контроль над кожним елементом і є стандартом, що очікується у професійних кодових базах та на співбесідах.
# bar_chart_oo.py
import matplotlib.pyplot as plt
import numpy as np
# Приклад квартальних даних про доходи
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue = [42_000, 58_000, 51_000, 67_000]
# Явне створення figure та axes
fig, ax = plt.subplots(figsize=(8, 5))
# Малювання стовпців із визначеним кольором
ax.bar(quarters, revenue, color="#2563eb", width=0.5)
# Чіткі підписи осей — рекрутери це перевіряють
ax.set_xlabel("Quarter")
ax.set_ylabel("Revenue (USD)")
ax.set_title("Quarterly Revenue — 2025")
# Форматування осі Y з доларовими сумами
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
# Видалення верхньої та правої рамок для чистішого вигляду
ax.spines[["top", "right"]].set_visible(False)
plt.tight_layout()
plt.savefig("quarterly_revenue.png", dpi=150)
plt.show()Ключові деталі, на які звертають увагу рекрутери: явне створення fig, ax замість plt.plot(), читабельні підписи осей, відформатовані значення поділок та видалений візуальний шум (зайві рамки). Ці дрібні вибори сигналізують про виробниче мислення.
Побудова субплотів для порівняльного аналізу
Співбесіди часто вимагають порівняння кількох метрик поруч. Функція subplots() забезпечує це за допомогою сіткового компонування.
# subplots_comparison.py
import matplotlib.pyplot as plt
import numpy as np
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
users = [1200, 1350, 1500, 1420, 1680, 1820]
revenue = [24_000, 27_000, 30_000, 28_400, 33_600, 36_400]
# Два графіки поруч зі спільною віссю X
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), sharey=False)
# Лівий панель: зростання користувачів як лінійний графік
ax1.plot(months, users, marker="o", color="#2563eb", linewidth=2)
ax1.set_title("Monthly Active Users")
ax1.set_ylabel("Users")
ax1.spines[["top", "right"]].set_visible(False)
# Правий панель: доходи як стовпчастий графік
ax2.bar(months, revenue, color="#16a34a", width=0.5)
ax2.set_title("Monthly Revenue")
ax2.set_ylabel("Revenue (USD)")
ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax2.spines[["top", "right"]].set_visible(False)
fig.suptitle("Product Metrics — H1 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("product_metrics.png", dpi=150)
plt.show()Використання sharey=False дозволяє кожній панелі масштабуватися незалежно — доходи в доларах та користувачі як числа мають різні порядки величин. suptitle додає загальний заголовок над обома субплотами.
Кандидати часто використовують plt.plot() для всього замість об'єктно-орієнтованого API. Коли рекрутер просить додати другу вісь Y або скоригувати окремий субплот, підхід pyplot виявляється недостатнім. Завжди варто за замовчуванням обирати fig, ax = plt.subplots().
Статистичні графіки Seaborn: від розподілу до кореляції
Seaborn побудований на базі Matplotlib та спеціалізується на статистичній візуалізації. Там, де Matplotlib потребує ручного налаштування, Seaborn виводить розумні значення за замовчуванням зі структури даних.
Аналіз розподілу — одне з найпоширеніших завдань на співбесідах — потребує одного виклику функції:
# distribution_analysis.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Симуляція даних про зарплати для двох відділів
np.random.seed(42)
data = pd.DataFrame({
"salary": np.concatenate([
np.random.normal(75_000, 12_000, 200), # Engineering
np.random.normal(65_000, 10_000, 150), # Marketing
]),
"department": ["Engineering"] * 200 + ["Marketing"] * 150
})
# KDE-графік для порівняння розподілів зарплат
fig, ax = plt.subplots(figsize=(10, 5))
sns.kdeplot(
data=data,
x="salary",
hue="department", # Автоматичний поділ за категорією
fill=True, # Затінена область під кривою
alpha=0.4,
palette=["#2563eb", "#dc2626"],
ax=ax # Прив'язка до явних осей
)
ax.set_title("Salary Distribution by Department")
ax.set_xlabel("Annual Salary (USD)")
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)
plt.tight_layout()
plt.savefig("salary_distribution.png", dpi=150)
plt.show()Параметр hue автоматично розділяє дані, а fill=True робить зони перетину видимими. Цей патерн — групування розподілів за категоріями — з'являється майже на кожній аналітичній панелі співбесіди.
Готовий до співбесід з Data Analytics?
Практикуйся з нашими інтерактивними симуляторами, flashcards та технічними тестами.
Теплові карти Seaborn для кореляційних матриць
Кореляційні теплові карти виявляють зв'язки між числовими змінними з першого погляду. Рекрутери використовують їх для перевірки, чи можуть кандидати ідентифікувати мультиколінеарність або помітити сильні залежності ознак.
# correlation_heatmap.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Симуляція метрик електронної комерції
np.random.seed(42)
n = 500
page_views = np.random.poisson(15, n)
time_on_site = page_views * 2.5 + np.random.normal(0, 5, n)
cart_adds = np.random.binomial(page_views, 0.3)
purchases = np.random.binomial(cart_adds, 0.4)
df = pd.DataFrame({
"page_views": page_views,
"time_on_site": time_on_site,
"cart_adds": cart_adds,
"purchases": purchases
})
# Обчислення кореляції Пірсона
corr_matrix = df.corr()
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
corr_matrix,
annot=True, # Відображення значень кореляції в комірках
fmt=".2f", # Два десяткові знаки
cmap="RdBu_r", # Дивергентна колірна карта з центром на 0
vmin=-1, vmax=1, # Фіксований масштаб для послідовності
square=True, # Квадратні комірки
linewidths=0.5,
ax=ax
)
ax.set_title("E-commerce Metrics Correlation")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()Дивергентна колірна карта RdBu_r позначає позитивні кореляції синім, а негативні — червоним, що є конвенцією, яку очікують рекрутери. Встановлення vmin=-1 та vmax=1 забезпечує інтерпретованість кольорової шкали незалежно від фактичного діапазону даних.
Стилізація графіків для професійних презентацій
Необроблений вивід Matplotlib виглядає застарілим. Кілька рядків конфігурації перетворюють графіки на візуалізації презентаційної якості, що демонструють увагу до деталей під час співбесід.
# professional_styling.py
import matplotlib.pyplot as plt
import seaborn as sns
# Застосування вбудованої теми Seaborn
sns.set_theme(
style="whitegrid", # Чисте тло з лініями сітки
palette="muted", # Професійна колірна палітра
font_scale=1.1 # Трохи більший текст
)
# Глобальні перевизначення Matplotlib
plt.rcParams.update({
"figure.facecolor": "white",
"axes.facecolor": "white",
"font.family": "sans-serif",
"axes.titlesize": 14,
"axes.labelsize": 12,
})Застосування sns.set_theme() на початку скрипта поширює узгоджену стилізацію на всі наступні графіки. Під час співбесід це економить час, який інакше був би витрачений на форматування кожного графіка окремо.
Seaborn 0.13 визнав застарілими set_style() та set_palette() як окремі виклики. Уніфікована функція set_theme() замінює обидві. Старіші відповіді зі Stack Overflow досі посилаються на застарілий API — їх слід уникати на співбесідах у 2026 році.
Поширені питання зі співбесід з візуалізації даних
Окрім кодування, рекрутери перевіряють концептуальне розуміння найкращих практик візуалізації. Наведені нижче питання стабільно з'являються на співбесідах з аналітики даних та дата-сайєнс.
Коли слід використовувати стовпчастий графік замість лінійного? Стовпчасті графіки відображають порівняння між дискретними категоріями (відділи, типи продуктів, регіони). Лінійні графіки показують тренди в безперервних або впорядкованих інтервалах (часові ряди, послідовні вимірювання). Використання лінійного графіка для невпорядкованих категорій передбачає хибний зв'язок між сусідніми стовпцями.
Що робить графік оманливим? Обрізані осі Y, подвійні осі Y з різними масштабами, 3D-ефекти на 2D-даних та вибірково підібрані часові діапазони — все це спотворює сприйняття. Рішення: починати вісь Y з нуля для стовпчастих графіків, явно підписувати осі та уникати декоративних елементів, що приховують дані.
Як вибір колірної палітри впливає на інтерпретацію даних?
Послідовні палітри (від світлого до темного) підходять для впорядкованих даних, таких як температура чи доходи. Дивергентні палітри (два відтінки, що зустрічаються в нейтральному центрі) підкреслюють відхилення від середньої точки, наприклад прибуток/збиток або коефіцієнти кореляції. Категоріальні палітри використовують різні відтінки для непов'язаних груп. Палітри, безпечні для дальтоніків (такі як colorblind або muted у Seaborn), забезпечують доступність — деталь, що відрізняє досвідчених кандидатів.
Яка різниця між plt.show() та plt.savefig()?
plt.show() рендерить фігуру в інтерактивному вікні та очищує стан фігури після відображення. plt.savefig() записує фігуру у файл без її очищення. Виклик savefig() після show() створює порожній файл — поширена помилка. Правильний порядок: спочатку savefig(), потім show().
Комплексна вправа для співбесіди
Типове домашнє завдання або вправа з живого кодування поєднує завантаження даних, очищення та кілька типів графіків. Наступний приклад відтворює реальні завдання зі співбесід аналітичних команд.
# interview_exercise.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
sns.set_theme(style="whitegrid", palette="muted", font_scale=1.05)
# Симуляція 12 місяців продуктових даних
np.random.seed(42)
months = pd.date_range("2025-01", periods=12, freq="MS")
df = pd.DataFrame({
"month": months,
"revenue": np.cumsum(np.random.normal(5000, 2000, 12)) + 50_000,
"customers": np.cumsum(np.random.poisson(50, 12)) + 500,
"churn_rate": np.clip(np.random.normal(0.05, 0.015, 12), 0.01, 0.12)
})
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
# Панель 1: Тренд доходів
axes[0].plot(df["month"], df["revenue"], marker="o", color="#2563eb")
axes[0].set_title("Revenue Trend")
axes[0].set_ylabel("Revenue (USD)")
axes[0].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
axes[0].tick_params(axis="x", rotation=45)
axes[0].spines[["top", "right"]].set_visible(False)
# Панель 2: Зростання клієнтів
axes[1].bar(df["month"], df["customers"], color="#16a34a", width=20)
axes[1].set_title("Customer Growth")
axes[1].set_ylabel("Total Customers")
axes[1].tick_params(axis="x", rotation=45)
axes[1].spines[["top", "right"]].set_visible(False)
# Панель 3: Показник відтоку з пороговою лінією
axes[2].plot(df["month"], df["churn_rate"], marker="s", color="#dc2626")
axes[2].axhline(y=0.05, color="gray", linestyle="--", label="Target: 5%")
axes[2].set_title("Monthly Churn Rate")
axes[2].set_ylabel("Churn Rate")
axes[2].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"{x:.1%}"))
axes[2].tick_params(axis="x", rotation=45)
axes[2].spines[["top", "right"]].set_visible(False)
axes[2].legend()
fig.suptitle("Product Dashboard — FY 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("interview_dashboard.png", dpi=150)
plt.show()Ця вправа демонструє три типи графіків в уніфікованому компонуванні, правильне форматування осей, референсну лінію для цілей відтоку та послідовну стилізацію. Це саме ті елементи, які оцінюють рекрутери.
Висновок
- Об'єктно-орієнтований API Matplotlib (
fig, ax = plt.subplots()) забезпечує повний контроль і є очікуваним стандартом у професійних та рекрутингових середовищах - Параметр
hueSeaborn та вбудовані статистичні функції (KDE, теплові карти) обробляють груповий аналіз з мінімальною кількістю коду - Кореляційні теплові карти з дивергентними колірними картами та фіксованими масштабами (
vmin=-1, vmax=1) є невід'ємним елементом аналітичних співбесід - Завжди слід викликати
savefig()передshow(), щоб уникнути порожніх вихідних файлів - Чиста стилізація — видалені рамки, відформатовані підписи поділок, явні заголовки — сигналізує рекрутерам про мислення виробничого рівня
- Варто практикувати побудову багатопанельних дашбордів під тиском часу: більшість раундів живого кодування відводять 10-15 хвилин на завдання з візуалізації
Теги
Поділитися
Пов'язані статті

Топ-25 запитань на співбесіді з Data Analytics у 2026 році
Повний посібник з 25 найпоширеніших запитань на співбесідах для data analyst у 2026 році. SQL-запити, Python Pandas, статистика, Power BI та поведінкові запитання з модельними відповідями та кодом.

SQL для аналітиків даних: віконні функції, CTE та розширені запити
Повний посібник з віконних функцій SQL (ROW_NUMBER, RANK, LAG/LEAD), Common Table Expressions та розширених технік запитів, необхідних для співбесід аналітиків даних та повсякденної роботи.

Django 5.2: Власна Middleware та Обробка Сигналів для Технічних Співбесід
Повний посібник з Django 5.2: побудова власної middleware, використання сигналів post_save та pre_save, асинхронна middleware, користувацькі сигнали та типові питання для технічних співбесід з прикладами коду.