이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

데이터 분석

소개

모든 데이터 분석은 몇 가지 표준 구성요소로 나뉩니다.

  • 전처리 — 이상값과 누락된 값을 고려해, 데이터를 스무딩하고 가능한 모델을 식별합니다.

  • 요약 — 기본 통계량을 계산하여 데이터의 전반적인 위치, 스케일, 형태를 설명합니다.

  • 시각화 — 데이터를 플로팅하여 패턴과 추세를 식별합니다.

  • 모델링 — 새로운 값을 예측하는 데 적합한 데이터 추세에 대한 자세한 설명을 제공합니다.

데이터 분석은 다음 두 가지 기본 목표를 바탕으로, 이러한 구성요소 간에 이루어집니다.

  1. 간단한 모델로 데이터의 패턴을 설명하며 이를 통해 정확한 예측값을 얻는다.

  2. 모델을 구성하는 다양한 변수 간의 관계를 파악한다.

이 섹션에서는 MATLAB® 환경에서 기본적인 데이터 분석을 수행하는 방법을 설명합니다.

데이터 전처리

이 예제에서는 분석을 위해 데이터를 전처리하는 방법을 보여줍니다.

개요

적절한 MATLAB® 컨테이너 변수로 데이터를 불러오고 "불량" 데이터에서 "양호" 데이터를 분류하는 것으로 데이터 분석을 시작합니다. 이는 이후의 분석 단계에서 의미 있는 결론을 얻도록 하는 예비 단계입니다.

데이터 불러오기

count.dat에 데이터를 불러오는 것으로 시작합니다.

load count.dat

24x3 배열 count에는 하루 동안 세 곳의 교차로(열)에서 집계된 시간당 교통량(행)이 포함되어 있습니다.

누락된 데이터

MATLAB NaN(Not a Number) 값은 일반적으로 누락된 데이터를 나타내는 데 사용됩니다. NaN 값을 사용하면 누락된 데이터가 있는 변수가 해당 구조를 유지할 수 있습니다. 이 경우에는 세 교차로 모두에 대해 24x1 벡터가 인덱스를 유지하게 됩니다.

isnan 함수를 사용하여 세 번째 교차로의 데이터에서 NaN 값을 확인해 보겠습니다.

c3 = count(:,3); % Data at intersection 3
c3NaNCount = sum(isnan(c3))
c3NaNCount = 0

isnanc3과 크기가 같은 논리형 벡터를 반환하며, 데이터의 24개 각 요소에 대해 NaN 값인지(1) 또는 아닌지(0)를 나타냅니다. 이 경우 논리값의 합이 0이므로 데이터에 NaN 값이 없는 것입니다.

NaN 값은 이상값 섹션에 나와 있는 데이터에서 소개됩니다.

이상값

이상값은 나머지 데이터의 패턴에 비해 큰 차이를 보이는 데이터 값입니다. 이상값은 계측 오류로 인해 발생할 수도 있고 데이터의 유의미한 특징을 나타낼 수도 있습니다. 이상값을 식별하고 이러한 값을 사용하여 무엇을 할 것인지를 결정하는 것은 데이터와 소스를 얼마나 이해하고 있는지에 달려 있습니다.

이상값을 식별하는 한 가지 일반적인 방법은 평균 에서 특정 수의 표준편차를 초과하는 값 를 검색하는 것입니다. 다음 코드에서는 세 번째 교차로에서 집계한 데이터의 히스토그램을 선과 함께 플로팅합니다. 여기서, 입니다.

h = histogram(c3,10); % Histogram
N = max(h.Values); % Maximum bin count
mu3 = mean(c3); % Data mean
sigma3 = std(c3); % Data standard deviation

hold on
plot([mu3 mu3],[0 N],'r','LineWidth',2) % Mean
X = repmat(mu3+(1:2)*sigma3,2,1);
Y = repmat([0;N],1,2);
plot(X,Y,'Color',[255 153 51]./255,'LineWidth',2) % Standard deviations
legend('Data','Mean','Stds')
hold off

플롯을 보면 일부 데이터가 평균에서 2 표준편차(표준편차의 두 배)를 초과하는 것을 알 수 있습니다. 이러한 데이터가 특징이 아닌 오차로 식별되는 경우 이를 다음과 같이 NaN 값으로 바꿉니다.

