Przygotowania wstępne

Na początku mojego zadania załaduję kilka bibliotek przydatnych w czasie jego realizacji oraz zdefinuję jedną zmienną pomocniczą o nazwie lata,przechowującą wektor lat dla których przygotowane są analizowane raporty zapisane w plikach csv oraz xlsx. Przygotuję także dwie funkcje kable1 oraz kable2 ułatwiające formatowanie danych prezentowanych w raporcie.

library(kableExtra)
library(validate)
library(readxl)
library(tidyverse)

lata = 2006:2018

kable1 = function(data) data %>% kbl() %>% 
  kable_styling(bootstrap_options = 
                  c("striped", "hover", "condensed", "responsive"))

kable2 = function(data, height="240px") data %>% kable1 %>% 
  scroll_box(width = "100%", height = height)

Import danych z pliku csv

Pierwsza (robocza) próba importu

Do importu danych wykorzystałem funkcję read_delim z pakietu readr wywołaną przez standardowe narzędzie Import dataset z RStudio.

ROLN_3179_csv <- read_delim("ROLN_3179.csv",
  delim = ";", escape_double = FALSE, trim_ws = TRUE)

Niestety ilość argumentów funkcji read_delim możliwych do ustawienia w okienku Import dataset jest niewystarczająca a przez to zaimportowane dane maj nieco kłopotliwą postać.

Po pierwsze nazwy kolumn (zmiennych) są zdecydowanie za długie i niezbyt czytelne.

names(ROLN_3179_csv) %>% kable2
x
Kod
Nazwa
gospodarstwa ogółem;gospodarstwa;2006;[-]
gospodarstwa ogółem;gospodarstwa;2007;[-]
gospodarstwa ogółem;gospodarstwa;2008;[-]
gospodarstwa ogółem;gospodarstwa;2009;[-]
gospodarstwa ogółem;gospodarstwa;2010;[-]
gospodarstwa ogółem;gospodarstwa;2011;[-]
gospodarstwa ogółem;gospodarstwa;2012;[-]
gospodarstwa ogółem;gospodarstwa;2013;[-]
gospodarstwa ogółem;gospodarstwa;2014;[-]
gospodarstwa ogółem;gospodarstwa;2015;[-]
gospodarstwa ogółem;gospodarstwa;2016;[-]
gospodarstwa ogółem;gospodarstwa;2017;[-]
gospodarstwa ogółem;gospodarstwa;2018;[-]
gospodarstwa ogółem;powierzchnia użytków rolnych;2006;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2007;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2008;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2009;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2010;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2011;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2012;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2013;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2014;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2015;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2016;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2017;[ha]
gospodarstwa ogółem;powierzchnia użytków rolnych;2018;[ha]
…29

Po drugie można zauważyć, że wczytanych zostało aż 29 zmiennych podczas gdy faktycznie powinno ich być 28. Ostania kolumna powstała z powodu zakończenia każdej linii pliku csv średnikiem. Należało by także dobrze się zastanowić czy na pewno będzie mi potrzebny pierwszy wiersz który zawiera podsumowanie dla całego kraju. Z punktu widzenia dalszej obróbki i analizy danych ten rekord w ogóle nie powinien być brany pod uwagę. Został on wczytany jedynie z powodu wymagań zaliczenia. Z tego też powodu zmienna Nazwa otrzyma w mojej tabeli nazwę Województwo.

Import właściwy

Dane wczytałem jeszcze raz, tym razem z ustawieniem odpowiednich, dodatkowych parametrów funkcji read_delim.

ROLN_3179_csv <- 
  read_delim(
    "ROLN_3179.csv",
    delim = ";", 
    escape_double = FALSE, 
    trim_ws = TRUE,
    skip = 1,
    col_select = -col29,
    col_names = c(
      "Kod", 
      "Województwo", 
      paste0("gosp_", lata),
      paste0("pow_", lata), 
      "col29")
    )

ROLN_3179_csv %>% kable2
Kod Województwo gosp_2006 gosp_2007 gosp_2008 gosp_2009 gosp_2010 gosp_2011 gosp_2012 gosp_2013 gosp_2014 gosp_2015 gosp_2016 gosp_2017 gosp_2018 pow_2006 pow_2007 pow_2008 pow_2009 pow_2010 pow_2011 pow_2012 pow_2013 pow_2014 pow_2015 pow_2016 pow_2017 pow_2018
0000000 POLSKA 9187 11870 14896 17091 20582 23449 25944 26598 24829 22277 22435 20257 19207 228038 287529 314848 367062 519069 605520 661688 669970 657902 580730 536579 494978 484677
0200000 DOLNOŚLĄSKIE 481 652 879 1021 1227 1322 1312 1189 1046 849 813 741 713 19332 21988 28467 26427 39703 45547 44304 37455 37005 31261 29200 27542 27357
0400000 KUJAWSKO-POMORSKIE 173 217 258 279 327 371 390 415 401 363 470 419 395 4846 5884 5943 6826 7688 8376 8813 11152 11573 10645 9263 8331 7655
0600000 LUBELSKIE 1072 1402 1566 1710 1962 2065 2174 2129 1975 1825 1980 1904 1948 19957 23934 26892 30113 34855 34837 37466 40819 38467 34052 31343 29001 28428
0800000 LUBUSKIE 256 361 480 579 833 1081 1356 1422 1370 1202 1148 948 877 12094 18201 18207 22929 35797 44259 52581 54692 53300 46343 43235 37923 37174
1000000 ŁÓDZKIE 218 261 314 366 420 478 518 528 508 478 497 477 491 3378 3561 4829 5270 7671 8746 9908 10342 11229 10158 9986 9260 8905
1200000 MAŁOPOLSKIE 1363 1627 2100 2197 2156 2138 2103 1838 1378 1128 1093 934 770 13827 14481 22619 16488 21968 21396 21050 17005 15529 12976 12364 10691 8844
1400000 MAZOWIECKIE 1028 1215 1481 1673 1935 2140 2373 2609 2374 2147 2426 2215 2284 20878 23218 27742 34538 46229 50100 55804 63445 60354 53790 49517 44348 42049
1600000 OPOLSKIE 46 53 62 63 79 86 90 88 75 67 68 57 61 1196 934 1571 1879 3180 2703 2930 3543 3306 3042 3216 2790 3554
1800000 PODKARPACKIE 1164 1577 1892 2014 2091 2045 1940 1750 1475 1261 1252 1194 1131 20601 27047 28671 22593 31868 32359 30381 29506 23510 16656 15486 15349 13630
2000000 PODLASKIE 628 847 1160 1528 2033 2440 2924 3407 3432 3273 3437 3211 2989 11657 15391 20410 28764 42917 52066 56367 63548 64897 56528 55168 53551 51608
2200000 POMORSKIE 222 273 392 494 648 763 894 893 847 737 679 609 540 8037 10968 11366 14591 22554 27357 30615 28721 29282 24866 23328 22419 19974
2400000 ŚLĄSKIE 116 143 176 199 228 238 236 242 230 201 180 162 148 2340 3079 3935 3632 5739 6787 7125 7220 7788 6638 5324 3726 2951
2600000 ŚWIĘTOKRZYSKIE 892 995 1165 1170 1243 1296 1288 1207 992 853 834 740 680 8963 9824 10841 10647 13123 14301 14551 15122 13038 11598 10739 9970 9087
2800000 WARMIŃSKO-MAZURSKIE 586 773 1059 1514 2279 3033 3793 4235 4234 4041 4142 3745 3393 23991 28810 28791 49617 75242 98473 112945 116199 117097 112768 108667 107067 104574
3000000 WIELKOPOLSKIE 264 415 516 588 748 888 974 1006 966 809 843 736 727 14511 21096 20417 23770 32513 38434 41479 41617 42071 34523 29171 25389 25994
3200000 ZACHODNIOPOMORSKIE 678 1059 1396 1696 2373 3065 3579 3640 3526 3043 2573 2165 2060 42431 59114 54151 68977 98023 119780 135367 129585 129456 114887 100570 87620 92892

Porównanie danych z rekordu POLSKA z sumą pozostałych rekordów

W celu szybkiego przygotowania porównania wartości z rekordu gdzie wartość zmiennej Nazwa (u mnie Województwo) ma wartość POLSKA z sumą pozostałych rekordów przygotowowałem nową tabelę o nazwie ROLN_diff. Warto zwrócić tu uwagę na łatwe i bardzo czytelne wykorzystanie nazw elementów wektora zwracanego prze funkcję colSums użyte w prostym potoku colSums %>% t %>% as_tibble %>%.

ROLN_diff = ROLN_3179_csv %>% 
  filter(Województwo=='POLSKA') %>% 
  select(where(is.numeric)) %>%
  pivot_longer(everything(), values_to = 'POLSKA') %>% 
  left_join(
    ROLN_3179_csv %>% 
      filter(Województwo!='POLSKA') %>% 
      select(where(is.numeric)) %>% 
      colSums %>% t %>% as_tibble %>% 
      pivot_longer(everything(), values_to = 'WOJEW'),
    by = "name"
  ) %>% mutate(
    is.diff = POLSKA!=WOJEW,
    diff = abs(POLSKA-WOJEW),
    diff.prop = paste((diff/POLSKA*100) %>% signif(3), "%"),
  )

ROLN_diff %>% filter(is.diff) %>% kable1
name POLSKA WOJEW is.diff diff diff.prop
pow_2006 228038 228039 TRUE 1 0.000439 %
pow_2007 287529 287530 TRUE 1 0.000348 %
pow_2008 314848 314852 TRUE 4 0.00127 %
pow_2009 367062 367061 TRUE 1 0.000272 %
pow_2010 519069 519070 TRUE 1 0.000193 %
pow_2011 605520 605521 TRUE 1 0.000165 %
pow_2012 661688 661686 TRUE 2 0.000302 %
pow_2013 669970 669971 TRUE 1 0.000149 %
pow_2015 580730 580731 TRUE 1 0.000172 %
pow_2016 536579 536577 TRUE 2 0.000373 %
pow_2017 494978 494977 TRUE 1 0.000202 %
pow_2018 484677 484676 TRUE 1 0.000206 %

Jak łatwo można zauważyć, różnice powstały w przypadku prawie wszystkich (nie licząc roku 2014) zmiennych dotyczących powierzchni gospodarstw i wynoszą najczęściej 1. Jest to na pewno spowodowane zaokrągleniami wartości które to musiało nastąpić podczas zapisywania danych do pliku csv.

