MATLAB Wstępna analiza danych

O co chodzi z tym NaN i jak sobie radzić kiedy nasze dane zawierają tego typu znaczniki? Co w sytuacji kiedy w macierzach są błędne wartości?  Czy proces wstępnej analizy danych można zautomatyzować? Na te i inne pytania znajdziecie odpowiedz w tym wpisie.

W kilku poprzednich artykułach pisałem o tym w jaki sposób nawiązać komunikację ze sprzętem pomiarowym i wykonać akwizycję danych. Praktyka pokazuje, że proces taki jest podatny na różnego rodzaju zakłócenia a więc dane w zależności od charakteru mogą zawierać różnego rodzaju błędy. Możemy się spotkać z sytuacjami gdzie w zbiorze brakuje części wartości, w sygnale występują zakłócenia, w danych są błędy grube (wartości znacznie odbiegające od trendu), itp. Ręczne usuwanie takich artefaktów zazwyczaj nie jest możliwe ze względu na duże rozmiary zbiorów. Na szczęście MATLAB ma wbudowane funkcje, które przychodzą nam z pomocą. Prześledźmy najczęściej występujące sytuacje z którymi możemy się spotkać oraz funkcje służące do wstępnej analizy danych pomiarowych.

Brakujące dane

Pierwsza sytuacja to brakujące dane. Jeżeli w zbiorze z jakiś przyczyn cześć danych nie została zapisana lub podczas importu MATLAB nie potrafił ich odczytać, to komórki takie są wypełniane znacznikiem NaN (dla danych numerycznych), NaT (dla szeregów czasowych), <missing> dla danych tekstowych. Używając funkcji ismissing możemy sprawdzić, czy w danych znajdują się brakujące rekordy. Podstawowa składnia tej funkcji jest następująca:

TF = ismissing(A,indicator)

Gdzie A to zbiór który chcemy sprawdzić, a TF to macierz logiczna o rozmiarze odpowiadającym macierzy A, zawierająca jedynki w miejscach gdzie zostały wykryte brakujące dane. Opcjonalny parametr indicator pozwala zdefiniować dodatkowe elementy (poza NaN, NaT, <missing>), które będą interpretowane jako brakujące dane. Przykład 1:

dane = [NaN 0.1 0.8 1.2 NaN 0.5 NaN];
indx = ismissing(dane)

indx =
  1×7 logical array
   1   0   0   0   1   0   1

Przykład 2:

dane = [NaN 0.1 0.8 1.2 NaN 0.5 NaN]
id = [NaN 0.5];
indx = ismissing(dane, id)

indx =
  1×7 logical array
   1   0   0   0   1   1   1

Jak widać, w pierwszym przypadku zostały zidentyfikowane komórki zawierające znacznik NaN, a w drugim przypadku dodatkowo, komórkę zawierającą wartość 0.5. Dysponując indeksami komórek, w których brakuje danych możemy je łatwo usunąć bądź zastąpić konkretnymi wartościami.

Tu z pomocą przychodzą gotowe funkcje: rmmissing – do usuwania brakujących wartości, fillmissing – do zastępowania brakujących wartości. Działanie pierwszej funkcji jest trywialne więc odsyłam Was do systemu pomocy MATLABA aby poznać jej składnie. Druga funkcja umożliwia zastępowanie wartości na kilka sposobów. Między innymi możemy do tego celu użyć interpolacji – metody, o której pisałem w tym wpisie. Składnia tej funkcji jest następująca:

F = fillmissing(A,method)

Prześledźmy jej działanie na poniższym przykładzie. Zasymulujmy, że w danych zarejestrowanych przez kartę pomiarową brakuje wartości pomiędzy -0.5V a 0.5V i uzupełnijmy je za pomocą fillmissing.

% parametry próbkowania sygnału
fpr = 200; dt = 1 / fpr;
N = 100; 
t = (0:N-1)*dt;
 
% sygnał z brakującymi wartościami
x = sin(2*pi*5*t);
x(x < 0.5 & x > -0.5) = NaN;
 
plot(t, x, 'x'); grid on; xlabel('Czas [s]'); ylabel('Napięcie [V]');
 
% uzupełnienie wartości przez interpolacje liniową 
[value,indx] = fillmissing(x,'linear','SamplePoints',t);
hold on; plot(t(indx), value(indx), 'o')
Zakłócenia i błędy grube

Inna sytuacja z  którą możemy się spotkać, szczególnie w zarejestrowanych danych z karty pomiarowej, to kiedy sygnał jest zaszumiony, lub występują w nim wartości znacznie odbiegające od trendu (błędy grube) będące wynikiem działania np. zakłóceń. Taki sygnał mamy na rysunku.

Widać wyraźnie (bez analizy numerycznej, co zawsze jest możliwe), że sygnał prawdopodobnie ma charakter sinusoidalny, ale jest zakłócony, a co więcej występują w nim trzy wartości 3V, ewidentnie będące wynikiem złego pomiaru. Czy da się taki sygnał „poprawić” aby uzyskać lepszy obraz informacji pomiarowej?

Rozwiązaniem są dwie metody: uśredniania z wykorzystaniem okien czasowych oraz usuwania bądź zastępowania błędów grubych wartościami interpolowanymi.

Do detekcji, usuwania i zastępowania błędów grubych służą w MATLABie funkcje: isoutlier, filloutliers i rmoutliers. Ich działanie jest podobne do opisanych powyżej funkcji związanych z brakującymi danymi, więc nie będę ich szczegółowo omawiał.

Druga grupa funkcji służy do „wygładzania” zaszumionych przebiegów. Ich zasada działania polega na zastosowaniu algorytmu wykorzystującego ruchome okno czasowe, w którym dane są filtrowane z niepożądanych składowych. Ta „filtracja” może odbywać się z wykorzystaniem średniej ruchomej, mediany ruchomej, lub innych metod. Proces ten można sobie wyobrazić w ten sposób, że dla wszystkich próbek z wycinka sygnału (okno czasowe o ustalonej długości) jest obliczana wartość średnia lub mediana. Tak obliczona wartość jest nową wartością próbki sygnału przypadającą na środek okna. Następnie okno jest przesuwane i cały proces się powtarza. Tym samym dzięki procesowi uśredniania sąsiednich próbek sygnału, lokalne zakłócenia są niwelowane, a wynikowy sygnał zawiera pierwotny trend sygnału. Funkcje z tej grupy to: smooth, smoothdata, movmean, mov median. Prześledźmy to na przykładzie.

% parametry próbkowania sygnału
fpr = 200; dt = 1 / fpr;
N = 100; 
t = (0:N-1)*dt;
 
% sygnał z szumem i błędami grubymi
x = sin(2*pi*5*t) + 0.1*randn(size(t));
x([10, 25, 70]) = 3;
 
plot(t, x); grid on; xlabel('Czas [s]'); ylabel('Napięcie [V]');
 
% "czyszczenie" sygnału
x1 = filloutliers(x, 'linear');
x2 = smooth(x1, 6)
 
hold on; plot(t, x2)

Widzimy, że z sygnału zostały usunięte błędy grube oraz został on wygładzony metodą średniej ruchomej z oknem o długości 6 próbek. Mimo, że jest to trywialny przykład, widać, że wstępna analiza sygnału z pomocą MATLABA przynosi pożądany skutek. Opisane funkcje oferują dużo więcej niż zostało pokazane w tym wpisie i warto przeczytać dokumentacje. Powodzenia!

(Visited 403 times, 1 visits today)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *