R, Kair, Cairo, wiek a liczba lat nauki

Dziś będzie o wielu tematach jednocześnie.
Po pierwsze przeglądając materiały z konferencji useR znalazłem informacje o pakiecie Cairo. Wstyd, że o tym pakiecie dowiedziałem się tak późno. Ale ciesze się że się dowiedziałem wystarczająco by napisać dlaczego.

Cairo to biblioteka do grafiki 2d umożliwiająca zapisywanie grafiki do różnych formatów, między innymi wektorowych formatów PS, PDF, SVG, ale również do rastrowych formatów PNG itp. Biblioteka pozwala na stosowanie takich miłych technik jak anty-aliasing itp. poprawiających wygląd grafiki, szczególnie rastrowej, szczególnie w porównaniu z tym co R produkuje domyślnie. Zobaczmy czy biblioteka ta odmieni rysunki na tym blogu. Zaczniemy od prostego przykładu, w którym porównamy liczbę lat nauki z liczbą przeżytych lat, oczywiście bazując na zbiorze danych o Diagnozie społecznej.

Aby nie zaciemniać tego co najważniejsze, nie będę tutaj wklejał kodu R, który generuje wykres. Osoby zainteresowane znajdą ten kod tutaj. W kodzie tym wykorzystujemy funkcję xyplot() z pakietu lattice do wygenerowania obiektu wyk opisującego wykres.

Porównamy wygląd grafiki zapisanej poleceniami png(grDevices), CairoPNG(Cairo) i CairoSVG(Cairo). W przypadku tej ostatniej funkcji rozmiary podajemy w calach, w poprzednich dwóch w pixelach.

Poniżej wygenerowane pliki. Pierwszy w formacie png wygenerowany przez funkcję png.

Drugi w formacie png ale wygenerowany biblioteka Cairo.

I trzeci w formacie SVG, nie każda przeglądarka potrafi go wyświetlić, jeżeli poniżej nie widać obrazka to znaczy że trzeba zmienić przeglądarkę.

Czy widać różnice? Ogromne, szczególnie na krzywych które w pierwszym przypadku są niesamowicie spixelowane w drugim przypadku już znacznie gładsze. Widać to szczególnie w dużym powiększeniu. W dużym powiększeniu widać też zalety wektorowego formatu SVG, krzywe będą gładkie bez względu jak bardzo je powiększymy. Oczywiście za format wektorowy trzeba zapłacić. W zbiorze danych Diagnoza Społeczna znajdują się dane dla kilku tysięcy osób. Gdyby każdą z nich zaznaczyć punktem to wektorowy format w którym każdy z tych punktów byłby opisany, zajmowałby kilkanaście MB. Nie najlepiej jak na grafikę do umieszczenia w internecie. Dlatego też na trzecim z powyższych obrazków są tylko krzywe bez punktów.

Dyskusje o technikaliach mamy już za sobą, zobaczmy co w ogóle widać na tych wykresach. Porównujemy liczbę lat nauki versus wiek. Dane bierzemy zarówno dla osób ankietowanych w roku 2000 jak i 2011. Znaczna część osób uczestniczy w obu badaniach, dla tej grupy spodziewamy się, że lat przybędzie ale lat nauki niekoniecznie.
Ciągła linią zaznaczyłem wygładzona medianę, kropkowaną linią wygładzony kwantyl rzędu 90%.

Dla osób które obecnie są w wieku 40-60 lat, mediana liczby lat edukacji to 11, dla osób w wieku 25 lat ta mediana jest już o 2 lata wyższa, efekt coraz większej liczby osób studiujących i też zmian w systemie edukacji. Niższą medianę liczby lat edukacji u osób w wieku >70 lat można wytłumaczyć wojną.

Przyjrzyjmy się jeszcze kwantylowi rzędu 90%. Dla 30latków kwantyl ten wynosi 18 lat nauki, czyli ponad 10% dzisiejszych 30latków ma na koncie 18 lub więcej lat nauki. To sporo, ale dla niektórych uczenie się nigdy się nie kończy. W stosunku do stanu sprzed 11 lat coraz więcej lat spędzamy na edukacji. Czy jako społeczeństwo jesteśmy dzięki temu mądrzejsi?

Rysujemy rozkład cen krok po kroku, część 4

Czas na ostatnią część wyjaśnień krok po kroku jak konstruowane były wykresy o cenach mieszkań.
Tym razem wykorzystamy wykres pudełkowy pokazany na wpisie tutaj do pokazania rozkładów cen w dzielnicach Warszawy.