outliers = (c3 - mu3) > 2*sigma3;
c3m = c3; % Copy c3 to c3m
c3m(outliers) = NaN; % Add NaN values

스무딩과 필터링

이상값 섹션에서 이상값을 제거한 세 번째 교차로의 데이터에 대해 시계열 플로팅을 수행하면 다음과 같은 플롯이 생성됩니다.

plot(c3m,'o-')
hold on

20시의 NaN 값은 플롯에서 빈 간격으로 나타납니다. MATLAB 플로팅 함수에서는 NaN 값을 일반적으로 이렇게 처리합니다.

잡음이 있는 데이터는 기대값에 대한 불규칙 변동을 보여줍니다. 모델을 작성하기 전에 데이터를 스무딩하여 데이터의 주요 특징을 나타내야 할 경우가 있습니다. 스무딩은 다음 두 가지 기본 가정을 기초로 합니다.

- 예측 변수(시간)와 응답(교통량) 간의 관계가 스무드하다.

- 잡음이 줄어들면 스무딩 알고리즘이 기대값보다 더 나은 추정값을 제시한다.

MATLAB convn 함수를 사용하여 데이터에 간단한 이동 평균 스무딩을 적용해 보겠습니다.

span = 3; % Size of the averaging window
window = ones(span,1)/span; 
smoothed_c3m = convn(c3m,window,'same');

h = plot(smoothed_c3m,'ro-');
legend('Data','Smoothed Data')

변수 span이 스무딩 범위를 제어합니다. 평균 계산을 수행하면 스무딩 기간(window)에 NaN 값이 포함되어 있을 때마다 NaN 값이 반환되므로 스무딩된 데이터의 빈 간격 크기가 증가됩니다.

filter 함수는 데이터 스무딩에도 사용됩니다.

smoothed2_c3m = filter(window,1,c3m);

delete(h)
plot(smoothed2_c3m,'ro-','DisplayName','Smoothed Data');

스무딩된 데이터는 이전 플롯에서 자리 이동됩니다. 'same' 파라미터를 사용하여 convn을 실행하면 데이터와 길이가 동일한, 컨벌루션의 중앙부가 반환됩니다. filter는 데이터와 길이가 동일한, 컨벌루션의 초기 부분을 반환합니다. 'same' 파라미터를 사용하지 않으면 두 알고리즘은 동일해집니다.

스무딩은 예측 변수의 각 값에서 응답값 분포의 중앙부를 추정합니다. 많은 피팅 알고리즘은 각 예측 변수 값의 오차는 독립적이라고 가정하는데, 스무딩에서는 이 가정이 유효하지 않습니다. 따라서 스무딩된 데이터를 사용하여 모델을 식별할 수는 있지만 스무딩된 데이터로 모델을 피팅해서는 안 됩니다.

데이터 요약

이 예제에서는 데이터를 요약하는 방법을 보여줍니다.

개요

다양한 MATLAB® 함수를 사용해 데이터 샘플의 전반적인 위치, 스케일, 형태를 요약할 수 있습니다.

MATLAB®에서 작업하면서 얻게 되는 이점 중 하나는 함수가 단순히 단일 스칼라 값이 아닌 전체 데이터 배열을 기반으로 동작한다는 점입니다. 즉, 함수가 벡터화됩니다. 벡터화가 되면 배열 기반 데이터를 사용해 문제를 효율적으로 구성할 수 있고, 벡터화된 통계 함수를 사용해 계산을 효율적으로 할 수 있게 됩니다.

위치 측정값

"대표적인" 값을 찾아 데이터 샘플의 위치를 요약합니다. 일반적인 위치 측정값 또는 "중심 경향성"은 함수 mean, median, mode를 사용하여 계산합니다.

load count.dat
x1 = mean(count)
x1 = 1×3

   32.0000   46.5417   65.5833

x2 = median(count)
x2 = 1×3

   23.5000   36.0000   39.0000

x3 = mode(count)
x3 = 1×3

    11     9     9

내장된 다른 모든 통계 함수와 마찬가지로 위의 MATLAB® 함수는 변수(열)를 보존하면서 전반적인 관측값(행) 데이터를 요약합니다. 이 함수들은 세 교차로 각각에서 집계한 데이터의 위치를 단일 호출로 계산합니다.

