Efektywne zarządzanie asortymentem w branży retail wymaga wyjścia poza prostą analizę tabelaryczną. W przypadku produktów, których głównym wyróżnikiem jest kolor, tradycyjne raporty sprzedażowe nie oddają relacji wizualnych między produktami, co utrudnia podejmowanie decyzji o wprowadzeniu nowych odcieni czy wycofaniu duplikatów.
Analiza realizuje dwa równoległe cele:
Aby zrealizować postawione cele, proces analityczny został podzielony na cztery etapy:
Transformacja Przestrzeni Barw (HEX -> CIE Lab): Standardowe kody HEX (model RGB) są przeznaczone do emisji światła przez ekrany i nie odzwierciedlają nieliniowej percepcji barw przez ludzkie oko. Dlatego w pierwszym kroku przeprowadzono konwersję danych do przestrzeni CIE Lab, gdzie odległości między kolorami odpowiadają rzeczywistej różnicy postrzeganej przez ludzkie oko.
Redukcja Wymiarów (Metoda PCA): Przestrzeń kolorystyczna Lab jest trójwymiarowa (\(L, a, b\)). Aby stworzyć czytelną mapę podobieństwa barw, trzeba zredukować ją do 2 wymiarów. Jako wiodącą metodę wybrano PCA (Principal Component Analysis).
Wizualizacja (Mapa podobieństwa barw): W tym etapie zaprezentowano wyniki redukcji wymiarów, dokonano oceny jakości wizualizacji oraz przeprowadzona została strategiczna analiza barw w asortymencie sklepu.
Weryfikacja Przestrzenna (3D): Każda redukcja wymiarów wiąże się z utratą części informacji. Wiarygodność mapy 2D została w tym kroku zwalidowana poprzez interaktywną wizualizację w pełnej przestrzeni 3D, weryfikując, czy barwy znajdujące się blisko siebie na mapie 2D rzeczywiście są do siebie podobne.
Analiza opiera się na zbiorze danych transakcyjnych ze sklepu internetowego Pakker Trousers zajmującego się sprzedażą spodni. Dane zostały zagregowane w środowisku Python, gdzie obliczono średnią sprzedaż miesięczną w okresie dostępności dla każdego wariantu kolorystycznego. Następnie do nazw handlowych kolorów ręcznie zostały przypisane odpowiednie kody kolorów w formacie HEX.
Kluczowe zmienne wykorzystane w analizie:
color_name: Nazwa handlowa koloru (np.
“Deep Green”, “Beige”).hex_code: Kod reprezentujący kolor w
świecie cyfrowym.L, a, b:
Współrzędne w przestrzeni barwnej CIELab (wyliczone z kodów HEX):
avg_sales: Średnia miesięczna liczba
sprzedanych sztuk produktu w okresie jego dostępności - wskaźnik
popularności wariantu kolorystycznego.
Projekt został zrealizowany w środowisku R z wykorzystaniem następujących pakietów:
library(tidyverse) # Manipulacja danymi i wykresy (ggplot2)
library(readxl) # Wczytywanie danych
library(ggrepel) # Czytelne etykiety na wykresach
library(FactoMineR) # Obliczenia PCA
library(factoextra) # Wizualizacja PCA
library(plotly) # Wykresy interaktywne i 3D
# Wczytanie przygotowanych danych
df <- read_excel("colors_sales_data.xlsx")
# Szybki podgląd danych
glimpse(df)
## Rows: 18
## Columns: 5
## $ color_name <chr> "Emerald", "Blue Jeans", "Brown", "Deep Green", "Black",…
## $ total_sold <dbl> 459, 6711, 494, 826, 6100, 5313, 1036, 3155, 4240, 3852,…
## $ months_active <dbl> 3, 52, 9, 8, 60, 60, 12, 43, 59, 60, 57, 51, 60, 59, 34,…
## $ avg_sales <dbl> 153.00000, 129.05769, 54.88889, 103.25000, 101.66667, 88…
## $ hex_code <chr> "#062b2a", "#3b6594", "#4c3a33", "#0f421c", "#000000", "…
Dane wejściowe to kody HEX, będące cyfrowym zapisem modelu RGB. Model ten powstał z myślą o reprezentacji kolorów na ekranach - różnice między kodami nie zawsze pokrywają się z różnicami widocznymi dla ludzkiego oka.
Z tego względu kluczowym krokiem jest transformacja danych do przestrzeni CIE Lab. Została ona zaprojektowana tak, aby odległości odpowiadały temu, jak ludzkie oko postrzega różnice barw. Dzięki temu bliskość punktów będzie faktycznie oznaczać podobieństwo wizualne barw.
# Konwersja HEX -> Macierz RGB
# col2rgb zamienia hex na liczby 0-255. Dzielimy przez 255, aby dostać zakres 0-1 (wymagany przez funkcję konwersji).
rgb_matrix <- t(col2rgb(df$hex_code)) / 255
# Konwersja RGB -> CIE Lab
lab_matrix <- convertColor(rgb_matrix, from = "sRGB", to = "Lab", scale.in = 1)
# Łączenie z danymi - dodanie nowych kolumnnL, a, b do głównej ramki danych
df <- cbind(df, lab_matrix) %>%
as.data.frame()
# Sprawdzenie wyniku - czy kolumny zostały dodane?
df %>%
select(color_name, hex_code, avg_sales, L, a, b) %>%
head()
## color_name hex_code avg_sales L a b
## 1 Emerald #062b2a 153.00000 15.10734 -13.0027714 -3.144360
## 2 Blue Jeans #3b6594 129.05769 41.76802 0.1088842 -30.208916
## 3 Brown #4c3a33 54.88889 26.18307 6.7857453 7.421683
## 4 Deep Green #0f421c 103.25000 23.90631 -26.4760201 18.215093
## 5 Black #000000 101.66667 0.00000 0.0000000 0.000000
## 6 Aperol #ce7346 88.55000 57.97254 32.0283456 40.184974
Celem tego etapu jest stworzenie dwuwymiarowej mapy kolorystycznej asortymentu. Wykorzystano algorytm PCA, aby znaleźć optymalny rzut przestrzeni 3D (\(L, a, b\)) na płaszczyznę, minimalizując utratę informacji o różnicach w wariantach barw.
Model PCA został zbudowany na standaryzowanych zmiennych \(L, a, b\). Kluczowym pytaniem jest: Ile informacji tracimy, spłaszczając przedstawienie kolorów do 2 wymiarów?
# Wybór kolumn do redukcji wymiarów
pca_input <- df %>% select(L, a, b)
# Obliczenie modelu PCA - wartości skalowane wewnątrz funkcji
pca_model <- prcomp(pca_input, center = TRUE, scale. = TRUE)
# Scree Plot
fviz_eig(pca_model, choice = 'variance', addlabels = TRUE, ylim = c(0, 100)) +
labs(title = "Scree Plot: Ile informacji zachowaliśmy?", y = "Procent wyjaśnionej wariancji", x = "Wymiary")
Analiza Scree Plot wskazuje, że redukcja przestrzeni barwnej z 3 do 2 wymiarów pozwala zachować 82,3% pierwotnej informacji (53,5% dla Wymiaru 1 oraz 28,8% dla Wymiaru 2).
Dla porównania: w przestrzeni trójwymiarowej prosty wybór dwóch z trzech zmiennych dałby teoretyczne pokrycie na poziomie 66.7%. Wynik PCA (82,3%) jest wyższy, co dowodzi skuteczności algorytmu – PCA nie odrzuca danych, lecz kompresuje informacje, tworząc mapę wierniej oddającą różnice między kolorami niż jakakolwiek prosta kombinacja cech.
# Wykres zmiennych (Circle of Correlation)
fviz_pca_var(pca_model, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE) +
labs(title = "Mapa Zmiennych (Co oznaczają osie?)",
subtitle = "Strzałki pokazują, jak cechy L, a, b wpływają na mapę")
# Wkład zmiennych w wymiary (Contribution)
p1 <- fviz_contrib(pca_model, choice = "var", axes = 1, title = "Wkład w PC1") + labs(y = "Wkład (%)")
p2 <- fviz_contrib(pca_model, choice = "var", axes = 2, title = "Wkład w PC2") + labs(y = "Wkład (%)")
gridExtra::grid.arrange(p1, p2, ncol = 2)
W analizowanym modelu osie stanowią kompozycję wielu cech fizycznych. PCA definiuje tutaj “synergię zmiennych” – czyli łączy te parametry kolorów, które w asortymencie naturalnie występują razem, tworząc nowe wskaźniki strategiczne.
Analiza Koła Korelacji oraz Wkładu Zmiennych pozwala zdefiniować znaczenie wymiarów w następujący sposób:
Odpowiada za 53.5% informacji.
To główna oś porządkująca kolekcję. Łączy ona informacje z wszystkich 3 wymiarów, głownie skupiając się na zmiennej \(b\). Na wykresie Koła Korelacji widzimy, że wektory \(L\) (Jasność) oraz \(b\) (Niebieski-Żółty) są ze sobą pozytywnie skorelowane i skierowane w prawą stronę. Także wektor odpowiadający zmiennej \(a\) (Zielony- Czerowny) skierowany jest w prawo.
Odpowiada za 28.8% informacji.
W tym wymiarze dominuje zmienna \(a\) (Zielony-Czerwony), której wektor celuje wyraźnie w dół. Ta oś służy do rozróżniania produktów, które mają podobną jasność, ale inny charakter barwny.
Długość strzałek na Kole Korelacji sięga niemal krawędzi okręgu, co jest doskonałym sygnałem technicznym, świadczącym, że zmienne te są dobrze odwzorowane na płaszczyźnie:
# Wyniki dla poszczególnych kolorów
ind_res <- get_pca_ind(pca_model)
# Dodanie statystyk do głównej ramki danych
df <- df %>%
mutate(
PC1 = ind_res$coord[, 1],
PC2 = ind_res$coord[, 2],
Cos2 = ind_res$cos2[, 1] + ind_res$cos2[, 2],
Contribution = ind_res$contrib[, 1] + ind_res$contrib[, 2]
)
# Histogram jakości odwzorowania
ggplot(df, aes(x = reorder(color_name, Cos2), y = Cos2)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
geom_hline(yintercept = 0.6, linetype = "dashed", color = "red") +
labs(title = "Jakość odwzorowania kolorów (Cos2)",
subtitle = "Słupki poniżej czerwonej linii mogą być lekko przekłamane na mapie 2D",
x = "Kolor", y = "Jakość (Cos2)") +
theme_minimal()
Po ustaleniu, ile ogólnej informacji zachowuje model, należy sprawdzić, jak ta jakość rozkłada się na poszczególne produkty. Służy do tego parametr Cos2 (Squared Cosine), który określa, jak dobrze odwzorowany został dany punkt na płaszczyźnie.
Poniższa wizualizacja stanowi finalny wynik procesu redukcji wymiarów. Jest to rzut asortymentu na płaszczyznę, który wyjaśnia ponad 82% różnic między barwami produktów, co czyni mapę precyzyjnym narzędziem analitycznym.
Instrukcja nawigacji po mapie:
Klucz do interpretacji:
Mapa jest interaktywna – najechanie kursorem na punkt wyświetli jego nazwę, średnią sprzedaż oraz precyzję odwzorowania (Cos2).
Rozmieszczenie punktów na mapie w większości potwierdza założenia wynikające z konstrukcji wymiarów PCA, jednak ujawnia istotne zniekształcenia dla kilku wariantów kolorystycznych.
Potwierdzenie struktury (Co się zgadza?):
Wykryte odstępstwa (Co się nie zgadza?):
Nakładając dane sprzedażowe (wielkość punktów) na mapę, zindentyfikowane zostały kluczowe strefy zarządzania kolorystyką asortymentu.
Zestawienie mapy z parametrami fizycznymi barw ujawnia uderzającą asymetrię w portfolio. Prawa połowa mapy jest niemal pusta, obsługiwana jedynie przez dwa kolory. Definiuje to jasne kierunki rozwoju kolekcji:
Ostatnim etapem analizy jest interaktywna weryfikacja modelu w pełnej przestrzeni trójwymiarowej. Dodanie trzeciego wymiaru pozwala odzyskać 17.7% informacji, które zostały utracone na płaskiej mapie.
Analiza modelu 3D pozwoliła wyjaśnić przyczyny niskiej jakości odwzorowania (niskie Cos2) niektórych kolorów. Okazuje się, że “błędy” na mapie 2D wynikają bezpośrednio ze specyficznej struktury asortymentu - a konkretnie z braku równowagi między kolorami.
Weryfikacja potwierdziła, że niska jakość odwzorowania dla koloru Blue Jeans wynika z jego unikalności w rodzinie kolorystycznej.
Analiza 3D rzuciła nowe światło na zagadkę niskiej jakości odwzorowania (niskie Cos2) dla produktów z grupy zielonej (Khaki, Green Corduroy, Deep Green).
Celem niniejszego projektu była weryfikacja, czy techniki uczenia maszynowego (redukcja wymiarów PCA) mogą zostać skutecznie wykorzystane do analizy struktury kolorystycznej asortymentu. Projekt miał odpowiedzieć na pytanie, czy płaska mapa 2D jest wystarczającym narzędziem do oceny wizualnego podobieństwa kolorów. Model PCA zachował 82.3% pierwotnej informacji - oznacza to, że spłaszczenie danych do 2D nie spowodowało krytycznej utraty sensu. Główne relacje między kolorami zostały zachowane, a uproszczona wizualizacja okazała się wartościowym narzędziem analitycznym, pozwalającym na szybką ocenę struktury kolorystycznej kolekcji i wyciągnięcie cennych biznesowo wniosków.