Wczytujemy pierwsze 33 linie kodu z poprzedniego wpisu a następnie uruchamiamy linie 142-187. Wyjaśnijmy od razu po co była funkcja nazwyIprocenty(). Otóż w pakiecie lattice dosyć łatwo narysować wykres w podziale na poziomy pewnej zmiennej grupującej. Grupa obserwacji odpowiadająca poszczególnym poziomom rysowana jest na kolejnym panelu. Nazwy poziomów znajdują się w nagłówku panelu. W naszym przykładzie funkcja nazwyIprocenty() zmieniła nazwy wszystkich poziomów w ten sposób, że do nazw dzielnic dodano cztery liczby określające procentową zmianę ceny w określonej dzielnicy (zmianę liczoną na różne sposoby, zobacz komentarze wewnątrz tej funkcji).

Dzięki temu warunkując po zmiennej dzielnica2 powinniśmy uzyskać zbiór wykresów pudełkowych w rozbiciu na dzielnicę.
Poniższy kod od kodu z poprzedniego wpisu różni się praktycznie wyłącznie formułą cenam2~dataF|dzielnica2.

Wadą tego wykresu są ponownie dzielnice w których mało jest oferowanych mieszkań. Usuńmy dzielnice w których jest mniej niż 1000 mieszkań średniej wielkości oferowanych do sprzedaży w ostatnich 4 latach. Poniżej prezentujemy tylko kod usuwający odpowiednie wiersze, następnie używamy tego samego kodu co powyżej aby wygenerować wykres dla dzielnic, tym razem już tylko 12.

Rysujemy rozkład cen krok po kroku, część 2

Kontynuując temat z wczoraj, narysujemy rozkład cen mieszkania dla każdej z  dzielnic Warszawy.

Punktem wyjścia jest przygotowanie danych, wykonajmy pierwsze 32 linie tak jak w poprzednim wpisie.

Aby wyświetlić na rożnych panelach dane dla kolejnych dzielnic, wystarczy zmodyfikowac formułę na cenam2~data|dzielnica, oraz za zabiór danych wskazać mieszkaniaKWW2011Warszawa2.

Kolejne panele przedstawiają kolejne dzielnice, ale ich kolejność jest alfabetyczna. Taka sama jak kolejność poziomów zmiennej czynnikowej dzielnica. Nie zawsze kolejność alfabetyczna będzie najlepsza. Użyjemy funkcji reorder by zmienić kolejność poziomów tak by odpowiadała medianie ceny metra kwadratowego w danej dzielnicy. Kod generujący obrazek będzie taki sam, zmieni się tylko kolejność dzielnic.

Dla niektórych dzielnic jest mało punktów, co powoduje, że trudno mieć zaufanie do wyznaczonego trendu. Tym razem usuniemy te dzielnice, dla których nie ma przynajmniej 2000 wierszy. Kod generujący wykres jest bez zmian, usuwamy tylko obserwacje z dzielnic w których obserwacji było mniej niż 2k.

Ceny mieszkań spadły o 20%!!! albo wzrosły o 5%!!! albo się nie zmieniły!!!

Ostatnio w gazetach pojawiło się kilka artykułów w których aby przyciągnąć więcej czytelników zastosowano bardzo głupie tytułu w stylu ,,Realne ceny mieszkań spadły/ mieszkania potaniały o 25% także w Warszawie”. Artykuły np. [gazeta na podstawie open finance], [raport oferty net], [wyborcza biz finanse] mają tą cechę wspólną, że podają liczby bez żadnej refleksji na temat tego jak liczby uzyskano i jakie ma to znaczenie. W każdym z przypadków badano zmianę ceny w trakcie ostatnich czterech lat (czyli od tzw górki 2007) tak więc i poniższe rozważania oprzemy na tym okresie.

Celem tego wpisu jest nie polemika z tym co to znaczy realna cena mieszkania, ani z tym czy spadek wynosił 25% czy nie, ale z tym, że jeżeli nie porównujemy ceny tego samego mieszkania to mówiąc o zmianie wartości należy dokładnie opisać zmianę wartości czego liczymy, bo wyniki mogą być bardzo różne. Dla każdej dzielnicy Warszawy na 8 sposobów policzymy jak zmieniały się ceny przez ostatnie 4 lata. I w każdym przypadku otrzymamy 8 różnych liczb opisujących zmianę ceny.

We wczorajszym wpisie dyskutowaliśmy różnice pomiędzy cenami m2 w dużych i małych mieszkaniach różnych dzielnic. Pisząc o strukturze koszyka pokazaliśmy, że badanie ,,tak po prostu” średniej mieszkań sprzedanych/oferowanych nie ma sensu jeżeli nie uwzględnimy jakie mieszkania (powierzchnia/lokalizacja/stan itp) wchodzą w skład koszyka. Poniżej będziemy podawać różne liczby ale nie po to by dowieść że cena zmieniła się o X%, ale by zaznaczyć jakie problemy wiążą się z analiza zmiany ceny. Wszystkie ceny to ceny ofertowe, nie pokrywają one całego rynku i pewnie nie są całkowicie reprezentacyjne. Nie mniej powinno być fajnie popatrzeć na obrazki.

Przyjrzyjmy się dzielnicy Żolibórz. Oś OY jest w skali logarytmicznej, pionowe szare linie oznaczają koniec roku. Na poniższym wykresie dla każdego miesiąca począwszy od września 2007 wyznaczamy wykres pudełkowy opisujący zmiany cen w danym miesiącu. W środku pudełka czarną kropką oznaczamy medianę cen w danym miesiącu. Następnie czterema liniami oznaczamy następujące trendy:

* linią czerwoną zaznaczamy trend liniowy wyznaczony na bazie wszystkich obserwacji używając regresji odpornej (funkcja rlm() w R), regresja odporna ma nas uchronić przed wpływem pojedynczych obserwacji odstających, nie uchroni nas jednak przed obciążeniem wynikającym z tego, że większość ofert sprzedaży dotyczy ostatniego roku.\ i to ten okres będzie głównie wpływał na ocenę trendu liniowego. W nagłówku wykresu podano cztery procenty, pierwszy z nich opisuje o ile ten trend liniowy się zmienił prze ostatnie cztery lata (-15.6%).

* linią niebieską zaznaczamy trend liniowy wyznaczony na bazie median cen używając regresji odpornej. Czyli najpierw wyznaczamy mediany cen w każdym miesiącu a później wyznaczamy trend. Tym razem trend nie jest już dominowany przez ceny z ostatniego roku. W nagłówku wykresu druga liczba to zmiana tego trendu przez ostatnie 4 lata (-7.6%, czyli około połowa poprzedniej liczby),

* linia zielona i trzecia liczba odpowiadają trendowi wyznaczonemu za pomocą lokalnego wygładzania. Ponieważ używanie trendu liniowego wydaje się być słabo uzasadnione, porównujemy trend liniowy z trendem wyznaczonym przez funkcję loess z parametrami rodzina = symmetric, span = 2/3, stopień wielomianu = 1. Oczywiście dla innych parametrów otrzymalibyśmy inne wygładzenie, te jednak wygląda w miarę dobrze. Trzecia liczba nagłówku opisuje o ile się zmieniła ocena trendu we wrześniu 2011 w stosunku do września 2007 (-11.1%).

* linia fioletowa łączy medianę ceny m2 mieszkań ferowanych we wrześniu 2007 z medianą ceny m2 mieszkań oferowanych we wrześniu 2011. Ponieważ danych o sprzedaży we wrześniu 2007 jest niewiele, ta linia wykazuje spora zmienność pomiędzy dzielnicami. Dla Żoliborza zmiana medianowej ceny m2 pomiędzy wrześniem 2007 a wrześniem 2011 to (-3.6%).

 

Mamy więc cztery liczby, począwszy od spadku niecałych 4% w cztery lata do spadku o ponad 15%. A to jeszcze nie wszystko. Te same analizy możemy zrobić uwzględniając strukturę wielkości mieszkań. Odrzućmy więc mieszkania najmniejsze i największe (te największe najwięcej straciły) i zajmujmy się tylko cenami m2 mieszkań o powierzchni od 49 do 68m2. Poniżej odpowiadający im wykres z oznaczeniami jak powyżej,

Jak widzimy ograniczając się tylko do segmentu mieszkań o średniej powierzchni otrzymujemy 4 inne trendy i cztery inne % opisujące zmianę tych trendów.

Która z tych 8 liczb lepiej opisuje zmianę cen mieszkań? Oczywiście to zależy jaki aspekt zmiany chcemy analizować. Ceny mieszkań zmieniają się w sposób złożony. Mnie najbardziej podoba się  trend lokalnie wygładzany, nie zakłada on liniowości tak jak linie czerwone i niebieskie a jednocześnie czerpie informacje z prawie wszystkich danych (w przeciwieństwie do linii fioletowej która patrzy tylko na skrajne miesiące).

W przypadku trendu nieliniowego nadużyciem jest stwierdzenie, że ceny spadały o X%, ponieważ w różnych okresach zachowywały się różnie.

Poniżej wyniki dla wszystkich dzielnic, pierwszy wykres bazuje na wszystkich obserwacjach, drugi dotyczy tylko mieszkań o średniej wielkości.

 

 

Zakup kontrolowany, czyli wybieramy auto dla rodziny

Od prawie czterech lat szukam rodzinnego auta. Ostatnio rozmawiałem ze znajomym, który był zdziwiony dlaczego to taki trudny wybór. Jak to stwierdził wystarczy wprowadzić dane do komputera, określić funkcje celu i wybrać najlepszą opcję. Hmmm, może i tak.

Mamy już dane zebrane  z serwisu otomoto.pl, więc spróbujmy zobaczyć jak wyglądają rozkłady cen w czasie różnych marek. Informacje o zmianach cen znaleźć można na wielu serwisach, np. autocentrum.pl, ale tutaj przedstawimy te zmiany lepiej i czytelniej. Tak jest, konkurujemy z eutotax.

Aktualnie wysoko na liście rozważanych marek stoi Passat. Poniższe wykresy będą wykonane dla prawie każdej marki obecnej w zbiorze danych cenyAut2011. Ale dla ustalenia uwagi zobaczmy  wygląda cena Passata i jak ta cena zależy od roku produkcji (oś OX), pojemności i typu silnika (poszczególne panele) oraz wersji marki (rożne kolory kropek).

Na panelu po prawej stronie podana jest nazwa marki, liczba ofert sprzedaży aut tej marki, oraz informacja o rozkładzie cen dla aut produkowanych w danym roczniku. Każda niebieska kropka to jedna oferta sprzedaży. Czerwona kropka oznacza medianę cen, czerwone kreski oznaczają odpowiednio kwantyle 5-25% i 75-95%. Ceny są w skali logarytmicznej. Na wykresie mamy tylko dane o autach używanych, w tej kategorii mediany cen układają się prawie idealnie w linii prostej, co odpowiada stałej procentowej zmianie w cenie. Tę informację jeszcze wykorzystamy.

Z wykresów widzimy, że passaty  w dieslu z silnikiem 1900cm3 są dosyć popularne. 5 lat to jeszcze wersja B6. Zobaczmy teraz jak wyglądają podobne wykresy dla konkurencji.

 

Obrazki dla innych marek można znaleźć w katalogu tutaj.

Lub korzystając z poniższej listy marek, dla której zebrano takie wykresy.
Alfa Romeo 147, Alfa Romeo 156, Alfa Romeo 159, Alfa Romeo 166, Alfa Romeo GT,
Audi A2, Audi A3, Audi A4, Audi A5, Audi A6, Audi A6 Allroad, Audi A7, Audi A8, Audi Q5, Audi Q7, Audi TT,
BMW 118, BMW 316, BMW 318, BMW 320, BMW 325, BMW 330, BMW 520, BMW 525, BMW 530, BMW 535, BMW 730, BMW 740, BMW X3, BMW X5, BMW X6,
Chevrolet Aveo, Chevrolet Lacetti,
Chrysler 300C, Chrysler Grand Voyager, Chrysler Pacifica, Chrysler PT Cruiser, Chrysler Sebring, Chrysler Town & Country, Chrysler Voyager,
Citroen Berlingo, Citroen C1, Citroen C2, Citroen C3, Citroen C4, Citroen C4 Picasso, Citroen C5, Citroen C8, Citroen Saxo, Citroen Xsara, Citroen Xsara Picasso,
Dacia Logan,
Daewoo Lanos, Daewoo Matiz, Daewoo Nubira,
Dodge Grand Caravan, Dodge RAM,
Fiat 500, Fiat Brava, Fiat Bravo, Fiat Croma, Fiat Doblo, Fiat Ducato, Fiat Grande Punto, Fiat Marea, Fiat Multipla, Fiat Palio, Fiat Panda, Fiat Punto, Fiat Seicento, Fiat Stilo, Fiat Uno,
Ford C-MAX, Ford Fiesta, Ford Focus, Ford Focus C-Max, Ford Fusion, Ford Galaxy, Ford KA, Ford Mondeo, Ford Mustang, Ford S-Max, Ford Transit,
Honda Accord, Honda Civic, Honda CR-V, Honda Jazz,
Hyundai Accent, Hyundai Coupe, Hyundai Getz, Hyundai i30, Hyundai Matrix, Hyundai Santa Fe, Hyundai Tucson,
Jaguar S-Type, Jaguar X-Type,
Jeep Cherokee, Jeep Grand Cherokee,
Kia Carens, Kia Carnival, Kia Cee’d, Kia Picanto, Kia Rio, Kia Sorento, Kia Sportage,
Lancia Lybra,
Land Rover Discovery, Land Rover Freelander, Land Rover Range Rover,
Lincoln Town Car,
Mazda 2, Mazda 3, Mazda 323, Mazda 323F, Mazda 5, Mazda 6, Mazda 626, Mazda CX-7, Mazda MPV, Mazda Premacy, Mazda RX-8,
Mercedes-Benz A 140, Mercedes-Benz A 160, Mercedes-Benz A 170, Mercedes-Benz A 180, Mercedes-Benz B 180, Mercedes-Benz C 180, Mercedes-Benz C 200, Mercedes-Benz C 220, Mercedes-Benz CLK 200, Mercedes-Benz E 200, Mercedes-Benz E 220, Mercedes-Benz E 270, Mercedes-Benz E 280, Mercedes-Benz E 320, Mercedes-Benz E 350, Mercedes-Benz ML 270, Mercedes-Benz ML 320, Mercedes-Benz ML 350, Mercedes-Benz S 320, Mercedes-Benz S 350, Mercedes-Benz S 500, Mercedes-Benz SLK 200, Mercedes-Benz Sprinter, Mercedes-Benz Vito,
Mini Cooper,
Mitsubishi Carisma, Mitsubishi Colt, Mitsubishi Eclipse, Mitsubishi Galant, Mitsubishi L200, Mitsubishi Lancer, Mitsubishi Outlander, Mitsubishi Pajero, Mitsubishi Space Star,
Nissan Almera, Nissan Almera Tino, Nissan Micra, Nissan Navara, Nissan Note, Nissan Patrol, Nissan Primera, Nissan Qashqai, Nissan Terrano, Nissan X-Trail,
Opel Agila, Opel Astra, Opel Combo, Opel Corsa, Opel Frontera, Opel Insignia, Opel Meriva, Opel Omega, Opel Signum, Opel Tigra, Opel Vectra, Opel Vivaro, Opel Zafira,
Peugeot 106, Peugeot 107, Peugeot 206, Peugeot 206 CC, Peugeot 207, Peugeot 306, Peugeot 307, Peugeot 308, Peugeot 406, Peugeot 407, Peugeot 607, Peugeot 807,
Peugeot Partner,
Porsche 911, Porsche Cayenne,
Renault Clio, Renault Espace, Renault Grand Espace, Renault Grand Scenic, Renault Kangoo, Renault Laguna, Renault Megane, Renault Modus, Renault Scenic, Renault Thalia, Renault Trafic, Renault Twingo,
Renault Vel Satis,
Rover 25, Rover 45, Rover 75,
Saab 9-3, Saab 9-5,
Seat Alhambra, Seat Altea, Seat Arosa, Seat Cordoba, Seat Ibiza, Seat Leon, Seat Toledo,
Skoda Fabia, Skoda Felicia, Skoda Octavia, Skoda Roomster, Skoda Superb,
Smart Fortwo,
Subaru Forester, Subaru Impreza, Subaru Legacy,
Suzuki Grand Vitara, Suzuki Jimny, Suzuki Swift, Suzuki SX4,
Toyota Auris, Toyota Avensis, Toyota Aygo, Toyota Camry, Toyota Celica, Toyota Corolla, Toyota Corolla Verso, Toyota Land Cruiser, Toyota RAV-4, Toyota Yaris,
Volkswagen Bora, Volkswagen Caddy, Volkswagen Caravelle, Volkswagen Fox, Volkswagen Golf, Volkswagen Golf Plus, Volkswagen Jetta, Volkswagen Lupo, Volkswagen Multivan, Volkswagen New Beetle, Volkswagen Passat, Volkswagen Passat CC, Volkswagen Polo, Volkswagen Sharan, Volkswagen Tiguan, Volkswagen Touareg, Volkswagen Touran, Volkswagen Transporter,
Volvo C30, Volvo S40, Volvo S60, Volvo S80, Volvo V40, Volvo V50, Volvo V70, Volvo XC 70, Volvo XC 90