Zapis różnic do pliku csv

Zapis tak wyliczonych porównań pomiędzy sumami nie nastręcza już większych problemów.

ROLN_diff %>% write_csv("pol.csv")

Podgląd zaś tego liku w RStudio ujawnia, że w tym przypadku nie trzeba się już przejmować żadnymi dodatkowymi kolumnami (brak deliminatora na końcach linii) i nie będzie najmniejszego problemu z wczytaniem tych danych do innych programów.

Import danych z pliku xlsx

Import właściwy

Import danych z pliku xlsx od razu rozpoczołem z użyciem dodatkowych opcji funkcji read_excel. Jednak w przypadku pliku xlsx nie było już problemu z dodatkową pustą, 29-tą kolumną.

ROLN_3179_xlsx <- 
  read_excel(
    "ROLN_3179.xlsx", 
    sheet = "TABLICA", 
    skip = 4,
    col_names = c(
      "Kod", 
      "Województwo", 
      paste0("gosp_", lata),
      paste0("pow_", lata)
    )
  )

ROLN_3179_xlsx %>% kable2
Kod Województwo gosp_2006 gosp_2007 gosp_2008 gosp_2009 gosp_2010 gosp_2011 gosp_2012 gosp_2013 gosp_2014 gosp_2015 gosp_2016 gosp_2017 gosp_2018 pow_2006 pow_2007 pow_2008 pow_2009 pow_2010 pow_2011 pow_2012 pow_2013 pow_2014 pow_2015 pow_2016 pow_2017 pow_2018
0000000 POLSKA 9187 11870 14896 17091 20582 23449 25944 26598 24829 22277 22435 20257 19207 228038.2 287528.6 314847.6 367062 519068.5 605519.6 661688 669970 657902 580730 536579 494978 484677
0200000 DOLNOŚLĄSKIE 481 652 879 1021 1227 1322 1312 1189 1046 849 813 741 713 19332.4 21987.7 28466.5 26427 39703.2 45546.5 44304 37455 37005 31261 29200 27542 27357
0400000 KUJAWSKO-POMORSKIE 173 217 258 279 327 371 390 415 401 363 470 419 395 4845.9 5884.4 5942.6 6826 7688.0 8376.0 8813 11152 11573 10645 9263 8331 7655
0600000 LUBELSKIE 1072 1402 1566 1710 1962 2065 2174 2129 1975 1825 1980 1904 1948 19956.6 23934.0 26891.9 30113 34854.6 34837.1 37466 40819 38467 34052 31343 29001 28428
0800000 LUBUSKIE 256 361 480 579 833 1081 1356 1422 1370 1202 1148 948 877 12093.8 18200.9 18206.5 22929 35796.8 44259.3 52581 54692 53300 46343 43235 37923 37174
1000000 ŁÓDZKIE 218 261 314 366 420 478 518 528 508 478 497 477 491 3378.3 3561.3 4828.5 5270 7671.2 8746.3 9908 10342 11229 10158 9986 9260 8905
1200000 MAŁOPOLSKIE 1363 1627 2100 2197 2156 2138 2103 1838 1378 1128 1093 934 770 13827.3 14481.2 22618.9 16488 21967.7 21395.8 21050 17005 15529 12976 12364 10691 8844
1400000 MAZOWIECKIE 1028 1215 1481 1673 1935 2140 2373 2609 2374 2147 2426 2215 2284 20877.8 23217.5 27742.3 34538 46229.4 50099.9 55804 63445 60354 53790 49517 44348 42049
1600000 OPOLSKIE 46 53 62 63 79 86 90 88 75 67 68 57 61 1195.9 934.0 1570.7 1879 3180.1 2702.9 2930 3543 3306 3042 3216 2790 3554
1800000 PODKARPACKIE 1164 1577 1892 2014 2091 2045 1940 1750 1475 1261 1252 1194 1131 20600.6 27046.7 28670.5 22593 31867.5 32358.5 30381 29506 23510 16656 15486 15349 13630
2000000 PODLASKIE 628 847 1160 1528 2033 2440 2924 3407 3432 3273 3437 3211 2989 11656.7 15391.0 20409.8 28764 42916.8 52065.9 56367 63548 64897 56528 55168 53551 51608
2200000 POMORSKIE 222 273 392 494 648 763 894 893 847 737 679 609 540 8037.2 10967.6 11366.0 14591 22554.0 27356.5 30615 28721 29282 24866 23328 22419 19974
2400000 ŚLĄSKIE 116 143 176 199 228 238 236 242 230 201 180 162 148 2340.0 3079.3 3934.5 3632 5738.9 6786.7 7125 7220 7788 6638 5324 3726 2951
2600000 ŚWIĘTOKRZYSKIE 892 995 1165 1170 1243 1296 1288 1207 992 853 834 740 680 8963.4 9824.1 10840.7 10647 13122.6 14301.0 14551 15122 13038 11598 10739 9970 9087
2800000 WARMIŃSKO-MAZURSKIE 586 773 1059 1514 2279 3033 3793 4235 4234 4041 4142 3745 3393 23990.8 28810.1 28791.0 49617 75241.9 98473.0 112945 116199 117097 112768 108667 107067 104574
3000000 WIELKOPOLSKIE 264 415 516 588 748 888 974 1006 966 809 843 736 727 14510.6 21095.6 20416.6 23770 32512.8 38434.3 41479 41617 42071 34523 29171 25389 25994
3200000 ZACHODNIOPOMORSKIE 678 1059 1396 1696 2373 3065 3579 3640 3526 3043 2573 2165 2060 42430.9 59113.5 54150.7 68977 98023.0 119779.9 135367 129585 129456 114887 100570 87620 92892

Porównanie danych z rekordu POLSKA z sumą pozostałych rekordów

Podobnie jaw w przypadku danych pochodzących z pliku csv sprawdziłem zgodność sum. Do tego celu wykorzystałem ten sam kod co poprzednio zmieniając jedynie wejściową tabelę.

ROLN_diff = ROLN_3179_xlsx %>% 
  filter(Województwo=='POLSKA') %>% 
  select(where(is.numeric)) %>%
  pivot_longer(everything(), values_to = 'POLSKA') %>% 
  left_join(
    ROLN_3179_xlsx %>% 
      filter(Województwo!='POLSKA') %>% 
      select(where(is.numeric)) %>% 
      colSums %>% t %>% as_tibble %>% 
      pivot_longer(everything(), values_to = 'WOJEW'),
    by = "name"
  ) %>% mutate(
    is.diff = POLSKA!=WOJEW,
    diff = abs(POLSKA-WOJEW),
    diff.prop = paste((diff/POLSKA*100) %>% signif(3), "%"),
  )

ROLN_diff %>% filter(is.diff) %>% kable1
name POLSKA WOJEW is.diff diff diff.prop
pow_2007 287528.6 287528.9 TRUE 0.3 0.000104 %
pow_2008 314847.6 314847.7 TRUE 0.1 3.18e-05 %
pow_2009 367062.0 367061.0 TRUE 1.0 0.000272 %
pow_2012 661688.0 661686.0 TRUE 2.0 0.000302 %
pow_2013 669970.0 669971.0 TRUE 1.0 0.000149 %
pow_2015 580730.0 580731.0 TRUE 1.0 0.000172 %
pow_2016 536579.0 536577.0 TRUE 2.0 0.000373 %
pow_2017 494978.0 494977.0 TRUE 1.0 0.000202 %
pow_2018 484677.0 484676.0 TRUE 1.0 0.000206 %

Również teraz można się przekonać, że występują różnice, choć są one nieco inne niż w przypadku danych pochodzących z pliku csv. Chociaż tym razem spodziewałem się, że w rekordzie podsumowującym (wierszu 5 arkusza TABLICA) użyto standardowej funkcji suma z programu Excel. Szybkie sprawdzenie zawartości tego pliku ujawniło, że żadna komórka tego wiersza nie zawiera funkcji a jedynie wpisane wartości.

Import danych z arkusza OPIS

Import właściwy

Import danych z arkusza OPIS wykonałem przy użyciu tej samej metody jak w przypadku arkusza TABLICA.

ROLN_OPIS <- 
  read_excel(
    "ROLN_3179.xlsx", 
    sheet = "OPIS", 
    col_names = c("Typ", "Tekst")
  )

ROLN_OPIS %>% kable2
Typ Tekst
Kategoria: ROLNICTWO
NA Dane o gruntach wykazano według form użytkowania. Prezentowane informacje dotyczą działalności rolniczej w zakresie produkcji roślinnej i zwierzęcej. Przez użytkowanie rozumie się faktyczne gospodarowanie na gruntach. Dane o powierzchni zasiewów dotyczą powierzchni upraw poszczególnych ziemiopłodów uprawianych w plonie głównym.
Grupa: GOSPODARSTWA ROLNE
NA
Podgrupa: Ekologiczne gospodarstwa rolne
NA Ekologiczne gospodarstwa rolne (z certyfikatem) - Głównego Inspektoratu Jakości Handlowej Artykułów Rolno-Spożywczych.
Data ostatniej aktualizacji: 2019-10-03
Wymiary: Rodzaje gospodarstw; Zakres przedmiotowy; Rok
Przypisy: Znak ‘-’ oznacza brak informacji z powodu: zmiany poziomu prezentacji, zmian wprowadzonych do wykazu jednostek terytorialnych lub modyfikacji listy cech w danym okresie sprawozdawczym

Zapisanie listy unikalnych słów zmiennej Tekst

Do utworzenia listy unikalnych słów posłużyłem się, tak jak poprzednio wygodnym potokiem oraz funkcją str_match_all z pakietu stringr. Wcześniej jednak skorzystałem z bardzo przydatnej funkcji str_view_all aby upewnić się wizualnie czy mój pattern jest na pewno właściwy.

ROLN_OPIS %>% 
  pull(Tekst) %>% 
  paste(collapse = " ") %>% 
  str_to_lower %>% 
  str_view_all("([a-z,ą,ć,ę,ł,ń,ó,ś,ż,ź]+)")

Po analizie tego wyniku byłem pewien, że moje działania dadzą poprawny efekt i od razu mogłem zapisać wyniki do odpowiedniego pliku.

