Analiza własnych finansów

Czytanie zajmie Ci około 8 minut

Jak nauczyć się analizy danych? Robiąc małe i duże projekty.

Kiedyś napisałem post o tym jak się przemieszczam w którym odsłoniłem dość dużo swojej prywatności, dzisiaj ciąg dalszy.

Postanowiłem, że mocniej wezmę się za Pythona i to co potrafię dość szybko zrobić w R będę robił w Pythonie. To najlepszy sposób na naukę – zmuszać się w pewnym sensie do przełamywania własnych oporów. Z drugiej strony – od dawna chodził za mną tekst związany z analizą własnych wydatków.

Połączmy więc to razem i przeanalizujmy w Pythonie (dość prostym) moje wydatki z karty kredytowej.

Karty używam od wielu lat i z reguły płacę kartą kredytową za wszystko (za co płacę kartą). A potem hurtem spłacam cały miesiąc i mam z głowy. W tym czasie gotówka na koncie może pracować w inny sposób (o ile jakaś jest).

Kartę mam w mBanku i co miesiąc dostaję ma maila podsumowanie ruchu na karcie. Przychodzi to w pliku HTML, od zawsze w jednym formacie. Zaczynajmy więc!

Na początek jak zawsze potrzebujemy jakichś pakietów, dość standardowych (seaborn bo wydaje mi się przyjaźniejszy i ładniejszy niż goły matplotlib):

Tak jak wspomniałem – każdy wyciąg jest w jednym pliku. Przygotujemy więc funkcję, która przeczyta konkretny plik i zwróci nam data frame z interesującymi nas elementami wyciągu:

Jak widzicie (po kodzie, albo komentarzach) trochę się tutaj dzieje, wiele niepotrzebnego. Można to posprzątać (właściwie powinno się) i zostawić to co konieczne:

  • datę operacji
  • kwotę operacji
  • szczegóły operacji

Jeśli nie macie wyciągów comiesięcznych to możecie wykorzystać eksport listy operacji z Waszego banku do jakiegoś CSV (każdy to powinien mieć, jeśli nie ma to proponuję zmienić bank) zamiast przechodzenia plik po pliku, o tak:

…po prostu wciągnąć cały CSV do data frame wyciag. Wystarczy zapewne jakieś:

i odpowiednie nazwanie kolumn. Reszta kodu z tego postu powinna zadziałać.

Każdego dnia kartą można zapłacić wiele razy. Jeśli będziemy chcieli policzyć średnie dzienne wydatki (a będziemy chcieli) to napotkamy na problem typu pięć zakupów po 20 zł w ciągu dnia. Uśredniając to wyjdzie nam, że średni dzienny wydatek to 20 zł. A przecież wydaliśmy stówę! Dlatego policzymy sumę wydaną każdego kolejnego dnia (zagregujemy dane do dni):

Mamy zebrane surowe dane, czas trochę je przygotować. Chociażby posortować zgodnie z czasem i rozbić datę na poszczególne składowe (feature engineering mocno ;-) – wyciągamy rok, miesiąc i dzień tygodnia):

Teraz już możemy przejść do analizy.

Na początku zobaczmy ile wydawałem każdego kolejnego dnia. Uwaga – żeby chronić nieco swoją prywatność na obrazkach liczby będą zamazane albo zafałszowane.

png

Jak widać z reguły wydaję mniej więcej tyle samo. Są oczywiście jakieś pojedyncze większe wydatki (zakupy sprzętu, wakacje).

Widać też jedną dziurę pod koniec 2016 roku. Okazuje się, że brakuje w tym miejscu wyciągów (i nie mam pojęcia dlaczego).

Zobaczmy skumulowane wydatki, czyli ile w sumie wydałem od początku.

png

Linia rośnie, bo podczas wczytywania kolejnych wyciągów usunąłem wszystkie spłaty karty. A z takich danych można by przeprowadzić prostą regresję liniową. Ale to nie tym razem.

Czy jest jakiś pattern mówiący o tym, że w danym okresie wydaję więcej? Na przykład w podziale na dni tygodnia? Uśrednijmy więc dane według dni tygodnia i zobaczmy wynik na wykresie słupkowym:

png

Dziwnym może być, że w sobotę wydaję najwięcej. Ale po chwili zastanowienia nie jest to wcale takie dziwne – w soboty głównie robię zakupy na cały (albo pół) kolejny tydzień. Takie z serii trzy wypchane po brzegi siaty (ja nie dam rady wszystkiego na raz z samochodu przynieść?)

png

Ma to jakiś sens (znając moje wydatki), ale nie do końca jest poprawne. Dlaczego? W jednym roku na przykład w czerwcu planowałem wakacje, bukowałem hotele itd. I czerwiec jest wyższy. Ale w pozostałych latach tak wcale nie musiało być i wydatki były normalne. Czy uśrednienie wydatków dziennych po miesiącach pokaże nam, że w czerwcu zazwyczaj wydaję więcej? Trochę tak, ale trochę nie.

Zobaczmy łączne wydatki rok po roku:

png

Wygląda na to że wydaję coraz więcej. Chyba czas zainteresować się jakimiś ograniczeniami ;)

Ale idąc tym samym tropem – policzmy sumę dla każdego miesiąca w kolejnych latach. Użyjemy do tego pivot_table() zamiast grupowania – wynik łatwo narysować z pomocą heatmap() z pakietu seaborn:

png

Tutaj wyraźnie widać w którym miesiącu płaciłem za wakacje. Zwróćcie uwagę (w kodzie), że nie są to sumy, a pierwiastki kwadratowe z sum. To zabieg na potrzeby zdynamizowania wykresu – aby większe (ale nawet nie jakoś bardzo) wydatki bardziej się wybijały. Sztuczka dobra, ale skala staje się przez to nieczytelna i trudniejsza w odbiorze. Lepszy na ogół jest logarytm dziesiętny – wówczas widać różnice na poziomie rzędów wielkości (10 a 100 i tak dalej), ale tutaj się nie sprawdziło. Wydatek dwa razy większy (np. 4 i 2 tysiące) po zlogarytmowaniu nie jest różnicą na poziomie 10 i 100.

Zobaczmy ile najczęściej wydaję jednorazowo, czyi jaki jest rozkład kwot poszczególnych wydatków:

png

Jak można się się spodziewać najwięcej jest kwot stosunkowo małych (do 100 złotych). Tych większych jest bardzo małych (i co z tego, skoro najbardziej obciążają kieszeń?).

Ciekawszą analizą jest to u kogo zostawiamy swoje pieniądze. Policzmy więc u kogo ile w sumie, ile razy i jaka jest średnia wydatków:

Najwięcej wydałem u… (kwoty prawdziwe, ale nazwy zmieniłem ręcznie):

szczegoly_operacji kwota_pln_float
0STACJA BENZYNOWA7933.02
1DUŻY ZAKUP5998.00
2CARREFOUR4814.83
3DUŻY ZAKUP4470.00
4DUŻY ZAKUP3748.00
5DUŻY ZAKUP3731.18
6WAKACJE3382.28
7AUCHAN3288.40
8GIOVANNI2720.30
9DUŻY ZAKUP2371.15
10BELLA PASTA2271.00
11DUŻY ZAKUP2183.83
12KOLPORTER2090.69
13DUŻY ZAKUP2050.00
14WAKACJE1840.38
15DUŻY ZAKUP1758.00
16POSMAKUJ1748.50
17DUŻY ZAKUP1732.00
18WAKACJE1716.05
19DUŻY ZAKUP1700.00

Najwięcej w sumie wydałem na benzynę. Później mamy codzienne zakupy w hipermarketach, kilka pojedynczych dużych wydatków, sporo miejsc do których chodzę na lunche. Dużą część zajmują też hotele czy inne miejsca związane z wakacjami.

Weźmy pod uwagę kilka często odwiedzanych miejsc i zobaczmy średnie wydatki w tych miejscach (tutaj odpuściłem sobie anonimizację – nie jest tajemnicą, że mieskam w Warszawie i pracuję w okolicach centrum):

szczegoly_operacjimean_kwota
0STAJCA BENZYNOWA214.405946
2CARREFOUR209.340435
7AUCHAN173.073684
62KAUFLAND89.180000
61STOKROTKA35.687000
49PIEKARNIA&BISTRO22.075000
22Spozywczy DZIADEK21.114237
10BELLA PASTA19.410256
116BELLA PASTA LE DINH TUNG19.055556
118ZABKA15.380909
12KOLPORTER15.260511
16POSMAKUJ14.570833
54Sajgonki14.310345
8GIOVANNI12.892417

Na paliwo wydaję średnio około 200 zł, podobnie na zakupy. Okazuje się, że Carrefour jest średnio droższy niż Auchan – na przestrzeni kilku lat aż tak bardzo mój średni koszyk zakupów się nie zmienił. Ale z drugiej strony – w Auchan kupowałem wcześniej, teraz raczej korzystam z Carrefour. Być może większa średnia ma związek z inflacją?

Dziadek to lokalny sklep tuż obok osiedla, gdzie wpada się po coś na szybko lub w drodze z pracy. Podobnie ze Stokrotką i Kauflandem – raczej nie robię tam często zakupów, a jeśli już to jakieś mniejsze (na jedną siatę ;). Kioski czy Żabka to głównie fajki, a cała reszta to lunchownie.

Znając poszczególne punkty i wiedząc gdzie dają lunch możemy zobaczyć coś więcej na ten temat:

png

Osoby które pracują tu gdzie ja rozpoznają zmianę Giovani na Posmakuj w jednym z biurowców. Bella Pasta kiedyś była knajpą typu włoskiego i tam się nie stołowałem. Ale kiedy zaczęła być lepszym chińczykiem niż Sajgonki – przerzuciliśmy się z ekipą na to miejsce. Widać też, że Bella Pasta ma od jakiegoś czasu drugi terminal.

Swoją drogą ciekawostką jest to, że zmieniła się nazwa lokalu (bo to nie jest już dawno Bella Pasta) a nie zmienił identyfikatora terminala płatniczego…

Kolejna ciekawostka to ile średnio wydaję na lunch? A może nie tyle średnio, co najczęściej?

png

Widać ograniczenie kwoty do 30 zł już na początku. To dlatego, żeby odsiać sytuacje typu ja płacę a potem mi oddasz, które przecież się zdarzają. Widać też modę (najczęściej występującą wartość) na poziomie 12-13 złotych ale zdarzają się wyskoki za piętnastaka, 18-19 zł czy nawet ponad 20 zł. Gdzie? Dowiemy się z innego wykresu:

png

Bella Pasta i Bella Pasta 2 to ta sama knajpa, dwa różne terminale – prawie idealnie pokrywają się te krzywe. Okazuje się, że Giovani był tańszy niż Posmakuj dostępny w naszym biurowcu. Sajgonki były tańsze niż chińczyk występujący tutaj pod nazwą Bella Pasta, ale wierzcie mi – różnica w smaku warta jest tych kilku złotych.

No ładny wykres, ale ile się trzeba naklepać kodu żeby go dostać. Każda lokalizacja osobno, trzeba je znać przy pisaniu kodu. Można inaczej:

png

To tyle na dzisiaj. Wiecie teraz gdzie jadam i za ile. Oraz kiedy robiłem większe zakupy do domu albo jechałem na wakacje (precyzyjniej: kiedy płaciłem za nie).

Analiza własnych wydatków to bardzo dobra zabawa (może też przerazić), a na pewno dobra szkoła filtrowania, agregowania i rysowania danych. I o to właśnie w tym odcinku chodziło.

Ciekawe ile osób zauważy jak słabo zamaskowane są dane.

3 myśli na “Analiza własnych finansów”

  1. Świetny tekst , pracuję aktualnie nad zastosowaniem R w raportach dla księgowości , przykład z analizą wyciągu bardzo mi pomógł , dziękuję.

  2. Dziękuję, że trafiłam na takie praktyczne podejście do analizy. Lubię życiowe rzeczy, które odrazu mogę wprowadzić.
    Rzadko kiedy komentuje, ale trafiłeś w sedno. Zagłębie się w dalsze posty.
    Sama zdobywam wiedzę na temat analizy i to mnie strasznie fascynuje.

Dodaj komentarz

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