Automatyzacja wizualizacji danych

Integracja danych

Author

Krzysztof Dyba

Wprowadzenie

Integracja danych to proces łączenia danych z różnych źródeł, systemów lub formatów do ujednoliconego i spójnego zbioru. Obejmuje on gromadzenie, przekształcanie i agregowanie danych z wielu źródeł, takich jak pliki, bazy danych, platformy chmurowe czy interfejsy programistyczne. Integracja stanowi kluczowy etap poprzedzający analizę danych i raportowanie.

Analiza rozproszonych danych jest wymagającym wyzwaniem ze względu na różnorodność ich struktur i schematów przechowywania. Ponadto, dane często charakteryzują się zróżnicowaną jakością oraz dokładnością. Z tych względów głównym celem integracji jest:

  • zapewnienie użytkownikom scentralizowanego dostępu do informacji,
  • zagwarantowanie spójności danych poprzez czyszczenie i standaryzację według określonego schematu.

Formaty plików

Format pliku określa sposób kodowania i organizacji danych w pliku, dzięki czemu można je przechowywać na dysku i uzyskiwać do nich dostęp za pomocą aplikacji. W szczególności, definiuje strukturę uwzględniając układ pliku, typy danych oraz metadane, a także zasady zapisu i odczytu danych. Format zazwyczaj powiązany jest z konkretnym rozszerzeniem pliku, np. .txt, .xlsx, .jpg. Co najważniejsze, formaty plików odgrywają kluczową rolę w udostępnianiu i interoperacyjności między systemami zapewniając, że zapisane dane będą mogły zostać wykorzystane przez różne aplikacje.

Formaty danych ustrukturyzowanych:

  • CSV (Comma-Separated Values) – format tekstowy, w którym każda linia jest rekordem danych, a każdy rekord składa się z jednego lub więcej atrybutów oddzielonymi przecinkami (może to być także inny separator, np. spacja czy średnik). Nie ma możliwości przechowywania typów danych oraz metadanych.
  • XLSX (Excel Spreadsheet) / ODS (OpenDocument Spreadsheet) – format oparty na języku znaczników XML służący do przechowywania danych tabelarycznych w arkuszach kalkulacyjnych. W porównaniu do formatu CSV umożliwia obsługę formuł, wykresów, formatowania i wielu arkuszy w jednym pliku.
  • Relacyjne bazy danych – formaty dedykowane relacyjnym bazom danych, często używane do eksportowania lub tworzenia kopii zapasowych zawartości bazy danych. Pozwalają zachować strukturę bazy danych, relacje i ograniczenia. Przykładowymi plikami (zrzutami) mogą być .sql, .db czy .sqlite.
  • Parquet – binarny format zoptymalizowany pod kątem przetwarzania i analizy dużych zbiorów danych (np. Apache Hadoop i Apache Spark) posiadający wysoką kompresję. Cechą wyróżniającą jest przechowywanie danych według kolumn, a nie wierszy. Z racji, iż jest to format binarny, to nie można go odczytać w prosty sposób.

Formaty danych częściowo ustrukturyzowanych:

  • JSON (JavaScript Object Notation) – format tekstowy służący do przechowywania danych jako par klucz-wartość lub obiektów (w tym zagnieżdżonych). Jest szeroko stosowany w tworzeniu stron i aplikacji internetowych. W systemach informacji geograficznej popularny jest format GeoJSON to przechowywania danych przestrzennych.
  • XML (eXtensible Markup Language) – format tekstowy oparty o język znaczników, który zawiera zestaw reguł kodowania dokumentów w formacie czytelnym zarówno dla człowieka, jak i dla komputera. Obsługuje złożone struktury hierarchiczne oraz umożliwia stosowanie metadanych i schematów XSD w celu ścisłego definiowania typów i struktury danych. Często jest bardziej rozwlekły niż JSON, przez co trudniejszy do odczytania przez człowieka.

Formaty danych nieustrukturyzowanych:

  • Pliki tekstowe (np. TXT, DOCX, PDF) – format służący do przechowywania danych tekstowych bez określonej struktury. Przykładowo mogą być to jakieś notatki czy wiadomości.
  • Pliki multimedialne (np. JPEG, WMV, MP3) – formaty umożliwiające przechowywanie obrazów, filmów i muzyki z uwzględnieniem kompresji stratnej lub bezstratnej.

Układ danych

