Kilka lat temu stanąłem przed wyzwaniem dokładnej analizy rentowności projektów. Na koszty projektu składały się wynagrodzenia pracowników (programistów, testerów, konsultantów), koszty licencji, sprzętu. Ponieważ firma prowadziła wiele projektów w danym czasie o różnej wielkości programiści często pracowali przy różnych projektach rejestrując czas pracy na poszczególne projekty.
Dodatkowym aspektem, który był istotny było rozliczanie kosztów, które nie były przydzielone bezpośrednio do projektów takich jak koszty administracyjne, biuro, księgowość i wiele innych, które były wsypywane do jednego worka.
Fragment mojego oryginalnego działającego procesu w Alteryx, całość ma 60 elementów |
Przygotowanie danych do raportowania zajeło mi kilka dni i polegało na stworzeniu wielu widoków SQL, które przetwarzały dane z różnych baz danych. Rozwiązanie żmudne i bardzo trudne w modyfikacji, jak się później okazało. Każda zmiana w systemach z danymi czy sposobie liczenia wymagała przeprogramowywania widoków SQL. Z pomocą przyszedł Alteryx, przepisałem całe procesowanie danych, wprowadzając jednocześnie wiele poprawek i ulepszeń. Zainspirowało mnie to do napisania posta, w którym przedstawie w uproszczeniu rozwiązanie tego zadania.
Mamy 3 źródła danych. Timesheet, w którym znajdują się informacje o czasie spędzonym przez ludzi przy projektach (w moim przypadku Harvest)
Dane z timesheet (rejestracja czasu pracy) |
W tym przykładzie przyjąłem że wpisy są robione dziennie, z dokładnością do godziny, jeden pracownik może pracować przy wielu projektach.
Wynagrodzenia, plik zawiera informacje o miesięcznych kosztach wynagrodzenia osoby pracującej przy projekcie.
Informaje o całkowitych kosztach osobowych |
Identyfikator łączący dane o wynagrodzeniach z rejestracją czasu pracy to imię nazwisko osoby.
W rzeczywistości pobieranie danych o kosztach osobowych jest bardziej skomplikowane, w moim realnym przypadku dane pochodziły z dwóch ewidencji. Pierwszy to systemu HR z którego płace były księgowane na odpowiednio skonstruowanych kontach księgowych, stąd można było wyciągnąć całkowity koszt wynagrodzenia. Drugim były informacje z rejestru VAT, do którego trafiały faktury od ludzi na kontraktach również księgowane do odpowiedniej struktury kont. Dla uproszczenia pominę ten etap przetwarzania danych, ponieważ jest on silnie zależny od używanych narzędzi HR, ewidencji VAT, księgowości.
Trzecim źródłem danych są zaksięgowane koszty. Koszty mogą zawierać identyfikator projektu, wtedy uznajemy że są to koszty należące do danego projektu. W przeciwnym wypadku mamy koszty wspólne, które chcemy rozlokować według ustalonego klucza po wszystkich projektach.
Informacje o zaksięgowanych kosztach bezpośrednich i wspólnych |
Plik zawiera również kategorię kosztów (może to być np opis faktury albo numer konta księgowego).
Efekt, który chcielibyśmy osiągnąć w naszym raportowaniu to pełna analiza kosztów na projektach, zawieracjąca również rozlokowane koszty wspólne. Przykładowe analizy zrobione w Tableau, mogą wyglądać następująco:
Analiza kosztów projektów uwzględniająca podział kosztów wspólnych |
Podział kosztów wspólnych/bezpośrednich w projekcie, zastosowałem klucz czasowy |
Omówię teraz kolejne kroki całego procesu w Alteryx,
Proces przygotowania danych do analizy kosztów projektów w Alteryx |
Ponieważ wszystkie dane są analizowane w granulach miesięcznych dodałem pole MY, które składa się z roku i miesiąca. Użyłem tutaj funkcji datetimetrim([Data],'month')
Dodanie pola MY (Rok, miesiąc) |
Dodatkowo przy wynagrodzeniach dodałem kategorie wynagrodzenia. W źródle kosztów stworzyłem pole Typ, które przyjmuje wartość na "bezpośrednie" tam gdzie jest identyfikator projektu albo "wspólne" tam gdzie pole jest puste.
Aby zmiejszyć ilość danych w timesheet zgrupowałem je do miesiąca, osoby i projektu. Nie będziemy potrzebowali analizy wpisów poszczególnych dni.
Aby zmiejszyć ilość danych w timesheet zgrupowałem je do miesiąca, osoby i projektu. Nie będziemy potrzebowali analizy wpisów poszczególnych dni.
Zgrupowanie danych z timesheet do miesiąca, projektu, osoby |
Ponieważ wynagrodzenia stanowią koszty bezpośrednie projektów musimy połączyć je z informacjami z timesheet'a i dodać do tabeli kosztów (zrobić union). Na końcu wszystkie koszty rozdzielamy na wspólne i bezpośrednie.
Zebranie wszystkich kosztów bezpośrednich i wspólnych |
Koszty wspólne chcemy podzielić pomiędzy projekty według określonego klucza. W moim przypadku kluczem tym jest miesięczny rozkład czasu spędzonego nad projektami. Jest to o tyle uzasadnione że więcej czasu konsultantów oznacza więcej zużytych "zasobów" i kosztów wspólnych. Możemy tutaj zastosować również klucz związany z wartością projektów klucz mieszany albo pobrać podział z zewnętrznego źródła danych.
W naszym przykładzie podzielnik kosztów wspólnych jest wyliczany z timesheet'a i polega na obliczeniu sumy przepracowanych w miesiącu następnie połączeniu wynikowej tabeli z tabelą zawierającą wszystkie wpisy i wyliczeniu podzielnika.
Wyliczanie podzielnika kosztów wspólnych |
Po tej operacji łączymy koszty wspólne wydzielone wcześniej z wszystkich kosztów z podzielnikiem i wyliczamy ostateczny podział kosztów.
Ostateczny podział kosztów wspólnych według podzielnika czasowego |
Ostatecznie otrzymujemy koszty wspólne podzielone według projektów, które dołączamy (union) do kosztów bezpośrednich a całość eksportujemy do ekstraktu Tableau.
Union kosztów wspólnych i bezpośrednich |
Tadaam!!!, możemy zacząć raportować w Tableau a jeśli do danych dodamy informacje o przychodzie będziemy mieli pełną analizę rentowności tematów.
Mam nadzieję że przykład jest dla was inspirujący, chętnie posłucham komentarzy, waszych doświadczeń.
pr
KOMENTARZE