library(readr)
library(dplyr)
library(lubridate)
library(stringr)
library(ggplot2)
Загрузим их
Это датасет с отзывами на костюмы для тыквенного спас (Хеллоуина) из Амазона. Данные совсем не предобрабатывались, поэтому это хорошая возможность посмотреть на формат с которым приходится работать в реальном мире.
library(readr)
Costumes_Amazon <- read_csv("Costumes_Amazon.csv")
# View(Costumes_Amazon)
и сравним с тем что должно было быть
В чём проблема? Давайте посмотрим на raw данные
В первые строчки файла попало описание, поэтому давайте не будем загружать эти строчки в датафрейм и просто пропутим их
Costumes_Amazon <- read_csv("Costumes_Amazon.csv", skip = 8)
Посмотрим на то, как данные выглядят теперь
Costumes_Amazon %>% head
## # A tibble: 6 x 5
## text date title rating `product name`
## <chr> <chr> <chr> <dbl> <chr>
## 1 "\n This wig is d… Reviewed in t… Too small… 2 Chestnut Cone Wig wWig C…
## 2 "\n Awesome wig! … Reviewed in t… Overall g… 4 Chestnut Cone Wig wWig C…
## 3 "\n One size fits… Reviewed in t… Too small… 2 Chestnut Cone Wig wWig C…
## 4 "\n Fit snug but … Reviewed in t… Cute wig 5 Chestnut Cone Wig wWig C…
## 5 "\n This is a ver… Reviewed in t… Great pie… 5 Chestnut Cone Wig wWig C…
## 6 "\n great additio… Reviewed in t… love it! 5 Chestnut Cone Wig wWig C…
Эти данные могут быть полезны вам, если вы магазин костюмов, чтобы узнать что нравится или не нравится вашим покупателям. Или если вы производитель костюмов и вам нужно создать новый костюм, и избежать ошибок, которые часто раздражают покупателей.
Очень часто приходится работать с датой, которую записывают в неудобном формате
Есть ли у вас идеи, как её можно было бы извлечь? попробуйте, потом обсудим
Costumes_Amazon %>%
head()# %>%
## # A tibble: 6 x 5
## text date title rating `product name`
## <chr> <chr> <chr> <dbl> <chr>
## 1 "\n This wig is d… Reviewed in t… Too small… 2 Chestnut Cone Wig wWig C…
## 2 "\n Awesome wig! … Reviewed in t… Overall g… 4 Chestnut Cone Wig wWig C…
## 3 "\n One size fits… Reviewed in t… Too small… 2 Chestnut Cone Wig wWig C…
## 4 "\n Fit snug but … Reviewed in t… Cute wig 5 Chestnut Cone Wig wWig C…
## 5 "\n This is a ver… Reviewed in t… Great pie… 5 Chestnut Cone Wig wWig C…
## 6 "\n great additio… Reviewed in t… love it! 5 Chestnut Cone Wig wWig C…
# mutate(new_date = date %>% ...)
Вот несколько решений
Costumes_Amazon %>%
head() %>%
mutate(new_date = date %>% str_extract_all("[[:digit:]]+"))
## # A tibble: 6 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <list>
## 1 "\n This wig i… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… <chr [2…
## 2 "\n Awesome wi… Reviewed in… Overall… 4 Chestnut Cone Wig wWig… <chr [2…
## 3 "\n One size f… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… <chr [2…
## 4 "\n Fit snug b… Reviewed in… Cute wig 5 Chestnut Cone Wig wWig… <chr [2…
## 5 "\n This is a … Reviewed in… Great p… 5 Chestnut Cone Wig wWig… <chr [2…
## 6 "\n great addi… Reviewed in… love it! 5 Chestnut Cone Wig wWig… <chr [2…
Costumes_Amazon %>%
head() %>%
mutate(new_date = date %>% str_extract("[[:digit:]], [[:digit:]]+"))
## # A tibble: 6 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 "\n This wig i… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… 8, 2017
## 2 "\n Awesome wi… Reviewed in… Overall… 4 Chestnut Cone Wig wWig… 7, 2019
## 3 "\n One size f… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… 0, 2018
## 4 "\n Fit snug b… Reviewed in… Cute wig 5 Chestnut Cone Wig wWig… 3, 2019
## 5 "\n This is a … Reviewed in… Great p… 5 Chestnut Cone Wig wWig… 7, 2018
## 6 "\n great addi… Reviewed in… love it! 5 Chestnut Cone Wig wWig… 0, 2018
Costumes_Amazon %>%
head() %>%
mutate(new_date = date %>% parse_number)
## # A tibble: 6 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <dbl>
## 1 "\n This wig i… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… 28
## 2 "\n Awesome wi… Reviewed in… Overall… 4 Chestnut Cone Wig wWig… 27
## 3 "\n One size f… Reviewed in… Too sma… 2 Chestnut Cone Wig wWig… 30
## 4 "\n Fit snug b… Reviewed in… Cute wig 5 Chestnut Cone Wig wWig… 3
## 5 "\n This is a … Reviewed in… Great p… 5 Chestnut Cone Wig wWig… 27
## 6 "\n great addi… Reviewed in… love it! 5 Chestnut Cone Wig wWig… 30
Теперь извлечём месяц и преобразуем его в число
month.name
## [1] "January" "February" "March" "April" "May" "June"
## [7] "July" "August" "September" "October" "November" "December"
month.name_tofind <- str_c(month.name, collapse="|")
Costumes_Amazon %>%
head() %>%
mutate(month = date %>% str_extract(month.name_tofind)) %>%
mutate(month_num = match(month, month.name)) %>%
mutate(month_num2 = as.integer(factor(month, levels = month.name)))
## # A tibble: 6 x 8
## text date title rating `product name` month month_num month_num2
## <chr> <chr> <chr> <dbl> <chr> <chr> <int> <int>
## 1 "\n This… Reviewe… Too s… 2 Chestnut Cone Wi… Dece… 12 12
## 2 "\n Awes… Reviewe… Overa… 4 Chestnut Cone Wi… Octo… 10 10
## 3 "\n One … Reviewe… Too s… 2 Chestnut Cone Wi… Sept… 9 9
## 4 "\n Fit … Reviewe… Cute … 5 Chestnut Cone Wi… Febr… 2 2
## 5 "\n This… Reviewe… Great… 5 Chestnut Cone Wi… July 7 7
## 6 "\n grea… Reviewe… love … 5 Chestnut Cone Wi… Octo… 10 10
И соберём дату целиком, но тут есть задание
Найдите ошибку, почему некоторые данные не обработались
Подсказка: сравните финальную дату и дату, которая извлеклась
Costumes_Amazon %>%
mutate(new_date = date %>%
str_extract("[[:digit:]], [[:digit:]]+") %>%
str_replace(", ", "-")) %>%
mutate(month = date %>%
str_extract(month.name_tofind) %>%
factor(levels = month.name) %>%
as.integer()) %>%
mutate(new_date = str_c(month,new_date, sep = "-")%>% as.Date(format = "%m-%d-%Y"))
## # A tibble: 7,814 x 7
## text date title rating `product name` new_date month
## <chr> <chr> <chr> <dbl> <chr> <date> <int>
## 1 "\n This wi… Reviewed … Too sm… 2 Chestnut Cone Wig w… 2017-12-08 12
## 2 "\n Awesome… Reviewed … Overal… 4 Chestnut Cone Wig w… 2019-10-07 10
## 3 "\n One siz… Reviewed … Too sm… 2 Chestnut Cone Wig w… NA 9
## 4 "\n Fit snu… Reviewed … Cute w… 5 Chestnut Cone Wig w… 2019-02-03 2
## 5 "\n This is… Reviewed … Great … 5 Chestnut Cone Wig w… 2018-07-07 7
## 6 "\n great a… Reviewed … love i… 5 Chestnut Cone Wig w… NA 10
## 7 "\n Fun pur… Reviewed … Fun Pu… 5 Chestnut Cone Wig w… 2017-12-01 12
## 8 "\n Great l… Reviewed … Five S… 5 Chestnut Cone Wig w… 2018-05-03 5
## 9 "\n Fun and… Reviewed … Fun! 5 Chestnut Cone Wig w… 2017-11-03 11
## 10 "\n I like … Reviewed … Two St… 2 Chestnut Cone Wig w… 2018-02-09 2
## # … with 7,804 more rows
# не забудьте сохранить изменения в датасете в переменную Costumes_Amazon_d
ответ: мы извлекали только 1 число из дня, поэтому всё что больше 9 не собралось полностью и создавало пропуски
Но есть и более аккурсатный вариант. Так как все наши записи выглядят как что-то что-то on Месяц день, год, то мы можем просто взять всё, что идёт после on, убрать всё лишнее, а остальное сделает lubridate
Costumes_Amazon_d = Costumes_Amazon %>%
mutate(new_date = date %>%
str_extract("on .+") %>%
str_remove("on ") %>%
mdy())
Когда люди чаще всего пишут отзывы про костюмы? (в какие месяцы, в какой год) Как вы думаете, почему так?
Costumes_Amazon_d
## # A tibble: 7,814 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <date>
## 1 "\n This wig … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2017-12-28
## 2 "\n Awesome w… Reviewed i… Overall… 4 Chestnut Cone Wig wWi… 2019-10-27
## 3 "\n One size … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2018-09-30
## 4 "\n Fit snug … Reviewed i… Cute wig 5 Chestnut Cone Wig wWi… 2019-02-03
## 5 "\n This is a… Reviewed i… Great p… 5 Chestnut Cone Wig wWi… 2018-07-27
## 6 "\n great add… Reviewed i… love it! 5 Chestnut Cone Wig wWi… 2018-10-30
## 7 "\n Fun purch… Reviewed i… Fun Pur… 5 Chestnut Cone Wig wWi… 2017-12-01
## 8 "\n Great loo… Reviewed i… Five St… 5 Chestnut Cone Wig wWi… 2018-05-03
## 9 "\n Fun and w… Reviewed i… Fun! 5 Chestnut Cone Wig wWi… 2017-11-23
## 10 "\n I like it… Reviewed i… Two Sta… 2 Chestnut Cone Wig wWi… 2018-02-19
## # … with 7,804 more rows
Есть ли связь между временем года и оценкой? используйте функцию quarter из пакета lubridate
?quarter
Costumes_Amazon_d %>%
mutate()
## # A tibble: 7,814 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <date>
## 1 "\n This wig … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2017-12-28
## 2 "\n Awesome w… Reviewed i… Overall… 4 Chestnut Cone Wig wWi… 2019-10-27
## 3 "\n One size … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2018-09-30
## 4 "\n Fit snug … Reviewed i… Cute wig 5 Chestnut Cone Wig wWi… 2019-02-03
## 5 "\n This is a… Reviewed i… Great p… 5 Chestnut Cone Wig wWi… 2018-07-27
## 6 "\n great add… Reviewed i… love it! 5 Chestnut Cone Wig wWi… 2018-10-30
## 7 "\n Fun purch… Reviewed i… Fun Pur… 5 Chestnut Cone Wig wWi… 2017-12-01
## 8 "\n Great loo… Reviewed i… Five St… 5 Chestnut Cone Wig wWi… 2018-05-03
## 9 "\n Fun and w… Reviewed i… Fun! 5 Chestnut Cone Wig wWi… 2017-11-23
## 10 "\n I like it… Reviewed i… Two Sta… 2 Chestnut Cone Wig wWi… 2018-02-19
## # … with 7,804 more rows
На какой товар чаще всего писли отзывы в этот хеллоуин? А в прошлый? А на следующий день после хеллоуина?
Какой товар самый старый, а какой самый новый?
Подумайте над словами, которые могут повлиять на оценку. Напишите в чат пример такого слова и вашу гипотезу про оценку товара
Например “spooky” увеличивает оценку, так как все хотят быть страшными на хеллоуин
Costumes_Amazon_d %>%
select(text) %>%
filter(str_detect(text %>% tolower(), "spooky")) %>%
kableExtra::kbl()
text |
---|
My daughter is 2.5years old. This was alittle long on her but arm length it fit well. She loves this costume! She wears it all the time pretending that she’s a “spooky witch” |
Well made easy to put on and take off. Thick velvety-ish material. Not too spooky or revealing. |
I was so pleased with this costume for my almost 5 year old son! My son decided he wanted to be a “spooky bat” for Halloween and when browsing for a costume to buy, I didn’t look at this at first because I was turned off by the stockings/overall styling of the photo. It’s really just a nice big fleece hoodie! So easy to put on and you can easily layer if you need to for a very cold Halloween. My son loved it and he got tons of compliments from his friends at school and his friends’ parents loved it too. My son is very tall for his age and I struggled with what size to get but thanks to some other reviews I selected a size medium. It was a great fit! Big enough for layering and for him to be able to wear for a while but it didn’t look too large on him either. For other clothing he normally wears 5T or boys size 6 for tops. I hope Amazon adds some additional photos of the hoodie by itself and on other kids (both boys and girls!) so it isn’t so misleading as it is now with the current photo. |
Отобрали некоторые слова заранее, но их можно заменить на удачные примеры из чата
Costumes_Amazon_d %>%
mutate(text = str_to_lower(text)) %>%
mutate(word_kid = str_detect(text, "kid"),
word_adult = str_detect(text, "adult"),
word_fun = str_detect(text, "fun"),
word_size = str_detect(text, "size")) -> Costumes_Amazon_d2
Costumes_Amazon_d2 %>%
summary()
## text date title rating
## Length:7814 Length:7814 Length:7814 Min. :1.000
## Class :character Class :character Class :character 1st Qu.:4.000
## Mode :character Mode :character Mode :character Median :5.000
## Mean :4.363
## 3rd Qu.:5.000
## Max. :5.000
## product name new_date word_kid word_adult
## Length:7814 Min. :2010-02-03 Mode :logical Mode :logical
## Class :character 1st Qu.:2017-05-07 FALSE:7465 FALSE:7723
## Mode :character Median :2019-01-08 TRUE :349 TRUE :91
## Mean :2018-07-17
## 3rd Qu.:2019-12-16
## Max. :2020-10-31
## word_fun word_size
## Mode :logical Mode :logical
## FALSE:7407 FALSE:6509
## TRUE :407 TRUE :1305
##
##
##
Посчитайте есть ли отличия в рейтинге отзывов, которые содержат выбранные слова от тех, где где их нет. Какое слово сильнее всего влияет на рейтинг отзыва?
Есть ли какой-то продукт для которого много отзывов с определённым словом?
Как понять для кого был сделан костюм? Как отличить костюм для мальчика от костюма для девочки?
Costumes_Amazon_d %>%
mutate()
## # A tibble: 7,814 x 6
## text date title rating `product name` new_date
## <chr> <chr> <chr> <dbl> <chr> <date>
## 1 "\n This wig … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2017-12-28
## 2 "\n Awesome w… Reviewed i… Overall… 4 Chestnut Cone Wig wWi… 2019-10-27
## 3 "\n One size … Reviewed i… Too sma… 2 Chestnut Cone Wig wWi… 2018-09-30
## 4 "\n Fit snug … Reviewed i… Cute wig 5 Chestnut Cone Wig wWi… 2019-02-03
## 5 "\n This is a… Reviewed i… Great p… 5 Chestnut Cone Wig wWi… 2018-07-27
## 6 "\n great add… Reviewed i… love it! 5 Chestnut Cone Wig wWi… 2018-10-30
## 7 "\n Fun purch… Reviewed i… Fun Pur… 5 Chestnut Cone Wig wWi… 2017-12-01
## 8 "\n Great loo… Reviewed i… Five St… 5 Chestnut Cone Wig wWi… 2018-05-03
## 9 "\n Fun and w… Reviewed i… Fun! 5 Chestnut Cone Wig wWi… 2017-11-23
## 10 "\n I like it… Reviewed i… Two Sta… 2 Chestnut Cone Wig wWi… 2018-02-19
## # … with 7,804 more rows
Есть ли связь между длиной отзыва и оценкой?
Попробуйте улучшить следующий фрагмент кода, чтобы было хоть что-то понятно
Costumes_Amazon_d %>%
mutate(len = text %>% str_length()) %>%
ggplot(aes(rating, len))+
geom_point()
Что ещё можно было бы сделать с текстом отзывов? узнаем про это на паре про тексты в следующем модуле