Istnieją dwa sposoby organizacji danych tabelarycznych:

  • Układ szeroki (wide), w którym każda zmienna (cecha) znajduje się w osobnej kolumnie.
  • Układ długi (long), w którym zmienne (cechy) znajdują się w wierszach, a nie osobnych kolumnach. W praktyce oznacza to, że jedna kolumna zawiera informacje o tym, co zostało zmierzone, natomiast kolejna kolumna zawiera wynik pomiaru. Taki zapis nazywa się układem klucz-wartość (key-value).

Układ szeroki jest bardziej czytelny dla człowieka i zazwyczaj wymagany przez testy statystyczne oraz algorytmy uczenia maszynowego. Z kolei układ długi jest przede wszystkim dostosowany do relacyjnych baz danych i programów do przetwarzania danych (jest także wymagany przez pakiet ggplot2). Jest on również preferowany przy modelowaniu szeregów czasowych oraz obliczaniu statystyk grupowych.

Załóżmy, że posiadamy wyniki badań trzech pacjentów, którym na trzech kolejnych wizytach mierzyliśmy tętno (zmienna hr; uderzenia na minutę). Dane te możemy przedstawić w następujący sposób:

UKŁAD SZEROKI
Pacjent Wiek hr_1 hr_2 hr_3
P1 61 72 83 78
P2 82 75 72 75
P3 63 89 92 91


UKŁAD DŁUGI
Pacjent Wiek Pomiar hr
P1 61 1 72
P1 61 2 83
P1 61 3 78
P2 82 1 75
P2 82 2 72
P2 82 3 75
P3 63 1 89
P3 63 2 92
P3 63 3 91

Konwersja

Najłatwiejszy sposób żeby dokonać konwersji pomiędzy tymi dwoma układami danych, to wykorzystanie pakietu tidyr i funkcji:

  • pivot_wider() – konwersja z układu długiego na szeroki.
  • pivot_longer() – konwersja z układu szerokiego na długi.
library("tidyr")
# układ szeroki
df = data.frame(
  Pacjent = c("P1", "P2", "P3"),
  Wiek = c(61, 82, 63),
  hr_1 = c(72, 75, 89),
  hr_2 = c(83, 72, 92),
  hr_3 = c(78, 75, 91)
)
print(df)
  Pacjent Wiek hr_1 hr_2 hr_3
1      P1   61   72   83   78
2      P2   82   75   72   75
3      P3   63   89   92   91
# szeroki na długi
df_long = pivot_longer(
  df,
  cols = starts_with("hr"),  # wybór kolumn do konwersji
  names_to = "Pomiar",       # nowa kolumna "klucz"
  names_prefix = "hr_",      # usunięcie prefiksu z nazwy zmiennej
  values_to = "hr"           # nowa kolumna "wartość"
)
print(df_long)
# A tibble: 9 × 4
  Pacjent  Wiek Pomiar    hr
  <chr>   <dbl> <chr>  <dbl>
1 P1         61 1         72
2 P1         61 2         83
3 P1         61 3         78
4 P2         82 1         75
5 P2         82 2         72
6 P2         82 3         75
7 P3         63 1         89
8 P3         63 2         92
9 P3         63 3         91
# długi na szeroki
df_wide = pivot_wider(
  df_long,
  names_from = "Pomiar",     # wybór kolumny "klucz"
  names_prefix = "hr_",      # dodanie prefiksu do nazwy zmiennej
  values_from = "hr"         # wybór kolumny "wartość"
)
print(df_wide)
# A tibble: 3 × 5
  Pacjent  Wiek  hr_1  hr_2  hr_3
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 P1         61    72    83    78
2 P2         82    75    72    75
3 P3         63    89    92    91

Zadanie

  1. W katalogu dane znajdziesz legendę do Copernicus Global Land Cover zapisaną w różnych formatach.

    • Wczytaj kategorie klas pokrycia terenu z pliku legenda.aux.xml jako ramkę danych i dodaj kolumnę z ID kategorii. Numeracja kategorii rozpoczyna się od 0.

    • Wczytaj ID, kolory oraz kategorie z następujących plików jako ramki danych:

      • legenda.clr (tabela kolorów zapisana jako tekst; pierwsza kolumna to ID, kolejne kolumny reprezentują kolory RGBA, ostatnia kolumna zawiera nazwę kategorii),
      • legenda.qml (styl warstwy QGIS oparty o XML),
      • legenda.sld (Styled Layer Descriptor oparty o XML).

    Do wczytania plików XML można wykorzystać pakiet xml2.

  2. Dokonaj konwersji formatu danych punktowych pliku miasta.csv do GeoJSON używając narzędzia ogr2ogr z GDAL. Upewnij się, że po konwersacji dane zostaną prawidłowo wczytane w QGIS jako obiekt przestrzenny.