# warto w tym głównym chunk'u (setup) poustawiać sobie odpowiednie parametry, żeby inne chunk'i je "dziedziczyły"
# nie musimy pamiętać tych opcji i wpisywać ich z reki, wystarczy kliknąć przycisk obok -->
# Modify Chunk Options
# Wprowadzenie
# Opisz cel raportu oraz krótki zarys tego, co będzie omawiane. Wyjaśnij, dlaczego analiza jest przeprowadzana i jakie pytania badawcze ma na celu odpowiedzieć.
Niniejszy raport przedstawia analizę sprzedaży produktów w sklepie internetowym za okres trzech kwartałów 2024 roku. Celem analizy jest identyfikacja najlepiej sprzedających się kategorii produktów oraz ocena trendów sprzedażowych.
# Jeśli uznacie Państwo, że dodanie grafiki wzmocni / urozmaici raport - czemu nie...
# czasem warto posiłkować się jakimś mocnym cytatem, który uczynimy mottem, lejtomotiwem raportu
# albo zacytujemy prezesa czy innego przełożonego, żeby "zdobyć punkty" przed zbliżającą się rozmową ewaluacyjną :P
# cytat tworzymy znakiem >
“Sprzedaż to sztuka słuchania i odpowiadania na rzeczywiste potrzeby klientów, tworząc bardziej sprawiedliwe i zrównoważone społeczeństwo.” - anonimowy Lewak
“Sprzedaż to domena wytrwałych i ambitnych, przecierających szlaki i kreujących nowe możliwości w dynamicznej gospodarce.” - anonimowy Prawak
# Skąd dane?
# Wskaż źródło danych, opisując ich pochodzenie, autorów (jeśli istnieją) oraz sposób, w jaki zostały pozyskane. Wyjaśnij także, dlaczego te dane są istotne dla analizy.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# ten element jest charakterystyczny głównie dla raportów tworzonych w tego typu narzędziach
# nazywajmy chunk'i, żeby mieć dostęp do sensownego Outline'u ---->
# nazwy chunk'ów muszą być unikalne w ramach raportu, w przeciwnym razie plik się nie sknit'uje
library(tidyverse)
library(knitr)
library(kableExtra)
library(lubridate)
library(DT)
library(plotly)
library(highcharter)
library(RColorBrewer)
# Dane sprzedażowe
sprzedaz <- data.frame(
id_transakcji = 1:150, # klucz tabeli
data = sample(seq(as.Date('2024-01-01'), as.Date('2024-09-30'), by="day"), 150, replace=TRUE),
id_produktu = sample(paste0("P", 1:15), 150, replace=TRUE), # klucz tabeli
ilosc = sample(1:10, 150, replace=TRUE),
cena_jednostkowa = sample(c(29.99, 49.99, 79.99, 99.99, 149.99, 199.99), 150, replace=TRUE)
)
# można, nie trzeba pokazać je poglądowo odbiorcy
head(sprzedaz) # <- w raporcie będzie wyglądać brzydko, w rozumieniu - technicznie
## id_transakcji data id_produktu ilosc cena_jednostkowa
## 1 1 2024-09-08 P8 1 99.99
## 2 2 2024-09-13 P10 10 199.99
## 3 3 2024-03-21 P12 6 199.99
## 4 4 2024-04-03 P8 1 199.99
## 5 5 2024-05-15 P15 4 99.99
## 6 6 2024-02-05 P5 9 99.99
DT::datatable(sprzedaz) # zalecałbym do dużych tabel, niech użytkownik decyduje co i ile chce widzieć
volumen_sprzedaz <- dim(sprzedaz)
names(volumen_sprzedaz) <- c("wiersze", "kolumny")
# dla mniejszych podsumowań kable()?
kableExtra::kable(data.frame(volumen_sprzedaz),
col.names = c("", "wielkość"), # drobne zabiegi estetyczne
caption = "Wolumen danych") # drobne zabiegi estetyczne
| wielkość | |
|---|---|
| wiersze | 150 |
| kolumny | 5 |
# Dane produktów - słownik
produkty <- data.frame(
id_produktu = paste0("P", 1:15), # klucz tabeli
nazwa = c("Laptop", "Mysz", "Klawiatura", "Monitor", "Słuchawki",
"Pendrive", "Dysk zewnętrzny", "Kamera", "Router", "Głośnik",
"Tablet", "Powerbank", "Hub USB", "Mikrofon", "Webcam"),
kategoria = c("Komputery", "Akcesoria", "Akcesoria", "Komputery", "Audio",
"Akcesoria", "Akcesoria", "Video", "Sieć", "Audio",
"Komputery", "Akcesoria", "Akcesoria", "Audio", "Video")
)
# alternatywna konwencja tworzenia data.frame ale w świecie tidyverse
# w kontekście wrzucania produktów do kategorii, być może mniej podatna na błędy
produkty2 <- tribble(
~id_produktu, ~nazwa, ~kategoria,
"P1", "Laptop", "Komputery",
"P2", "Mysz", "Akcesoria",
"P3", "Klawiatura", "Akcesoria",
"P4", "Monitor", "Komputery",
"P5", "Słuchawki", "Audio",
"P6", "Pendrive", "Akcesoria",
"P7", "Dysk zewnętrzny", "Akcesoria",
"P8", "Kamera", "Video",
"P9", "Router", "Sieć",
"P10", "Głośnik", "Audio",
"P11", "Tablet", "Komputery",
"P12", "Powerbank", "Akcesoria",
"P13", "Hub USB", "Akcesoria",
"P14", "Mikrofon", "Audio",
"P15", "Webcam", "Video"
)
# class(produkty)
# class(produkty2)
# identical(tibble(produkty), produkty2)
# można, nie trzeba pokazać je poglądowo odbiorcy
DT::datatable(produkty,
colnames = c("ID Produktu", "Nazwa", "Kategoria")) # <- dopieszczenie takiego szczegółu jak nazwy kolumn (nic nie zmieniliśmy w data.frame, dalej obowiązują stare nazwy w zbiorze)
# Dane regionów (zwróćmy uwagę na format danych)
regiony_wide <- data.frame(
id_transakcji = sample(1:150, 150), # klucz tabeli
Warszawa = sample(0:1, 150, replace=TRUE),
Krakow = sample(0:1, 150, replace=TRUE),
Wroclaw = sample(0:1, 150, replace=TRUE)
)
# można, nie trzeba pokazać je poglądowo odbiorcy
DT::datatable(regiony_wide,
colnames = c("ID Tranzakcji", "Warszawa", "Kraków", "Wrocław"))
# Czyszczenie danych
# Opisz kroki podjęte w celu przygotowania danych do analizy. Możesz wymienić usunięcie brakujących wartości, normalizację i standaryzację danych oraz wszelkie inne działania, które poprawiają jakość danych.
sprzedaz_clean <- sprzedaz %>%
distinct(id_transakcji, .keep_all = TRUE) %>% # Usunięcie duplikatów
filter(!is.na(id_produktu)) %>% # obsługa braków
mutate(
wartosc = ilosc * cena_jednostkowa,
miesiac = lubridate::month(data, label = TRUE, abbr = FALSE),
kwartal = quarter(data, type = "year.quarter")
)
dplyr::glimpse(sprzedaz_clean) # <- wygląda "technicznie" nie wprowadzajmy użytkownika w "zakłopotanie"
## Rows: 150
## Columns: 8
## $ id_transakcji <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
## $ data <date> 2024-09-08, 2024-09-13, 2024-03-21, 2024-04-03, 2024…
## $ id_produktu <chr> "P8", "P10", "P12", "P8", "P15", "P5", "P3", "P9", "P…
## $ ilosc <int> 1, 10, 6, 1, 4, 9, 1, 3, 9, 7, 3, 1, 6, 9, 7, 2, 10, …
## $ cena_jednostkowa <dbl> 99.99, 199.99, 199.99, 199.99, 99.99, 99.99, 29.99, 7…
## $ wartosc <dbl> 99.99, 1999.90, 1199.94, 199.99, 399.96, 899.91, 29.9…
## $ miesiac <ord> September, September, March, April, May, February, Ma…
## $ kwartal <dbl> 2024.3, 2024.3, 2024.1, 2024.2, 2024.2, 2024.1, 2024.…
DT::datatable(sprzedaz_clean)
# Zmiana z formatu szerokiego na długi
regiony_long <- regiony_wide %>%
pivot_longer(
cols = c(Warszawa, Krakow, Wroclaw),
names_to = "region",
values_to = "czy_region"
) %>%
filter(czy_region == 1) %>%
select(id_transakcji, region)
DT::datatable(regiony_long)
# Połączenie wszystkich danych
dane_pelne <- sprzedaz_clean %>%
left_join(produkty, by = "id_produktu") %>%
left_join(regiony_long, by = "id_transakcji") %>%
mutate(region = replace_na(region, "Inne"))
DT::datatable(dane_pelne)
# Pomysł na analizy
# Przedstaw, jakie metody analityczne zamierzasz zastosować i dlaczego. Może to obejmować zarówno metody statystyczne, jak i modele matematyczne.
# Weryfikacja hipotez/pomysłów
# Opisz, jak zamierzasz przetestować każdą hipotezę. Przedstaw procedury testowe oraz kryteria oceny ich wyników.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# Wrzucenie wzoru zawsze "podnosi prestiż" ;)
# Do Państwa decyzji czy uczyć się formatowania w LaTeXu czy skorzystać z narzędzi on-line do generowania takiej linijki kodu
\[ Zysk = \sqrt{\frac{\text{Sprzedaz}^2 + 4 \times \text{Profit} - \log(\text{Bankructwo})}{\text{Sprzedaz} - 0.5 \times \text{Profit}}} \times e^{\text{Bankructwo}} \]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
sprzedaz_kategorie <- dane_pelne %>%
group_by(kategoria) %>%
summarise(
liczba_transakcji = n(),
laczna_ilosc = sum(ilosc),
laczna_wartosc = sum(wartosc),
srednia_wartosc = mean(wartosc),
.groups = "drop"
) %>%
arrange(desc(laczna_wartosc))
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
sprzedaz_czas <- dane_pelne %>%
group_by(kwartal, kategoria) %>%
summarise(
wartosc = sum(wartosc),
.groups = "drop"
)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
sprzedaz_region <- dane_pelne %>%
filter(region != "Inne") %>%
group_by(region, kategoria) %>%
summarise(
wartosc = sum(wartosc),
.groups = "drop"
)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# Ważne w tworzeniu tabel jest abyśmy korzystali z właściwych pakietów do ich generowania, np. w zależności od tego jak dużą ramkę chcemy zaprezentować w raporcie. Poza tym istnotnym jest, żeby te tabele były estetyczne, zgodne np. z paletą kolorystyczną firmy, w której pracujemy, etc.
# pakiet kableExtra
sprzedaz_kategorie %>% # dane
# head(5) %>% # pierwsze 5 wierszy z danych
mutate( # Modyfikuje kolumny danych
laczna_wartosc = round(laczna_wartosc, 2), # Zaokrągla wartości w kolumnie
srednia_wartosc = round(srednia_wartosc, 2) # Zaokrągla wartości
) %>%
kable( # Generuje tabelę z danymi do raportu
col.names = c("Kategoria", "Liczba transakcji", "Łączna ilość",
"Łączna wartość (PLN)", "Średnia wartość (PLN)"), # Ustala nazwy kolumn w tabeli
caption = "Top 5 kategorii produktów według wartości sprzedaży", # Dodaje tytuł tabeli
format.args = list(big.mark = " ", decimal.mark = ",") # Ustala formatowanie liczb w tabeli
) %>%
kable_styling( # Dodaje styl do tabeli
bootstrap_options = c("striped", "hover", "condensed"), # Ustawia opcje stylizacji bootstrap
full_width = T, # Ustawia tabelę na pełną szerokość
position = "left" # Ustawia pozycję tabeli na lewo
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#3498db") # Ustala styl dla pierwszego wiersza (nagłówków)
| Kategoria | Liczba transakcji | Łączna ilość | Łączna wartość (PLN) | Średnia wartość (PLN) |
|---|---|---|---|---|
| Akcesoria | 98 | 589 | 53 344,11 | 544,33 |
| Audio | 54 | 309 | 26 466,91 | 490,13 |
| Komputery | 47 | 284 | 23 057,16 | 490,58 |
| Video | 38 | 184 | 20 038,16 | 527,32 |
| Sieć | 19 | 97 | 8 039,03 | 423,11 |
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# pakiet DT
sprzedaz_kategorie %>%
head(5) %>%
mutate( # Zaokrąglanie możemy zostawić tutaj lub zrobić to w DT (poniżej)
laczna_wartosc = round(laczna_wartosc, 2),
srednia_wartosc = round(srednia_wartosc, 2)
) %>%
datatable(
colnames = c("Kategoria", "Liczba transakcji", "Łączna ilość",
"Łączna wartość (PLN)", "Średnia wartość (PLN)"),
caption = "Top 5 kategorii produktów według wartości sprzedaży",
class = 'stripe hover cell-border order-column', # Klasy Bootstrapowe: stripe, hover, cell-border
options = list(
dom = 't', # Wyświetla tylko tabelę (bez wyszukiwarki i stronnicowania, jak w kable)
autoWidth = TRUE,
# Odpowiednik row_spec(0, ...) - stylizowanie nagłówka przez JS() od JavaScript
initComplete = JS(
"function(settings, json) {",
"$(this.api().table().header()).css({'background-color': '#3498db', 'color': '#fff'});",
"}"
)
)
) %>%
# Odpowiednik format.args - formatowanie liczb (separator tysięcy i przecinek)
formatCurrency(
columns = c('laczna_wartosc', 'srednia_wartosc'),
currency = "",
mark = " ",
dec.mark = ","
)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
sprzedaz_region %>%
pivot_wider( # transpozycja
names_from = region,
values_from = wartosc,
values_fill = 0
) %>%
# Dla każdej kolumny, która zawiera wartości numeryczne (is.numeric) zastosowujemy funkcję round(), która zaokrągla wartości w tych kolumnach do dwóch miejsc po przecinku.
mutate(across(where(is.numeric), round, 2)) %>%
kable(
caption = "Wartość sprzedaży według regionów i kategorii (PLN)",
format.args = list(big.mark = " ", decimal.mark = ",")
) %>%
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = TRUE
) %>%
row_spec(0, # stylizacja dotyczy wiersza nagłówka tabeli
bold = TRUE, # tekst pogrubiony
color = "white", # czcionka bialutka
background = "#27ae60") # tło zieloniutkie
| kategoria | Krakow | Warszawa | Wroclaw |
|---|---|---|---|
| Akcesoria | 17 128,07 | 13 858,45 | 20 267,72 |
| Audio | 5 279,28 | 8 938,89 | 9 459,05 |
| Komputery | 8 089,03 | 6 969,06 | 4 879,32 |
| Sieć | 1 499,82 | 2 369,70 | 2 669,67 |
| Video | 3 779,64 | 5 579,49 | 6 939,32 |
# Przetwarzanie danych
tabela_regiony <- sprzedaz_region %>%
pivot_wider(
names_from = region,
values_from = wartosc,
values_fill = 0
)
# Generowanie interaktywnej tabeli
tabela_regiony %>%
datatable(
caption = "Wartość sprzedaży według regionów i kategorii (PLN)",
class = 'stripe hover row-border', # Odpowiednik bootstrap_options
options = list(
fullWidth = TRUE,
# Stylizacja nagłówka na zielono (#27ae60), biało i ogólnie spójnie z poprzednią tabelą
initComplete = JS(
"function(settings, json) {",
"$(this.api().table().header()).css({'background-color': '#27ae60', 'color': '#fff'});",
"}"
)
)
) %>%
# Dynamiczne formatowanie wszystkich kolumn numerycznych
formatCurrency(
columns = which(sapply(tabela_regiony, is.numeric)),
currency = "",
mark = " ",
dec.mark = ","
)
# Wizualizacje
# Przygotuj wizualizacje, które w prosty i klarowny sposób przedstawiają wyniki analizy.
# Opisz, jakie wnioski można wyciągnąć na podstawie grafiki.
# Czasem, jak mawiał klasyk, jedna emotka mówi więcej niż tysiąc słów - zwłaszcza w aktualnej, rysunkowej rzeczywistości, gdzie portal zachęca do przeczytania więcej niż nagłówka, bądź lead'u, gwarantując, np. że zajmie to mniej niż 2 minuty (sic! Na Ozyrysa!)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# Warto rozważyć jeden z kilku pakietów, a następnie zostać przy nim, trzymać jedną stylizację kolorystyczną i dobierać w sposób przemyślany typ wykresu do danych, problemu, 'mesydżu', etc.
# pakiet {ggplot2}
plot1 <- ggplot(sprzedaz_kategorie, aes(x = reorder(kategoria, laczna_wartosc),
y = laczna_wartosc,
fill = kategoria)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(round(laczna_wartosc/1000, 1), "k")),
hjust = -0.2, size = 3.5) +
coord_flip() +
scale_y_continuous(labels = scales::comma_format(suffix = " PLN")) +
scale_fill_brewer(palette = "Set3") +
labs(
title = "Łączna wartość sprzedaży według kategorii produktów",
subtitle = "Okres: styczeń - wrzesień 2024",
x = "Kategoria",
y = "Wartość sprzedaży (PLN)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text = element_text(size = 10),
panel.grid.major.y = element_blank()
)
plot1
# jeśli znamy pakiet {ggplot2}, ale nie znamy pakietu {plotly}, a chcielibyśmy wgrać trochę reaktywności w wykres, możemy zrobić jak poniżej, potraktować obiekt typu ggplot funkcją ggplotly()
# class(plot1)
plotly::ggplotly(plot1)
# jeśli znamy pakiet {plotly}, to możemy "from scratch" zbudować wykres
# Przygotowanie ramki danych (sortowanie jest kluczowe dla odpowiednika reorder)
plot_data <- sprzedaz_kategorie %>%
arrange(laczna_wartosc) %>%
mutate(kategoria = factor(kategoria, levels = kategoria))
# Tworzenie wykresu plot_ly
fig <- plotly::plot_ly(
data = plot_data,
y = ~kategoria,
x = ~laczna_wartosc,
type = 'bar',
orientation = 'h',
color = ~kategoria,
colors = "Set3", # Plotly obsługuje palety Brewer
text = ~paste0(round(laczna_wartosc / 1000, 1), "k"), # Odpowiednik geom_text
textposition = 'outside',
showlegend = FALSE,
# Tooltip (dymek) - opcjonalnie konfigurujemy co ma się wyświetlać
hovertemplate = paste(
"<b>%{y}</b><br>",
"Wartość: %{x:,.0f} PLN<br>",
"<extra></extra>"
)
)
# konfiguracja wyglądu (odpowiednik labs, theme i scale z ggplot2)
fig <- fig %>% layout(
title = list(
# w {plotly} nie ma chyba dedykowanego pola na podtytuł. Można to ograćza pomocą tagów HTML (<br><sup>...</sup>) w głównym tytule.
text = "<b>Łączna wartość sprzedaży według kategorii produktów</b><br><sup>Okres: styczeń - wrzesień 2024</sup>",
x = 0, # wyrównanie do lewej
font = list(size = 18)
),
xaxis = list(
title = "Wartość sprzedaży (PLN)",
tickformat = ",.0f", # separator tysięcy
ticksuffix = " PLN",
range = c(0, max(plot_data$laczna_wartosc) * 1.15) # miejsce na etykiety tekstowe
),
yaxis = list(
title = "Kategoria",
showgrid = FALSE # odpowiednik panel.grid.major.y = element_blank()
),
margin = list(l = 50, r = 50, t = 80, b = 50),
font = list(size = 12),
# Styl tła zbliżony do theme_minimal()
plot_bgcolor = 'rgba(0,0,0,0)',
paper_bgcolor = 'rgba(0,0,0,0)'
)
fig
# jeśli znamy pakiet {highcharter} i opłaciliśmy możliwość korzystania z niego :(, to możemy "from scratch" zbudować wykres
# Przygotowanie danych ({highcharter} lubi posortowane dane dla wykresów słupkowych)
data_hc <- sprzedaz_kategorie %>%
arrange(desc(laczna_wartosc))
# Pobranie kolorów z palety Set3 (tak jak w poprzednim wykresie ggplot)
nb_cats <- n_distinct(data_hc$kategoria)
colors <- brewer.pal(n = nb_cats, name = "Set3")
# 3. Tworzenie wykresu
hchart(
data_hc,
"bar",
hcaes(x = kategoria, y = laczna_wartosc, color = kategoria)
) %>%
hc_colors(colors) %>%
hc_title(
text = "Łączna wartość sprzedaży według kategorii produktów",
align = "left",
style = list(fontWeight = "bold", fontSize = "18px")
) %>%
hc_subtitle(
text = "Okres: styczeń - wrzesień 2024", # tu też można by pomyśleć o uogólnieniu kodu, nie wpisywaniu "na sztywno"
align = "left"
) %>%
hc_xAxis(
title = list(text = "Kategoria"),
gridLineWidth = 0 # Usuwamy linie siatki tak jak w theme_minimal
) %>%
hc_yAxis(
title = list(text = "Wartość sprzedaży (PLN)"),
labels = list(format = "{value:,.0f} PLN")
) %>%
hc_plotOptions(
bar = list(
dataLabels = list(
enabled = TRUE,
# Formatowanie etykiet na styl "12.5k" przy użyciu JavaScript
formatter = JS("function() { return (this.y / 1000).toFixed(1) + 'k'; }")
),
showInLegend = FALSE
)
) %>%
hc_tooltip(
pointFormat = "Wartość: <b>{point.y:,.2f}</b> PLN"
) %>%
# hc_add_theme(hc_theme_smpl())
# hc_add_theme(hc_theme_ggplot2())
# hc_add_theme(hc_theme_538())
hc_add_theme(hc_theme_google())
# hc_add_theme(hc_theme_db())
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
ggplot(sprzedaz_czas, aes(x = as.factor(kwartal),
y = wartosc,
fill = kategoria)) +
geom_col(position = "dodge") +
scale_y_continuous(labels = scales::comma_format(suffix = " PLN")) +
scale_fill_brewer(palette = "Paired") +
labs(
title = "Wartość sprzedaży według kwartałów i kategorii",
x = "Kwartał",
y = "Wartość sprzedaży (PLN)",
fill = "Kategoria"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
legend.position = "bottom",
legend.title = element_text(face = "bold")
)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
sprzedaz_region %>%
ggplot(aes(x = region, y = wartosc, fill = kategoria)) +
geom_col(position = "stack") +
scale_y_continuous(labels = scales::comma_format(suffix = " PLN")) +
scale_fill_viridis_d(option = "plasma") +
labs(
title = "Struktura sprzedaży według regionów",
x = "Region",
y = "Wartość sprzedaży (PLN)",
fill = "Kategoria"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text.x = element_text(angle = 0, hjust = 0.5),
legend.position = "right"
)
# Zakończenie
# Podsumuj kluczowe wnioski oraz ich znaczenie w kontekście postawionych pytań badawczych. Możesz również zaproponować dalsze kierunki badań.
# Jak nie wiesz co powiedzieć odpowiadaj: "To zależy...", zmarszcz brwi i zaintonuj dłuższą ciszę. Wyjdziesz na intelektualistę.
# Gdy powyższa zasada nie zadziała, po prostu milcz, pokaż wyniki i tyle, bowiem "lepiej nic nie mówić i wyjść na idiotę, niż odezwać się i rozwiać wszelkie wątpliwości"
# Używajmy inner chunk'ów, nie hardcode'ujmy
Na podstawie przeprowadzonej analizy można sformułować następujące wnioski:
Najlepsza kategoria: Kategoria Akcesoria generuje najwyższą wartość sprzedaży.
Trend czasowy: Obserwujemy stabilną lub rosnącą sprzedaż w kolejnych kwartałach dla większości kategorii.
Zróżnicowanie regionalne: Różne regiony wykazują preferencje dla różnych kategorii produktów, co sugeruje potrzebę dostosowania oferty do lokalnych rynków.
Rekomendacje:
Zwiększyć inwestycje marketingowe w najlepiej sprzedające się kategorie
Rozważyć optymalizację asortymentu w słabszych kategoriach
Dostosować strategie regionalne do lokalnych preferencji
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# Źródła
# Wymień wszystkie źródła literaturowe, z których korzystałeś podczas tworzenia raportu. To pomaga w zabezpieczeniu prawidłowego odniesienia i zwiększa wiarygodność raportu.