Daty urodzenia, płeć i oceny klientów

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

Problemem, który napotkasz podczas programowania, jest to, że czasami funkcja, którą uważasz za wystarczająco ogólną, musi zostać w jakiś sposób zmieniona. Czasami właściwą decyzją jest zmiana istniejącej funkcji, ale innym razem właściwą decyzją jest utworzenie nowej funkcji (być może na podstawie oryginalnej), którą można zmodyfikować w razie potrzeby bez łamania starego kodu, który ją używał. Dzieje się tak, gdy założenia dotyczące funkcji nie są spełnione i nie można jej łatwo dostosować. W naszym przypadku, co się stanie, jeśli będziemy chcieli wykorzystać dane clients do wykreślenia dat urodzenia naszych klientów za pomocą roku na osi x, miesiąca na osi y, koloru według płci i pokazania korekty oceny wielkość kropek? Cóż, założenia dotyczące danych osi x i osi y mogą zostać spełnione przy niewielkich przekształceniach danych, założenie dotyczące koloru jest już spełnione, ale założenie dotyczące rozmiaru wydaje się nie pasować do naszego poprzedniego modelu. W naszej funkcji graph_marginal_distributions() założyliśmy, że użyjemy shape jako czwartej zmiennej do reprezentowania zmiennych kategorialnych, ale wydaje się, że chociaż zmienna STARS jest technicznie czynnikiem, lepiej byłaby reprezentowana przy użyciu rozmiaru, a nie różnych kształtów. Fakt, że musimy zająć się osią x, osią y i założeniami dotyczącymi wielkości w specjalnych przypadkach dla danych clients, jest wystarczającym powodem, aby zdecydować się na stworzenie własnej funkcji na podstawie oryginalnej. Jeśli w pewnym momencie zechcemy połączyć te dwie funkcje w jedną, możemy to zrobić, ale na tym etapie nie ma potrzeby zbytniego komplikowania rzeczy dla siebie. W naszej funkcji  graph_marginal_distributions_clients_birth_dates()  wystarczy nam odebrać dane, nad którymi będziemy pracować (w tym przypadku cliets). Nie ma potrzeby stosowania innych parametrów, ponieważ wszystkie założenia zostaną w tym przypadku zakodowane na stałe w funkcji, ponieważ nie chcemy uogólniać kodu. Aby kod był bardziej czytelny, użyjemy krótkich nazw zmiennych, które będą zawierać ciąg znaków, którego użyjemy do stworzenia specyfikacji wykresu. Tym właśnie są te zmienne x, y, x_noise i y_noise. Jak wspomniano, musimy nieco przekształcić dane, zanim będziemy w stanie stworzyć wykres. Najpierw musimy zdezagregować BIRTH_DATE na BD_YEAR i BD_MOTH (BD jest skrótem od daty urodzenia (birth date)). Następnie dodajemy szum do dat, ponieważ gdybyśmy po prostu zachowali daty bez zmian, otrzymalibyśmy siatkę wartości, a nie rozkład, a to dlatego, że zarówno rok, jak i miesiąc są wartościami całkowitymi, więc byłoby dużo kropek jeden na drugim i dużo pustej przestrzeni między nimi, widzimy mieszaną wersję danych i dlatego musimy dodać do nich szum. Zobacz poniżej, jak obie te funkcje działają wewnętrznie. Po uzyskaniu naszych krótkich nazw i przekształceniu danych jesteśmy gotowi do utworzenia wykresu punktowego, tak jak robiliśmy to wcześniej. Tutaj pojawia się rozróżnienie między datami z hałasem i bez. Gdybyśmy użyli dat z szumem do wyświetlenia wartości tików dla osi, zobaczylibyśmy etykiety lat, takie jak 1953,51, 1973,85, 1993,23 i tak dalej. Oczywiście wyświetlanie osi roku z takimi wartościami nie jest intuicyjne. Podobnie dla osi y zobaczylibyśmy wartości miesięcy, takie jak 1,24, 4,09, 8,53 i tak dalej. Ten sam problem. Dlatego potrzebujemy dwie wersje danych, ta z szumem (wartościami rzeczywistymi), która jest używana do umieszczania punktów na wykresie, i ta bez szumu (wartości całkowite), która jest używana do wyświetlania wartości na osi. Na koniec dodajemy etykiety osi i wysyłamy wykres przez funkcję ggMarginal, tak jak to zrobiliśmy wcześniej:

graph_marginal_distributios_client_birth_dates <- function(data) {

x<- „BD_YEAR”

y <- „BD_MONTH”

x_noise <- „BD_YEAR_NOISE”

y_noise <- „BD_MONTH_NOISE”

data <- disaggregate_dates(data)

data <- add_dates_noise(data)

graph <- ggplot(data, aes_string(x_noise, y_noise, size = „STARS”, color = „GENDER”)) +

scale_x_continuous(breaks = seq(min(data[, x], max(data[, x]), by = 5)) +

scale_y_continuous(breaks = seq(min(datat[, y]) , max(data[, y]))) + geom_point() + ylab(„MONTH”) + xlab(„YEAR”)

return(ggMargina(graph, type = „historgam”))

}

disaggregate_dates <- funtion(data) {

}

disaggregate_dates <- function(data) {

data$BD_YEAR <- as.numeric(format(data$BIRTH_DATE, „%Y”))

data$BD_MONTH<- as.numeric(format(data$BIRTH_DATE, „%m”))

return(data)

}

Dodawanie szumu do danych jest proste, po prostu tworzymy nowe zmienne (BD_YEAR_NOISE i BD_MONTH_NOISE), które mają oryginał (liczbę całkowitą) wartości i dodajemy liczbę losową z rozkładu normalnego ze średnią 0 i odchyleniem standardowym 0,5. Potrzebujemy małego odchylenia standardowego, aby upewnić się, że nasze dane nie ulegają zbyt dużym zmianom:

add_dates_noise <- funtion(data) {

year_noise <- rnorm(nrow(data), sd = 0.5)

month_noise <- rnorm(nrow(data), sd= 0.5)

data$BD_YEAR_NOISE <- data$BD_YEAR + year_noise

data$BD_MOTH_NOISE <- data$BD_MONTH + month_noise

return(data)

}

Aby zdezagregować daty, po prostu tworzymy nowe zmienne (BD_YEAR i BD_MOTH), które zawierają odpowiednią wartość daty wyodrębnioną przy użyciu specyfikacji formatu daty, która zawiera R (%Y dla roku i %m dla miesiąca numerycznego) przekonwertowane na liczby (abyśmy mogli dodać do nich szum i je wykreślić). Przyjrzyjmy się datom urodzenia klienta za pomocą wykresu:

Teraz możemy łatwo utworzyć ten wykres w dowolnym momencie, bez martwienia się o szczegóły, jak go utworzyć za pomocą następującego kodu:

graph_marginal_distributions_lient_birth_dates(clients)

Ceny i rentowność według źródła białka i kontynentu

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

Jak zwykle zaczynamy rozwijać naszą funkcję wykresu. Jako parametry otrzymujemy data oraz zmienne osi x (x) i osi y (y), a w tym przypadku przewidujemy cztery przypadki, które odpowiadają kombinacjom obejmującym lub nie zmiennych color i shape dla wykresu. Wykonujemy standardowe sprawdzenie i tworzymy odpowiednią bazę wykresów. Oto inna część, którą nazywamy funkcją ggMrginal() pakietu ggExtra z grafem obiektu, który chcemy (w tym przypadku wykres bazowy plus warstwa punktów) i określ typ wykresu, który ma być używany dla rozkładów krańcowych. Możesz wybrać spośród density, histogram i boxplot. Wybieramy histogram:

graph_marginal_distributions <- function(data, x, y, color = NULL, shape = NULL_ {

if (is.null(color)) {

if (is.null(shape)) {

graph <- ggplot(data, aes_string(x,y))

} else {

graph <- ggplot(data, aes_string(x,y), shape = shape)

}

} else {

if (is.null(shape)) {

graph <- ggplot(data, aes_string(x,y), color = color))

} else {

graph <- ggplot(data, aes_string(x,y), color = color ,shape = shape))

}

}

return (ggMarginal(graph + geom_point(), type = „histogram”))

}

Teraz możemy łatwo tworzyć wykresy punktowe z marginalnymi rozkładami po bokach. Na pierwszym wykresie (po lewej) pokazujemy zależność między PRICE, COST, PROTEIN_SOURCE  i CONTINENT.

Zauważ, że istnieją bardzo rozróżnialne grupy. Na drugim wykresie (po prawej) pokazujemy zależność między PRICE, POFIT_RATIO PROTEI_SOURCE i CONTINENT. Zauważ, że znajdujemy tę samą relację, którą znaleźliśmy na naszych interaktywnych wykresach punktowych 3D, im wyższa wartość PRICE, tym wyższa wartość PROFIT_RATIO. Jednak są tutaj dwa interesujące ustalenia. Czy możesz powiedzieć, czym one są?

graph_marginal_distributions (sales, „COST”, „PRICE”, „PROTEIN_SOURCE”< „CONTINENT”)

Jeśli użyjesz funkcji graph_marginal_distributions() do sporządzenia wykresu kombinacji COST, PRIE, STATUS i PAID, nie powinien pojawić się żaden wzorzec, ponieważ te dystrybucje zostały losowo zasymulowane, aby uzyskać normalny rozkład oraz nie zastosowano do nich żadnego procesu wypaczania.

Wykresy punktowe z rozkładami łącznymi i krańcowymi

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

W poprzednich sekcjach widzieliśmy, jak tworzyć wykresy punktowe z ggplot(). Dlatego w tej sekcji skupimy się tylko na częściach, których wcześniej nie widzieliśmy. Naszym celem jest tworzenie wykresów punktowych, które nie tylko pokazują wykres punktowy, ale także rozszerzają go, pokazując krańcowe rozkłady na obu osiach. Są one nazywane wykresami marginalnymi i są przydatne do zrozumienia, w jaki sposób dane są rozkładane łącznie (dwie zmienne), a także marginalnie (jedna zmienna).

Wykresy zdezagregowanych danych za pomocą wykresów słupkowych

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

