Main Content

다변량 데이터 시각화하기

이 예제에서는 다양한 통계적 플롯을 사용하여 다변량 데이터를 시각화하는 방법을 보여줍니다. 많은 통계량 분석이 두 개의 변수, 즉 한 개의 예측 변수와 한 개의 응답 변수를 사용합니다. 이러한 데이터는 2차원 산점도 플롯, 이변량 히스토그램, 상자 플롯 등을 사용하여 쉽게 시각화할 수 있습니다. 또한, 3차원 산점도 플롯을 사용하거나 2차원 산점도 플롯에 색상 등으로 인코딩된 세 번째 변수를 함께 사용하여 삼변량 데이터를 시각화할 수도 있습니다. 그러나 많은 데이터 세트가 다수의 변수를 포함하고 있어서 바로 시각화하기가 더 어렵습니다. 이 예제에서는 MATLAB®에서 Statistics and Machine Learning Toolbox™를 사용하여 고차원 데이터를 시각화하는 몇 가지 방법을 살펴봅니다.

이 예제는 carbig 데이터셋을 사용합니다. 이 데이터셋은 약 400대의 1970년대, 1980년대 자동차에서 측정한 다양한 변수를 포함하고 있습니다. 연료 효율(갤런당 마일 주행 거리, MPG), 가속도(0-60MPH 도달 시간, 초), 엔진 배기량(입방 인치), 중량, 마력에 대한 값을 사용하여 다변량 시각화를 살펴보겠습니다. 관측값은 기통 개수를 사용하여 그룹화하겠습니다.

load carbig
X = [MPG,Acceleration,Displacement,Weight,Horsepower];
varNames = {'MPG'; 'Acceleration'; 'Displacement'; 'Weight'; 'Horsepower'};

산점도 플롯 행렬

더 낮은 차원의 부분공간을 슬라이스로 표시하는 것은 2차원 또는 3차원이 가지는 제한을 부분적으로 해결하는 한 방법입니다. 예를 들어, gplotmatrix 함수를 사용하면 5개 변수 사이의 이변량 산점도 플롯을 각 변수에 대한 일변량 히스토그램과 함께 배열 형태로 표시할 수 있습니다.

figure
gplotmatrix(X,[],Cylinders,['c' 'b' 'm' 'g' 'r'],[],[],false);
text([.08 .24 .43 .66 .83], repmat(-.1,1,5), varNames, 'FontSize',8);
text(repmat(-.12,1,5), [.86 .62 .41 .25 .02], varNames, 'FontSize',8, 'Rotation',90);

각 산점도 플롯의 점은 기통 개수에 따라 각기 다른 색으로 구분됩니다. 4기통은 파란색, 6기통은 녹색, 8기통은 빨간색으로 표시됩니다. 5기통 자동차도 몇 대 있으며 회전식 엔진 자동차는 3기통으로 표시되었습니다. 이 플롯 배열을 통해 변수 쌍 간의 관계 속 패턴을 쉽게 파악할 수 있습니다. 하지만 더 높은 차원에 중요한 패턴이 있을 수 있는데 이 플롯으로는 그러한 패턴을 쉽게 인식할 수 없습니다.

평행좌표 플롯

산점도 플롯 행렬은 이변량 관계만 표시합니다. 그러나, 모든 변수를 함께 표시하는 다른 대안이 있으며, 이 방법을 통해 변수 간에 더 높은 차원의 관계를 조사할 수 있습니다. 가장 간단한 다변량 플롯은 평행좌표 플롯입니다. 이 플롯에서는 일반적인 카테시안 그래프에서처럼 직교 축을 사용하는 대신 좌표축이 모두 가로로 놓여 있습니다. 각각의 관측값은 플롯에서 일련의 연결된 선분으로 표현됩니다. 예를 들어, 4기통, 6기통, 8기통 자동차에 대한 플롯을 생성하고 관측값의 그룹은 색으로 구분할 수 있습니다.

Cyl468 = ismember(Cylinders,[4 6 8]);
parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames)

