Rmd source

Problem

Aleksandra Dulkiewicz jest znana z autopromocji, do której wykorzystuje także Twittera. Ocenimy kiedy kwituje i z jakim natężeniem

library(ggplot2)
library(dplyr)
library("timeDate")

every_nth = function(n) {
  return(function(x) {x[c(TRUE, rep(FALSE, n - 1))]})
}

Dane

Z danych zostały pobrane za pomocą API/Twittera zapisano w postaci pliku CSV informacje na temat dnia/godziny/dnia tygodnia wysłania twita:

t <- read.csv("dulkiewicz_times.csv", sep = ';',  header=T, na.string="NA");
str(t)
## 'data.frame':    2452 obs. of  4 variables:
##  $ yymmdd: Factor w/ 656 levels "2019-03-11","2019-03-12",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ dow   : Factor w/ 7 levels "Fri","Mon","Sat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ hh    : int  11 12 12 12 12 12 12 12 12 12 ...
##  $ mmss  : Factor w/ 1800 levels "00:01","00:03",..: 1471 638 652 665 725 737 751 770 851 857 ...

Dni święteczne i pracujące

Sobota/Niedziela są jawnie zaznaczone w danych; do tego dochodzą polskie dni świąteczne:

## Polskie dni świąteczne
pds <- c('01-01', '01-06', '05-01', '05-03', '08-15', '11-01',
         '11-11', '12-25', '12-26')

Jeżeli chodzi o święta ruchome to de-facto jest takowe dwa: poniedziałek wielkanocny oraz Boże Ciało (60 dni po wielkanocy), ponieważ wielkanoc jest zawsze w niedzielę podobnie jak Zielone Świątki (49 dni po wielkanocy.)

Obliczamy wszystkie poniedziałki i bożeciała. W tym celu ustalamy numer pierwszego/ostatniego roku a następnie dla każdego roku obliczamy datę wielkanocy. Do tej daty dodajemy odpowiednio jeden i 60:

## święta ruchome
## Święta ruchome: lany Poniedziałek + BC
## inne ruchome są w niedzielę
firstyear <- substr(first(as.character(t$yymmdd)),1,4)
lastyear <- substr(last(as.character(t$yymmdd)),1,4)

wetMondays <- c()

for (year in as.numeric(firstyear): as.numeric(lastyear)) {
  ##print(paste("The year is", year))
  wm <- as.Date(Easter(year)) +1
  bc <- as.Date(Easter(year)) +60
  wetMondays <- append(wetMondays, c(wm, bc))
}

Liczymy także numer tygodnia w roku

## week of year
t <- t %>% mutate ( yw = as.numeric(strftime(yymmdd, format="%V")), 
                    mmdd = substr(as.character(yymmdd),6,10))

Zmnienna hday jest równa H dla dnia świątecznego; w przypadku przeciwnym zawiera napis pusty:

## hday - if holiday 'H',  empty otherwise
t <- t %>% mutate ( hday = ifelse(dow == 'Sat' | dow == 'Sun' | 
            mmdd %in% pds | yymmdd %in% as.character(wetMondays), "H", ""))

Analiza

Teraz możemy ustalić ile twitów było napisanych i kiedy.

##twitów ogółem
firstday <- first(t$yymmdd)
lastday <- last(t$yymmdd)

##days <- as.Date(lastday) ##- as.Date(firstday, "%d-%M-%Y")
#days <- as.numeric(as.POSIXct(lastday)-as.POSIXct(firstday))
# albo
days <- t %>% select(yymmdd) %>% distinct()

Liczmy tylko dni twitowania, takie w których nie było twitów nie występują w bazie.

Pierwszy twit w bazie jest datowany na 2019-03-11 ostatni zaś na 2021-02-20 (baza obejmuje 656 dni.)

## dni świąteczne
daysh <- t %>% filter(hday =='H') %>% select(yymmdd) %>% distinct()
daysw <- nrow(days) - nrow(daysh)
days_h <- nrow(daysh)

total <- nrow(t)
## twitów w dni świąteczne
total_h <- nrow(t %>% filter(hday =='H'))

## twity w dni pracy
t0 <- t %>% filter ( hday != 'H')
total0 <- nrow(t0)

Dni świątecznych jest 191; dni pracujących 465. Twitów w dni świąteczne 629 zaś w dni pracujące 1823. Z tego by wynikało, że w dni pracujące opublikowano 74.35%.

Histogram

Rozkład godzinowy twitów przedstawiono na histogramie. Najwięcj w godzinach pracy:

p0 <- ggplot(t0, aes(x = hh)) + geom_histogram(binwidth = 1, fill=default_cyan) +
  ylab("liczba tweetów") +
  xlab("godzina") +
  ggtitle(sprintf("Rozkład godzinowy twitowania p. Dulkiewicz* (%s--%s)", 
                  firstday, lastday),
           subtitle=sprintf("*w dniach pracy | %i tweetów w %i dni | średnio %.1f/dzień",
                            total0, daysw, total0/daysw )) +
  scale_x_continuous(breaks=seq(0, 23, by=1)) +
  scale_y_continuous(breaks=seq(0, 140, by=10)) +
  #coord_cartesian(ylim = c(0, 30), xlim=c(0, 23))
  coord_cartesian(xlim=c(0, 23))

p1 <- t %>% filter ( hday == 'H') %>%
  ggplot(aes(x = hh)) + geom_histogram(binwidth = 1, fill=default_cyan) +
  ylab("liczba tweetów") +
  xlab("godzina") +
  ggtitle(sprintf("Rozkład godzinowy twitowania p. Dulkiewicz* (%s--%s)", 
                  firstday, lastday),
           subtitle=sprintf("*w dniach wolnych od pracy | %i tweetów w %i dni | średnio %.1f/dzień",
                            total_h, days_h, total_h/days_h )) +
  scale_x_continuous(breaks=seq(0, 23, by=1)) +
  scale_y_continuous(breaks=seq(0, 140, by=10)) +
  #coord_cartesian(ylim = c(0, 30), xlim=c(0, 23))
  coord_cartesian(xlim=c(0, 23))
p0

p1

Wynikało by z powyższego, że Twitter jest wykorzystywany mocno oszczędnie do autopromocji przez A. Dulkiewicz.

Twitowanie w czasie

Dane tygodniowe (dni pracy i świąteczne):

p3 <- t %>% mutate ( yr = substr(as.character(t$yymmdd),1,4)) %>%
  mutate (yrww = sprintf ("%s/%i", yr, yw)) %>%
  group_by(yrww) %>% summarise(tt=n()) %>%
ggplot(aes(x = yrww)) +
  geom_bar(aes(y = tt ), stat="identity", alpha=.5, fill=default_cyan ) +
  xlab(label="rok/tydzień") +
  ylab(label="liczba twitów") +
  scale_x_discrete( breaks = every_nth(n = 10)) +
  ggtitle(sprintf("Twity A Dulkiewicz tygodniowo (%s--%s)", 
                  firstday, lastday))
  ##
  ##theme(axis.text = element_text(size = 4)) +
  ##theme(plot.title = element_text(hjust = 0.5)) +
p3