Tworzenie wykresów słupkowych jest przydatne przy przedstawianiu wyników osobom, które nie są zaznajomione ze statystykami, ale fakt, że wykresy słupkowe agregują informacje (tak jak to zrobiliśmy na wykresach słupkowych dla najlepszych wykonawców) oznacza, że ​​w rzeczywistości tracimy informacje z powodu zmniejszenie. Jeśli pracujesz z ludźmi, którzy rozumieją, czym są kwartyle, wykresy pudełkowe mogą być przydatną wizualizacją. Są łatwym sposobem na wyświetlenie poszczególnych rozkładów dla różnych poziomów zmiennej. Każde pole reprezentuje pierwszy kwartyl na dole, trzeci kwartyl na górze oraz medianę na linii pośrodku. Linie, które rozciągają się w pionie, sięgają do dowolnej obserwacji w granicach 1,5 * IQR, gdzie rozstęp międzykwartylowy (IQR) to odległość między pierwszym a trzecim kwartylem. Każda obserwacja powyżej 1,5 * IQR jest traktowana jako wartość odstająca i jest pokazywana indywidualnie. Naszym celem jest pokazanie wykresu słupkowego, który stworzyliśmy dla najlepszych wykonawców według PROFIT, ale w sposób zdezagregowany. Podczas korzystania z wykresów słupkowych trudność wynika z agregacji danych poprawnie, ale ponieważ nie musimy agregować danych do wykresów pudełkowych, ich tworzenie jest bardzo proste.

Nasza funkcja graph_top_boxplots() przyjmuje jako parametry wartość data, zmienne dla osi x i y, liczbę najlepszych elementów do pokazania jako n i opcjonalnie kolory linii i wypełnienia, odpowiednio jako c i f. Jeśli nie określono kolorów, używany jest wybór błękitów. Specyfikację kolorów należy podać w notacji HEX lub z nazwami kolorów R. Po prostu filtrujemy dane naszą funkcją filte_n_top i używamy warstwy boxplot() do tworzenia wykresów pudełkowych z odpowiednimi kolorami. Tytuł określamy również jako połączenie parametrów otrzymanych przez funkcję:

graph_top_n_boxplots <-  function(data , x, y ,n, f = „#2196F3” c = „#0D47A1”){

data <- filter_n_top(sales, n, x)

return (

ggplot (data, aess_string(x,y)) + geom__boxplot(fill = f ,color = c) + ggtitle (paste (y, „by” , x, „(Top” , n,  „)”)

)

}

Funkcja flter_n_top() otrzymuje jako parametry wartość data,  liczbę najlepszych wykonawców, którą chcemy zachować jako n, oraz identyfikator wykonawców jako by. Najpierw używamy funkcji aggregate() do agregowania zmiennej PROFIT według wybranego identyfikatora (który jest wysyłany jako lista, zgodnie z wymaganiami funkcji) i wykonujemy agregacja z operatorem sum w celu uzyskania sumy PROFIT na klienta. Gdybyśmy użyli operatora mean, zobaczylibyśmy wykres średniej PROFIT na klienta. Następnie porządkujemy wyniki, które są zawarte w drugiej kolumnie obiektu aggr w kolejności malejącej i bierzemy n górne wartości z pierwszej kolumny, która zawiera identyfikatory ( wartości CLIENT_ID w poniższym przykładzie). Na koniec przechowujemy w danych tylko te obserwacje, które odpowiadają najwyższym identyfikatorom, jakie mamy w obiekcie top.

filter_n_top <- funtion(data, n by) {

aggr <- aggregate(data$PROFIT , list(data[, by]), sum)

top <- aggr[order(-aggr[, 2]) [1:n] , 1]

data <- data[data [, by] %in% top, ]

return(data)

}

Teraz możemy łatwo powtórzyć wykres słupkowy, który utworzyliśmy w poprzedniej sekcji, używając wykresów pudełkowych.

Jak widać, mamy więcej informacji pokazanych na wykresie, ale tracimy możliwość łatwego znalezienia całkowitej wartości PROFIT dla każdego CLIENT_ID. Wybór typu wykresu zależy od tego, jakie informacje próbujesz przekazać:

grpah_top_n_boxplots(sales, „CLIENT_ID”, „PROFIT”, 10)

Przedstawianie najlepszych wyników za pomocą wykresów słupkowych

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

Wykresy słupkowe są jednym z najczęściej używanych narzędzi graficznych na świecie i ten rozdział nie jest wyjątkiem. W naszym ostatnim przykładzie wykresu słupkowego pokażemy, jak wykreślić wykresy najlepszych wyników dla danej zmiennej w kolejności malejącej. Naszym celem jest wykreślenie PROFIT lub Frequency na osi y oraz sparametryzowanej zmiennej dla osi x. Chcemy pokazać najbardziej efektywne n elementy dla zmiennej x w malejącej kolejności od lewej do prawej, jak pokazano na poniższym wykresie.

Aby to osiągnąć, otrzymujemy jako parametry dane (w tym przypadku sales), zmienną, która będzie używana dla osi x  liczbę najlepszych wykonawców, których chcemy pokazać n i czy chcemy użyć PROFIT na osi y lub nie (w takim przypadku użyjemy Frequency), używając wartości boolowskiej by_profit. Pierwszą rzeczą, którą robimy, jest sprawdzenie parametru by_profit; jeśli to TRUE, to agregujemy dane PROFIT dla każdego CLIENT_ID z funkcją aggregate() przy użyciu operatora sum ( chcemy całkowitego zysku od klienta, a nie średniego zysku od klienta). Następnie porządkujemy wyniki funkcją order() Znak minus (-) tuż przed wartością profit_by_client$x oznacza, że ​​chcemy porządku malejącego, a x następujący po profit_by_client jest spowodowane tym, że wynikiem funkcji aggregate() jest ramka danych z Group.1 i x kolumnami, które przechowują sumę CLIENT_ID i PROFIT, odpowiednio. Ponieważ chcemy uniknąć niepotrzebnego powielania kodu, kiedy zwracamy żądany wykres, musimy upewnić się, że oba przypadki w bloku if else używają tych samych nazw zmiennych, których użyjemy w funkcji ggplot(). Dlatego jawnie przypisujemy nazwy x i y_bar do ramki danych top_df. Jeśli zajrzałeś do wnętrza obiektu top_df podczas wykonywania, zobaczysz, że zawiera on zduplikowane dane z różnymi nazwami kolumn. Moglibyśmy się tym zająć, usuwając kolumny z nazwami, których nie chcemy, ale w tym momencie jest to niepotrzebne, ponieważ i tak jest to obiekt jednorazowy. Jednak w niektórych sytuacjach może to być problem z wydajnością, z którym musimy się uporać, ale nie w tym przypadku. W przypadku bloku else koncepcyjnie robimy to samo. Jednak technicznie realizujemy inaczej. W tym przypadku tworzymy tabelę, w której każdy wpis w tabeli jest unikalną wartością CLIENT_ID, a wartością każdego wpisu jest liczba razy CLIENT_ID pojawiająca się w danych (Frequency) i robimy to za pomocą funkcji table(). Następnie sortujemy te wyniki w porządku malejącym za pomocą funkcji sort() i bierzemy górę n wyników. Następnie wykorzystujemy te wyniki do utworzenia ramki danych top_df z odpowiednimi kolumnami. Zauważ, że potrzebujemy pomocniczej nazwy aux_name dla zmiennej x, ponieważ nie możemy utworzyć ramki danych przez określenie nazwy kolumny za pomocą zmiennej. Następnie kopiujemy dane z kolumny aux_name do rzeczywistej nazwy, której potrzebujemy (zawartej w zmiennej x). Na koniec tworzymy wykres i natychmiast zwracamy go bez pamięci pośredniej. W tym momencie szczegółowe informacje na temat tego, co robi każda linia w tej części kodu, powinny być dla Ciebie jasne, więc unikniemy ponownego wyjaśniania tego. Teraz możesz łatwo utworzyć n najlepszych wykresów za pomocą następującego kodu. Sugerujemy, abyś spróbował utworzyć podobne wykresy dla innych zmiennych kategorialnych (na przykład CONTINENT lub PROTEIN_SOURCE). Zwróć uwagę, że wartości CLIENT_ID w każdym przypadku są różne, co oznacza, że ​​klienci, którzy kupują najwięcej w The Food Factory, niekoniecznie są klientami, którzy generują na tym największy zysk:

graph_top_n_bars(sales, „CLIENT_ID” , 10)

graph_top_n_bars(sales, „CLIENT_ID” , 10, TRUE)

Chcieliśmy zacząć od prostego i pokazać podstawowe koncepcje pracy z funkcjami wykresów, zanim skomplikujemy sprawy w kolejnych sekcjach

Dodanie trzeciego wymiaru z kolorami

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą ogromną wdzięczność … oraz lepsze i ciekawsze TEKSTY. Dziękujemy”

Jak to często bywa, chcemy popracować nad utworzonym wcześniej kodem, aby dodać więcej funkcji. W tym przypadku chcemy dodać trzeci wymiar do wykresów za pomocą kolorów. Chcemy móc określić zmienną color, która będzie używana do dalszego dzielenia danych wykresu. Aby to osiągnąć, dodajemy parametr color do sygnatury funkcji za pomocą wzorca „NULL check” i w każdym przypadku dodajemy odpowiedni parametr. Dodanie parametru bezpośrednio w funkcji aes_string() nie jest problematyczne w przypadku NULL, ponieważ wartości NULL wskazują na ggplot(), nie chcemy aby użyć koloru do wypełnienia wykresu. Pamiętaj jednak, że nie jesteśmy w stanie użyć tej samej techniki z y. Zamiast tego sprawdzamy czy powinniśmy wysłać y, czy nie, i wysyłać to do funkcji ggplot() tylko wtedy, gdy mamy wartość inną niż NULL. Dodajemy również parametr position= „dodge” do funkcji geom_bar() tak, że otrzymujemy niezakumulowane wykresy słupkowe. Jeśli nie wyślemy tego parametru otrzymalibyśmy skumulowane wykresy słupkowe i dla tych konkretnych wykresów pomyśleliśmy, że wersja unstacked wyglądała lepiej. Możesz samemu wypróbować wersję skumulowaną. Spójrzmy na następujący kod:

graph)bars <- funtio(data, x,y =  NULL, color = NULL) {

if (is.null(y)) {

graph <- ggplot(datat, aes_string(,fill = color)) + geom_bar(position = „dodge”) + ggtitle(paste(x, „Frequency”)) + ylab(„Frequency”)

} else {

aggregation <- get_aggregation(y)

graph <- ggplot(data, aes_string(x,y, fill = color)) +  geom_bar(

fu.y = aggregation,

stat = „summary”, postion = „dodge”) +

ggtitle(paste(y, „by” , x)

)

}

if (class(data[, x] ) == „numeric”) {

graph <- graph + scale_x_continous (

breaks = seq(min(data[, x]),

max(data[, x]))

)

}

return(graph)

}

