Appearance
6. Облака точек (Скаттерплоты) и визуализация несбалансированных данных
Работа с точечными диаграммами через ax.scatter()
Инженерный смысл диаграмм рассеяния в машинном обучении
Если метод ax.plot() связывает точки непрерывной линией (что идеально подходит для упорядоченных временных рядов или эпох обучения), то для анализа распределения независимых объектов выборки в пространстве признаков применяется метод ax.scatter(x, y).
Диаграмма рассеяния (Scatter plot) отображает каждый объект датасета в виде изолированной дискретной точки на плоскости, где её координаты определяются значениями двух признаков x и y. В ИИ-инженерии это главный инструмент для визуального поиска кластеров, оценки линейной разделимости классов перед обучением классификаторов или анализа корреляций между фичами на этапе EDA.
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Feature X (e.g., house square meters) and Feature Y (e.g., price)
feature_x = [35, 45, 70, 110, 55]
feature_y = [120, 150, 280, 410, 190]
# Drawing a simple scatter plot layer with default markers
ax.scatter(feature_x, feature_y)
ax.grid(True)Управление перекрытием элементов (Overplotting)
Проблема несбалансированных выборок и мажоритарных классов
В реальных задачах ИИ датасеты практически всегда несбалансированы. Например, в задачах обнаружения мошенничества (Fraud Detection) или спама 99% строк таблицы представляют собой нормальные транзакции (мажоритарный класс), и лишь 1% — целевые аномалии (миноритарный класс).
Если визуализировать такое пространство признаков стандартным вызовом ax.scatter(), возникнет эффект Overplotting (перекрытие данных). Плотное облако из тысяч точек нормального класса физически закроет собой редкие точки аномалий. В результате на графике миноритарный класс просто «потонет», и инженер не сможет оценить его распределение.
Инструменты управления слоями: alpha, s и zorder
Для выведения редких и важных объектов на передний план в методе ax.scatter() используются три ключевых параметра визуального кодирования:
alpha(прозрачность от0.0до1.0): Делает точки мажоритарного класса полупрозрачными. В местах высокой концентрации данные будут выглядеть насыщенно, а в местах разрежения — прозрачно, открывая обзор на скрытые под ними элементы.s(размер маркеров в пикселях): Позволяет сделать точки редкого класса крупнее, а точки частого класса — уменьшить до размера микроскопических пикселей (s=1), чтобы они не загромождали холст.zorder(порядок отрисовки слоев): Строгий физический контракт Matplotlib. Чем выше числоzorder(по умолчанию2), тем ближе к зрителю находится слой. Вызов мажоритарного класса с параметромzorder=2, а поверх него миноритарного класса сzorder=3гарантирует, что редкие точки будут нарисованы поверх частых.
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Drawing a dense majority class layer at the bottom layer level (zorder=2)
ax.scatter(x_normal, y_normal, alpha=0.2, s=5, color="blue", zorder=2, label="Normal")
# Drawing a rare minority class layer strictly on top of the majority (zorder=3)
ax.scatter(x_anomaly, y_anomaly, alpha=1.0, s=25, color="red", zorder=3, label="Anomaly")
ax.legend()
ax.grid(True)Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Построение базовой диаграммы рассеяния
Задача: Даны координаты признаков пяти объектов выборки: x_metric = [1, 2, 3, 4, 5] и y_metric = [10, 14, 12, 19, 22]. Инициализируйте холст и осей через ООП-подход, постройте скаттерплот и включите координатную сетку.
Посмотреть решение
python
import matplotlib.pyplot
x_metric = [1, 2, 3, 4, 5]
y_metric = [10, 14, 12, 19, 22]
# Standard OOP scatter plotting architecture execution
fig, ax = matplotlib.pyplot.subplots()
ax.scatter(x_metric, y_metric)
ax.grid(True)2. Кастомизация размера и цвета маркеров точек
Задача: На основе данных из предыдущего упражнения постройте скаттерплот, сделав все точки зеленого цвета ("green"), увеличив их физический размер до 80 пикселей с помощью параметра s=80.
Посмотреть решение
python
import matplotlib.pyplot
x_metric = [1, 2, 3, 4, 5]
y_metric = [10, 14, 12, 19, 22]
fig, ax = matplotlib.pyplot.subplots()
# Applying custom dot sizes and colors criteria parameters
ax.scatter(x_metric, y_metric, color="green", s=80)
ax.grid(True)3. Борьба с перекрытием через прозрачность alpha
Задача: Сгенерируйте скаттерплот по координатам x_data = [1, 1.1, 1.2, 2], y_data = [5, 5.1, 5.2, 6]. Задайте точкам красный цвет ("red") и установите высокий уровень прозрачности alpha=0.3, чтобы места наложения точек были отчетливо видны.
Посмотреть решение
python
import matplotlib.pyplot
x_data = [1, 1.1, 1.2, 2]
y_data = [5, 5.1, 5.2, 6]
fig, ax = matplotlib.pyplot.subplots()
# Blending points transparency using the alpha channel argument
ax.scatter(x_data, y_data, color="red", alpha=0.3, s=150)
ax.grid(True)4. Настройка жесткого порядка слоев через zorder
Задача: Нарисуйте на одной координатной сетке два скаттерплота. Первый (крупная черная точка): x=[2.0], y=[2.0], s=300. Второй (малая белая точка): x=[2.0], y=[2.0], s=50. Настройте параметр zorder так, чтобы черная точка гарантированно легла на нижний слой (zorder=2), а белая — нарисована строго поверх нее (zorder=3).
Посмотреть решение
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Enforcing strict rendering drawing sequence using zorder layers flags
ax.scatter([2.0], [2.0], color="black", s=300, zorder=2)
ax.scatter([2.0], [2.0], color="white", s=50, zorder=3)
ax.grid(True)5. Текстовое аннотирование осей скаттерплота
Задача: Постройте скаттерплот. Снабдите координатную зону текстовыми метаданными: добавьте главный заголовок "Dataset Feature Space Analysis", подпись горизонтальной оси X — "Feature: Length (cm)", подпись вертикальной оси Y — "Feature: Width (cm)".
Посмотреть решение
python
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
ax.scatter([1, 2, 3], [4, 5, 6])
# Injecting explicit metadata contexts into text description sub-nodes
ax.set_title("Dataset Feature Space Analysis")
ax.set_xlabel("Feature: Length (cm)")
ax.set_ylabel("Feature: Width (cm)")
ax.grid(True)Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Headless-рендеринг скаттерплота случайного распределения из NumPy
Задача: С помощью случайного генератора NumPy rng = numpy.random.default_rng(seed=42) сгенерируйте два независимых вектора по 500 элементов каждый из нормального распределения со средним 0.0 и отклонением 1.0 — x_noise и y_noise (Урок 17 модуля NumPy). Переведите Matplotlib в неинтерактивный режим работы без графического интерфейса (Урок 3 модуля Matplotlib). Создайте холст размером (8, 8) (Урок 2 модуля Matplotlib). Постройте точечную диаграмму рассеяния, сделав маркеры полупрозрачными alpha=0.4 и мелкими s=10 для борьбы с перекрытием (Урок 6 модуля Matplotlib). Добавьте подписи осей и сохраните полученное облако точек в файл "scatter_noise.png" (Урок 3 модуля Matplotlib).
Посмотреть решение
python
import numpy
import matplotlib
# Enforcing non-interactive headless backend execution profile (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot
# Generating independent stochastic tracking vectors (NumPy Lesson 17)
rng = numpy.random.default_rng(seed=42)
x_noise = rng.normal(loc=0.0, scale=1.0, size=500)
y_noise = rng.normal(loc=0.0, scale=1.0, size=500)
# Initializing geometric canvas configuration constraints (Matplotlib Lesson 2)
fig, ax = matplotlib.pyplot.subplots(figsize=(8, 8))
# Drawing the point cloud layer mitigating overplotting risks (Matplotlib Lesson 6)
ax.scatter(x_noise, y_noise, color="teal", alpha=0.4, s=10)
ax.set_title("Stochastic Gaussian Features Space")
ax.set_xlabel("Latent Factor X")
ax.set_ylabel("Latent Factor Y")
ax.grid(True)
# Dumping buffer directly to files blocks storage (Matplotlib Lesson 3)
fig.savefig("scatter_noise.png")7. Визуализация несбалансированных классов ИИ-датасета из Parquet-файла
Задача: Загрузите табличные данные из файла "fraud_dataset.parquet" (Урок 8 модуля Pandas). С помощью булевой фильтрации через оператор .loc[] разделите выборку на две подтаблицы (Урок 6 модуля Pandas): мажоритарную df_normal (где "is_fraud" == 0) и миноритарную df_fraud (где "is_fraud" == 1). Настройте headless-режим (Урок 3 модуля Matplotlib). Нарисуйте их облака точек на одной координатной сетке по осям признаков "v1" (ось X) и "v2" (ось Y). Для нормального класса задайте параметры: цвет серый ("gray"), размер мелкий s=5, высокая прозрачность alpha=0.15 и нижний слой zorder=2. Для мошеннических транзакций задайте: цвет красный ("red"), размер крупный s=30, полная непрозрачность alpha=1.0 и верхний слой zorder=3 (Урок 6 модуля Matplotlib). Добавьте легенду и сохраните график в "fraud_visualization.png".
Посмотреть решение
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
# Loading tabular parquet file database logs from disk (Pandas Lesson 8)
fraud_df = pandas.read_parquet(path="fraud_dataset.parquet")
# Segmenting rows collections into independent classes frames (Pandas Lesson 6)
df_normal = fraud_df.loc[fraud_df["is_fraud"] == 0, :]
df_fraud = fraud_df.loc[fraud_df["is_fraud"] == 1, :]
fig, ax = matplotlib.pyplot.subplots(figsize=(9, 7))
# Layering unbalanced datasets separating targets with zorder and alpha controls (Matplotlib Lesson 6)
ax.scatter(df_normal["v1"], df_normal["v2"], color="gray", alpha=0.15, s=5, zorder=2, label="Normal Transaction")
ax.scatter(df_fraud["v1"], df_fraud["v2"], color="red", alpha=1.0, s=30, zorder=3, label="Fraudulent Alert")
ax.set_title("Credit Card Fraud Anomaly Detection Space")
ax.set_xlabel("Anonymized Feature V1")
ax.set_ylabel("Anonymized Feature V2")
ax.legend()
ax.grid(True)
fig.savefig("fraud_visualization.png")8. Скаттерплот отфильтрованных по маске фичей из CSV-файла после очистки NaN
Задача: Загрузите текстовый файл "telemetry.csv", ограничив чтение столбцами ["speed", "consumption"] через параметр usecols (Урок 8 модуля Pandas). Проверьте таблицу на наличие пустот и заполните все скрытые пропуски NaN вычисленным средним арифметическим значением этого столбца на месте (Урок 9 / Урок 5 модуля Pandas). Переведите Matplotlib в неинтерактивный режим (Урок 3). Постройте скаттерплот признака "consumption" (ось Y) от "speed" (ось X) (Урок 6 модуля Matplotlib). Проведите горизонтальный маркер критического порога расхода топлива y=15.0 синим пунктиром через метод ax.axhline() (Урок 4 модуля Matplotlib). Выведите результат в файл "telemetry_scatter.png".
Посмотреть restriction
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
# Optimized disk data ingestion (Pandas Lesson 8)
telemetry_df = pandas.read_csv(filepath_or_buffer="telemetry.csv", usecols=["speed", "consumption"])
# Computing average metrics and running filling imputation pipelines (Pandas Lessons 5 & 9)
consumption_mean = telemetry_df["consumption"].mean()
telemetry_df["consumption"].fillna(consumption_mean, inplace=True)
fig, ax = matplotlib.pyplot.subplots()
# Drawing the features spatial points cloud data layer (Matplotlib Lessons 2 & 6)
ax.scatter(telemetry_df["speed"], telemetry_df["consumption"], color="darkblue", alpha=0.5, label="Telemetry Nodes")
ax.set_title("Fuel Consumption Dependency Profile")
ax.set_xlabel("Vehicle Speed (km/h)")
ax.set_ylabel("Fuel Consumption (L/100km)")
# Drawing a reference threshold line (Matplotlib Lesson 4)
ax.axhline(y=15.0, color="blue", linestyle="--", label="Critical Consumption Threshold")
ax.legend()
ax.grid(True)
fig.savefig("telemetry_scatter.png")9. Скаттерплот подматрицы извлеченных строк и столбцов таблицы Pandas
Задача: Создайте 2D-матрицу из диапазона целых чисел от 0 до 11 через numpy.arange(12).reshape(4, 3) (Урок 3 / Урок 11 модуля NumPy). Оберните её в таблицу pandas.DataFrame с именами колонок ["f_1", "f_2", "f_3"] (Урок 5 модуля Pandas). С помощью универсального оператора двумерной адресации .loc[] извлеките подматрицу, содержащую первые три строки и первые два столбца ["f_1", "f_2"] (Урок 6 / Урок 7 модуля Pandas). В неинтерактивном headless-режиме постройте скаттерплот, где координатой X будут значения признака "f_1", а координатой Y — значения "f_2" из полученной подматрицы (Урок 6 модуля Matplotlib). Задайте точкам синий цвет и размер 100. Сохраните график в файл "sub_matrix_scatter.png".
Посмотреть решение
python
import numpy
import pandas
import matplotlib
# Enforcing non-interactive aggregation environment layout (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot
# Generating structured 2D matrices coordinates (NumPy Lessons 3 & 11)
raw_matrix = numpy.arange(12).reshape(4, 3)
dataset_df = pandas.DataFrame(raw_matrix, columns=["f_1", "f_2", "f_3"])
# Slicing bounding sub-matrix coordinate zones blocks (Pandas Lessons 6 & 7)
sub_matrix_df = dataset_df.loc[0:2, ["f_1", "f_2"]]
# Mapping independent dataframe tracks straight to scatter spatial dimensions (Matplotlib Lessons 2 & 6)
fig, ax = matplotlib.pyplot.subplots()
ax.scatter(sub_matrix_df["f_1"], sub_matrix_df["f_2"], color="blue", s=100)
ax.grid(True)
fig.savefig("sub_matrix_scatter.png")10. Поиск и раскрытие спецификаций API метода ax.scatter в Jupyter
Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную Docstring-инструкцию по встроенному методу точечного маскирования и построения скаттерплотов matplotlib.axes.Axes.scatter с помощью символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).
Посмотреть решение
python
import matplotlib.axes
# Running this cell evaluation string statement reveals the full parameter contracts pane
?matplotlib.axes.Axes.scatter