tibble(
  słowa = 
    ROLN_OPIS %>% 
    pull(Tekst) %>% 
    paste(collapse = " ") %>%
    str_to_lower %>% 
    str_match_all("([a-z,ą,ć,ę,ł,ń,ó,ś,ż,ź]+)")
  ) %>% 
  unnest(słowa) %>% 
  mutate(słowa = słowa[,1]) %>% 
  distinct(słowa) %>% 
  arrange(słowa) %>% 
  write_csv("słowa.txt", col_names = FALSE)

Porównanie danych csv z xlsx

Dla pewności sprawdziłem jeszcze czy odczytane dane z pliku csv są takie same jak dane odczytane z pliku Excela.

ROLN_3179_csv %>% all_equal(ROLN_3179_xlsx) == TRUE
## [1] FALSE

Dane okazały się różne. Spróbowałem zatem zidentyfikować gdzie leży problem dokonując porównań w grupach zmiennych.

ROLN_3179_csv %>% select(Kod:Województwo) %>% 
  all_equal(ROLN_3179_xlsx %>% select(Kod:Województwo)) == TRUE
## [1] TRUE
ROLN_3179_csv %>% select(starts_with("gosp")) %>% 
  all_equal(ROLN_3179_xlsx %>% select(starts_with("gosp"))) == TRUE
## [1] TRUE
ROLN_3179_csv %>% select(starts_with("pow")) %>% 
  all_equal(ROLN_3179_xlsx %>% select(starts_with("pow"))) == TRUE
## [1] FALSE

Jak widać problem występuje w zmiennych dotyczących powierzchni. Szybka kontrola wartości wpisanych do komórek Excela ujawniła przyczynę. W kolumnach z wartościami powierzchni w niektórych rekordach wpisane były wartości z dziesiętnymi częściami hektara. Jednak zaokrąglanie Excel jest nie zgodne z normą IEC 60559. Aby się o tym przekonać przygotowałem specjalną funkcję round0 zaokrąglająca wartości wektora x niezgodnie z normą IEC 60559 a zgodnie z metodą zaokrąglania stosowaną w Excel.

round0 = function(x) ifelse(x-trunc(x)>=0.5,trunc(x)+1,trunc(x))

ROLN_3179_csv %>% select(starts_with("pow")) %>% 
  all_equal(ROLN_3179_xlsx %>% 
  mutate_at(vars(starts_with("pow")), round) %>% 
              select(starts_with("pow"))) == TRUE
## [1] FALSE
ROLN_3179_csv %>% select(starts_with("pow")) %>% 
  all_equal(ROLN_3179_xlsx %>% 
  mutate_at(vars(starts_with("pow")), round0) %>% 
              select(starts_with("pow"))) == TRUE
## [1] TRUE

Zastosowanie podstawowej funkcji języka R round identyfikowało różnice pomiędzy danymi. Dopiero zastosowanie własnej funkcji round0 dało pełną zgodność danych. Ostatecznie do dalszych obliczeń zdecydowałem się pozostawić wartości odczytane z pliku Excel ze względu na minimalnie lepszą dokładność usuwając jedynie podsumowanie dotyczące całego kraju.

ROLN_3179 = ROLN_3179_xlsx %>% 
  filter(Województwo!="POLSKA") 

ROLN_3179 %>% kable2
Kod Województwo gosp_2006 gosp_2007 gosp_2008 gosp_2009 gosp_2010 gosp_2011 gosp_2012 gosp_2013 gosp_2014 gosp_2015 gosp_2016 gosp_2017 gosp_2018 pow_2006 pow_2007 pow_2008 pow_2009 pow_2010 pow_2011 pow_2012 pow_2013 pow_2014 pow_2015 pow_2016 pow_2017 pow_2018
0200000 DOLNOŚLĄSKIE 481 652 879 1021 1227 1322 1312 1189 1046 849 813 741 713 19332.4 21987.7 28466.5 26427 39703.2 45546.5 44304 37455 37005 31261 29200 27542 27357
0400000 KUJAWSKO-POMORSKIE 173 217 258 279 327 371 390 415 401 363 470 419 395 4845.9 5884.4 5942.6 6826 7688.0 8376.0 8813 11152 11573 10645 9263 8331 7655
0600000 LUBELSKIE 1072 1402 1566 1710 1962 2065 2174 2129 1975 1825 1980 1904 1948 19956.6 23934.0 26891.9 30113 34854.6 34837.1 37466 40819 38467 34052 31343 29001 28428
0800000 LUBUSKIE 256 361 480 579 833 1081 1356 1422 1370 1202 1148 948 877 12093.8 18200.9 18206.5 22929 35796.8 44259.3 52581 54692 53300 46343 43235 37923 37174
1000000 ŁÓDZKIE 218 261 314 366 420 478 518 528 508 478 497 477 491 3378.3 3561.3 4828.5 5270 7671.2 8746.3 9908 10342 11229 10158 9986 9260 8905
1200000 MAŁOPOLSKIE 1363 1627 2100 2197 2156 2138 2103 1838 1378 1128 1093 934 770 13827.3 14481.2 22618.9 16488 21967.7 21395.8 21050 17005 15529 12976 12364 10691 8844
1400000 MAZOWIECKIE 1028 1215 1481 1673 1935 2140 2373 2609 2374 2147 2426 2215 2284 20877.8 23217.5 27742.3 34538 46229.4 50099.9 55804 63445 60354 53790 49517 44348 42049
1600000 OPOLSKIE 46 53 62 63 79 86 90 88 75 67 68 57 61 1195.9 934.0 1570.7 1879 3180.1 2702.9 2930 3543 3306 3042 3216 2790 3554
1800000 PODKARPACKIE 1164 1577 1892 2014 2091 2045 1940 1750 1475 1261 1252 1194 1131 20600.6 27046.7 28670.5 22593 31867.5 32358.5 30381 29506 23510 16656 15486 15349 13630
2000000 PODLASKIE 628 847 1160 1528 2033 2440 2924 3407 3432 3273 3437 3211 2989 11656.7 15391.0 20409.8 28764 42916.8 52065.9 56367 63548 64897 56528 55168 53551 51608
2200000 POMORSKIE 222 273 392 494 648 763 894 893 847 737 679 609 540 8037.2 10967.6 11366.0 14591 22554.0 27356.5 30615 28721 29282 24866 23328 22419 19974
2400000 ŚLĄSKIE 116 143 176 199 228 238 236 242 230 201 180 162 148 2340.0 3079.3 3934.5 3632 5738.9 6786.7 7125 7220 7788 6638 5324 3726 2951
2600000 ŚWIĘTOKRZYSKIE 892 995 1165 1170 1243 1296 1288 1207 992 853 834 740 680 8963.4 9824.1 10840.7 10647 13122.6 14301.0 14551 15122 13038 11598 10739 9970 9087
2800000 WARMIŃSKO-MAZURSKIE 586 773 1059 1514 2279 3033 3793 4235 4234 4041 4142 3745 3393 23990.8 28810.1 28791.0 49617 75241.9 98473.0 112945 116199 117097 112768 108667 107067 104574
3000000 WIELKOPOLSKIE 264 415 516 588 748 888 974 1006 966 809 843 736 727 14510.6 21095.6 20416.6 23770 32512.8 38434.3 41479 41617 42071 34523 29171 25389 25994
3200000 ZACHODNIOPOMORSKIE 678 1059 1396 1696 2373 3065 3579 3640 3526 3043 2573 2165 2060 42430.9 59113.5 54150.7 68977 98023.0 119779.9 135367 129585 129456 114887 100570 87620 92892

Walidacja oraz uporządkowanie danych

Walidacja zmiennych typu character

Po wczytaniu danych warto na nich wykonać choć prostą walidację. Użyłem do tego celu funkcji z pakietu validate. Najpierw wykonałem szybką walidację zmiennych Kod oraz Województwo.

ROLN_3179 %>% 
  select(Kod, Województwo) %>% 
  confront(
    validator(
      char.val.Kod = is.character(Kod),
      char.val.Woj = is.character(Województwo),
      NA.val = !is.na(.)
    )
  ) %>% summary %>% kable1
name items passes fails nNA error warning expression
char.val.Kod 1 1 0 0 FALSE FALSE is.character(Kod)
char.val.Woj 1 1 0 0 FALSE FALSE is.character(Województwo)
NA.val 32 32 0 0 FALSE FALSE !is.na(.)

Pierwsza walidacja przeszła pomyślnie. Jednak przed walidacją pozostałych zmiennych zdecydowałem już teraz przekonwertować dalszą cześć tabeli do postaci długiej, która będzie znacznie bardziej praktyczna do dalszych analiz.

Konwersja danych do postaci długiej

Jak można się było przekonać, w zadaniu mamy do czynienia z dwoma szeregami czasowymi (jeden dotyczący gospodarstw i drugi dotyczący powierzchni użytków rolnych). Znacznie prościej będzie operować tymi danymi kiedy przekształcimy je do postaci długiej. Przy okazji zmieniłem także typ wcześniej walidowanym zmiennym Kod i Województwo na typ factor.

ROLN_3179 = ROLN_3179 %>% 
  pivot_longer(gosp_2006:pow_2018, names_to = c("name", "rok"),
               names_pattern = "(^[a-z]*)_(\\d*)") %>% 
  pivot_wider() %>% 
  rename(gospodarstwa = gosp,
         powierzchnia = pow) %>% 
  mutate(Kod = Kod %>% fct_inorder,
         Województwo = Województwo %>% fct_inorder,
         rok = rok %>% as.integer)