Zauważ, że mamy teraz cztery różne przypadki, które możemy chcieć przedstawić na wykresie, po pierwsze, gdy określimy tylko wartość x, po drugie, gdy określimy wartości x i y, po trzecie, gdy określimy wartości x i color, po czwarte , kiedy określimy wszystkie trzy z nich. Ponieważ specyfikacja ggplot() dla każdego z tych przypadków jest niepowtarzalna, nie możemy ich zwinąć do mniejszej liczby przypadków. Należy również pamiętać, że wewnątrz bloków warunkowych przechowujemy tylko kod, który jest specyficzny dla konkretnego sprawdzenia, a z bloku warunkowego wyciągamy kod, który nie jest specyficzny dla sprawdzenia i powinien być stosowany za każdym razem w dwóch przypadkach. To właśnie robimy z funkcjami ylab() i geom_bar() w zewnętrznym bloku if i z funcjami get_aggregation() i geom_bar() w zewnętrznym bloku else. W przeciwnym razie niepotrzebnie powtarzalibyśmy kod, co jest bardzo złą praktyką.

Teraz możemy stworzyć wykresy słupkowe, które opcjonalnie otrzymają trzeci parametr color (pokazany powyżej), a jeśli zostanie wysłany, zostanie użyty do podzielenia danych za pomocą kolorów. Zauważ, że w pierwszym wierszu poniższego kodu musimy jawnie wysłać parametr color.  Dzieje się tak, ponieważ pomijamy parametr y w wywołaniu funkcji, a jeśli nie podamy jednoznacznie parametru color, zostanie on zinterpretowany jako parametr x.

Począwszy od prostych aplikacji do wykresów słupkowych

Zaczniemy od prostych wykresów i przejdziemy do zaawansowanych wykresów. Pierwszy wykres, który utworzymy, to wykres słupkowy. Narysujemy tabelę częstotliwości, która pokazuje, ile zamówień sprzedaży mamy dla każdego numeru QUANTITY w naszej sprzedaży. Aby to zrobić, używamy funkcji ggplot(), używając sales jako danych i ustawiając estetykę za pomocą funkcji aes() z QUANTITY w osi x (pierwszy argument). Po utworzeniu podstawy wykresu za pomocą funkcji ggplot() dodajemy warstwy dla różnych obiektów, które chcemy zobaczyć na wykresie (na przykład słupki, linie i punkty). W tym przypadku my dodaj słupki z funkcją geom_bar(). Zwróć uwagę, jak ta warstwa jest dodawana za pomocą znaku + (plus) do podstawy wykresu. Następnie dodajemy kolejną warstwę dla tytułu z ggtitle(). Na koniec dodajemy specyfikację osi x z funkcją scale_x_continuous(), która pozwoli nam zobaczyć liczbę dla każdego słupka na wykresie. Jeśli nie dodasz tej warstwy, wykres może nie pokazywać liczby dla każdego słupka, co może być nieco mylące. Sposób, w jaki to określamy, polega na wysyłaniu sekwencji liczb, które powinny być używane jako przerwy (tam, gdzie pokazane są dane tickowe). Ponieważ liczby w danych mogą się różnić seq() od minimalnej liczby w zmiennej QUANTITY do maksymalnejy. To automatycznie pokaże prawidłowe liczby, nawet jeśli zmienna QUANTITY ma bardzo różne zakresy. Może się wydawać, że to dużo kodu do zbudowania prostego wykresu. Jednak to właśnie ilość kodu pozwala nam dokładnie określić, co chcemy zobaczyć na wykresie, jak zobaczysz w poniższych przykładach. Należy również zauważyć, że tylko funkcje ggplot() (z odpowiadającą im funkcją aes()) i geom_bar() są wymagane do faktycznego utworzenia wykresu. Funkcje ggtitle() i scale_x_continuous()  służą tylko do ulepszania wykresu:

graph <- ggplot(sales, aes(QUANTITY)) + geom_bar() +  ggtitle(„QUANTITY Frequency”) +  scale_x_continuous (

breaks = seq(min(sales[, „QUANTITY”]),

max(sales[, „QUANTITY”]))

)

Poniższy wykres przedstawia częstotliwość QUANTITY dla poprzedniego kodu:

Ponieważ będziemy tworzyć wiele wykresów słupkowych, chcemy uniknąć konieczności kopiowania i wklejania kodu, który właśnie napisaliśmy, i nie tylko, ale także uczynienia go bardziej elastycznym. Aby to osiągnąć, uogólnimy nasz kod, parametryzując go i rozważając różne scenariusze, które powinniśmy pokryć. Na co więc możemy chcieć, żeby nasza niestandardowa funkcja graph_bar nam umożliwiała? Na początek możemy chcieć określić różne zmienne dla naszej osi x i osi y. Aby to zrobić, musimy zrozumieć, jak funkcja geom_bar() działa wewnętrznie. Jeśli spojrzysz wstecz na kod, nigdy nie określiliśmy zmiennej dla osi y i ggplot() automatycznie użyliśmy liczby razy QUANTITY liczby pojawiającej się w danych (częstotliwość ).

A jeśli chcemy użyć wartości PROFIT dla każdej sprzedaży jako zmiennej dla osi y? W takim przypadku musimy zdać sobie sprawę, że mamy ponad 2000 potencjalnie różnych wartości, jak PROFIT kiedy QUNTITY wynosi dwa lub trzy, a mniej w pozostałych przypadkach. Musimy w jakiś sposób zagregować te wartości PROFIT, zanim będziemy mogli użyć PROFIT na osi y. Do agregowania danych można użyć dowolnej funkcji, która może zredukować wartości PROFIT do jednej wartości dla wszystkich transakcji, dla każdej wartości QUATITY. Jednak najbardziej typowe wybory wykorzystują średnią lub sumę. Średnia pokazałaby wykres, na którym widzimy średnią PROFIT dla każdej wartości QUANTITY. Suma pokaże nam łączną wartość PROFIT dla każdej  wartości QUANTITY. To samo dotyczyłoby, gdybyśmy chcieli użyć PROFIT_RATIO  (lub dowolnej innej zmienna numeryczna) na osi y. Najbardziej intuicyjne opcje wykorzystują sumę dla PROFIT (całkowity zysk) i średnią dla PROFIT_RATIO (średni wskaźnik zysku), więc użyjemy tych. W przypadku osi x możemy mieć zmienne jakościowe, numeryczne lub daty. W tym konkretnym przypadku domyślne opcje osi x są odpowiednie dla zmiennych kategorialnych i dat, ale nadal chcemy widzieć wszystkie liczby w znacznikach podczas pracy ze zmiennymi numerycznymi. Oznacza to, że musimy zapewnić sprawdzenie typu zmiennej na osi x, a jeśli jest liczbowa, to musimy wykonać odpowiednią korektę (taką samą, jaką widzieliśmy w poprzednim kodzie).

To, co wyjaśniliśmy wcześniej, jest zaprogramowane w naszej funkcji graph_bars(). Otrzymuje jako parametry dane oraz zmienne osi x i osi y. Najpierw sprawdza, czy podaliśmy określoną zmienną osi y. Jeśli nie otrzymamy zmiennej osi y , tworzymy wykres słupkowy tak jak to zrobiliśmy wcześniej (używając częstotliwości zmienna osi x domyślnie) i tworzymy odpowiedni tytuł za pomocą funkcji paste(). Jeśli otrzymamy zmienną dla osi y (co oznacza, że ​​jesteśmy w bloku else), to musimy dowiedzieć się, jaki typ agregacji musimy zrobić, i robimy to za pomocą naszej funkcji get_aggregation(), która zwraca sumę jako metodę agregacji, jeśli zostaniemy poproszeni o wykreślenie zmiennej PROFIT na osi y, i zwraca średnią w każdym innym przypadku. Następnie używamy tej nazwy funkcji jako wartości parametru fun.y (odczytywanego jako funkcja dla y) i określamy, że jesteśmy praca z funkcją podsumowującą (jeśli nie potrzebujesz agregacji dla zmiennej, powinieneś wysłać parametr stat = ‘identity’ do  funkcji geom_bar() i unikaj wysyłania go do parametru fun.y). Następnie w razie potrzeby określamy tytuł wykresu. Po bloku if else sprawdzamy, czy typ zmiennej dla osi x jest numeryczny, a jeśli tak, to stosujemy transformację nazw przedziałów:

graph_bars <- funtio(data, x,y = NULL) {

if (is.null(y)) {

graph <- ggplot(data, aes_string(x)) + geom_bar() + ggtitle(paste(x, „Frequeny”)) +

ylab(„Frequency”)

}else {

aggregation <- get_aggregation(y)

praph <- ggplot(data, aes_string(x,y) ) + geom_bar(fun.y = aggregation, stat = „summary”) + ggtitle(paste(y , „by” , x))

}

if (class(data[, x]) == „numeric”) {

praph <- praph + scale__continous (

breaks = seq(min(data[, ]). ma(datat[, ])

}

return (graph)

}

Podczas pracy z tą funkcją dotyczącą przypadków specjalnych zalecamy umieszczenie wielkości liter w  części if sprawdzainia, aby upewnić się, że wychwytujesz tylko przypadki specjalne, których szukamy, a w przeciwnym razie zwracasz wielkość ogólną. Jeśli zrobisz to na odwrót (najpierw sprawdzając przypadki ogólne), z pewnością napotkasz kilka trudnych błędów:

get_aggregation <- function(y) {

if (y == „PROFIT”) {

return(„sum”)

}

return(„mean”)

}

Teraz możemy stworzyć o wiele więcej wykresów słupkowych za pomocą naszej niestandardowej funkcji graph_bars():

graph_bars()(sales, „CONTINENT”)

graph_bars()(sales, „CONTINENT”, „PROFIT”)

graph_bars()(sales, „CONTINENT”, „PROFIT_RATIO”)

graph_bars()(sales, „PROTEIN_SOURCE”)

graph_bars()(sales, „PROTEIN_SOURCE”, „PROFIT”)

graph_bars()(sales, „PROTEIN_SOURCE”, „PROFIT_RATIO”)

Wszystkie poniższe wykresy są pokazane razem w celu łatwiejszej wizualizacji i zachowania miejsca, ale można je uzyskać jeden po drugim, wykonując kod samodzielnie.

Bloki konstrukcyjne do wysokiej jakości wykresów wielokrotnego użytku

Aby zdiagnozować stan biznesowy i znaleźć nowe możliwości, w tym rozdziale użyjemy różnego rodzaju wykresów. Jeśli chodzi o tworzenie statycznych wykresów wysokiej jakości, nie możesz się pomylić z pakietem ggplot2. Standardowe (wbudowane) wykresy w R nadają się do celów eksploracyjnych, ale nie są tak elastyczne ani ładne, jak wykresy ggplot2. Ponieważ chcemy pokazać, jak tworzyć wysokiej jakości wykresy, skupimy się na wykorzystaniu tego pakietu (i innych rozszerzających go) do wykresów statycznych. Jednak tylko od pakietu waniliowego ggplot2 działa dla wykresów statycznych, będziemy używać innych pakietów dla wysokiej jakości interaktywnych wykresów. Wadą tak dużej elastyczności podczas korzystania z ggplot2 jest to, że jest bardzo rozwlekły, przez co tworzenie wykresów wymaga dużej ilości kodu (szczególnie w porównaniu ze standardowymi wbudowanymi funkcjami graficznymi języka R). Chcemy uniknąć konieczności kopiowania i wklejania kodu, jeśli zamierzamy tworzyć podobne wykresy, dlatego opracujemy funkcje wielokrotnego użytku, których możemy użyć do łatwego tworzenia podobnych wykresów. Na przykład zamiast  powtarzanie więcej niż 10 linii kodu ggplot2, aby wprowadzić tylko kilka drobnych zmian:

grapph_1 <- a_function_that_returns_a_graph_object (

data_1, other_parameters_1

print(graph_1)

graph_2<- a_function_that_returns_a_graph_object (

data_2, other_parameters_2)

print(graph_2)

Czasami ludzie nie czują się komfortowo pracując w ten sposób, ale te funkcje wykresów są takie same, jak w przypadku innych funkcji. Jedyna różnica polega na tym, że jeśli tylko będzie to możliwe, zwrócimy obiekt wykresu zamiast innych typów danych. Te obiekty wykresów są ładne podczas pracy z ggplot2, ponieważ nie można ich przekazać innym funkcjom (nie wszystkie pakiety graficzne są zaprojektowane w ten sposób). Na przykład użyliśmy następującej funkcji save_png(), która pobiera obiekt wykresu i zapisuje go na dysku. Wszystko, czego potrzebowaliśmy, to opcjonalnie zmienić wymiary wykresu podczas zapisywania, aby upewnić się, że ma odpowiedni rozmiar:

save_png <-function(graph , save_to , width = 480, height = 480) {

png(save_to, width = width , height = height)

print(graph)

dev.off()

}

Jeśli pracujesz z wieloma wykresami, jeśli podczas tworzenia pojawi się błąd jeden z nich i wyświtlisz go, możesz być zdezorientowany, widząc poprzedni wykres, nad którym pracowałeś. Aby uniknąć tego zamieszania, możesz wykonać graph <- NULL po każdym wywołaniu funkcji print lub save, aby upewnić się, że jest oczywiste, gdzie wystąpił błąd.

Teraz, jeśli chcesz utworzyć wykres i zapisać go w obrazie 1024×768 pikseli, możesz użyć funkcji save_png  w następujący sposób:

graph <- a_function_that_returns_a _graph_object(data, parameters)

save_png(graph, 1024 768)

Standardowy sposób opracowywania analizy danych jest procesem iteracyjnym ściśle związanym z metodą naukową

Rozszerzenie naszych danych o wskaźniki zysków

Jak wspomniano wcześniej, naszym celem jest zdiagnozowanie obecnego stanu biznesu i znalezienie nowych możliwości. Na początek przyjrzymy się trzem wskaźnikom biznesowym z różnych punktów widzenia. Miarami są liczba sprzedaży, zyski i wskaźniki zysku. Mówią nam, ile fabryka żywności sprzedaje w ilości, ile zarabia (zysk) i gdzie są możliwości rozwoju (wskaźnik zysku). Należy pamiętać, że nie jest to profesjonalna ocena finansowa i, jak zawsze, nacisk kładzie się na techniki programowania, a nie na rzeczywiste wyniki analizy. Pierwszą rzeczą, którą musimy zrobić, jest dodanie do każdej sprzedaży odpowiednich zysków i wskaźnika zysku. Zakładamy, że jedynym sposobem, w jaki możemy policzyć zysk, jest dostarczenie zlecenia sprzedaży i czyzostało zapłacone. W przeciwnym razie określimy zysk i wskaźnik zysku jako zero. Jeśli sprzedaż kwalifikuje się do zysku, obliczenie zysku jest następujące: ZYSK = CENA – KOSZT – ZNIŻKA. Zauważ, że pozwala to na sprzedaż, która nie jest opłacalna (fabryka żywności traci pieniądze), jeśli KOSZT + ZNIŻKA> CENA. Jeśli istnieje zysk, to wskaźnik zysku to ZYSK / KOSZT. To, co właśnie opisaliśmy, jest zaprogramowane w funkcji add_profits():

add_profits <- funtion(data) {

unprofitable <- c(„RETURNED”, „CANCELLED”, „PENDING”)

data$PPROFIT <- data$PRICE – data$COST – data$DISCOUNT

data$PROFIT[data$STATUS %in% unprofitable] – 0

data$PROFIT[data$PAID ==”NO”] <- 0

data$PROFIT_RATIO <- data$PROFIT / data$COST

return(data)

}

Po zdefiniowaniu funkcji add_profits() stosujemy ją po prostu do naszych danych sprzedażowych w następujący sposób:

sales <- add_profits(sales)

Jak wspomniano wcześniej, naszym celem jest zdiagnozowanie obecnego stanu biznesu i znalezienie nowych możliwości. Na początek przyjrzymy się trzem wskaźnikom biznesowym z różnych punktów widzenia. Miarami są liczba sprzedaży, zyski i wskaźniki zysku. Mówią nam, ile fabryka żywności sprzedaje w ilości, ile zarabia (zysk) i gdzie są możliwości rozwoju (wskaźnik zysku). Należy pamiętać, że nie jest to profesjonalna ocena finansowa i, jak zawsze, nacisk kładzie się na techniki programowania, a nie na rzeczywiste wyniki analizy. Pierwszą rzeczą, którą musimy zrobić, jest dodanie do każdej sprzedaży odpowiednich zysków i wskaźnika zysku. Zakładamy, że jedynym sposobem, w jaki możemy policzyć zysk, jest dostarczenie zlecenia sprzedaży i czyzostało zapłacone. W przeciwnym razie określimy zysk i wskaźnik zysku jako zero. Jeśli sprzedaż kwalifikuje się do zysku, obliczenie zysku jest następujące: ZYSK = CENA – KOSZT – ZNIŻKA. Zauważ, że pozwala to na sprzedaż, która nie jest opłacalna (fabryka żywności traci pieniądze), jeśli KOSZT + ZNIŻKA> CENA. Jeśli istnieje zysk, to wskaźnik zysku to ZYSK / KOSZT. To, co właśnie opisaliśmy, jest zaprogramowane w funkcji add_profits():

add_profits <- funtion(data) {

unprofitable <- c(„RETURNED”, „CANCELLED”, „PENDING”)

data$PPROFIT <- data$PRICE – data$COST – data$DISCOUNT

data$PROFIT[data$STATUS %in% unprofitable] – 0

data$PROFIT[data$PAID ==”NO”] <- 0

data$PROFIT_RATIO <- data$PROFIT / data$COST

return(data)

}

Po zdefiniowaniu funkcji add_profits() stosujemy ją po prostu do naszych danych sprzedażowych w następujący sposób:

sales <- add_profits(sales)

Wymagane pakiety

Będziemy korzystać z następujących pakietów języka R. Pakiety te będą należeć do jednej z dwóch kategorii: pakiety do tworzenia wykresów i pakiety do pracy z danymi. Niektóre pakiety używane do interaktywnych wykresów (wykresy, które nie są statyczne, co oznacza, że ​​można je przesuwać po ekranie, aby zobaczyć różne kąty danych) będą wymagały do ​​działania zależności systemowych (na przykład rgl i rgdal), a inne będą działać za pośrednictwem Twojej przeglądarki internetowej (na przykład threejs, leaflet i plotly). Zostały przetestowane przy użyciu Google Chrome jako przeglądarki internetowej. Jeśli napotkasz jakiekolwiek problemy z konkretną przeglądarką internetową, spróbuj użyć Google Chrome. Grafika statyczna zostanie utworzona przy użyciu static i niektórych pakietów, które ją rozszerzają (na przykład viridis i ggExtra).

Pakiet : Zadanie

ggplot2 : Wysokiej jakości wykresy

viridis: Paleta kolorów dla wykresów

ggExtra : Wykresy z rozkładami krańcowymi

threejs : Interaktywna kula ziemska

leaflet :  Interaktywne mapy wysokiej jakości

plotly :  Interaktywne wykresy wysokiej jakości

rgl : Interaktywne wykresy 3D

rgdal :  Manipulowanie danymi geograficznymi

tidyr :  Manipulowanie danymi