이 플롯에서 가로 방향은 좌표축을 나타내며, 세로축은 데이터를 나타냅니다. 관측값은 각각 5개 변수에 대한 측정값으로 구성됩니다. 각 관측값은 높이로 표현되고 그에 대응하는 선들은 각 좌표축을 가로지릅니다. 5개 변수는 서로 크게 다른 범위를 가지기 때문에 이 플롯은 표준화된 값으로 생성되었으며, 여기서 각 변수는 평균 0과 단위 분산을 갖도록 표준화되었습니다. 서로 다른 색으로 구분된 이 그래프를 보면 8기통 자동차는 전반적으로 MPG, 가속도의 값이 낮고 배기량, 중량, 마력의 값을 높음을 알 수 있습니다.

그룹마다 다른 색을 사용했더라도 평행좌표 플롯에 많은 수의 관측값이 표시되어 있으면 읽기가 어려울 수 있습니다. 각 그룹마다 중앙값과 분위수(25% 점 및 75% 점)만 표시되는 평행좌표 플롯을 생성할 수도 있습니다. 그러면 그룹 간의 일반적인 차이점과 유사성을 더 쉽게 구분할 수 있습니다. 그러나 각 그룹마다 가장 흥미로운 이상값이 있을 수 있는데 이 플롯에서는 이러한 이상값을 전혀 표시하지 않습니다.

parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames, 'quantile',.25)

앤드류스(Andrews) 플롯

또 다른 유사한 유형의 다변량 시각화로는 앤드류스 플롯이 있습니다. 이 플롯은 각 관측값을 구간 [0,1]에서 매끄러운 함수로 나타냅니다.

andrewsplot(X(Cyl468,:), 'group',Cylinders(Cyl468), 'standardize','on')

각 함수는 푸리에 급수이며 계수는 그에 대응하는 관측값의 값과 같습니다. 이 예제의 푸리에 급수는 총 5개의 항, 즉 상수항 1개, 주기가 각각 1과 1/2인 사인 항 2개, 사인 항과 유사한 코사인 항 2개를 가집니다. 앞의 3개 항으로 인해 함수의 형태에 나타나는 영향은 앤드류스 플롯에서 가장 명확히 나타나므로 처음 세 개 변수의 패턴이 가장 쉽게 인식되는 경향이 있습니다.

t = 0에서 그룹 간 뚜렷한 차이가 있으며, 이는 첫 번째 변수 MPG가 4기통, 6기통, 8기통 자동차 간에 구분이 되는 특징 중 하나임을 나타냅니다. 더 흥미로운 점은 약 t = 1/3에서 보이는 세 그룹 간의 차이입니다. 이 값을 앤드류스 플롯 함수 공식에 대입하면 그룹들을 구별하는 변수의 선형 결합을 정의하는 계수 집합을 얻게 됩니다.

t1 = 1/3;
[1/sqrt(2) sin(2*pi*t1) cos(2*pi*t1) sin(4*pi*t1) cos(4*pi*t1)]
ans =

    0.7071    0.8660   -0.5000   -0.8660   -0.5000

이 계수를 보면 4기통 자동차는 MPG, 가속도의 값이 더 높고 배기량, 마력, 특히 중량의 값이 더 낮으며 8기통 자동차는 그 반대라는 것을 알 수 있으며, 이런 차이점을 통해 4기통 자동차와 8기통 자동차를 구분할 수 있습니다. 이는 평행좌표 플롯에서 도출한 결론과도 동일합니다.

그림문자 플롯

다변량 데이터를 시각화하는 또 다른 방법은 "그림문자"를 사용하여 차원을 나타내는 것입니다. 함수 glyphplot은 두 가지 유형의 그림문자, 즉 별과 체르노프 얼굴을 지원합니다. 예를 들어, 다음은 자동차 데이터의 처음 9개 모델에 대한 별 플롯입니다. 별에서 각 축(spoke)은 하나의 변수를 나타내고 축 길이는 각 관측값에서 해당 변수의 값에 비례합니다.