ROLN_3179 %>% kable2
Kod Województwo rok gospodarstwa powierzchnia
0200000 DOLNOŚLĄSKIE 2006 481 19332.4
0200000 DOLNOŚLĄSKIE 2007 652 21987.7
0200000 DOLNOŚLĄSKIE 2008 879 28466.5
0200000 DOLNOŚLĄSKIE 2009 1021 26427.0
0200000 DOLNOŚLĄSKIE 2010 1227 39703.2
0200000 DOLNOŚLĄSKIE 2011 1322 45546.5
0200000 DOLNOŚLĄSKIE 2012 1312 44304.0
0200000 DOLNOŚLĄSKIE 2013 1189 37455.0
0200000 DOLNOŚLĄSKIE 2014 1046 37005.0
0200000 DOLNOŚLĄSKIE 2015 849 31261.0
0200000 DOLNOŚLĄSKIE 2016 813 29200.0
0200000 DOLNOŚLĄSKIE 2017 741 27542.0
0200000 DOLNOŚLĄSKIE 2018 713 27357.0
0400000 KUJAWSKO-POMORSKIE 2006 173 4845.9
0400000 KUJAWSKO-POMORSKIE 2007 217 5884.4
0400000 KUJAWSKO-POMORSKIE 2008 258 5942.6
0400000 KUJAWSKO-POMORSKIE 2009 279 6826.0
0400000 KUJAWSKO-POMORSKIE 2010 327 7688.0
0400000 KUJAWSKO-POMORSKIE 2011 371 8376.0
0400000 KUJAWSKO-POMORSKIE 2012 390 8813.0
0400000 KUJAWSKO-POMORSKIE 2013 415 11152.0
0400000 KUJAWSKO-POMORSKIE 2014 401 11573.0
0400000 KUJAWSKO-POMORSKIE 2015 363 10645.0
0400000 KUJAWSKO-POMORSKIE 2016 470 9263.0
0400000 KUJAWSKO-POMORSKIE 2017 419 8331.0
0400000 KUJAWSKO-POMORSKIE 2018 395 7655.0
0600000 LUBELSKIE 2006 1072 19956.6
0600000 LUBELSKIE 2007 1402 23934.0
0600000 LUBELSKIE 2008 1566 26891.9
0600000 LUBELSKIE 2009 1710 30113.0
0600000 LUBELSKIE 2010 1962 34854.6
0600000 LUBELSKIE 2011 2065 34837.1
0600000 LUBELSKIE 2012 2174 37466.0
0600000 LUBELSKIE 2013 2129 40819.0
0600000 LUBELSKIE 2014 1975 38467.0
0600000 LUBELSKIE 2015 1825 34052.0
0600000 LUBELSKIE 2016 1980 31343.0
0600000 LUBELSKIE 2017 1904 29001.0
0600000 LUBELSKIE 2018 1948 28428.0
0800000 LUBUSKIE 2006 256 12093.8
0800000 LUBUSKIE 2007 361 18200.9
0800000 LUBUSKIE 2008 480 18206.5
0800000 LUBUSKIE 2009 579 22929.0
0800000 LUBUSKIE 2010 833 35796.8
0800000 LUBUSKIE 2011 1081 44259.3
0800000 LUBUSKIE 2012 1356 52581.0
0800000 LUBUSKIE 2013 1422 54692.0
0800000 LUBUSKIE 2014 1370 53300.0
0800000 LUBUSKIE 2015 1202 46343.0
0800000 LUBUSKIE 2016 1148 43235.0
0800000 LUBUSKIE 2017 948 37923.0
0800000 LUBUSKIE 2018 877 37174.0
1000000 ŁÓDZKIE 2006 218 3378.3
1000000 ŁÓDZKIE 2007 261 3561.3
1000000 ŁÓDZKIE 2008 314 4828.5
1000000 ŁÓDZKIE 2009 366 5270.0
1000000 ŁÓDZKIE 2010 420 7671.2
1000000 ŁÓDZKIE 2011 478 8746.3
1000000 ŁÓDZKIE 2012 518 9908.0
1000000 ŁÓDZKIE 2013 528 10342.0
1000000 ŁÓDZKIE 2014 508 11229.0
1000000 ŁÓDZKIE 2015 478 10158.0
1000000 ŁÓDZKIE 2016 497 9986.0
1000000 ŁÓDZKIE 2017 477 9260.0
1000000 ŁÓDZKIE 2018 491 8905.0
1200000 MAŁOPOLSKIE 2006 1363 13827.3
1200000 MAŁOPOLSKIE 2007 1627 14481.2
1200000 MAŁOPOLSKIE 2008 2100 22618.9
1200000 MAŁOPOLSKIE 2009 2197 16488.0
1200000 MAŁOPOLSKIE 2010 2156 21967.7
1200000 MAŁOPOLSKIE 2011 2138 21395.8
1200000 MAŁOPOLSKIE 2012 2103 21050.0
1200000 MAŁOPOLSKIE 2013 1838 17005.0
1200000 MAŁOPOLSKIE 2014 1378 15529.0
1200000 MAŁOPOLSKIE 2015 1128 12976.0
1200000 MAŁOPOLSKIE 2016 1093 12364.0
1200000 MAŁOPOLSKIE 2017 934 10691.0
1200000 MAŁOPOLSKIE 2018 770 8844.0
1400000 MAZOWIECKIE 2006 1028 20877.8
1400000 MAZOWIECKIE 2007 1215 23217.5
1400000 MAZOWIECKIE 2008 1481 27742.3
1400000 MAZOWIECKIE 2009 1673 34538.0
1400000 MAZOWIECKIE 2010 1935 46229.4
1400000 MAZOWIECKIE 2011 2140 50099.9
1400000 MAZOWIECKIE 2012 2373 55804.0
1400000 MAZOWIECKIE 2013 2609 63445.0
1400000 MAZOWIECKIE 2014 2374 60354.0
1400000 MAZOWIECKIE 2015 2147 53790.0
1400000 MAZOWIECKIE 2016 2426 49517.0
1400000 MAZOWIECKIE 2017 2215 44348.0
1400000 MAZOWIECKIE 2018 2284 42049.0
1600000 OPOLSKIE 2006 46 1195.9
1600000 OPOLSKIE 2007 53 934.0
1600000 OPOLSKIE 2008 62 1570.7
1600000 OPOLSKIE 2009 63 1879.0
1600000 OPOLSKIE 2010 79 3180.1
1600000 OPOLSKIE 2011 86 2702.9
1600000 OPOLSKIE 2012 90 2930.0
1600000 OPOLSKIE 2013 88 3543.0
1600000 OPOLSKIE 2014 75 3306.0
1600000 OPOLSKIE 2015 67 3042.0
1600000 OPOLSKIE 2016 68 3216.0
1600000 OPOLSKIE 2017 57 2790.0
1600000 OPOLSKIE 2018 61 3554.0
1800000 PODKARPACKIE 2006 1164 20600.6
1800000 PODKARPACKIE 2007 1577 27046.7
1800000 PODKARPACKIE 2008 1892 28670.5
1800000 PODKARPACKIE 2009 2014 22593.0
1800000 PODKARPACKIE 2010 2091 31867.5
1800000 PODKARPACKIE 2011 2045 32358.5
1800000 PODKARPACKIE 2012 1940 30381.0
1800000 PODKARPACKIE 2013 1750 29506.0
1800000 PODKARPACKIE 2014 1475 23510.0
1800000 PODKARPACKIE 2015 1261 16656.0
1800000 PODKARPACKIE 2016 1252 15486.0
1800000 PODKARPACKIE 2017 1194 15349.0
1800000 PODKARPACKIE 2018 1131 13630.0
2000000 PODLASKIE 2006 628 11656.7
2000000 PODLASKIE 2007 847 15391.0
2000000 PODLASKIE 2008 1160 20409.8
2000000 PODLASKIE 2009 1528 28764.0
2000000 PODLASKIE 2010 2033 42916.8
2000000 PODLASKIE 2011 2440 52065.9
2000000 PODLASKIE 2012 2924 56367.0
2000000 PODLASKIE 2013 3407 63548.0
2000000 PODLASKIE 2014 3432 64897.0
2000000 PODLASKIE 2015 3273 56528.0
2000000 PODLASKIE 2016 3437 55168.0
2000000 PODLASKIE 2017 3211 53551.0
2000000 PODLASKIE 2018 2989 51608.0
2200000 POMORSKIE 2006 222 8037.2
2200000 POMORSKIE 2007 273 10967.6
2200000 POMORSKIE 2008 392 11366.0
2200000 POMORSKIE 2009 494 14591.0
2200000 POMORSKIE 2010 648 22554.0
2200000 POMORSKIE 2011 763 27356.5
2200000 POMORSKIE 2012 894 30615.0
2200000 POMORSKIE 2013 893 28721.0
2200000 POMORSKIE 2014 847 29282.0
2200000 POMORSKIE 2015 737 24866.0
2200000 POMORSKIE 2016 679 23328.0
2200000 POMORSKIE 2017 609 22419.0
2200000 POMORSKIE 2018 540 19974.0
2400000 ŚLĄSKIE 2006 116 2340.0
2400000 ŚLĄSKIE 2007 143 3079.3
2400000 ŚLĄSKIE 2008 176 3934.5
2400000 ŚLĄSKIE 2009 199 3632.0
2400000 ŚLĄSKIE 2010 228 5738.9
2400000 ŚLĄSKIE 2011 238 6786.7
2400000 ŚLĄSKIE 2012 236 7125.0
2400000 ŚLĄSKIE 2013 242 7220.0
2400000 ŚLĄSKIE 2014 230 7788.0
2400000 ŚLĄSKIE 2015 201 6638.0
2400000 ŚLĄSKIE 2016 180 5324.0
2400000 ŚLĄSKIE 2017 162 3726.0
2400000 ŚLĄSKIE 2018 148 2951.0
2600000 ŚWIĘTOKRZYSKIE 2006 892 8963.4
2600000 ŚWIĘTOKRZYSKIE 2007 995 9824.1
2600000 ŚWIĘTOKRZYSKIE 2008 1165 10840.7
2600000 ŚWIĘTOKRZYSKIE 2009 1170 10647.0
2600000 ŚWIĘTOKRZYSKIE 2010 1243 13122.6
2600000 ŚWIĘTOKRZYSKIE 2011 1296 14301.0
2600000 ŚWIĘTOKRZYSKIE 2012 1288 14551.0
2600000 ŚWIĘTOKRZYSKIE 2013 1207 15122.0
2600000 ŚWIĘTOKRZYSKIE 2014 992 13038.0
2600000 ŚWIĘTOKRZYSKIE 2015 853 11598.0
2600000 ŚWIĘTOKRZYSKIE 2016 834 10739.0
2600000 ŚWIĘTOKRZYSKIE 2017 740 9970.0
2600000 ŚWIĘTOKRZYSKIE 2018 680 9087.0
2800000 WARMIŃSKO-MAZURSKIE 2006 586 23990.8
2800000 WARMIŃSKO-MAZURSKIE 2007 773 28810.1
2800000 WARMIŃSKO-MAZURSKIE 2008 1059 28791.0
2800000 WARMIŃSKO-MAZURSKIE 2009 1514 49617.0
2800000 WARMIŃSKO-MAZURSKIE 2010 2279 75241.9
2800000 WARMIŃSKO-MAZURSKIE 2011 3033 98473.0
2800000 WARMIŃSKO-MAZURSKIE 2012 3793 112945.0
2800000 WARMIŃSKO-MAZURSKIE 2013 4235 116199.0
2800000 WARMIŃSKO-MAZURSKIE 2014 4234 117097.0
2800000 WARMIŃSKO-MAZURSKIE 2015 4041 112768.0
2800000 WARMIŃSKO-MAZURSKIE 2016 4142 108667.0
2800000 WARMIŃSKO-MAZURSKIE 2017 3745 107067.0
2800000 WARMIŃSKO-MAZURSKIE 2018 3393 104574.0
3000000 WIELKOPOLSKIE 2006 264 14510.6
3000000 WIELKOPOLSKIE 2007 415 21095.6
3000000 WIELKOPOLSKIE 2008 516 20416.6
3000000 WIELKOPOLSKIE 2009 588 23770.0
3000000 WIELKOPOLSKIE 2010 748 32512.8
3000000 WIELKOPOLSKIE 2011 888 38434.3
3000000 WIELKOPOLSKIE 2012 974 41479.0
3000000 WIELKOPOLSKIE 2013 1006 41617.0
3000000 WIELKOPOLSKIE 2014 966 42071.0
3000000 WIELKOPOLSKIE 2015 809 34523.0
3000000 WIELKOPOLSKIE 2016 843 29171.0
3000000 WIELKOPOLSKIE 2017 736 25389.0
3000000 WIELKOPOLSKIE 2018 727 25994.0
3200000 ZACHODNIOPOMORSKIE 2006 678 42430.9
3200000 ZACHODNIOPOMORSKIE 2007 1059 59113.5
3200000 ZACHODNIOPOMORSKIE 2008 1396 54150.7
3200000 ZACHODNIOPOMORSKIE 2009 1696 68977.0
3200000 ZACHODNIOPOMORSKIE 2010 2373 98023.0
3200000 ZACHODNIOPOMORSKIE 2011 3065 119779.9
3200000 ZACHODNIOPOMORSKIE 2012 3579 135367.0
3200000 ZACHODNIOPOMORSKIE 2013 3640 129585.0
3200000 ZACHODNIOPOMORSKIE 2014 3526 129456.0
3200000 ZACHODNIOPOMORSKIE 2015 3043 114887.0
3200000 ZACHODNIOPOMORSKIE 2016 2573 100570.0
3200000 ZACHODNIOPOMORSKIE 2017 2165 87620.0
3200000 ZACHODNIOPOMORSKIE 2018 2060 92892.0

