Analýza XML feedu pomocí jazyka R

Než začnu nastavovat produktové kampaně, potřebuji si udělat alespoň přibližnou představu o zboží, které budu inzerovat. U velkých XML feedů to ale není možné. Jednak je většinou ani nelze otevřít v prohlížeči, jednak při velkém počtu položek to není v lidských silách. Nejjednodušší možnost je použít Open Refine. Větší soubory už ale často nezvládá zpracovat, nepomůže ani navýšení RAM. Nenabízí ani moc možností jak data analyzovat. Pro tento účel je ideální použít Rko, které zvládá opravdu velké data sety.

Nejdříve je potřeba stáhnout XML feed (resp. obsah vybraných elementů) a vytvořit data frame.

# načtení knihoven
library(rvest)
library(xml2)
library(tidyverse) #je v ní vložen dplyr, který potřebuji
library(stringr)


# URL adresa XML feedu
url <- 'https://exampleshop.cz/heureka-cz.xml'

# načtení URL adresy
web <- read_xml(url)

# definuji hlavní element jako celý blok elementů, který obsahuje
# všechny podřízené elementy.
# Je potřeba to udělat takto. Kdybych extrahoval každý element
# zvlášť, a byla by tam chybějící data, v data framu by se řádky
# posunuly tak, že by došlo k chybě. Později uvidím, že tam
# některá data skutečně chybí.
shopitem_node <- 'SHOPITEM' 

# načte všechny elementy uvnitř shopitem jako vectory
shopitem_node_read <- xml_nodes(web, shopitem_node)

# vyberu elementy, které potřebuji
product_xml <- 'PRODUCT'
category_xml <- 'CATEGORYTEXT'
price_xml <- 'PRICE_VAT'
manufacturer_xml <- 'MANUFACTURER'
delivery_xml <- 'DELIVERY_DATE'

# vyextrahování elementů z shopitem
product <- html_node(shopitem_node_read, product_xml) %>%
  xml_text()

cat <- html_node(shopitem_node_read, category_xml) %>%
  xml_text()

price <- html_node(shopitem_node_read, price_xml) %>%
  xml_text()
# cenu převedu na číslo
price <- as.numeric(price)

brand <- html_node(shopitem_node_read, manufacturer_xml) %>%
  xml_text() 

delivery <- html_node(shopitem_node_read, delivery_xml) %>%
  xml_text()

# ještě si vytvořím product_pure, který budu později upravovat
product_pure <- product

# vytvořím data_frame
shop <- data.frame(
  product,
  product_pure,
  price,
  brand,
  delivery,
  cat
)

# vytvoření data frame pro dplyr (nabízí lepší funkce)
shop <- tbl_df(shop)

V této fázi můžete data set vyexportovat do CSVčka a na analýzu využít něco jiného. Nabízí se třeba Google Data Studio nebo Power BI, které také zvládnou obrovské soubory.

write.csv2(shop, file = "shop.csv", row.names = F)
# (jako separátor středník, s desetinnou čárkou)

Alternativně lze Rko propojit přímo s Google Sheets. Následně pak data jednoduše vytáhnete do Google Data Studia. Kvůli jednorázové analýze to ale nedává moc smysl.

Power BI nabízí ještě lepší řešení. Přes datový konektor lze R script přímo vložit a vykonat. Když použijete tuto úvodní část, budete mít tabulku vytvořenou rovnou v Power BI. Jen si musíte být jisti, že ve scriptu nemáte chybu 😉

Když budeme pokračovat v Rku, je potřeba data upravit.

# všechna data kromě ceny jsou jako factor. Musím to upravit.
# Product a product_pure potřebuju jako text
shop$product <- as.character(shop$product)
shop$product_pure <- as.character(shop$product_pure)

# rozdělím cat na dva sloupce, abych dostal první a druhou
# nejvyšší kategorii, se kterými budu pracovat
shop <- shop %>% separate(cat, c("cat_first", "cat_second"), "\\|",
                          extra = "drop", fill = "right")

