Dostępność lekarzy specjalistów, tutorial

Dwa dni temu, w tym wpisie przedstawialiśmy grafiki przygotowane przez Michała Kurtysa w ramach wakacyjnego projektu.

Pan Michał przygotował też krótki tutorial wyjaśniający jak samodzielnie zrobić takie wykresy w R. Poniżej wklejamy ten tutorial. Jest on moim zdaniem bardzo ciekawy i porusza wiele ciekawych technicznych problemów z analizą danych przestrzennych.

Dane
Informacje o kolejkach zapisane są w plikach Excelowych o rozszerzeniu xls.
Na każde województwo przypada takich plików kilka. Nas teraz będzie interesował tylko plik dotyczący świadczeń specjalistycznych, zawierający w nazwie skrót AOS.
W sumie jest więc 16 plików (po jednym na województwo), które wyglądają mniej-więcej w ten sposób.
01_AOS_31072013.xls
02_AOS_31072013.xls
...
16_AOS_31072013.xls

Województwa są ułożone alfabetycznie – najmniejszy numer odpowiada województwu dolnośląskiemu, a największy zachodniopomorskiemu. Aby powiązać numer z nazwą województwa przygotowałem plik województwa.csv, w którym są one wypisane w należytej kolejności.

wojwództwa.csv
WOJ. DOLNOŚLĄSKIE
WOJ. KUJAWSKO-POMORSKIE
WOJ. LUBELSKIE
WOJ. LUBUSKIE
WOJ. ŁÓDZKIE
WOJ. MAŁOPOLSKIE
WOJ. MAZOWIECKIE
WOJ. OPOLSKIE
WOJ. PODKARPACKIE
WOJ. PODLASKIE
WOJ. POMORSKIE
WOJ. ŚLĄSKIE
WOJ. ŚWIĘTOKRZYSKIE
WOJ. WARMIŃSKO-MAZURSKIE
WOJ. WIELKOPOLSKIE
WOJ. ZACHODNIOPOMORSKIE

Dane o granicach administracyjnych Polski pobrałem z Geoportalu. Ze względów licencyjnych początkowo chciałem wykorzystać OpenStreetMap. Gotowe pliki shapefile oferuje m.in. geofabrik/cloudmade. Niestety, jeżeli chodzi o Polskę nie miałem tam czego szukać – wszystkie mapy były zdeformowane.
Mapy z Geoportalu nie są dostępne w formacie shapefile. Na szczęście dzięki instrukcjom we wpisie Pawła Wiechuckiego przedstawianego na tym blogu ich własnoręczne stworzenie nie było trudne.

Biblioteki
Potrzebujemy następujących bibliotek:
** maptools – funkcja readShapePoly pozwala na wczytanie pliku ShapeFile.
** sp – do manipulacji i wyświetlania danych kartograficznych.
** rgeos, rgdal – funkcja spTransform, pozwala zmienić układ współrzędnych
** FNN – funkcja get.knnx – do regresji
** SmarterPoland – funkcję getGoogleMapsAddress ułatwi pobranie współrzędnych punktu o określonym adresie
** Cairo – do produkcji wykresów
** XLConnect – obsługa plików excela

Kod R

Zacznijmy od wczytania bibliotek.

1
2
3
4
5
6
7
8
library(maptools)
library(sp)
library(rgeos)
library(SmarterPoland)
library(FNN)
library(rgdal)
library(Cairo)
library(XLConnect)

Następnie zmiana katalogu roboczego. Wczytanie listy województw.

Z każdego pliku „aos” odczytujemy dane, które zaczynają się w 3 wierszu(razem z nagłówkiem) i mają 9 kolumn.
Postawnowiłem zmienić nazwy kolumn, gdyż oryginalne były niesłychanie długie.
Dodatkowo tworzymy dodatkowe kolumny – ID i nazwę województwa.

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
setwd("C:\\Users\\mic\\Documents\\eurostat\\nfzqueue\\new")
wojewodztwa = read.csv("wojewodztwa.csv", header=FALSE)
wojewodztwa$V1 = as.character(wojewodztwa$V1)
 