Walidacja danych typu numeric

Po tych przygotowaniach mogłem już przystąpić do walidacji moich nowych zmiennych gospodarstwa oraz powierzchnia.

ROLN_3179 %>% 
  confront(
    validator(
      num.val = is.numeric(gospodarstwa),
      big.val = gospodarstwa>0 & gospodarstwa<10000,
      NA.val = !is.na(gospodarstwa)
    )
  ) %>% summary %>% kable1
name items passes fails nNA error warning expression
num.val 1 1 0 0 FALSE FALSE is.numeric(gospodarstwa)
big.val 208 208 0 0 FALSE FALSE gospodarstwa > 0 & gospodarstwa < 10000
NA.val 208 208 0 0 FALSE FALSE !is.na(gospodarstwa)
ROLN_3179 %>% 
  confront(
    validator(
      num.val = is.numeric(powierzchnia),
      big.val = powierzchnia>0 & powierzchnia<1000000,
      NA.val = !is.na(powierzchnia)
    )
  ) %>% summary %>% kable1
name items passes fails nNA error warning expression
num.val 1 1 0 0 FALSE FALSE is.numeric(powierzchnia)
big.val 208 208 0 0 FALSE FALSE powierzchnia > 0 & powierzchnia < 1e+06
NA.val 208 208 0 0 FALSE FALSE !is.na(powierzchnia)

W ten sposób przekonałem się, że całe dane spełniają moje założenia walidacyjne i nadają się do dalszych przekształceń oraz analiz.

Wyliczenie średniej wielkości gospodarstwa

Na zakończenie pozostało mi już tylko wyliczenia średniej wielkości gospodarstwa rolnego, co wymagało jednej prostej mutacji do nowej zmiennej gospodarstwo.

ROLN_3179 = ROLN_3179 %>% 
  mutate(gospodarstwo = powierzchnia/gospodarstwa)