스케일 측정값

데이터 샘플의 스케일 또는 "분산"을 측정하는 방법에는 여러 가지가 있습니다. MATLAB® 함수 max, min, std, var는 몇 가지 일반적인 측정값을 계산합니다.

dx1 = max(count)-min(count)
dx1 = 1×3

   107   136   250

dx2 = std(count)
dx2 = 1×3

   25.3703   41.4057   68.0281

dx3 = var(count)
dx3 = 1×3
103 ×

    0.6437    1.7144    4.6278

내장된 다른 모든 통계 함수와 마찬가지로 위의 MATLAB® 함수는 변수(열)를 보존하면서 전반적인 관측값(행) 데이터를 요약합니다. 이 함수들은 세 교차로 각각에서 집계한 데이터의 스케일을 단일 호출로 계산합니다.

분포의 형상

분포의 형상은 위치나 스케일보다 요약하기가 더 어렵습니다. MATLAB® hist 함수는 요약 정보를 시각화하여 보여주는 히스토그램을 플로팅합니다.

figure
hist(count)
legend('Intersection 1',...
       'Intersection 2',...
       'Intersection 3')

파라미터 모델은 분포 형상의 분석 내용을 요약해서 보여줍니다. 교통량 데이터의 경우 데이터 평균으로 지정된 파라미터 mu와 함께 지수 분포를 사용하는 것이 좋습니다.

c1 = count(:,1); % Data at intersection 1
[bin_counts,bin_locations] = hist(c1);
bin_width = bin_locations(2) - bin_locations(1);
hist_area = (bin_width)*(sum(bin_counts));

figure
hist(c1)
hold on

mu1 = mean(c1);
exp_pdf = @(t)(1/mu1)*exp(-t/mu1); % Integrates
                                   % to 1
t = 0:150;
y = exp_pdf(t);
plot(t,(hist_area)*y,'r','LineWidth',2)
legend('Distribution','Exponential Fit')

일반적인 파라미터 모델을 데이터 분포에 피팅하는 방법은 이 섹션의 범위를 벗어나는 내용입니다. Statistics and Machine Learning Toolbox™에서는 분포 파라미터의 최대가능도 추정값을 계산하는 함수를 제공합니다.

데이터 시각화

개요

다양한 MATLAB 그래프 유형을 사용하여 데이터의 패턴과 추세를 시각화할 수 있습니다. 이 섹션에 설명된 산점도 플롯을 사용하면 서로 다른 교차로에서 집계된 교통량 데이터 간의 관계를 손쉽게 시각화할 수 있습니다. 또한 데이터 탐색 툴을 사용하여 그래프의 개별 데이터 점을 쿼리하고 이러한 데이터 점과 상호 작용할 수 있습니다.

참고

이 섹션에서는 데이터 요약에서 시작한 데이터 분석을 계속 수행합니다.

2차원 산점도 플롯

scatter 함수로 만든 2차원 산점도 플롯은 처음 두 교차로에서 집계된 교통량 간의 관계를 보여줍니다.

load count.dat
c1 = count(:,1); % Data at intersection 1
c2 = count(:,2); % Data at intersection 2

figure
scatter(c1,c2,'filled')
xlabel('Intersection 1')
ylabel('Intersection 2')

cov 함수로 계산되는 공분산은 두 변수 간 선형 관계의 강도를 측정합니다. 즉, 산점도 전반에 걸쳐 최소제곱선을 따라 데이터가 얼마나 조밀하게 위치하고 있는지를 알아보는 것입니다.

C12 = cov([c1 c2])
C12 = 2×2
103 ×

    0.6437    0.9802
    0.9802    1.7144

결과는 대칭 정사각 행렬에 표시되며, (i, j)번째 위치에 i번째 변수와 j번째 변수의 공분산이 표시됩니다. i번째 대각선 요소는 i번째 변수의 분산입니다.

공분산은 개별 변수를 측정하는 데 사용되는 단위에 따라 달라지는 단점이 있습니다. 공분산을 변수의 표준편차로 나눠 값을 +1에서 –1 사이로 정규화할 수 있습니다. corrcoef 함수는 상관 계수를 계산합니다.

R12 = corrcoef([c1 c2])
R12 = 2×2

    1.0000    0.9331
    0.9331    1.0000

r12 = R12(1,2) % Correlation coefficient
r12 = 0.9331
r12sq = r12^2 % Coefficient of determination
r12sq = 0.8707

상관 계수의 값은 정규화되었기 때문에 다른 교차로 쌍의 값과 곧바로 비교할 수 있습니다. 상관 계수의 제곱인 결정계수는 최소제곱선에 대한 분산을 평균에 대한 분산으로 나눈 값입니다. 따라서 결정계수는 산점도 전반에 걸쳐 최소제곱선으로 제거되었거나 통계적으로 설명된 응답(이 경우 2번 교차로의 교통량)의 변동 비율입니다.

3차원 산점도 플롯

scatter3 함수로 만든 3차원 산점도 플롯은 세 교차로 모두에서 집계된 교통량 간의 관계를 보여줍니다. 이전 단계에서 만든 변수 c1, c2, c3를 사용하겠습니다.

figure
c3 = count(:,3); % Data at intersection 3
scatter3(c1,c2,c3,'filled')
xlabel('Intersection 1')
ylabel('Intersection 2')
zlabel('Intersection 3')

eig 함수를 사용하여 공분산 행렬의 고유값을 계산하는 방식으로 3차원 산점도에 있는 변수 간 선형 관계의 강도를 측정해 보겠습니다.

vars = eig(cov([c1 c2 c3]))
vars = 3×1
103 ×

    0.0442
    0.1118
    6.8300

explained = max(vars)/sum(vars)
explained = 0.9777

고유값은 데이터의 주 성분을 따라 나타나는 분산입니다. 변수 explained는 데이터 축을 따라, 첫 번째 주 성분에 의해 설명되는 변동 비율을 측정합니다. 2차원 산점도의 결정계수와 달리 이 측정은 예측 변수와 응답 변수를 구분합니다.

산점도 플롯 배열

plotmatrix 함수를 사용하여 교차로의 여러 쌍 간의 관계를 비교해 보겠습니다.

figure
plotmatrix(count)

배열의 (i, j)번째 위치에 있는 플롯은 세로 축 i번째 변수와 가로 축 j번째 변수의 산점도 플롯입니다. i번째 대각 위치에 있는 플롯은 i번째 변수의 히스토그램 플롯입니다.

그래프의 데이터 탐색

Figure 도구 모음의 두 개 툴로 거의 모든 MATLAB 그래프에서 관측값을 마우스로 선택할 수 있습니다.

  • 데이터 커서

  • 데이터 브러싱

이 툴들을 사용하면 탐색 모드로 전환되므로, 그래프의 데이터 점을 선택해 해당 값을 식별하는 것은 물론 특정 관측값이 포함되도록 작업 공간 변수를 만들 수도 있습니다. 데이터 브러싱을 사용하면 선택한 관측값을 복사하거나 제거하거나 대체할 수도 있습니다.

예를 들어, count의 첫 번째 열과 세 번째 열로 구성된 산점도 플롯을 만들어 보겠습니다.

load count.dat
scatter(count(:,1),count(:,3))
데이터 커서 툴 을 선택하고 오른쪽 끝에 있는 데이터 점을 클릭합니다. 그러면 점의 x 값과 y 값이 데이터팁으로 표시됩니다.

데이터팁은 기본적으로 x, y, z(3차원 플롯의 경우) 좌표를 표시합니다. 데이터팁을 한 데이터 점에서 다른 데이터 점으로 끌어서 놓아 새 값을 확인할 수도 있고, 데이터팁을 마우스 오른쪽 버튼으로 클릭하고 상황별 메뉴를 사용하여 추가할 수도 있습니다. 또한 MATLAB 코드를 사용하여 데이터팁에 표시되는 텍스트를 사용자 지정할 수도 있습니다.

데이터 브러싱은 그래프에 있는 관측값을 클릭하거나 드래그하여 하나 또는 여러 개를 강조 표시할 수 있는 기능입니다. 데이터 브러싱 모드로 전환하려면 Figure 도구 모음에서 데이터 브러싱 툴 의 왼쪽을 클릭해야 합니다. 툴 아이콘의 오른쪽에 있는 화살표를 클릭하면 관측값을 브러싱하는 데 사용할 색을 선택하기 위한 색 팔레트가 드롭다운 메뉴 형식으로 나타납니다. 다음 Figure는 이전 Figure와 동일한 산점도 플롯을 보여 주지만 평균에서 1 표준편차를 벗어난 모든 관측값(툴(Tools) > 데이터 통계량(Data Statistics))이 빨간색으로 브러싱되어 있습니다.

scatter(count(:,1),count(:,3))

데이터 관측값을 브러싱하고 나면 이 관측값들을 대상으로 다음 작업을 수행할 수 있습니다.

  • 데이터 관측값을 삭제합니다.

  • 데이터 관측값을 상수값으로 바꿉니다.

  • 데이터 관측값을 NaN 값으로 바꿉니다.

  • 데이터 관측값을 끌어서 놓거나 복사하여 명령 창에 붙여넣습니다.

  • 데이터 관측값을 작업 공간 변수로 저장합니다.

예를 들어, 데이터 브러싱 상황별 메뉴 또는 툴(Tools) > 브러싱(Brushing) > 새 변수 만들기(Create new variable) 옵션을 사용하여 count13high라는 새 변수를 만들어 보겠습니다.

그 결과로 작업 공간에 다음과 같은 새 변수가 만들어집니다.

count13high

count13high =
    61   186
    75   180
   114   257

연결된 플롯, 즉 데이터 연결은 데이터 브러싱과 밀접한 관련이 있는 기능입니다. 플롯이 그리는 작업 공간 데이터에 플롯이 실시간으로 연결되는 경우, 플롯이 연결되었다고 표현합니다. 객체의 XData, YData, 그리고 해당하는 경우 ZData에 저장된 변수의 복사본은, 자신과 연결된 작업 공간 변수가 변경되거나 삭제되면 항상 자동으로 업데이트됩니다. 그 결과로 복사본이 그려지는 그래프도 자동으로 업데이트됩니다.

플롯을 변수에 연결하면 그 변수를 그리는 또 다른 플롯에 특정 관측값을 다르게 표시하여 관측값을 추적해 볼 수 있습니다. 연결된 플롯의 데이터 점을 브러싱하는 경우 그래프 하나를 브러싱하면 동일한 변수에 연결된 모든 그래프의 동일한 관측값이 강조 표시됩니다.

데이터 연결을 수행하면 변수 편집기가 작업 공간 변수와 커뮤니케이션하는 것과 동일한 방식으로 Figure와 작업 공간 변수 간에 즉각적인 양방향 커뮤니케이션이 설정됩니다. 데이터를 연결하려면, Figure의 도구 모음에서 데이터 연결 툴 을 활성화합니다. 이 툴을 활성화하면 다음 Figure에 표시된 대로, 연결된 플롯 정보 표시줄이 플롯 맨 위에 나타납니다(플롯 제목을 가릴 수도 있음). 플롯의 연결을 해제하지 않고도 아래 Figure에 표시된 정보 표시줄을 닫을 수 있습니다. 즉, 정보 표시줄이 표시되지 않더라도 Figure 저장 내용에는 변화가 없습니다.

다음 두 그래프는 데이터가 연결된 산점도 플롯들입니다. 왼쪽 그래프의 일부 관측값이 데이터 연결 전에 브러싱되었습니다. 데이터 연결 후 브러싱된 데이터가 어떻게 표시되는지 그려져 있습니다. 공통 변수 count는 브러싱 표시를 오른쪽 Figure로 전달합니다. 오른쪽 그래프는 데이터 브러싱 모드에 있지 않지만, 브러싱된 변수에 연결되어 있으므로 브러싱 표시가 나타납니다.

figure
scatter(count(:,1),count(:,2))
xlabel ('count(:,1)')
ylabel ('count(:,2)')
figure
scatter(count(:,3),count(:,2))
xlabel ('count(:,3)')
ylabel ('count(:,2)')

오른쪽 플롯에는 브러싱된 관측값의 관계가 왼쪽 플롯보다 더 뚜렷하게 선형적으로 나타나 있습니다.

해당 변수를 변수 편집기에서 보면 브러싱된 데이터 관측값이 브러싱 색으로 강조 표시되어 나타나며, 이는 다음 그림에서 확인할 수 있습니다.

