# 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

1. Wprowadzenie

# 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...
Żródło: cyrekdigital.com
Żródło: cyrekdigital.com


# 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



2. Przygotowanie danych


# 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.

2.1 Wczytanie bibliotek

# 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)

2.2 Utworzenie przykładowych danych


2.2.1 Dane sprzedażowe

# 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
Wolumen danych
wielkość
wiersze 150
kolumny 5


2.2.2 Dane produktów

# 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)


2.2.3 Dane regionów

# 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"))




3. Czyszczenie i transformacja danych

# 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.

3.1 Czyszczenie danych sprzedażowych

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)

3.2 Transpozycja danych regionów

# 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)

3.3 Łączenie ramek danych

# 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)




4. Analiza danych

# 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.


4.1 Agregacja po kategoriach


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))

4.2 Sprzedaż w czasie


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"
  )

4.3 Analiza regionalna


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"
  )




5. Prezentacja wyników

5.1 Tabela: Top 5 kategorii produktó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.

# 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)
Top 5 kategorii produktów według wartości sprzedaży
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 = ","
  )

5.2 Tabela: Sprzedaż według regionó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.

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
Wartość sprzedaży według regionów i kategorii (PLN)
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 = ","
  )




6. Wizualizacje

# 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.


6.1 Wykres: Wartość sprzedaży według kategorii

# 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.


Wykres {ggplot2}


# 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


Wykres semi{plotly}


# 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)


Wykres {plotly}


# 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


Wykres {highcharter}


# 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())

6.2 Wykres: Trendy sprzedaży w czasie


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")
                  )

6.3 Wykres: Sprzedaż według regionó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.

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"
  )




7. Wnioski

# 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:

  1. Najlepsza kategoria: Kategoria Akcesoria generuje najwyższą wartość sprzedaży.

  2. Trend czasowy: Obserwujemy stabilną lub rosnącą sprzedaż w kolejnych kwartałach dla większości kategorii.

  3. Zróżnicowanie regionalne: Różne regiony wykazują preferencje dla różnych kategorii produktów, co sugeruje potrzebę dostosowania oferty do lokalnych rynków.

  4. 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.


8. Źródła

# Ź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.