poradnie = data.frame()
for( i in 1:16) {
	filename = sprintf("%02d_AOS_31072013.xls", i)
	print(filename)
	wb = loadWorkbook( filename, create = FALSE)
	dane = readWorksheet(wb,sheet="Zestawienie", startRow = 3, startCol=0, endCol=8)
	dane$IDWojewodztwa = i
	dane$Wojewodztwo = wojewodztwa$V1[i]
	poradnie = rbind(poradnie, dane)
}
 
#zmiana nazwy kolumn
names(poradnie) = c(
"Nazwa.komorki.realizujacej",
"Kategoria",
"Nazwa",
"Nazwa.komorki",
"Adres",
"Liczba.oczekujacych",
"Liczba.skreslonych",
"Sredni.czas",
"ID.wojewodztwa",
"Wojewodztwo")

Pacjenci są podzieleni przez NFZ na dwie grupy – „przypadek stabilny” i „przypadek ostry”.
Graficznie przedstawiać będziemy wyłącznie dane o przypadkach stabilnych.

Dalej dzielimy adres na części składowe – nazwa miejscowości i ulica razem z numerem numer lokalu.

36
37
38
39
poradnie = poradnie[which(poradnie$Kategoria == "przypadek stabilny"), ]
poradnie$Miejscowosc = sapply(strsplit(poradnie$Adres, "\n"), function(x) x[1] )
poradnie$Ulica = sapply(strsplit(poradnie$Adres, "\n"), function(x) x[2] )
poradnie$Sredni.czas = as.numeric(poradnie$Sredni.czas)

Pobieramy współrzędne wyłącznie miejscowości w której znajduje się poradnia.
Jest to znacznie szybsze, a z pewnością nie potrzebujemy większej dokładności.
Po za tym Google ogranicza darmowy dostęp do usługi do 2500 zapytań dziennie.

Konstruujemy więc tabelę zawierającą nazwę miejscowości w jednej kolumnie, a w drugiej województwo w którym się ona znajduje.
Dodanie województwa pomaga uściślić zapytanie – istnieją przecież miejscowości, które noszą tę samą nazwę.

Funkcja unique eliminuje zduplikowane wiersze.
W pętli tworzymy nową zmienną region, w której zapisujemy jedynie nazwę województwa bez skrótu „Woj.” na początku.
Google Geocoding raczej nie trawi tego przedrostka.

Województwo łączymy z nazwą miejscowości i przekazujemy do argumentu city funkcji getGoogleMapAddress.
Może to wyglądać to dziwnie, ale zapytanie i tak zostanie skonstruowane poprawnie.

40
41
42
43
44
45
46
47
48
49
50
51
52
places_unique = data.frame( poradnie$Miejscowosc, poradnie$Wojewodztwo, check.names=FALSE)
places_unique = unique( places_unique )
names(places_unique) = c("Miejscowosc", "Wojewodztwo")
places_unique$Wojewodztwo = as.character(places_unique$Wojewodztwo)
places_unique$Miejscowosc = as.character(places_unique$Miejscowosc)
 
for( i in 1:nrow(places_unique) ) {
	region = strsplit( places_unique$Wojewodztwo[i], " " )[[1]][2]
	temp_coords = getGoogleMapsAddress(street="",city=paste(places_unique$Miejscowosc[i],",",region))
 
	places_unique$lat_wgs84[i] = temp_coords[1]
	places_unique$lng_wgs84[i] = temp_coords[2]
}

Zawczasu warto przygotować sobie współrzędne w układzie, który jest bardziej przyjazny do zadania:
Tworzymy zmienną typu SpatialPoints i określamy ich układ współrzędnych.
Współrzędne, które pobraliśmy są w układzie odniesienia WGS 84, znanym także jako EPSG:4326

Zmieniamy układ współrzędnych przy pomocy funkcji spTransform.

Ostatecznie łączymy dwie tabele przy pomocy funkcji merge.
Wreszcie mamy wszystkie interesujące nas wartości.

53
54
55
56
57
58
59
60
places_sp = SpatialPoints( cbind(places_unique$lng_wgs84, places_unique$lat_wgs84) )
proj4string(places_sp) = CRS("+init=epsg:4326")
places_sp = spTransform( places_sp, CRS("+init=epsg:2180"))
 