openvar count

변수 편집기에서는 연결된 플롯 데이터 값을 변경할 수 있으며, 그러면 그래프에 편집 내용이 반영됩니다. 변수 편집기에서 데이터 관측값을 브러싱하려면 브러싱 툴 버튼을 클릭하십시오. 브러싱하려는 변수가 연결된 플롯에 현재 그려져 있는 경우, 변수 편집기에서 관측값을 브러싱하면 플롯에서도 강조 표시됩니다. 행렬의 한 열(변수)에서 어떤 행을 브러싱하면 다른 열의 해당 행도 같이 브러싱됩니다. 즉, 어떤 한 행(행 벡터) 또는 어떤 한 열(열 벡터)의 개별 관측값을 브러싱하면, 클릭된 관측값뿐만 아니라 다른 열에서도 해당 행이 같이 강조 표시(브러싱)됩니다.

데이터 모델링

개요

파라미터 모델은 데이터 관계에 대한 이해를 예측 검정력이 있는 분석 툴로 변환합니다. 교통량 데이터의 고저 추세를 나타내려면 간단히 다항식 모델과 정현파 모델을 사용할 수 있습니다.

다항식 회귀

polyfit 함수를 사용하여 다항식 모델의 계수를 추정한 다음, polyval 함수를 사용하여 예측 변수의 임의 값에서 모델을 실행합니다.

다음 코드는 6차 다항식 모델을 사용하여 세 번째 교차로의 교통량 데이터를 피팅합니다.

load count.dat
c3 = count(:,3); % Data at intersection 3 
tdata = (1:24)'; 
p_coeffs = polyfit(tdata,c3,6);

figure 
plot(c3,'o-') 
hold on 
tfit = (1:0.01:24)'; 
yfit = polyval(p_coeffs,tfit); 
plot(tfit,yfit,'r-','LineWidth',2)
legend('Data','Polynomial Fit','Location','NW')

이 모델은 고저 추세를 표시하면서도 간편하다는 이점이 있습니다. 그러나 예측 검정력의 정확도가 불확실하며 특히 데이터 끝 부분에서는 더욱 그렇습니다.

일반 선형 회귀

데이터의 수집 주기가 12시간이고 7시간 근방에서 피크라면 다음과 같은 형태의 정현파 모델에 피팅하는 것이 적절합니다.

y=a+bcos((2π/12)(t7))

계수 ab는 선형적으로 표시됩니다. MATLAB® mldivide(백슬래시) 연산자를 사용하여 일반 선형 모델을 피팅해 보겠습니다.

load count.dat
c3 = count(:,3); % Data at intersection 3 
tdata = (1:24)'; 
X = [ones(size(tdata)) cos((2*pi/12)*(tdata-7))];
s_coeffs = X\c3;

figure
plot(c3,'o-')
hold on
tfit = (1:0.01:24)';
yfit = [ones(size(tfit)) cos((2*pi/12)*(tfit-7))]*s_coeffs; 
plot(tfit,yfit,'r-','LineWidth',2)
legend('Data','Sinusoidal Fit','Location','NW')

lscov 함수를 사용하여 피팅에 대한 통계량을 계산합니다(예: 계수에 대해 추정된 표준 오차와 평균 제곱 오차).

[s_coeffs,stdx,mse] = lscov(X,c3)
s_coeffs = 2×1

   65.5833
   73.2819

stdx = 2×1

    8.9185
   12.6127

mse = 1.9090e+03

fft 함수를 사용하여 계산한 주기도로 데이터 수집 주기가 12시간이라는 가정을 확인합니다.

Fs = 1; % Sample frequency (per hour)
n = length(c3); % Window length
Y = fft(c3); % DFT of data
f = (0:n-1)*(Fs/n); % Frequency range
P = Y.*conj(Y)/n; % Power of the DFT

figure
plot(f,P)
xlabel('Frequency')
ylabel('Power')

predicted_f = 1/12
predicted_f = 0.0833

약간 더 높은 주파수에서 피크를 기록하긴 하지만 0.0833 근방에서 피크라는 점이 이 가정을 뒷받침합니다. 이에 따라 모델을 조정할 수 있습니다.

참고 항목

| | | | | | | | | | | | | | | | | | | | |