# čištění cat_first a cat_second od mezer na začátku a na konci
shop$cat_first <- trimws(shop$cat_first, which = c("r"))
shop$cat_second <- trimws(shop$cat_second, which = c("b"))

# nové proměnné jsou textové řetězce, potřebuji je převést na factor
shop$cat_first <- as.factor(shop$cat_first)
shop$cat_second <- as.factor(shop$cat_second)

Základní možnosti jak na data nahlížet:

# přehlednější náhled struktury data framu v dplyr
shop %>% glimpse()
# Observations: 27,296
# Variables: 7
# $ product      <chr> "BRDK patch kabel Csl8E, UTP - 1,5m...
# $ product_pure <chr> "BRDK patch kabel Csl5E, UTP - 1,5m...
# $ brand        <fctr> CNS, CNS, CNS, CNS, CNS, CNS, Peach...
# $ delivery     <fctr> 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,...
# $ cat_first    <fctr> PC, PC, PC, PC, PC, PC, Elektronika,...
# $ cat_second   <fctr> KOMPONENTY PC A PŘÍSLUŠENSTVÍ, KOMPONENTY...
# $ price        <dbl> 13, 13, 17, 17, 17, 18, 25, 25, 25,...

# zkontroluji typ data framu
class(shop)
# [1] "tbl_df"     "tbl"        "data.frame"

# zobrazení proměnných (sloupců)
names(shop)
# [1] "product"  "product_pure" "brand"   "delivery"     "cat_first"   
# [6] "cat_second"   "price"   

# zobrazení prvních 10 řádků
shop %>% print(n=10)
# to samé, jen se řádky nebudou zalamovat
shop %>% print(width=Inf)

# ukázat náhodně 10 řádků jen proměnné product
shop %>% select(product) %>%
  sample_n(size=10)

# ukázat náhodně produkty z kategorie elektronika
shop %>% select(product,cat_first) %>%
  filter(cat_first == "Elektronika") %>%
  sample_n(size=10)

# vybrané proměnné vložené do sloupce cols
cols = c("cat_first","price","brand","delivery")
shop %>% select(one_of(cols)) %>%
  print(width=Inf)

Je vhodné zkontolovat, jestli u některých produktů nechybí data. Při nastavování klíčových slov nebo inzerátů je na to potřeba myslet.

# kolik a v jakých sloupcích jsou chybějící data (NA)
colSums(is.na(shop))
# product product_pure        brand     delivery    cat_first   
#       0            0          369            0            0       
# cat_second        price 
#          0            0 

# podívám se, ve kterých to je kategoriích
shop %>% select(cat_first,brand) %>%
  filter(is.na(brand)) %>%
  print(n=30)
# A tibble: 369 x 2
#                cat_first  brand
#                   <fctr> <fctr>
#   1    Filmy, knihy, hry   <NA>
#   2    Filmy, knihy, hry   <NA>
#   3        Dům a zahrada   <NA>
#   4    Filmy, knihy, hry   <NA>
#   5    Filmy, knihy, hry   <NA>
#   6           Bílé zboží   <NA>
#   7    Audio, Video a TV   <NA>
#   8    Filmy, knihy, hry   <NA>
#   9    Filmy, knihy, hry   <NA>
#   10                 Hry   <NA>
#   11 Malá smart technika   <NA>
#   12         Elektronika   <NA>
#   13         Elektronika   <NA>
#   14   Filmy, knihy, hry   <NA>
#   15   Filmy, knihy, hry   <NA>
#   16   Filmy, knihy, hry   <NA>
#   17   Filmy, knihy, hry   <NA>
#   18         Elektronika   <NA>
# ... with 351 more rows

Filmy, knihy, hry asi výrobce mít nebudou, ale u elektroniky a bílého zboží je potřeba zkontrolovat, o co se jedná.

A teď už sumarizace podle různých hledisek:

# jaká je distribuce skladové dostupnosti
table(shop$delivery)
#     0     3    14 
# 13106  2533 11657 
# nebo takto
count(shop,delivery)
# A tibble: 3 x 2
#   delivery     n
#     <fctr> <int>
#   1     0  13106
#   2     3   2533
#   3     14 11657

# počet produktů podle kategorií
shop %>%
  select(cat_first) %>%
  group_by(cat_first) %>%
  summarise(pocet = n()) %>%
  arrange(desc(pocet))
# A tibble: 16 x 2
#              cat_first pocet
#                 <fctr> <int>
# 1          Elektronika 20651
# 2          Fotoaparáty  1105
# 3        Dům a zahrada   797
# 4           Bílé zboží   795
# 5                   PC   754
# 6         Mobily a GPS   699
# 7      Oblečení a móda   601
# 8         Do kanceláře   429
# 9    Audio, Video a TV   305
# 10            Software   269
# 11        Dětské zboží   267
# 12   Filmy, knihy, hry   223
# 13                 Hry   158
# 14 Malá smart technika   132
# 15     Sportovní zboží    79
# 16           Auto-moto    32

# koláčový graf: počet produktů podle kategorií
ggplot(shop,
       aes(x = factor(""), fill = cat_first) ) +
  geom_bar() +
  coord_polar(theta = "y") +
  scale_x_discrete("") +
  ggtitle("Počet produktů podle kategorií")

Koláčové grafy jsou ošklivé a nikdo je nemá rád. Takže je nedělejte. Tohle je jen na ukázku. Zkusíme lepší grafy. To zelené je kategorie elektronika 🙂

Podíváme se na počet produktů podle dostupnosti a ketegorie.

# Řazeno od skladem podle počtu.
shop %>%
  select(delivery,cat_first) %>%
  group_by(delivery,cat_first) %>%
  summarise(pocet = n()) %>%
  arrange(delivery,desc(pocet))
# A tibble: 43 x 3
# Groups:   delivery [3]
#   delivery         cat_first pocet
#     <fctr>            <fctr> <int>
# 1        0       Elektronika 10091
# 2        0   Oblečení a móda   601
# 3        0       Fotoaparáty   491
# 4        0                PC   419
# 5        0      Do kanceláře   320
# 6        0      Mobily a GPS   239
# 7        0 Filmy, knihy, hry   212
# 8        0        Bílé zboží   207
# 9        0     Dům a zahrada   144
# 10       0 Audio, Video a TV   129
# ... with 33 more rows

# barplot: dostupnost podle kategorií
# (všechny a v jednotlivých grafech)
ggplot(shop, aes(x = delivery)) +
  geom_bar() +
  theme_bw() +
  facet_wrap(~cat_first) +
  ggtitle("Dostupnost podle kategorií") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet")

Produktů z kategorie elektronika je nejvíc, ostatní kategorie tak skoro vymazala. Podíváme se na graf bez ní.

# barplot: dostupnost podle nejvyšší kategorie bez elektroniky
# (v jednotlivých grafech)
shop %>%
  filter(cat_first != "Elektronika") %>%
  ggplot(aes(x = delivery)) +
  geom_bar() +
  theme_bw() +
  facet_wrap(~cat_first, ncol = 5) +
  ggtitle("Dostupnost podle kategorií bez kategorie elektronika") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet")

To už je lepší. Vidím, že dům a zahrada není moc skladem, takže to nebude zajímavé. Skladem je oblečení a móda, to je potřeba prověřit.

# barplot: dostupnost podle nejvyšší kategorie bez elektroniky
# (v jednom grafu)
shop %>%
  filter(cat_first != "Elektronika") %>%
  ggplot(aes(x = cat_first, fill = delivery)) +
  geom_bar() +
  theme_bw() +
  theme(axis.text.x=element_text(angle=90, hjust=1)) +
  ggtitle("Dostupnost podle kategorií bez kategorie elektronika") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet") +
  labs(fill = "delivery")