places_unique$lng = coordinates(places_sp)[,1]
places_unique$lat = coordinates(places_sp)[,2]
 
poradnie = merge(poradnie, places_unique)

Wczytanie pliku shapefile, który zawiera granice administracyjne województw.
Jest już w prawidłowym układzie współrzędnych – wystarczy tylko go określić.

61
62
wojewodztwa.shp = readShapePoly("geoportal\\woj.shp")
proj4string(wojewodztwa.shp)=CRS("+init=epsg:2180")

Funkcja generate_grid posłuży do wygenerowania kraty, która będzie pokrywać powierzchnię określonego pola.
Na obrazku widać punkty kraty. W istocie są to punkty, które będą służyły jako punkty startowe linii.

Pierwszy argument funkcji to ilość komórek kraty w osi X.
Komórka kraty ma być kwadratem, więc ich ilość w osi Y nie będzie przekazywana do funkcji.

Następnie wyliczamy topologię kraty. Przekazujemy:
** współrzędne dolnego, lewego rogu
** wymiary komórek
** ilość komórek
I na koniec zwracamy obiekt klasy SpatialGrid.

63
64
65
66
67
68
69
70
71
72
73
generate_grid = function( cell_n_x=1000, sp_polygons) {
	bbox_min = bbox(sp_polygons)[,1]
	bbox_max = bbox(sp_polygons)[,2]
	cell_width=((bbox_max-bbox_min)/cell_n_x)[1]
	cell_height=cell_width
	cell_n_y = ceiling(((bbox_max-bbox_min)/cell_height)[2])
 
	gt = GridTopology( bbox_min, c(cell_width,cell_height), c(cell_n_x,cell_n_y)  )
	sg = SpatialGrid(gt, CRS("+init=epsg:2180"))
	return(sg)
}

Jak widać na obrazku, część punktów kraty znajduje się poza granicami kraju.
Funkcja which_cells_inside zwraca indeksy komórek kraty, które znajdują się wewnątrz obiektu SpatialPolygons.

Wykorzystamy do tego funkcję over. Dla argumentów SpatialPoints i SpatialPolygons funkcja zwraca wektor o długości równej ilości punktów.
Wartości wektora mówią o tym, wewnątrz którego wielokąta znajduje się punkt.
Tych mamy 16 – odpowiadają województwom.

Jeżeli jest poza jakimkolwiek wielokątem składowym to danemu punktowi odpowiadać będzie wartość NA.

Szczegółowo wielokąt składowy to obiekt klasy Polygons:

74
75
76
77
78
79
80
81
82
83
84
85
> class(wojewodztwa.shp)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
> class(wojewodztwa.shp@polygons)
[1] "list"
> class(wojewodztwa.shp@polygons[[1]])
[1] "Polygons"
attr(,"package")
[1] "sp"
> length(wojewodztwa.shp@polygons)
[1] 16
86
87
88
89
90
91
92
93
which_cells_inside = function( sp_grid, sp_polygons) {
	grid_coords = coordinates(sp_grid)
	grid_points = SpatialPoints(grid_coords, CRS( proj4string(sp_grid)) )
	inside = over( grid_points, sp_polygons)
	proj4string(grid_points) = proj4string(wojewodztwa.shp)
	inside = which( inside$ID1 > 0 )
	return(inside)
}

Generowanie linii. W argumentach znajduje się zmienna cell_distance, która mówi co ile komórek kraty będzie znajdować się początek linii.
Gdy pisałem kod uznałem, że być może takie rozwiązanie się przyda. Teraz jestem pewien, że bardziej elegancko byłoby generować mniejszą kratę.
Co z resztą każdy zauważy.

Zwracamy obiekt typu SpatialLines. Strukura obiektów (Spatial)Line(s) jest podobna do Polygons.

Przypominam, że linie rysujemy od punktu kraty do najbliższej przychodni.
Musimy więc wiedzieć, która jest najbliższa.
Przekazujemy więc macierz knn_indices w której będzie to zapisane.

94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# sp_points to obiekt typu SpatialPoints, zawierający listę przychodni.
# cell_subset ogranicza kratę, tak by linie były prowadzone tylko z wewnątrz kraju. 
 