ROLN_3179 %>% mutate_if(is.numeric, round, dig=2) %>% kable2
Kod Województwo rok gospodarstwa powierzchnia gospodarstwo
0200000 DOLNOŚLĄSKIE 2006 481 19332.4 40.19
0200000 DOLNOŚLĄSKIE 2007 652 21987.7 33.72
0200000 DOLNOŚLĄSKIE 2008 879 28466.5 32.39
0200000 DOLNOŚLĄSKIE 2009 1021 26427.0 25.88
0200000 DOLNOŚLĄSKIE 2010 1227 39703.2 32.36
0200000 DOLNOŚLĄSKIE 2011 1322 45546.5 34.45
0200000 DOLNOŚLĄSKIE 2012 1312 44304.0 33.77
0200000 DOLNOŚLĄSKIE 2013 1189 37455.0 31.50
0200000 DOLNOŚLĄSKIE 2014 1046 37005.0 35.38
0200000 DOLNOŚLĄSKIE 2015 849 31261.0 36.82
0200000 DOLNOŚLĄSKIE 2016 813 29200.0 35.92
0200000 DOLNOŚLĄSKIE 2017 741 27542.0 37.17
0200000 DOLNOŚLĄSKIE 2018 713 27357.0 38.37
0400000 KUJAWSKO-POMORSKIE 2006 173 4845.9 28.01
0400000 KUJAWSKO-POMORSKIE 2007 217 5884.4 27.12
0400000 KUJAWSKO-POMORSKIE 2008 258 5942.6 23.03
0400000 KUJAWSKO-POMORSKIE 2009 279 6826.0 24.47
0400000 KUJAWSKO-POMORSKIE 2010 327 7688.0 23.51
0400000 KUJAWSKO-POMORSKIE 2011 371 8376.0 22.58
0400000 KUJAWSKO-POMORSKIE 2012 390 8813.0 22.60
0400000 KUJAWSKO-POMORSKIE 2013 415 11152.0 26.87
0400000 KUJAWSKO-POMORSKIE 2014 401 11573.0 28.86
0400000 KUJAWSKO-POMORSKIE 2015 363 10645.0 29.33
0400000 KUJAWSKO-POMORSKIE 2016 470 9263.0 19.71
0400000 KUJAWSKO-POMORSKIE 2017 419 8331.0 19.88
0400000 KUJAWSKO-POMORSKIE 2018 395 7655.0 19.38
0600000 LUBELSKIE 2006 1072 19956.6 18.62
0600000 LUBELSKIE 2007 1402 23934.0 17.07
0600000 LUBELSKIE 2008 1566 26891.9 17.17
0600000 LUBELSKIE 2009 1710 30113.0 17.61
0600000 LUBELSKIE 2010 1962 34854.6 17.76
0600000 LUBELSKIE 2011 2065 34837.1 16.87
0600000 LUBELSKIE 2012 2174 37466.0 17.23
0600000 LUBELSKIE 2013 2129 40819.0 19.17
0600000 LUBELSKIE 2014 1975 38467.0 19.48
0600000 LUBELSKIE 2015 1825 34052.0 18.66
0600000 LUBELSKIE 2016 1980 31343.0 15.83
0600000 LUBELSKIE 2017 1904 29001.0 15.23
0600000 LUBELSKIE 2018 1948 28428.0 14.59
0800000 LUBUSKIE 2006 256 12093.8 47.24
0800000 LUBUSKIE 2007 361 18200.9 50.42
0800000 LUBUSKIE 2008 480 18206.5 37.93
0800000 LUBUSKIE 2009 579 22929.0 39.60
0800000 LUBUSKIE 2010 833 35796.8 42.97
0800000 LUBUSKIE 2011 1081 44259.3 40.94
0800000 LUBUSKIE 2012 1356 52581.0 38.78
0800000 LUBUSKIE 2013 1422 54692.0 38.46
0800000 LUBUSKIE 2014 1370 53300.0 38.91
0800000 LUBUSKIE 2015 1202 46343.0 38.55
0800000 LUBUSKIE 2016 1148 43235.0 37.66
0800000 LUBUSKIE 2017 948 37923.0 40.00
0800000 LUBUSKIE 2018 877 37174.0 42.39
1000000 ŁÓDZKIE 2006 218 3378.3 15.50
1000000 ŁÓDZKIE 2007 261 3561.3 13.64
1000000 ŁÓDZKIE 2008 314 4828.5 15.38
1000000 ŁÓDZKIE 2009 366 5270.0 14.40
1000000 ŁÓDZKIE 2010 420 7671.2 18.26
1000000 ŁÓDZKIE 2011 478 8746.3 18.30
1000000 ŁÓDZKIE 2012 518 9908.0 19.13
1000000 ŁÓDZKIE 2013 528 10342.0 19.59
1000000 ŁÓDZKIE 2014 508 11229.0 22.10
1000000 ŁÓDZKIE 2015 478 10158.0 21.25
1000000 ŁÓDZKIE 2016 497 9986.0 20.09
1000000 ŁÓDZKIE 2017 477 9260.0 19.41
1000000 ŁÓDZKIE 2018 491 8905.0 18.14
1200000 MAŁOPOLSKIE 2006 1363 13827.3 10.14
1200000 MAŁOPOLSKIE 2007 1627 14481.2 8.90
1200000 MAŁOPOLSKIE 2008 2100 22618.9 10.77
1200000 MAŁOPOLSKIE 2009 2197 16488.0 7.50
1200000 MAŁOPOLSKIE 2010 2156 21967.7 10.19
1200000 MAŁOPOLSKIE 2011 2138 21395.8 10.01
1200000 MAŁOPOLSKIE 2012 2103 21050.0 10.01
1200000 MAŁOPOLSKIE 2013 1838 17005.0 9.25
1200000 MAŁOPOLSKIE 2014 1378 15529.0 11.27
1200000 MAŁOPOLSKIE 2015 1128 12976.0 11.50
1200000 MAŁOPOLSKIE 2016 1093 12364.0 11.31
1200000 MAŁOPOLSKIE 2017 934 10691.0 11.45
1200000 MAŁOPOLSKIE 2018 770 8844.0 11.49
1400000 MAZOWIECKIE 2006 1028 20877.8 20.31
1400000 MAZOWIECKIE 2007 1215 23217.5 19.11
1400000 MAZOWIECKIE 2008 1481 27742.3 18.73
1400000 MAZOWIECKIE 2009 1673 34538.0 20.64
1400000 MAZOWIECKIE 2010 1935 46229.4 23.89
1400000 MAZOWIECKIE 2011 2140 50099.9 23.41
1400000 MAZOWIECKIE 2012 2373 55804.0 23.52
1400000 MAZOWIECKIE 2013 2609 63445.0 24.32
1400000 MAZOWIECKIE 2014 2374 60354.0 25.42
1400000 MAZOWIECKIE 2015 2147 53790.0 25.05
1400000 MAZOWIECKIE 2016 2426 49517.0 20.41
1400000 MAZOWIECKIE 2017 2215 44348.0 20.02
1400000 MAZOWIECKIE 2018 2284 42049.0 18.41
1600000 OPOLSKIE 2006 46 1195.9 26.00
1600000 OPOLSKIE 2007 53 934.0 17.62
1600000 OPOLSKIE 2008 62 1570.7 25.33
1600000 OPOLSKIE 2009 63 1879.0 29.83
1600000 OPOLSKIE 2010 79 3180.1 40.25
1600000 OPOLSKIE 2011 86 2702.9 31.43
1600000 OPOLSKIE 2012 90 2930.0 32.56
1600000 OPOLSKIE 2013 88 3543.0 40.26
1600000 OPOLSKIE 2014 75 3306.0 44.08
1600000 OPOLSKIE 2015 67 3042.0 45.40
1600000 OPOLSKIE 2016 68 3216.0 47.29
1600000 OPOLSKIE 2017 57 2790.0 48.95
1600000 OPOLSKIE 2018 61 3554.0 58.26
1800000 PODKARPACKIE 2006 1164 20600.6 17.70
1800000 PODKARPACKIE 2007 1577 27046.7 17.15
1800000 PODKARPACKIE 2008 1892 28670.5 15.15
1800000 PODKARPACKIE 2009 2014 22593.0 11.22
1800000 PODKARPACKIE 2010 2091 31867.5 15.24
1800000 PODKARPACKIE 2011 2045 32358.5 15.82
1800000 PODKARPACKIE 2012 1940 30381.0 15.66
1800000 PODKARPACKIE 2013 1750 29506.0 16.86
1800000 PODKARPACKIE 2014 1475 23510.0 15.94
1800000 PODKARPACKIE 2015 1261 16656.0 13.21
1800000 PODKARPACKIE 2016 1252 15486.0 12.37
1800000 PODKARPACKIE 2017 1194 15349.0 12.86
1800000 PODKARPACKIE 2018 1131 13630.0 12.05
2000000 PODLASKIE 2006 628 11656.7 18.56
2000000 PODLASKIE 2007 847 15391.0 18.17
2000000 PODLASKIE 2008 1160 20409.8 17.59
2000000 PODLASKIE 2009 1528 28764.0 18.82
2000000 PODLASKIE 2010 2033 42916.8 21.11
2000000 PODLASKIE 2011 2440 52065.9 21.34
2000000 PODLASKIE 2012 2924 56367.0 19.28
2000000 PODLASKIE 2013 3407 63548.0 18.65
2000000 PODLASKIE 2014 3432 64897.0 18.91
2000000 PODLASKIE 2015 3273 56528.0 17.27
2000000 PODLASKIE 2016 3437 55168.0 16.05
2000000 PODLASKIE 2017 3211 53551.0 16.68
2000000 PODLASKIE 2018 2989 51608.0 17.27
2200000 POMORSKIE 2006 222 8037.2 36.20
2200000 POMORSKIE 2007 273 10967.6 40.17
2200000 POMORSKIE 2008 392 11366.0 28.99
2200000 POMORSKIE 2009 494 14591.0 29.54
2200000 POMORSKIE 2010 648 22554.0 34.81
2200000 POMORSKIE 2011 763 27356.5 35.85
2200000 POMORSKIE 2012 894 30615.0 34.24
2200000 POMORSKIE 2013 893 28721.0 32.16
2200000 POMORSKIE 2014 847 29282.0 34.57
2200000 POMORSKIE 2015 737 24866.0 33.74
2200000 POMORSKIE 2016 679 23328.0 34.36
2200000 POMORSKIE 2017 609 22419.0 36.81
2200000 POMORSKIE 2018 540 19974.0 36.99
2400000 ŚLĄSKIE 2006 116 2340.0 20.17
2400000 ŚLĄSKIE 2007 143 3079.3 21.53
2400000 ŚLĄSKIE 2008 176 3934.5 22.36
2400000 ŚLĄSKIE 2009 199 3632.0 18.25
2400000 ŚLĄSKIE 2010 228 5738.9 25.17
2400000 ŚLĄSKIE 2011 238 6786.7 28.52
2400000 ŚLĄSKIE 2012 236 7125.0 30.19
2400000 ŚLĄSKIE 2013 242 7220.0 29.83
2400000 ŚLĄSKIE 2014 230 7788.0 33.86
2400000 ŚLĄSKIE 2015 201 6638.0 33.02
2400000 ŚLĄSKIE 2016 180 5324.0 29.58
2400000 ŚLĄSKIE 2017 162 3726.0 23.00
2400000 ŚLĄSKIE 2018 148 2951.0 19.94
2600000 ŚWIĘTOKRZYSKIE 2006 892 8963.4 10.05
2600000 ŚWIĘTOKRZYSKIE 2007 995 9824.1 9.87
2600000 ŚWIĘTOKRZYSKIE 2008 1165 10840.7 9.31
2600000 ŚWIĘTOKRZYSKIE 2009 1170 10647.0 9.10
2600000 ŚWIĘTOKRZYSKIE 2010 1243 13122.6 10.56
2600000 ŚWIĘTOKRZYSKIE 2011 1296 14301.0 11.03
2600000 ŚWIĘTOKRZYSKIE 2012 1288 14551.0 11.30
2600000 ŚWIĘTOKRZYSKIE 2013 1207 15122.0 12.53
2600000 ŚWIĘTOKRZYSKIE 2014 992 13038.0 13.14
2600000 ŚWIĘTOKRZYSKIE 2015 853 11598.0 13.60
2600000 ŚWIĘTOKRZYSKIE 2016 834 10739.0 12.88
2600000 ŚWIĘTOKRZYSKIE 2017 740 9970.0 13.47
2600000 ŚWIĘTOKRZYSKIE 2018 680 9087.0 13.36
2800000 WARMIŃSKO-MAZURSKIE 2006 586 23990.8 40.94
2800000 WARMIŃSKO-MAZURSKIE 2007 773 28810.1 37.27
2800000 WARMIŃSKO-MAZURSKIE 2008 1059 28791.0 27.19
2800000 WARMIŃSKO-MAZURSKIE 2009 1514 49617.0 32.77
2800000 WARMIŃSKO-MAZURSKIE 2010 2279 75241.9 33.02
2800000 WARMIŃSKO-MAZURSKIE 2011 3033 98473.0 32.47
2800000 WARMIŃSKO-MAZURSKIE 2012 3793 112945.0 29.78
2800000 WARMIŃSKO-MAZURSKIE 2013 4235 116199.0 27.44
2800000 WARMIŃSKO-MAZURSKIE 2014 4234 117097.0 27.66
2800000 WARMIŃSKO-MAZURSKIE 2015 4041 112768.0 27.91
2800000 WARMIŃSKO-MAZURSKIE 2016 4142 108667.0 26.24
2800000 WARMIŃSKO-MAZURSKIE 2017 3745 107067.0 28.59
2800000 WARMIŃSKO-MAZURSKIE 2018 3393 104574.0 30.82
3000000 WIELKOPOLSKIE 2006 264 14510.6 54.96
3000000 WIELKOPOLSKIE 2007 415 21095.6 50.83
3000000 WIELKOPOLSKIE 2008 516 20416.6 39.57
3000000 WIELKOPOLSKIE 2009 588 23770.0 40.43
3000000 WIELKOPOLSKIE 2010 748 32512.8 43.47
3000000 WIELKOPOLSKIE 2011 888 38434.3 43.28
3000000 WIELKOPOLSKIE 2012 974 41479.0 42.59
3000000 WIELKOPOLSKIE 2013 1006 41617.0 41.37
3000000 WIELKOPOLSKIE 2014 966 42071.0 43.55
3000000 WIELKOPOLSKIE 2015 809 34523.0 42.67
3000000 WIELKOPOLSKIE 2016 843 29171.0 34.60
3000000 WIELKOPOLSKIE 2017 736 25389.0 34.50
3000000 WIELKOPOLSKIE 2018 727 25994.0 35.76
3200000 ZACHODNIOPOMORSKIE 2006 678 42430.9 62.58
3200000 ZACHODNIOPOMORSKIE 2007 1059 59113.5 55.82
3200000 ZACHODNIOPOMORSKIE 2008 1396 54150.7 38.79
3200000 ZACHODNIOPOMORSKIE 2009 1696 68977.0 40.67
3200000 ZACHODNIOPOMORSKIE 2010 2373 98023.0 41.31
3200000 ZACHODNIOPOMORSKIE 2011 3065 119779.9 39.08
3200000 ZACHODNIOPOMORSKIE 2012 3579 135367.0 37.82
3200000 ZACHODNIOPOMORSKIE 2013 3640 129585.0 35.60
3200000 ZACHODNIOPOMORSKIE 2014 3526 129456.0 36.71
3200000 ZACHODNIOPOMORSKIE 2015 3043 114887.0 37.75
3200000 ZACHODNIOPOMORSKIE 2016 2573 100570.0 39.09
3200000 ZACHODNIOPOMORSKIE 2017 2165 87620.0 40.47
3200000 ZACHODNIOPOMORSKIE 2018 2060 92892.0 45.09

Wizualizacja danych

Prawdziwy eksplorator danych nie mógł by się nazywać tym mianem jeżeli po dotknięciu danych ciekawość nie zawiodła by go do choćby najprostszej ich analizy i wizualizacji.

Na początek przygotowałem więc kilka podstawowych statystyk w ujęciu całościowym (dla całego kraju).