# barplot: stejný graf jen s vybranými kategoriemi
shop %>%
  filter(cat_first == "Fotoaparáty" | cat_first == "Dětské zboží"
         | cat_first == "Bílé zboží" | cat_first == "PC"
         | cat_first == "Dům a zahrada" | cat_first == "Mobily a GPS"
         | cat_first == "Oblečení a móda" | cat_first == "Do kanceláře"
         | cat_first == "Audio, Video a TV" | cat_first == "Hry") %>%
# to samé, ale kratší zápis filtrování
# filter(str_detect(cat_first, "^Fo|Dě|B|P|M|O|A|H")) %>%
  ggplot(aes(x = cat_first, fill = delivery)) +
  geom_bar() +
  theme_bw() +
  ggtitle("Dostupnost podle kategorií - top kategorie") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet") +
  labs(fill = "delivery")

Analýza cen

# analýza cen všech produktů (průměr, medián, quantily, minimum a maximum)
summary(shop$price)
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   13     555    1454    4903    4278  504162 

# cena (průměr, medián, odchylka, minimum, maximum a první quantile)
# podle kategorií seřazeno podle nejlevnějších produktů
shop %>%
  group_by(cat_first) %>%
  summarise(mean = mean(price),
            median = median(price),
            sd = sd(price),
            min = min(price),
            max = max(price),
            quantile_first = quantile(price, prob = c(.25))) %>%
  arrange((min))
# A tibble: 16 x 7
#            cat_first     mean  median       sd     min   max  quantile_first
#                <fctr>    <dbl>  <dbl>      <dbl> <dbl>  <dbl>          <dbl>
# 1                  PC 5097.715  515.5  9319.8091    13  70366         227.25
# 2         Elektronika 5217.912 1545.0 12520.9233    25 504162         569.50
# 3                 Hry 1575.253  546.0  3571.5924    32  23929         272.75
# 4   Audio, Video a TV 1851.148  716.0  3793.2681    34  40627         304.00
# 5         Fotoaparáty 7574.609 1629.0 20928.8762    49 379900         407.00

A následně vizualizace…

# boxplot: cenové rozpětí podle kategorií
# - omezeno na max 50k Kč, aby bylo něco vidět
shop %>%
  filter(price < 50000) %>%
  ggplot(aes(x = cat_first, y = price)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x=element_text(angle=90, hjust=1)) +
  ggtitle("Cenové rozpětí podle kategorií (max 50k Kč)") +
  xlab("Cena") +
  ylab("Celkový počet")

V kategorii fotoaparáty a PC je medián mnohem nižší než průměr. Je tam tedy docela dost produktů s velmi vysokou cenou. Oproti tomu ve sportovním zboží je vše v úzkém rozpětí.

Teď ještě to stejné jen s vybranými kategoriemi…

# boxplot: vybrané kategorie
shop %>%
  filter(cat_first == "Bílé zboží" | cat_first == "Dětské zboží"
         | cat_first == "Dům a zahrada" | cat_first == "Mobily a GPS"
         | cat_first == "Oblečení a móda" | cat_first == "Hry"
         | cat_first == "Audio, Video a TV" | cat_first == "PC") %>%
  ggplot(aes(x = cat_first, y = price)) +
  geom_boxplot() +
  theme_bw() +
  ggtitle("Cenové rozpětí top kategorií") +
  xlab("Cena") +
  ylab("Celkový počet")

Rozložení ceny pro vše v kombinaci s dostupností…

# histogram: distribuce ceny podle dostupnosti
shop %>%
  filter(price < 25000) %>%
  ggplot(aes(x = price, fill = delivery)) +
  geom_histogram(binwidth = 500) +
  theme_bw() +
  ggtitle("Cenové rozpětí podle dostupnosti (max 25k Kč)") +
  xlab("Cena (rozpětí po 500 Kč)") +
  ylab("Celkový počet")

Nevypadá to příliš užitečně, ale zdá se, že v rozpětí od 9k do 14k Kč, které mě docela zajímá, není zboží tolik skladem.