generate_lines = function( knn_indices, sp_grid, sp_points, cell_distance=1, cell_subset=NULL ) {
	cell_n_x = sg@grid@cells.dim[1]
	cell_n_y = sg@grid@cells.dim[2]
	#macierz ktora zawiera indeksy komorek w ktorych zaczynaja sie linie
	line_anchors = matrix(nrow=floor(cell_n_y/cell_distance), ncol=floor(cell_n_x/cell_distance))
	for( i in 1:nrow(line_anchors)) {
		line_anchors[i,] = seq(cell_distance, cell_n_x, by= cell_distance) +
						  rep(cell_n_x*cell_distance*i,floor(cell_n_x/cell_distance))
	}
	#tylko te linie ktorych poczatek jest w wybranych komorkach
	#na przyklad wewnatrz kraju
	line_anchors = intersect(line_anchors, cell_subset)
 
	#konstrukcja obiektow biblioteki sp
	line_starts = coordinates(sp_grid)[line_anchors,]
	closest_medic_idx = knn_indices[line_anchors,1]
 
	line_stops = coordinates(sp_points)[closest_medic_idx,]
	line_list = sapply( 1:nrow(line_starts), function(x) Line( rbind( line_starts[x,], line_stops[x,])) )
	line_obj = Lines(line_list, ID="a")
	sp_lines_obj = SpatialLines( list(line_obj) )
 
	return(sp_lines_obj)
}

Odpalamy funkcje.
W pętli przejdziemy po kolei po ka¿dym typie poradni.
Wewnątrz niej wybierzemy interesujące nas wiersze w tabeli poradnie.
Dzięki bibliotece Cairo łatwo zapiszemy wykres w wysokiej rozdzielczości.
get.knnx jest funkcją obsługującą regresję k-sąsiadów.
W pierwszym argumencie jest zbiór danych, w drugim zbiór zapytań.
W tej sytuacji interesuje nas wyłącznie najbliższy sąsiad, więc k wynosi 1.
Zwraca dwie macierze – w pierwszej zapisuje indeksy najbliższych sąsiadów, a w drugiej odległości.

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#wczytanie danych, etc..
#kod
sg = generate_grid( cell_n_x=100, wojewodztwa.shp)
inside_poland = which_cells_inside( sg, wojewodztwa.shp)
 
for( specialist_type in unique( (poradnie$Nazwa.komorki.realizujacej) ) ) {
	print(specialist_type)
	flush.console()
	specialist = poradnie[which(poradnie$Nazwa.komorki.realizujacej == specialist_type),]
	specialist_sp = SpatialPoints( cbind( specialist$lng, specialist$lat) ,CRS("+init=epsg:2180") )
 
	knn_res = get.knnx( specialist_sp@coords, coordinates(sg), k = 1 )
 
	sp_lines_obj = generate_lines( knn_res[[1]], sg, specialist_sp, cell_distance=1, cell_subset=inside_poland )
 
	Cairo(900, 700, file=paste(specialist_type,".png",sep=""), type="png", bg="white")
	plot(wojewodztwa.shp)
	plot(sp_lines_obj,add=T)
	#plot(specialist_sp,col="blue",lwd=2, add=T)
	title(main=specialist_type)
	dev.off()
}

Hidden track. Tworzenie map „kolorowych”. Tworzymy gęstszą kratę.
Następnie uzyskujemy punkty kraty i zmieniamy ich układ współrzędnych do WGS 84.

Jest to niezbędne – dla układu współrzędnych epsg:2180 funkcja spDistsN1 nie zwracała odległości w kilometrach.

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
sg = generate_grid( cell_n_x=500, wojewodztwa.shp)
inside_poland = which_cells_inside( sg, wojewodztwa.shp)
 
grid_points_wgs84 = SpatialPoints( coordinates(sg), CRS(proj4string(sg)))
grid_points_wgs84 = spTransform(grid_points_wgs84, CRS("+init=epsg:4326"))
gp_coords = coordinates(grid_points_wgs84)
 