Do przygotowania tych statystyk wykorzystałem kilka własnych funkcji. Są to między innymi gmean do wyznaczania średniej geometrycznej, moda do wyznaczania dominanty, funkcja ShapiroTest zwracająca wartości statystyki W oraz p wartość testu Shapiro-Wilka, odporna na zarówno zbyt krótki jak i zbyt długi wektor na wejściu. Ostania to funkcja sum_stats zwracająca szereg różnych statystyk która została napisana w taki sposób aby można było używając ją z jawnym określeniem zmiennych dla których będę ją używać.

#Średnia geometryczna
gmean = function(x) ifelse(all(x>0), exp(mean(log(x))), NULL)

#Dominanta
moda = function(x) {
  dens = density(x)
  dens$x[which(dens$y == max(dens$y))]
}

#Funckcja zawracająca statystykę W oraz p.value testu Shapiro-Wilka
ShapiroTest = function(x, alpha=0.05){
  if(length(x)>5000) x=sample(x, 5000)
  if(length(x)>=3) sw=shapiro.test(x) else sw=list(statistic=NA, p.value=NA)
  list(W = sw$statistic, p = sw$p.value)
}

#Funckja zwracająca szereg różnych satystyk
sum_stats = function(data, group, value, alpha=0.05) data %>%
  group_by(!!enquo(group)) %>%
  summarise(
    n = n(),
    min = min(!!enquo(value)),
    q1 = quantile(!!enquo(value),1/4,8),
    mean = mean(!!enquo(value)),
    gmean = gmean(!!enquo(value)),
    median = median(!!enquo(value)),
    moda = moda(!!enquo(value)),
    q3 = quantile(!!enquo(value),3/4,8),
    max = max(!!enquo(value)),
    sd = sd(!!enquo(value)),
    kurtosis = e1071::kurtosis(!!enquo(value)),
    skewness = e1071::skewness(!!enquo(value)),
    SW.W = ShapiroTest(!!enquo(value), alpha)$W,
    SW.p = ShapiroTest(!!enquo(value), alpha)$p,
    nout = length(boxplot.stats(!!enquo(value))$out)
  )

Wykorzystanie tych funkcji pozwoliło mi na bardzo łatwe obliczenie interesujących mnie statystyk.

Pol.stat = ROLN_3179 %>% 
  pivot_longer(gospodarstwa:gospodarstwo) %>% 
  sum_stats(name, value) 

Pol.stat %>% mutate_if(is.numeric, signif, dig=4) %>% kable2
name n min q1 mean gmean median moda q3 max sd kurtosis skewness SW.W SW.p nout
gospodarstwa 208 46.000 477.80 1243.00 822.70 993.50 560.50 1912.00 4235.00 1001.00 0.4922 1.0520 0.8987 0.0e+00 3
gospodarstwo 208 7.505 17.27 26.57 23.95 24.76 17.99 35.99 62.58 11.68 -0.5688 0.4469 0.9562 5.3e-06 0
powierzchnia 208 934.000 10120.00 30810.00 19710.00 22770.00 11100.00 40980.00 135400.00 29240.00 2.6070 1.7050 0.8060 0.0e+00 16

Dane te można przedstawić w bardzo czytelny sposób na wykresie typu box-plot. Dodatkowo klasyczny box-plot uzupełniłem o wykres wiolinowy co pozwala mi od razu ocenić gęstość rozkładu. Na wykresie zaznaczyłem także wartość centralne.

#Przygotowanie wykresu typu 1
plot1 = function(df, variable, stat) {
  stat = stat %>% 
    select(name, mean, gmean, median, moda) %>% 
    filter(name == variable) %>% 
    pivot_longer(mean:moda, names_to = "Centralne", values_to = variable) %>% 
    mutate(Centralne = Centralne %>% fct_inorder)
  
  df %>% 
    ggplot(aes(1, !!as.name(variable)))+
    geom_violin(alpha=0.3, fill = "mediumorchid1")+
    geom_boxplot(alpha=0.8, width=0.3, outlier.shape = NA)+
    geom_jitter(shape=21, width =0.1, fill = "mediumorchid1", alpha=0.6, size=2)+
    geom_point(aes(1, !!as.name(variable), shape=Centralne), 
               data=stat, size=4, fill = "#660066")+
    scale_shape_manual(values=c(21, 22, 23, 24))+
    theme(axis.text.x = element_blank(),
          axis.ticks.x = element_blank(),
          legend.position = c(0.9, 0.75))+
    xlab("")
}