shop %>%
  filter(price > 9000 & price < 14000) %>%
  ggplot(aes(x = price, fill = delivery)) +
  geom_histogram(binwidth = 200) +
  theme_bw() +
  ggtitle("Cenové rozpětí podle dostupnosti (od 9k do 14k Kč)") +
  xlab("Cena (rozpětí po 200 Kč)") +
  ylab("Celkový počet")

Když to zobrazím poměrně, bude to snad patrnější.

shop %>%
  filter(price > 9000 & price < 14000) %>%
  ggplot(aes(x = price, fill = delivery)) +
  geom_histogram(binwidth = 200, position = 'fill') +
  theme_bw() +
  ggtitle("Cenové rozpětí podle dostupnosti (od 9k do 14k Kč)") +
  xlab("Cena (rozpětí po 200 Kč)") +
  ylab("Celkový počet")

Je to zhruba půl na půl…

Ještě se podívám na nejlevnější a nejdražší produkty.

# jaké jsou nejlevnějsí produkty
shop %>%
  select(product, price, cat_first) %>%
  filter(price < 20)
# A tibble: 6 x 3
#                                  product price cat_first
#                                    <chr> <dbl>    <fctr>
# 1     BRDK patch kabel Cat5E, UTP - 0,5m    13        PC
# 2     BRDK patch kabel Cat5E, UTP - 0,5m    13        PC
# 3     BRDK patch kabel Cat5E, UTP - 1m      17        PC

# a jaké je nejdražší zboží
shop %>%
  select(product, price, cat_first) %>%
  filter(price > 300000)
# A tibble: 6 x 3
#                                      product  price    cat_first
#                                        <chr>  <dbl>       <fctr>
# 1    Projektor BenQ LU9715, WUXGA, 8000 ANSI 345968  Elektronika
# 2     LAGDA 200-500mm F6,8 / 800-1000mm F5,6 379900  Fotoaparáty
# 3                       LAGDA 300-500mm F2,8 379900  Fotoaparáty
# 4                      Skartovač GPM FA500.2 455382 Do kanceláře

Další analýza top kategorie elektronika. Dost možná, že začnu jen s touto kategorií.

# počet produktů v kategorii elektronika podle druhé nejvyšší kategorie
shop %>%
  filter(cat_first == "Elektronika") %>%
  select(cat_second) %>%
  group_by(cat_second) %>%
  summarise(pocet = n()) %>%
  arrange(desc(pocet))
# A tibble: 4 x 2
#               cat_second pocet
#                   <fctr> <int>
# 1                     PC 17531
# 2       TV, video, audio  2052
# 3 Mobilní telefony a GPS   896
# 4     Foto příslušenství   172

# dostupnost v kategorii elektronika podle druhé nejvyšší kategorie
# - řazeno od delivery 0 dní podle počtu
shop %>%
  filter(cat_first == "Elektronika") %>%
  select(delivery,cat_second) %>%
  group_by(delivery,cat_second) %>%
  summarise(pocet = n()) %>%
  arrange(delivery,desc(pocet))
# A tibble: 11 x 3
# Groups:   delivery [3]
#    delivery             cat_second pocet
#      <fctr>                 <fctr> <int>
# 1         0                     PC  8760
# 2         0       TV, video, audio   926
# 3         0 Mobilní telefony a GPS   389
# 4         0     Foto příslušenství    16
# 5         3                     PC  1497
# 6         3       TV, video, audio   213
# 7         3 Mobilní telefony a GPS    27
# 8        14                     PC  7274
# 9        14       TV, video, audio   913
# 10       14 Mobilní telefony a GPS   480
# 11       14     Foto příslušenství   156

# a ve sloupcovém grafu
shop %>%
  filter(cat_first == "Elektronika") %>%
  ggplot(aes(x = cat_second, fill = delivery)) +
  geom_bar() +
  theme_bw() +
  facet_wrap(~cat_first, ncol = 5) +
  ggtitle("Dostupnost podle druhé nejvyšší kategorie v kategorii elektronika") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet")

