суббота, 6 июня 2020 г.

R : работа с факторами


Преобразование символьного вектора в факторный

Допустим у нас есть символьный вектор, состоящий из двух значений "w" и "h", причем "w" повторяется 5 раз, а "h" два. И нам необходимо вывести количество повторений каждого символа в векторе. Попробуем воспользоваться для этого функцией summary и построить график с помощью функции plot.

x <- c(rep('w',5),rep('h',2))       
x

[1] "w" "w" "w" "w" "w" "w" "h" "h"


summary(x)           
               
Получаем на выходе для  summary


   Length     Class      Mode 
       8 character character 

plot(x)                                   

И ошибку для plot


Error in plot.window(...) : нужны конечные значения 'ylim'

Преобразуем вектор в факторный тип и повторим


xf <- factor(x)                
summary(x)           

plot(x)                                   


h w 
2 5


Перейдем к более интересным данным. Для этого загрузим датафрейм с дневными продажами розничного магазина одежды. Выведем его первые строки и структуру :

shop <- read_excel("ShopSale06.xlsx")
head(shop)

# A tibble: 6 x 6
  Date                            Code       Gender    Category      Season           Amt
  <dttm>                       <chr>      <chr>       <chr>    <       chr>          <dbl>
1 2019-06-01 00:00:00 SQ52420 Женский Шорты        Лето              1
2 2019-06-01 00:00:00 SQ54655 Мужской Шорты        Лето              1
3 2019-06-01 00:00:00 SQ60070 Унисекс Аксессуары  Универсал   1
4 2019-06-01 00:00:00 SQ60453 Женский Рубашка      Универсал   1
5 2019-06-01 00:00:00 SQ49034 Мужской Шорты        Лето              1
6 2019-06-01 00:00:00 SQ49786 Мужской Брюки         Лето              1

str(shop)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1411 obs. of  6 variables:
 $ Date    : POSIXct, format: "2019-06-01" "2019-06-01" "2019-06-01" ...
 $ Code    : chr  "SQ52420" "SQ54655" "SQ60070" "SQ60453" ...
 $ Gender  : chr  "Женский" "Мужской" "Унисекс" "Женский" ...
 $ Category: chr  "Шорты" "Шорты" "Аксессуары" "Рубашка" ...
 $ Season  : chr  "Лето" "Лето" "Универсал" "Универсал" ...
 $ Amt     : num  1 1 1 1 1 1 1 1 1 1 ...

В этом датафрейме 1411 наблюдений по 6 переменным, с одним типом Дата четырьмя символьными и одним числовым. Каждая строка представляет продажи одного артикула в течение дня. Допустим мы хотим узнать распределение продаж по дням недели. Для этого добавим еще одну колонку WDay

shop$Wday <- wday(shop$Date, label = T)
class(shop$wday)

[1] "ordered" "factor" 


Функция  class  показала что это упорядоченный фактор, применим функцию summary , которая выведет нам продажи по дням недели

summary(shop$wday)


 Вс  Пн  Вт  Ср  Чт  Пт  Сб 
294 123 153 176 165 147 353

Далее хотелось бы вывести количество продаж по категориям. Выведем класс этого показателя и что с ним можно сделать без преобразований

class(shop$Category)

[1] "ordered" "factor" 

summary(shop$Category)

   Length     Class      Mode 
     1411 character character

unique(shop$Category)

[1] "Шорты"     "Аксессуары"    "Рубашка"   "Брюки"     "Футболка"  "Платье"    "Куртка"    "Юбка"     
[9] "Толстовка

plot(shop$Category)

выдаст ошибку

Не очень много полезной информации и далеко не то, что нам нужно. Преобразуем значения в фактор , добавим новую колонку в датафрейм и проведем подобные действия 

shop$Category2 <- factor(shop$Category)
str(shop$Category2)                        

 Factor w/ 9 levels "Брюки","Куртка",..: 8 8 4 5 8 1 5 7 5 1 ...

summary(shop$Category2)

Аксессуары Брюки  Куртка Платье  Рубашка Толстовка  Футболка Шорты Юбка 
      361               198       50         23            100              32              501          139        7 

plot(shop$Category2)




В данном случае мы получили, то что хотели, однако и это представление можно улучшить, сделать так, чтобы категории шли по нисходящим продажам. Для этого используем функцию из пакета  forcats.

shop$Category3 <- forcats::fct_infreq(shop$Category)
str(shop$Category3)                                 

Factor w/ 9 levels "Футболка","Разное",..: 4 4 2 5 4 3 5 1 5 3 ...

summary(shop$Category3)                       

 Футболка    Аксессуары     Брюки     Шорты   Рубашка    Куртка Толстовка    Платье      Юбка 
      501                361                 198          139            100             50             32              23              7      

plot(shop$Category3)                                



Но и это еще не все, допустим мы хотим выделить три самые продаваемые категории, а остальные объединить, это можно сделать с помощью функций из того же пакета

shop$Category4 <- fct_lump(shop$Category, n = 3)
summary(shop$Category4)                                    

Аксессуары      Брюки   Футболка      Other 
       361                  198            501             351 

plot(shop$Category4)       |     


А с помощью другой функции упорядочить по продажам от большего к меньшему

shop$Category4 <- fct_infreq(fct_lump(shop$Category, n = 3)) 
summary(shop$Category4)                              

Футболка  Аксессуары      Other      Брюки 
       501            361               351        198 
      
plot(shop$Category4)                                       





















Комментариев нет:

Отправить комментарий