for( specialist_type in unique( (poradnie$Nazwa.komorki.realizujacej) ) ) {
	print(specialist_type)
	flush.console()
	specialist = poradnie[which(poradnie$Nazwa.komorki.realizujacej == specialist_type),]
	specialist_sp = SpatialPoints( cbind( specialist$lng, specialist$lat) ,CRS("+init=epsg:2180") )
	specialist_coords_wgs84 = cbind( specialist$lng_wgs84, specialist$lat_wgs84)
 
	#knn_res = get.knnx( specialist_sp@coords, coordinates(sg), k = ifelse(nrow(specialist)>10, 10, nrow(specialist) ))
	knn_res = get.knnx( specialist_sp@coords, coordinates(sg), k = 1)
 
	knn_indices = knn_res[[1]]
	km_distances =  matrix( nrow=nrow( knn_indices ), ncol=ncol(knn_indices))
	closest_coords = apply( knn_indices, c(1,2), function(x) specialist_coords_wgs84[x,])
	closest_coords = matrix( closest_coords, ncol = 2, byrow=TRUE ) #2*ncol(knn_indices)
 
	for (rowID in 1:nrow( knn_indices ) ) {
		pts = matrix(closest_coords[rowID,],ncol=2)
 
		p = gp_coords[rowID,]
		km_distances[rowID,] = spDistsN1(pts, p, TRUE)
	}
	closest_distance = km_distances[,1]
	sg_df = SpatialGridDataFrame( sg, data.frame(closest_distance))
 
	#obszar położony poza granicami kraju ma kolor biały
	sg_df@data$closest_distance[-inside_poland]=0
	#80 jest górną granicą wartości na wykresie
	sg_df@data$closest_distance[ sg_df@data$closest_distance>80] = 80
 
	Cairo(900, 700, file=paste(specialist_type,"_c",".png",sep=""), type="png", bg="white")
	print(spplot( sg_df, panel = function(x,y,...){
	panel.gridplot(x,y,...,  )
	sp.polygons( wojewodztwa.shp )
	sp.points( specialist_sp, pch=".", col="black" )
	}, at=c(1:80), col.regions = rev(heat.colors(100)), main=specialist_type))
	dev.off()
 
}

Było to mój pierwszy ,,większy” projekt w R. Z pewnością wiele rozwiązań nie jest najlepszych, ale mimo wszystko mam nadzieję, że ten wpis będzie pomocny.

Statystyki konkursów NCN 2012

Na stronach NCN (a dokładniej tutaj) znaleźć można nowe statystyki konkursów przeprowadzonych przez NCN.
Jeżeli chodzi o kompletność i czytelność prezentowanych tez, jest wyraźny, duży krok do przodu w porównaniu z poprzednimi statystykami (przynajmniej moim zdaniem).
Wciąż jednak pewne rzeczy zgrzytają. Poniżej napiszę co ciekawego w tych statystykach NCN znalazłem i co chciałbym znaleźć, ale jeszcze tego tam nie ma, ale mam nadzieję, że będzie w kolejnych edycjach.

 

Pieniądze na wynagrodzenia

Ciekawą statystyką prezentowaną w raporcie jest informacja ile (średnio) pieniędzy w zakwalifikowanych wnioskach przeznaczane jest na wynagrodzenia (w raporcie pokazana jest również cała struktura kosztów: na aparaturę / koszty pośrednie i bezpośrednie).
To ciekawa informacja, szkoda tylko, że nie została przedstawiona w podziale na dyscypliny. Żyję w przekonaniu (bo nie mam twardych danych by to przekonanie je potwierdzić lub obalić), że średni udział kosztów aparatury w kosztach dla ,,nauk o życiu” jest wyższy niż dla ,,naukach humanistycznych”. W takim razie struktura wynagrodzeń w tych dyscyplinach też będzie inna a uśrednianie dwóch różnych struktur tylko zaciemnia obraz. Jaka jest ta struktora kosztów w różnych dyscyplinach? Mam nadzieje, że informacje o strukturze kosztów NCN będzie w przyszłości pokazywał w podziale na dyscypliny lub panele.

Czytaj dalej Statystyki konkursów NCN 2012

Ponieważ możemy! czyli o mapie na której widać 38 511 800 Polaków