ROLN_3179 %>% plot1("gospodarstwa", Pol.stat)+  
  ylab("Ilość gospodarstw rolnych")+
  labs(title = "Ilość gospodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_3179 %>% plot1("powierzchnia", Pol.stat)+
  ylab("Powierzchnia użytków rolnych [ha]")+
  labs(title = "Powierzchnia użytków rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_3179 %>% plot1("gospodarstwo", Pol.stat)+
  ylab("Gospodarstwo [ha]")+
  labs(title = "Średnia wielkość godpodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

W kolejnym kroku zwizualizowałem te same dane tym razem w podziale na województwa, wykonując obliczenia osobno dla zmiennej gospodarstwa, powierzchnia oraz gospodarstwo.

#Funckja wyliczająca statystyki dla wybranej zmiennej
stat1 = function(df, variable) df %>% 
  ungroup() %>% 
  nest_by(Województwo) %>% 
  mutate(stat = sum_stats(data, NULL, !!as.name(variable)) %>% list) %>% 
  unnest(stat) %>% 
  select(-data)

Woj.stat.gosp = ROLN_3179 %>% stat1("gospodarstwa")
Woj.stat.gosp %>% mutate_if(is.numeric, signif, dig=4) %>% kable2
Województwo n min q1 mean gmean median moda q3 max sd kurtosis skewness SW.W SW.p nout
DOLNOŚLĄSKIE 13 481 741 941.90 904.60 879 813.00 1189 1322 267.60 -1.39400 -0.0005311 0.9541 0.66150 0
KUJAWSKO-POMORSKIE 13 173 279 344.50 332.20 371 390.30 401 470 87.98 -1.03700 -0.5503000 0.9303 0.34370 0
LUBELSKIE 13 1072 1710 1824.00 1794.00 1948 1975.00 1980 2174 314.20 0.03763 -1.0450000 0.8752 0.06144 1
LUBUSKIE 13 256 579 916.40 815.10 948 1143.00 1202 1422 395.30 -1.45700 -0.2910000 0.9341 0.38550 0
ŁÓDZKIE 13 218 366 427.20 412.90 478 491.20 497 528 103.90 -0.93200 -0.8337000 0.8336 0.01757 0
MAŁOPOLSKIE 13 770 1128 1602.00 1516.00 1627 2064.00 2103 2197 519.10 -1.69500 -0.1867000 0.8891 0.09473 0
MAZOWIECKIE 13 1028 1673 1992.00 1924.00 2147 2270.00 2373 2609 495.00 -1.02500 -0.6743000 0.9005 0.13570 0
OPOLSKIE 13 46 61 68.85 67.54 67 62.95 79 90 13.87 -1.34800 0.1223000 0.9556 0.68510 0
PODKARPACKIE 13 1131 1252 1599.00 1558.00 1577 1253.00 1940 2091 372.00 -1.84500 0.0214500 0.8769 0.06478 0
PODLASKIE 13 628 1528 2408.00 2118.00 2924 3154.00 3273 3437 1048.00 -1.50700 -0.4997000 0.8584 0.03673 0
POMORSKIE 13 222 494 614.70 568.40 648 701.50 763 894 222.20 -1.23700 -0.3675000 0.9428 0.49480 0
ŚLĄSKIE 13 116 162 192.20 187.70 199 226.20 230 242 41.67 -1.41100 -0.2966000 0.9246 0.28880 0
ŚWIĘTOKRZYSKIE 13 680 853 1027.00 1006.00 995 1207.00 1207 1296 214.00 -1.61400 -0.1743000 0.9203 0.25290 0
WARMIŃSKO-MAZURSKIE 13 586 1514 2833.00 2366.00 3393 3845.00 4041 4235 1405.00 -1.60000 -0.4654000 0.8493 0.02794 0
WIELKOPOLSKIE 13 264 588 729.20 687.20 748 828.60 888 1006 227.00 -0.89770 -0.5864000 0.9342 0.38650 0
ZACHODNIOPOMORSKIE 13 678 1696 2373.00 2141.00 2373 2465.00 3065 3640 979.40 -1.39000 -0.2023000 0.9476 0.56190 0
Woj.stat.pow = ROLN_3179 %>% stat1("powierzchnia")
Woj.stat.pow %>% mutate_if(is.numeric, signif, dig=4) %>% kable2
Województwo n min q1 mean gmean median moda q3 max sd kurtosis skewness SW.W SW.p nout
DOLNOŚLĄSKIE 13 19330 27360 31970 31000 29200 28030 37460 45550 8181.0 -1.288 0.239600 0.9475 0.561200 0
KUJAWSKO-POMORSKIE 13 4846 6826 8230 7981 8331 8123 9263 11570 2077.0 -1.239 0.093530 0.9657 0.838200 0
LUBELSKIE 13 19960 28430 31550 30990 31340 30210 34850 40820 5981.0 -1.003 -0.262800 0.9804 0.981300 0
LUBUSKIE 13 12090 22930 36670 33350 37920 44170 46340 54690 14510.0 -1.450 -0.351100 0.9136 0.205100 0
ŁÓDZKIE 13 3378 5270 7942 7395 8905 9639 9986 11230 2735.0 -1.408 -0.557600 0.8678 0.048940 0
MAŁOPOLSKIE 13 8844 12980 16100 15490 15530 14260 21050 22620 4511.0 -1.452 0.095610 0.9394 0.449100 0
MAZOWIECKIE 13 20880 34540 44000 41670 46230 49750 53790 63440 13780.0 -1.301 -0.346600 0.9443 0.514300 0
OPOLSKIE 13 934 1879 2603 2414 2930 3136 3216 3554 898.7 -1.202 -0.671700 0.8661 0.046440 0
PODKARPACKIE 13 13630 16660 23670 22690 23510 29090 29510 32360 6801.0 -1.702 -0.154800 0.9075 0.169300 0
PODLASKIE 13 11660 28760 44070 38930 52070 55220 56370 64900 18530.0 -1.333 -0.617000 0.8565 0.034620 0
POMORSKIE 13 8037 14590 21080 19530 22550 25180 27360 30620 7580.0 -1.413 -0.400400 0.9167 0.226300 0
ŚLĄSKIE 13 2340 3632 5099 4749 5324 3466 6787 7788 1898.0 -1.759 -0.004649 0.9101 0.183700 0
ŚWIĘTOKRZYSKIE 13 8963 9970 11680 11500 10840 10320 13120 15120 2122.0 -1.534 0.298000 0.9185 0.239700 0
WARMIŃSKO-MAZURSKIE 13 23990 49620 83400 72550 104600 108700 112800 117100 37100.0 -1.520 -0.613700 0.7889 0.005052 0
WIELKOPOLSKIE 13 14510 23770 30080 28700 29170 25220 38430 42070 9120.0 -1.478 -0.039160 0.9377 0.427400 0
ZACHODNIOPOMORSKIE 13 42430 68980 94830 89460 98020 111400 119800 135400 30980.0 -1.455 -0.260300 0.9378 0.428600 0
Woj.stat.gos1 = ROLN_3179 %>% stat1("gospodarstwo")
Woj.stat.gos1 %>% mutate_if(is.numeric, signif, dig=4) %>% kable2
Województwo n min q1 mean gmean median moda q3 max sd kurtosis skewness SW.W SW.p nout
DOLNOŚLĄSKIE 13 25.880 32.39 34.46 34.27 34.45 34.38 36.82 40.19 3.606 0.1477 -0.63710 0.9531 0.646200 0
KUJAWSKO-POMORSKIE 13 19.380 22.58 24.26 24.02 23.51 22.86 27.12 29.33 3.503 -1.5700 0.02960 0.9223 0.269700 0
LUBELSKIE 13 14.590 16.87 17.33 17.27 17.23 17.36 18.62 19.48 1.476 -1.0670 -0.30060 0.9589 0.737100 0
LUBUSKIE 13 37.660 38.55 41.07 40.91 39.60 38.94 42.39 50.42 3.859 0.2927 1.24800 0.8021 0.007219 1
ŁÓDZKIE 13 13.640 15.50 18.09 17.91 18.30 19.12 19.59 22.10 2.626 -1.2830 -0.27550 0.9433 0.501000 0
MAŁOPOLSKIE 13 7.505 10.01 10.29 10.22 10.19 11.25 11.31 11.50 1.205 -0.3277 -0.80850 0.8846 0.082240 1
MAZOWIECKIE 13 18.410 20.02 21.79 21.65 20.64 19.79 23.89 25.42 2.529 -1.7720 0.08805 0.8956 0.116500 0
OPOLSKIE 13 17.620 29.83 37.48 35.73 40.25 42.73 45.40 58.26 11.460 -1.1280 0.01647 0.9774 0.964400 0
PODKARPACKIE 13 11.220 12.86 14.71 14.56 15.24 15.93 15.94 17.70 2.123 -1.5340 -0.22870 0.9302 0.342600 0
PODLASKIE 13 16.050 17.27 18.44 18.38 18.56 18.54 18.91 21.34 1.555 -0.7805 0.43600 0.9443 0.514400 0
POMORSKIE 13 28.990 33.74 34.50 34.37 34.57 34.70 36.20 40.17 3.023 -0.5402 -0.23120 0.9510 0.614000 3
ŚLĄSKIE 13 18.250 21.53 25.80 25.30 25.17 21.54 29.83 33.86 5.289 -1.6430 0.08978 0.9271 0.312300 0
ŚWIĘTOKRZYSKIE 13 9.100 10.05 11.55 11.44 11.30 13.07 13.14 13.60 1.680 -1.7620 -0.10810 0.8940 0.110700 0
WARMIŃSKO-MAZURSKIE 13 26.240 27.66 30.93 30.67 29.78 28.27 32.77 40.94 4.334 -0.2192 0.94670 0.8786 0.068250 1
WIELKOPOLSKIE 13 34.500 39.57 42.12 41.76 42.59 42.60 43.47 54.96 5.857 -0.3047 0.62730 0.9043 0.153000 2
ZACHODNIOPOMORSKIE 13 35.600 37.82 42.37 41.79 39.09 38.88 41.31 62.58 7.951 0.9288 1.51500 0.7253 0.001005 2

Podobnie jak poprzednio dane te zostaną zaprezentowane w postaci box-plotów uszeregowanych w kolejności według rosnącej mediany. Aby jednak nie pogarszać czytelności wykresu zrezygnowałem z wykresu wiolinowego oraz zaznaczania wartości centralnych.

#Przygotowanie wykresu typu 2
plot2 = function(df, variable) df %>% 
  mutate(Województwo = Województwo %>% 
           fct_reorder(!!as.name(variable), median)) %>% 
  ggplot(aes(Województwo, !!as.name(variable), fill=Województwo))+
  geom_boxplot()+
  theme(legend.position = "none",
        axis.text.x = element_text(angle=-90, hjust=0, vjust=0))

ROLN_3179 %>% plot2("gospodarstwa")+
  ylab("Ilość gospodarstw rolnych")+
  labs(title = "Ilość gospodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_3179 %>% plot2("powierzchnia")+
  ylab("Powierzchnia użytków rolnych [ha]")+
  labs(title = "Powierzchnia użytków rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_3179 %>% plot2("gospodarstwo")+
  ylab("Gospodarstwo [ha]")+
  labs(title = "Średnia wielkość godpodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

Biorąc zaś pod uwagę, że analizowane dane są typowymi szerami czasowymi postanowiłem przdstawić ich trend w czasie.

#Posdumowanie wartości z wszystkich województw
ROLN_POLSKA = ROLN_3179 %>% 
  select(where(is.numeric)) %>% 
  group_by(rok) %>% 
  summarise(
    gospodarstwa = sum(gospodarstwa),
    powierzchnia = sum(powierzchnia),
    gospodarstwo = sum(gospodarstwo)
  )

#Przygotowanie wykresu typu 3
plot3 = function(df, variable, rok.przelomowy=NA){ 
  p = df %>% ggplot(aes(rok, !!as.name(variable)))
  if(is.na(rok.przelomowy)){
    p = p + geom_smooth(formula = y~x, method = "lm")
  } else {
    df1 = df %>% filter(rok<=rok.przelomowy)
    df2 = df %>% filter(rok>=rok.przelomowy)
    p = p + geom_smooth(formula = y~x, method = "lm", data=df1)+ 
      geom_smooth(formula = y~x, method = "lm", data=df2)+
      geom_vline(xintercept = rok.przelomowy, color = "red", linetype="dotdash")
  }
  p + geom_line(size=1, linetype = "dashed")+
    geom_point()+
    scale_x_continuous(breaks = seq(2006, 2018, 2))
}

ROLN_POLSKA %>% plot3("gospodarstwa", 2013)+  
  ylab("Ilość gospodarstw rolnych")+
  labs(title = "Ilość gospodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_POLSKA %>% plot3("powierzchnia", 2013)+
  ylab("Powierzchnia użytków rolnych [ha]")+
  labs(title = "Powierzchnia użytków rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

ROLN_POLSKA %>% plot3("gospodarstwo")+
  ylab("Gospodarstwo [ha]")+
  labs(title = "Średnia wielkość godpodarstw rolnych w Polsce w latach 2006-2018",
       caption = "M. Fiołka")

Tak samo trend ten przedstawiam w poszczególnych województwach szeregując je tym razem według malejącej mediany.

#Przygotowanie wykresy typu 4
plot4 = function(df, variable) df %>% 
  mutate(Województwo = Województwo %>% 
           fct_reorder(!!as.name(variable), median, .desc = TRUE)) %>% 
  ggplot(aes(rok, !!as.name(variable), color=Województwo))+
  geom_point(aes(fill=Województwo), color = "black", shape=23, size=2)+
  geom_path()+
  scale_x_continuous(breaks = seq(2006, 2018, 2))

ROLN_3179 %>% plot4("gospodarstwa")+
  ylab("Ilość gospodarstw rolnych")+
  labs(title = "Ilość gospodarstw rolnych w Polsce",
       subtitle = "Z podziałem według województw",
       caption = "M. Fiołka")

ROLN_3179 %>% plot4("powierzchnia")+
  ylab("Powierzchnia użytków rolnych [ha]")+
  labs(title = "Powierzchnia użytków rolnych w Polsce",
       subtitle = "Z podziałem według województw",
       caption = "M. Fiołka")

ROLN_3179 %>% plot4("gospodarstwo")+
  ylab("Gospodarstwo [ha]")+
  labs(title = "Średnia wielkość godpodarstw rolnych w Polsce",
       subtitle = "Z podziałem według województw",
       caption = "M. Fiołka")

Wnioski końcowe

Przeprowadzone zadanie pozwoliło mi na wyciągnięcie kilku bardzo istotnych wniosków. Po pierwsze uświadomiłem sobie, że wczytując dane do R muszę zwracać bardzo dużą uwagę jak te dane są przygotowane i jaki będzie efekt po zastosowaniu domyślnych parametrów funkcji importujących dane. Dane, szczególnie te pochodzące w rożnych arkuszy Excela często mogą być przygotowane w sposób niechlujny z licznymi scaleniami komórek które będą największym wrogiem poprawnego importu danych do R.

Należy także zwracać baczną uwagę na sam sposób zapisu danych. Nierzadko trzeba będzie zmienić ich formę do długiej lub szerokiej w zależności od potrzeb i wymagań funkcji wizualno-analitycznych które będę używać w R.

Nie mogę także zapominać o takich drobiazgach jak chociażby metoda zaokrągleń liczb zmiennoprzecinkowych i niezgodność Excela z normą IEC 60559.

Także import danych z plików csv może nieść ze sobą niejakie problemy. Mogą się pojawić problemy z nazwami zmiennych a nawet, jak to było w moim zadaniu, z poprawną ich ilością. Trzeba także pamiętać, że zapisując dane z arkusza Excel do pliku csv możemy całkiem nieświadomie utracić część dokładności danych tylko i wyłącznie przez sam sposób ich prezentacji w Excelu.

Bardzo istotne jest także aby z rozmysłem zaplanować i wykonać automatyczną walidację zaimportowanych danych, szczególnie gdy będę miał do czynienia z wieloma tysiącami rekordów i setkami zmiennych. Ręczne, a raczej wizualne przeglądanie dużych zbiorów danych może nie przynieść oczekiwanych efektów i łatwo będzie przeoczyć czające się w danych błędy i nieścisłości.