Документация Engee
Notebook

Создание точечных диаграмм с помощью группированных данных

Введение

В данном примере представлено, как создавать точечные диаграммы с использованием сгруппированных выборочных данных. Точечная диаграмма — это простой график зависимости одной переменной от другой.

Функцияscatter создаёт точечные диаграммы. Мы создадим функцию gplotmatrix, которая может создавать матрицу таких графиков, показывающую взаимосвязь между несколькими парами переменных. Для обозначения принадлежности к группе, будут использоваться различные графические символы. Таким образом, будут созданы группированные версии этих графиков. Это полезно для определения того, одинаковы ли значения двух переменных или взаимосвязь между ними в каждой группе.

Исходные данные

Импортируем и присоединим необходимые библиотеки.

In [ ]:
import Pkg 
Pkg.add(["PlotlyKaleido", "StatsPlots", "DataFrames", "StatsBase", "CSV", "RDatasets", "Statistics", "Random"])
using StatsPlots, DataFrames, StatsBase, CSV, RDatasets, Statistics, Random
plotly()

Предположим, нам необходимо изучить вес и пробег автомобилей трёх различный годов выпуска.

Импортируем и отобразим набор данных об автомобилях.

In [ ]:
автомобили = dataset("datasets", "mtcars")
Out[0]:
32×12 DataFrame
7 rows omitted
RowModelMPGCylDispHPDRatWTQSecVSAMGearCarb
String31Float64Int64Float64Int64Float64Float64Float64Int64Int64Int64Int64
1Mazda RX421.06160.01103.92.6216.460144
2Mazda RX4 Wag21.06160.01103.92.87517.020144
3Datsun 71022.84108.0933.852.3218.611141
4Hornet 4 Drive21.46258.01103.083.21519.441031
5Hornet Sportabout18.78360.01753.153.4417.020032
6Valiant18.16225.01052.763.4620.221031
7Duster 36014.38360.02453.213.5715.840034
8Merc 240D24.44146.7623.693.1920.01042
9Merc 23022.84140.8953.923.1522.91042
10Merc 28019.26167.61233.923.4418.31044
11Merc 280C17.86167.61233.923.4418.91044
12Merc 450SE16.48275.81803.074.0717.40033
13Merc 450SL17.38275.81803.073.7317.60033
21Toyota Corona21.54120.1973.72.46520.011031
22Dodge Challenger15.58318.01502.763.5216.870032
23AMC Javelin15.28304.01503.153.43517.30032
24Camaro Z2813.38350.02453.733.8415.410034
25Pontiac Firebird19.28400.01753.083.84517.050032
26Fiat X1-927.3479.0664.081.93518.91141
27Porsche 914-226.04120.3914.432.1416.70152
28Lotus Europa30.4495.11133.771.51316.91152
29Ford Pantera L15.88351.02644.223.1714.50154
30Ferrari Dino19.76145.01753.622.7715.50156
31Maserati Bora15.08301.03353.543.5714.60158
32Volvo 142E21.44121.01094.112.7818.61142

Так как в представленном наборе данных отсутствует информация о годах выпуска, предположим, что это 1970, 1976, и 1982 годы. Добавим эти данные вручную.

In [ ]:
n = nrow(автомобили)
наблюдений_в_год = div(n, 3)
годы_выпуска = repeat([1970, 1976, 1982], inner=наблюдений_в_год)
if length(годы_выпуска) < n
    append!(годы_выпуска, годы_выпуска[1:(n-length(годы_выпуска))])