Czy chcielibyście zobaczyć mapę Polski, na której zaznaczony jest każdy Polak? Wizualizację ponad 38 milionów osób rozrzuconych mniej lub bardziej losowo na obszarze ponad 300 tysięcy km^2? Jeżeli w tej chwili w waszych głowach zapala się pytanie 'po co?’, nie czytajcie dalej. Jeżeli zaś już widzicie taką mapę oczami wyobraźni, poniższy wpis bardzo Wam się spodoba.

Celem tego projektu było pokazanie w interesujący sposób informacji z Narodowego Spisu Powszechnego 2011. Jedną z inspiracji była interaktywna mapa przedstawiająca spis powszechny w Stanach Zjednoczonych o której przeczytać można tutaj. W ramach dzisiaj opisywanego projektu opracowano mapę Polski składającą się z ponad 38 milionów punktów, każdy punkt odpowiadający jednej osobie, rozmieszczenie punktów odpowiadające rzeczywistej gęstości zaludnienia.

Ten wpis jak i cały projekt został wykonany przez Pawła Wiechuckiego w ramach wolontariatu dla naszej fundacji.
Kiedyś podczas jakiejś prezentacji usłyszałem, że organizacje non-profit to ciekawe miejsca, ponieważ przyciągają osoby, które za darmo tworzą rzeczy bezcenne, dlatego że chcą by te rzeczy powstały. Projekt Pawła Wiechuckiego jest świetnym przykładem takiej aktywności. Nie było łatwo, trzeba było pokonać wiele trudności, których nie widać przy bardziej standardowych zastosowaniach [np. R nie potrafi wygenerować w formacie wektorowym kwadratu o boku mniejszym niż pół punktu tzn. 1/144 cala, nie można też wygenerować dowolnie dużego rysunku, a przynajmniej 100GB RAM to za mało, sama mapa to połowa sukcesu, bufor drukarki może być niewystarczający by taką mapę wydrukować itp], ale się udało.

Przy okazji dziękuję też firmie Iqor Polska za udostępnienie plotera drukującego na 42 calowej rolce, dzięki temu udało się wydrukować mapę na połączonych arkuszach o łącznej powierzchni ponad 6 metrów kwadratowych, powiesić na ścianie i zrobić zdjęcie młodej wskazującej kropkę przedstawiającą babcię.

Nieszablonowa mapa Polski

Paweł Wiechucki

Czytaj dalej Ponieważ możemy! czyli o mapie na której widać 38 511 800 Polaków

Nauka w Polsce 2013, czyli słów kilka o nowym raporcie ministerstwa

W poprzednim tygodniu ukazał się raport ,,Nauka w Polsce 2013” [znajdziesz go tutaj]. Jest on prawdopodobnie opracowany przez ministerstwo [,,prawdopodobnie” ponieważ w raporcie brakuje informacji kto jest autorem]. Jest w nim wiele wykresów, z których część można by było zrobić lepiej. I o tym co można zrobić lepiej będzie dzisiejszy wpis.

,,Nowoczesna” forma

Raport ma bardzo ,,nowoczesną” formę, składa się głównie z wykresów. Brak w nim komentarzy czy wniosków dotyczących prezentowanych wyników, jedynie gdzieniegdzie można znaleźć objaśnienia jak pewne współczynniki były liczone.
Przez co w pierwszej chwili można odnieść wrażenie, że to jedynie slajdy z prezentacji/streszczenia [sprawdzałem nawet w słowniku języka polskiego czy taki zbiór wykresów można nazywać raportem].

Do większości wykresów brakuje informacji o źródle danych, które są przedstawiane. Utrudnia to weryfikację prezentowanych liczb. Niestety do standardów raportów OECD jest jeszcze daleko, tam przy poważnych raportach do każdego wykresu dodane są odnośniki do źródeł danych.

Sytuacja z tym raportem jest kuriozalna. Mamy zbiór wykresów, w części nie najlepiej przygotowanych, nie ma odnośników do danych źródłowych, nie ma tabel z liczbami, na postawie których te wykresy powstały. Brakuje też wniosków czy podsumowania, które można by zweryfikować.
Rodzi to wręcz obawy, że z tego raportu każdy odczyta sobie wnioski jakie będą mu pasować, a nieuporządkowana formuła raportu nie pozwoli na ich weryfikację.