# jaké značky jsou v kategorii elektronika > PC nejvíce zastoupeny
shop %>%
  filter(cat_first == "Elektronika") %>%
  filter(cat_second == "PC") %>%
  select(cat_second,brand) %>%
  group_by(brand) %>%
  summarise(pocet = n()) %>%
  arrange(desc(pocet))
# A tibble: 200 x 2
#             brand pocet
#            <fctr> <int>
# 1              HP  1550
# 2           Xerox  1424
# 3           Epson   948
# 4         Rayfilm   825
# 5           Canon   782
# 6         Brother   558
# 7          Lenovo   547
# 8            Asus   500
# 9  Konica Minolta   430
# 10        Lexmark   419
# ... with 190 more rows

# nejčastěji zastoupené značky v kategorii elektronika > PC podle dostupnosti
shop %>%
  filter(cat_first == "Elektronika") %>%
  filter(brand == "HP" | brand == "Xerox"
         | brand == "Epson" | brand == "Rayfilm"
         | brand == "Canon" | brand == "Brother") %>%
  ggplot(aes(x = brand, fill = delivery)) +
  geom_bar() +
  theme_bw() +
  ggtitle("Dostupnost nejčastějších značek v kategorii elektronika > PC") +
  xlab("Delivery 0 - 3 - 14") +
  ylab("Celkový počet")

Důležité je vědět, zda nejsou produkty duplicitní. Hádal bych, že tomu tak bude v kategorii oblečení a móda. Podívám se tedy na to, jestli jsou názvy v product unikátní.

# kolik je unikátních produktů
length(unique(shop$product))
# [1] 27295
# kolik je unikátních lze i takto:
shop %>% select(product) %>%
  distinct()
# A tibble: 27,295 x 1

# celkově je 27 296 řádků, takže máme jednu duplicitu
dup.product <- shop[which(duplicated(shop$product)), "product"]
# podíváme se, které to jsou
shop[which(shop$product %in% dup.product),]
# A tibble: 2 x 7
#                                          product
#                                            <chr>
# 1 Skříňka ACUTAKE ACU-SPEED-HANDLED (ROHS verze)
# 2 Skříňka ACUTAKE ACU-SPEED-HANDLED (ROHS verze)

Typové názvy produktů je nutné očistit od nesmyslů. Hodí se proto podívat se na to, kde se nejvíc upravovaly.

# čištění product_pure
shop$product_pure <- gsub("\\s\\+.*", "", shop$product_pure)
shop$product_pure <- gsub("\\(.*\\)", "", shop$product_pure)
shop$product_pure <- gsub(",\\s.*", "", shop$product_pure)

# podívám se několikrát na náhodně vybrané očištěné produkty,
# abych věděl, co ještě odstranit. Vypadá to dobře.
shop %>% select(product_pure) %>%
  sample_n(size=3)
# A tibble: 3 x 1
#                           product_pure
#                                  <chr>
# 1                                SSD 2
# 2    CC GIGABYTE HTR0-HD3  GA-H270-HD3
# 3 WD BLUE SSD WDS1456GH0A 1TB SATA/600

# vytvoření nových proměnných - počet slov v product a product_pure
shop <- shop %>% mutate(product_delka = str_count(shop$product," ")+1)
shop <- shop %>% mutate(product_pure_delka = str_count(shop$product_pure," ")+1)

# v jaké kategorii jsou nejkratší slova
shop %>%
  select(cat_first, product_delka) %>%
  group_by(cat_first) %>%
  summarise(mean_pocet_slov = mean(product_delka)) %>%
  arrange(mean_pocet_slov)