h = glyphplot(X(1:9,:), 'glyph','star', 'varLabels',varNames, 'obslabels',Model(1:9,:));
set(h(:,3),'FontSize',8);

이 플롯은 MATLAB의 라이브 Figure 창에서 데이터 커서를 사용하여 데이터 값을 대화형 방식으로 탐색할 수 있습니다. 예를 들어, Ford Torino 별 플롯의 오른쪽 점을 클릭하면 MPG 값이 17임이 표시됩니다.

그림문자 플롯 및 다차원 스케일링

특정한 순서 없이 그리드에 별 플롯을 플로팅하면 인접한 별 플롯이 상당히 다른 모양으로 표시되므로 혼동을 일으키는 Figure가 생성될 수 있습니다. 따라서, 눈으로 확인할 수 있는 매끄러운 패턴이 없을 수 있습니다. 다차원 스케일링(MDS)을 그림문자 플롯과 함께 사용하면 유용한 경우가 많습니다. 이를 설명하기 위해 먼저 1977년도 자동차를 모두 선택한 후 zscore 함수를 사용하여 5개 변수 각각을 평균 0과 단위 분산을 갖도록 표준화하겠습니다. 그런 다음, 이렇게 표준화된 관측값 간의 유클리드 거리를 비유사성 척도로 계산할 수 있습니다. 이 선택은 실제 사례에 적용하기에는 지나치게 단순할 수 있지만, 여기서 설명하는 용도로는 충분합니다.

models77 = find((Model_Year==77));
dissimilarity = pdist(zscore(X(models77,:)));

마지막으로, mdscale을 사용하여 원래 고차원 데이터 간의 비유사성에 대한 근삿값을 점 간 거리로 하는 일련의 위치를 2차원에 생성하고 이 위치를 사용하여 그림문자를 플로팅합니다. 이 2차원 플롯에서 거리는 데이터를 대략적으로만 재현할 수 있지만, 이 유형의 플롯에서는 이 정도로 충분합니다.

Y = mdscale(dissimilarity,2);
glyphplot(X(models77,:), 'glyph','star', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:), 'radius',.5);
title('1977 Model Year');

이 플롯에서는 MDS를 차원 축소 방법으로 사용하여 2차원 플롯을 생성했습니다. 일반적으로 이는 정보의 손실을 의미할 수 있지만, 그림문자를 플로팅함으로써 데이터에 있는 모든 고차원 정보를 포함시켰습니다. MDS를 사용하는 목적은 그림문자 플롯 간 패턴을 쉽게 확인할 수 있도록 데이터의 변동성에 규칙성을 부과하는 것입니다.

앞의 플롯과 마찬가지로, 라이브 Figure 창에서 대화형 방식의 탐색이 가능합니다.

그림문자 플롯의 또 다른 유형은 체르노프 얼굴입니다. 이 그림문자 플롯은 각 관측값의 데이터 값을 얼굴의 특징(예: 얼굴 크기, 얼굴 모양, 눈의 위치 등)으로 인코딩합니다.

glyphplot(X(models77,:), 'glyph','face', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:));
title('1977 Model Year');

여기서, 가장 뚜렷한 두 가지 특징인 얼굴 크기와 상대적인 이마/턱 크기는 MPG와 가속도를 인코딩하는 반면, 이마 모양과 턱 모양은 배기량과 중량을 인코딩합니다. 눈 사이의 너비는 마력을 인코딩합니다. 주목할 만한 점은 넓은 이마와 좁은 턱을 가지거나 그 반대인 얼굴이 거의 없다는 것입니다. 이는 배기량 및 중량 변수 간에 양의 선형 상관관계가 성립됨을 나타냅니다. 이는 산점도 플롯 행렬에서도 확인된 사항입니다.

변수에 대한 특징의 대응 관계에 따라 어떤 관계를 가장 쉽게 볼 수 있는지가 결정되며 glyphplot을 사용하면 선택 항목을 손쉽게 변경할 수 있습니다.

close