end
shuffle!(годы_выпуска)
автомобили[!, :Год_выпуска] = годы_выпуска;
автомобили
Out[0]:
32×13 DataFrame
7 rows omitted
RowModelMPGCylDispHPDRatWTQSecVSAMGearCarbГод_выпуска
String31Float64Int64Float64Int64Float64Float64Float64Int64Int64Int64Int64Int64
1Mazda RX421.06160.01103.92.6216.4601441982
2Mazda RX4 Wag21.06160.01103.92.87517.0201441970
3Datsun 71022.84108.0933.852.3218.6111411970
4Hornet 4 Drive21.46258.01103.083.21519.4410311976
5Hornet Sportabout18.78360.01753.153.4417.0200321970
6Valiant18.16225.01052.763.4620.2210311982
7Duster 36014.38360.02453.213.5715.8400341976
8Merc 240D24.44146.7623.693.1920.010421976
9Merc 23022.84140.8953.923.1522.910421982
10Merc 28019.26167.61233.923.4418.310441970
11Merc 280C17.86167.61233.923.4418.910441982
12Merc 450SE16.48275.81803.074.0717.400331970
13Merc 450SL17.38275.81803.073.7317.600331976
21Toyota Corona21.54120.1973.72.46520.0110311970
22Dodge Challenger15.58318.01502.763.5216.8700321976
23AMC Javelin15.28304.01503.153.43517.300321976
24Camaro Z2813.38350.02453.733.8415.4100341970
25Pontiac Firebird19.28400.01753.083.84517.0500321976
26Fiat X1-927.3479.0664.081.93518.911411976
27Porsche 914-226.04120.3914.432.1416.701521970
28Lotus Europa30.4495.11133.771.51316.911521970
29Ford Pantera L15.88351.02644.223.1714.501541982
30Ferrari Dino19.76145.01753.622.7715.501561970
31Maserati Bora15.08301.03353.543.5714.601581982
32Volvo 142E21.44121.01094.112.7818.611421970

Построим точечную диаграмму зависимости расхода топлива от массы автомобилей.

In [ ]:
p1 = scatter(автомобили.WT, автомобили.MPG, 
        group=автомобили.Год_выпуска,
        markershape=[:x :o :square],
        markercolor=[:blue :green :red],
        xlabel="Масса", ylabel="Удельный запас хода",
        title="Зависимость расхода топлива от массы",
        legend_title="Год выпуска",
        legend=:best,
        markersize=7)
display(p1)

Функцияscatterсоздаёт точечную диаграмму, на которой каждая группа отображена определённым символом.

Набор данныхавтомобилисодержит другие переменные, описывающие различные характеристики автомобилей. Мы можем изучить несколько из них в одном окне, создав матрицу диаграмм.

Создадим функцию, формирующую данные для отображения матрицы диаграмм.

In [ ]:
xvars = [:WT, :Disp, :HP] 
yvars = [:MPG, :QSec]   

function gplotmatrix(df, xvars, yvars, группа)
    nx = length(xvars)
    ny = length(yvars)
    plt = plot(layout=(ny, nx), size=(800, 600), dpi=150)
    xlabels = ["Масса", "Объём двигателя", "Мощность (л.с.)"]
    ylabels = ["Удельный запас хода", "Время разгона (сек)"]
    
    for i in 1:ny  
        for j in 1:nx  
            subplot_idx = (i-1)*nx + j
            цвета = [:blue, :green, :red]
            значки = [:x, :o, :square]
            обозначения = ["1970", "1976", "1982"]
            
            for (k, grp) in enumerate([1970 1976 1982])
                mask = df[!, группа] .== grp
                scatter!(df[mask, xvars[j]], df[mask, yvars[i]],
                        subplot=subplot_idx,
                        marker=значки[k],
                        color=цвета[k],
                        label=обозначения[k],
                        markersize=6,
                        alpha=0.7,
                        legend=(i==1 && j==1) ? :best : false)
            end
            
            if i == ny
                xlabel!(plt.subplots[subplot_idx], xlabels[j])
            end
            if j == 1
                ylabel!(plt.subplots[subplot_idx], ylabels[i])
            end
        end
    end
    
    return plt
end
Out[0]:
gplotmatrix (generic function with 1 method)

И отобразим матрицу диаграмм.

In [ ]:
matrix_plot = gplotmatrix(автомобили, xvars, yvars, :Год_выпуска)
display(matrix_plot)

Матрица диаграмм отображает зависимость одних различных параметров от других. Например исходя из верхней левой диаграммы можно сделать обобщение о том, что чем ниже масса автомобиля, тем выше удельный запас хода.

Заключение

Представленный метод визуализации группированных данных является важным инструментом для анализа для статистики и машинного обучения.

Матрица диаграмм позволяет оценить однородность взаимосвязей между переменными в разных группах. Это помогает определить, требуется ли в модель включать эффекты взаимодействия между количественными и категориальными переменными, что критически важно для корректной спецификации статистических моделей.

В машинном обучении такая визуализация помогает выявить групповую структуру данных и несбалансированность классов, что особенно важно для алгоритмов, чувствительных к распределению данных. Она также позволяет выбрать оптимальный уровень сложности модели — от единой глобальной зависимости до раздельного обучения на подгруппах, снижая риск переобучения.

Таким образом, группированные диаграммы служат мостом между первичным анализом данных и построением формальных моделей, способствуя созданию более точных и интерпретируемых решений.