Во овој документ навлеговме подлабоко во два значајни аспекти на работа со податоци. Прво, направивме едноставна линеарна регресија и ги разгледавме резултатите како графички така и преку R
објекти за регресии. Ова ни даде еден пример за работа со вистински (неуредни, недостапни, неадекватни) податоци, бидејќи беше очигледно дека регресијата беше под влијание на мал дел од податоците кои беа грешни или неадекватни. Откако видовме кои се овие податоци, беше лесно да ги тргнеме од датасетот, што резултираше со регресија која имаше повеќе смисла.
Втората значајна активност туке се однесува на користење на повеќе различни, но поврзани, табели за заедничко графирање. Типичен пример за ова е доколку сакаме да ги прикажеме сите податоци, но да го обрнеме вниманието на читателот на дел од податоците. Во вакви случаи вообичаено графираме еден слој (на пр., сиви точки) со сите податоци, и втор слој од обоени точки кои претставуваат накаква кондензација од сите податоци (средни вредности, суми, екстреми, итн.)
library(tidyverse)
library(ggrepel)
library(ggpubr)
pizza_barstool <-
readr::read_csv(
"https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-10-01/pizza_barstool.csv"
)
Дефинираме некои бои за консистентно боење низ документот
vv <- viridis::viridis(n = 9, alpha = .8, begin = .2 ,option = "C")[c(1,5,9)]
First grab just columns we need
pzbs <-
pizza_barstool %>%
dplyr::select(name,
address = address1,
city,
tidyselect::contains("average_score")) %>%
filter(review_stats_community_average_score > 0)%>%
filter(review_stats_dave_average_score > 0.2)
Calculate the other two dataset that we created in the exploratory session. Color the pizzerias based on the degree of rating disagreement. First lets calculate the difference in rating.
rate_diff <-
pzbs %>%
mutate(difference =
review_stats_community_average_score - review_stats_dave_average_score) %>%
mutate(agreement=1/difference)
Highlight points (outliers, influential values,..). We need another dataset, this time for the five pizzerias with largest negative and positive difference.
rate_diff_top5 <- rate_diff %>%
mutate(pos_neg = ifelse(difference > 0, "preferred by community", "preferred by dave")) %>%
group_by(pos_neg) %>%
top_n(n = 5, wt = abs(difference)) %>%
ungroup
More modifications to this data frame to make coordinates for segments for manual labels.
rdt5 <-
rate_diff_top5 %>%
mutate(name_city= paste(name, "\n(", city, ")", sep="")) %>%
select(name, name_city, contains("dave"), contains("community"), pos_neg, difference) %>%
arrange(pos_neg, desc(difference)) %>%
mutate(xend=c(rep(10.1,5), rep(2.4, 5))) %>%
mutate(yend=c(5,2,3,4,6, 7,6,10,9,8)) %>%
rename(x=review_stats_community_average_score,
y=review_stats_dave_average_score)
PP <-
ggplot(data = pzbs) +
geom_abline(slope = 1,
intercept = 0,
linetype = 2) +
aes(x = review_stats_community_average_score) +
aes(y = review_stats_dave_average_score) +
geom_point(
data = rate_diff,
inherit.aes = TRUE,
color = "white",
aes(size = abs(difference), fill = difference),
pch = 21
) +
geom_segment(
data = rdt5,
size = .5,
linetype = 3,
aes(
x = x,
y = y,
xend = xend,
yend = yend
)
) +
geom_label(
data = rdt5,
aes(
x = xend,
y = yend,
fill = difference,
label = str_wrap(name, 22)
),
size = 3.5,
hjust = c(rep(0, 5), rep(1, 5))
)
PP <- PP +
scale_fill_gradient2(
name = "",
low = vv[1],
mid = vv[2],
high = vv[3],
limits = c(-5, 7.5),
breaks = c(-5,-2.5, 0, 2.5, 5, 7.5),
labels = c(
"Dave's favorites\nrated low by the community",
"",
"",
"",
"",
"Community favorites\nrated low by Dave"
),
guide = guide_colourbar(
title.vjust = 1,
frame.colour = 'white',
label.position = "top",
frame.linewidth = 1,
ticks.colour = 'white',
ticks.linewidth = 2,
barheight = unit(.30, "cm"),
barwidth = unit(8, "cm"),
draw.ulim = TRUE,
draw.llim = TRUE
)
) +
scale_y_continuous(breaks = seq(0, 10, 2), limits = c(0, 12)) +
scale_x_continuous(breaks = seq(0, 10, 2), limits = c(0, 12)) +
scale_size_continuous(range = c(0.5, 8), guide = "none")
PP <- PP +
labs(x = "Community rating (average)") +
labs(y = "Dave's rating") +
labs(title = "Trust Dave?") +
labs(subtitle = "Or follow the crowd?") +
labs(caption = "TidyTuesdayAtKIKA using pizza_barstool data")
PP <- PP +
theme_minimal() +
theme(legend.position = 'bottom') +
theme(panel.background = element_rect(fill = "grey80", color = "white")) +
theme(plot.background = element_rect(fill = "grey80", color = "grey60")) +
theme(axis.title = element_text(hjust = 1, size = 12)) +
theme(axis.text = element_text(hjust = 1, size = 10))
PP
+
geom_label_repel(
data = rate_diff_top5, force=10,
aes(x = review_stats_community_average_score,
y = review_stats_dave_average_score,
label = name,
fill=difference),
alpha=.8,
inherit.aes = FALSE
)
library(ggforce)
gmark <- function(row) {
geom_mark_circle(
data = row,
label.fontsize = 8,
label.fill = NA,
aes(x = review_stats_community_average_score,
y = review_stats_dave_average_score,
label = name),
inherit.aes = FALSE
)
}
PP + map(1:10, function(x) slice(rate_diff_top5, x) %>% gmark)