# A tibble: 16 x 2
#              cat_first mean_pocet_slov
#                 <fctr>           <dbl>
# 1      Oblečení a móda        2.594010
# 2           Bílé zboží        5.820126
# 3    Filmy, knihy, hry        6.986547
# 4                  Hry        7.177215
# 5         Dětské zboží        7.333333
# 6         Do kanceláře        7.466200
# 7      Sportovní zboží        7.518987
# 8        Dům a zahrada        7.601004
# 9  Malá smart technika        8.037879
# 10   Audio, Video a TV        8.540984
# 11         Fotoaparáty        8.586425
# 12        Mobily a GPS        8.742489
# 13         Elektronika        8.938841
# 14                  PC        9.180371
# 15           Auto-moto        9.656250
# 16            Software       10.122677

Konečně se podívám na produkty v kategorii oblečení a móda. Už je to hodně podezřelé 🙂

shop %>%
  filter(cat_first == "Oblečení a móda") %>%
  filter(product_delka > 0 & product_delka < 3) %>%
  select(product,product_delka) %>%
  arrange(product_delka) %>%
  print(n=10)
# A tibble: 279 x 2
#            product product_delka
#              <chr>         <dbl>
# 1  Casio GA/100-1A             2
# 2  Casio GA/110-1A             2
# 3  Casio GA/140-1A             2
# 4  Casio GA/150-1A             2
# 5  Casio GA/170-1A             2
# 6  Casio GA/190-1A             2
# 7  Casio GA/210-1A             2
# 8  Casio GA/280-1A             2
# 9  Casio GA/310-1A             2
# 10 Casio GA/400-1A             2
# ... with 269 more rows

Takže nakonec v kategorii oblečení a móda jsou jen hodinky 🙂

Závěrem se ještě podívám na to, kde se text odstraňoval nejvíc.

# vytvořím novou proměnnou - rozdíl délky textu
shop <- shop %>%
  mutate(product_rozdil = product_delka - product_pure_delka)

# v jaké kategorii se nejvíc zkracovalo
shop %>%
  select(cat_first, product_rozdil) %>%
  group_by(cat_first) %>%
  summarise(mean_pocet_slov = mean(product_rozdil)) %>%
  arrange(desc(mean_pocet_slov))
# A tibble: 16 x 2
#              cat_first mean_pocet_slov
#                 <fctr>           <dbl>
# 1      Sportovní zboží       3.0632911
# 2                   PC       2.4018568
# 3          Fotoaparáty       2.1085973
# 4          Elektronika       2.0302165
# 5            Auto-moto       1.9375000
# 6    Audio, Video a TV       1.7278689
# 7         Mobily a GPS       1.6223176
# 8             Software       1.3494424
# 9  Malá smart technika       0.9545455
# 10                 Hry       0.9367089
# 11        Dětské zboží       0.7228464
# 12       Dům a zahrada       0.6913425
# 13        Do kanceláře       0.5874126
# 14          Bílé zboží       0.2893082
# 15   Filmy, knihy, hry       0.0000000
# 16     Oblečení a móda       0.0000000

# zkontroluji produkty v kategorii sportovní zboží
shop %>%
  filter(cat_first == "Sportovní zboží") %>%
  filter(product_rozdil > 6) %>%
  select(product,product_rozdil) %>%
  print(width=Inf)
# A tibble: 4 x 2
#                                                product product_rozdil
#                                                  <chr>          <dbl>
# 1                                EVOLVEO TWISTER LIGHT,
#      voděodolné světlo do 10m, solární a ručně nabíjené             8
# 2                       EVAL CAR LIGHT, multi světlo do
#        auta, ruční dobíjení, dobíječka pro mobily APPLE            10
# 3                    EVANOS LED světlo čelovka DDGB004,
#       0.5W Nicea LED + 1 červená LED, 1x AA 18909188800            10

V této kategorii jsou velmi dlouhé a mnohaslovné názvy. Nejspíš ji nebudu vůbec nastavovat, nemělo by to smysl.

Určitě se dá analyzovat ještě spousta věcí. Je mít chuť a čas! Na druhou stranu, na základní přehled stačí i mnohem méně 🙂

Autor

Miroslav Šollar

Jsem PPCčkař. Působím v Praze. 7 let mě baví a živí online marketing, posledních pět let se specializuji na PPC reklamu.