Wiele interesujących tematów

W raporcie poruszanych jest wiele tematów. Można zobaczyć wykresy traktujące o finansowaniu nauki w Polsce (chciałem napisać przeczytać, ale akurat przeczytać się nie da).
Począwszy od wysokości nakładów na naukę, informacji co w jakiej wysokości jest finansowane, jest o tym, ile jest uczeni i pracowników naukowych w różnych województwach (choć nie jest jasne jak liczeni są ci, co pracują w rożnych województwach), ile jest jednostek badawczych, jakiego typu i jak bardzo aktywnych. I wiele innych informacji.

Zachęcam do przejrzenia tego raportu.
Aktualna wersja ma podtytuł ,Edycja 1′, może kolejne edycje będą miały już liczby i wnioski dzięki czemu będzie to ciekawe źródło informacji.

Co można by w raporcie poprawić?

Zaczniemy od retorycznego pytania: czy jeżeli w raporcie nie ma spisanych wniosków i nie ma podanych źródeł to trudno się czegoś przyczepić?
Wybierzmy kilka rodzynków. Powiedzmy, że w ramach działalności typu ,,watchdog”.
Dwie pierwsze to oczywiste grube błędy, kolejne to sugestie.

Czytaj dalej Nauka w Polsce 2013, czyli słów kilka o nowym raporcie ministerstwa

Mapa wartości samochodów

Wczoraj graficznie przedstawialiśmy jak wygląda rozkład cen w zależności od roku produkcji. Co ciekawe w skali logliniowej zależność pomiędzy ceną a rokiem produkcji jest bardzo bliska liniowej dla wielu marek. Zakładając zależność liniową możemy wyznaczyć dwie liczby dla każdej marki. Średnią procentową zmianę ceny w ciągu roku i orientacyjną średnią cenę auta wyprodukowanego w roku 2006. Rok 2006 został wybrany by móc porównywać ceny różnych marek ze sobą, oczekiwaną cenę w roku 2006 wyznaczmy bez względu na to czy dany samochód był produkowany w tym roku czy nie (wykorzystamy liniową zależność aby oszacować średnią cenę w roku 2006).
Na poniższej mapie zaznaczono każdą markę w układzie dwóch współrzędnych, utraty wartości w ciągu roku oraz orientacyjnej ceny w roku 2006. Należy zaznaczyć, że wartość procentowa na osi OX to różnica pomiędzy średnimi cenami dwóch kolejnych roczników, a nie różnica pomiędzy ceną danego rocznika w dwóch kolejnych latach. Tą drugą wartość będzie można ustalić za rok.

 

Dodatkowo na tej mapie wielkością punktu zaznaczono jak wiele aut było wykorzystanych do oszacowania obu wskaźników (cztery wielkości do 100, od 100 do 200, od 200 do 500, powyżej 500) oraz z jakiego kraju pochodzi dana marka. Jeżeli chodzi o pochodzenie to z uwagi na przejęcia oraz przenoszenie produkcji do innych krajów należy tę informację traktować z dystansem.

To co ciekawego widać na tej mapie to że są auta tanie, które nie tracą wiele z czasem na wartości (np Fiat Uno), drogie, które też dużo na wartości tracą (Porche Cayenne), tanie które dużo tracą (Dacia Logan), drogie które mało tracą (Volkswagen Bora) i całe spektrum innych możliwości.

Aby łatwiej ten wykres się analizowało możemy dokonać zbliżenia

Volkswagen Passat traci średni 16% na rok i kosztuje z roku 2006 około 40tys. W otoczeniu znaleźć można np Toyote Corolle Verso. Na prawo znajdziemy Forda S-Maxa o podobnej cenie ale za to znacznie większej utracie na wartości.

Zobaczmy co się stanie jeżeli zagregujemy modele z tej samej marki.

 

Otrzymujemy mapę marek, im bardziej na lewo tej mapy tym mniejsza utrata na wartości im niżej tym tańsze auta.