Google Data Analytics: Case Study 1 (uz RStudio)

Google Data Analytics: Case Study 1 (uz RStudio)


Negde početkom leta sam krenuo u polaganje Gugl sertifikata za analitičara podataka na Kurseri. Motivacija da uopšte krenem u to je bila što generalno volim igru sa brojevima i hteo sam da neka moja intuitivna predviđanja potkrepim i nekom metodologijom. Odluke koje su vođenje podacima, razgovor sa potencijalnim klijentima i okruženjem te prezentacija mogućih rešenja za njihove probleme su nešto što je išlo ok samo po sebi, ali sam hteo da dođem do samog početka tog levka odluka, koje onda sprovodim u delo programiranjem.
Ovaj članak u stvari predstavlja “završni ispit” za dobijanje ovog sertifikata, a u budućnosti ću se pozabaviti i temama koje nisu sa izmišljenim podacima kao u ovom primeru. S druge strane, ovde ćete imati primer kako se radi jedna analiza podataka uz alate kao što su RStudio i Tableu.
Proćićemo zajedno kroz sve faze procesa: Pitaj, Pripremi, Obradi, Analiziraj, Podeli i Deluj (Ask, Prepare, Process, Analyze, Share & Act.)

Scenario

Izmišljena bike-share kompanija, Cyclistic iz Čikaga, veruje da je budući uspeh kompanije u vezi sa povećanjem broja godišnjih pretplatnika. Cilj analize je identifikovati obrasce korišćenja bicikala između povremenih korisnika (casual riders) i godišnjih članova (annual members). Na osnovu ovih uvida, potrebno je osmisliti strategije za konverziju povremenih korisnika u godišnje članove, kako bi se povećala profitabilnost i dugoročna održivost programa.

Pitaj (Ask)

Treba postaviti tri pitanja koja će voditi budući marketinški program:

  1. Na koji način godišnji članovi i povremeni korisnici različito koriste bicikle Cyclistic-a?
  2. Zašto bi povremeni korisnici kupili godišnju članarinu za Cyclistic?
  3. Kako Cyclistic može iskoristiti digitalne medije da uticaj na povremene korisnike da postanu članovi?

Direktor nam je dodelio prvo pitanje: Na koji način godišnji članovi i povremeni korisnici različito koriste bicikle Cyclistic-a?

Trebalo bi da napravim izveštaj sa sledećim elementima:

  1. Jasna izjava o poslovnom zadatku
  2. Opis svih korišćenih izvora podataka
  3. Dokumentacija o čišćenju i manipulaciji podataka
  4. Rezime analize
  5. Podržavajuće vizualizacije i ključna otkrića
  6. Tri najbolje preporuke zasnovane na analizi

Pripremi (Prepare)

Koristićemo podatke o korišćenjima biciklova u prethodnih 12 meseci (2023-11 / 2024-10), a koji su dostupni na ovom linku. Podatke je obezbedila Motivate International Inc. pod ovom licencom. Ne sadrže lične informacije korisnika, čime su ispunjeni svi standardi privatnosti.
S obzirom da su svi podaci zapakovani po mesecima, skinućemo 12 zip fajlova i sve ih otpakovati u jedan folder. Za sve CSV fajlove, napravićemo jedan sub folder kako bismo imali originalne podatke kako bismo bili sigurni da možemo da radimo bez bojazni da ćemo nešto izgubiti.
Sve datoteke ćemo preimenovati kako bismo im dali jasna i opisna imena koja će odražavati njihov sadržaj. To će nam omogućiti bolju organizaciju i lakši pronalazak potrebnih informacija.
202408-divvy-tripdata.csv -> 2024-08-tripdata.csv

Za izvršavanje ovog zadatka, možete “peške” da preimenujete sve fajlove, a možete i u RStudio konzoli (pod uslovom da ste ga instalirali na vaš računar) pokrenete sledeću skriptu unutar foldera u kojem se nalaze vaši .csv fajlovi

Ključne informacije uključuju sledeće kolone:

  • ride_id: Jedinstveni identifikator vožnje.
  • started_at, ended_at: Datum i vreme početka i završetka vožnje.
  • start_station_name, end_station_name: Naziv stanice na kojoj je vožnja počela i završena.
  • member_casual: Tip korisnika (povremeni ili član).
  • start_lat, start_lng, end_lat, end_lng: Geografske koordinate za mapiranje ruta.
  • ride_length: Trajanje vožnje (računato kao razlika između ended_at i started_at).
# Napravite listu svih fajlova u trenutnom direktorijumu   
files <- list.files() 

# Funkcija za preimenovanje jednog fajla

rename_file <- function(file) {   
year <- substr(file, 1, 4) month <- substr(file, 5, 6)   
new_name <- paste0(year, "-", month, "-tripdata.csv")   
file.rename(file, new_name)   
} 

# Primenjivanje funkcije na sve fajlove  
sapply(files, rename_file)  

Obradi (Process)

S obzirom da imamo 5,933,712 zapisa kada se spoje svi CSV fajlovi, korišćenje Excela ili Google Sheets bi bilo teško, zbog same količine podataka. Zato ćemo dalje čišćenje obaviti putem RStudio. Dakle da bismo učitali u dataframe naše podatke koristićemo sledeću skriptu:

library(tidyverse)  
library(janitor)  
library(lubridate)  
library(magrittr)  
library(dplyr)

# Sve fajlove iz CSV folders treba da pročitamo i smestimo u file_list varijablu  
file_list <- list.files(path="~/Projects/RProjects/csv", pattern = "*.csv", full.names = TRUE)

# Čitanje i kombinovanje CSV fajlova u jedan dataframe  
all_data <- file_list %>%  
  lapply(read.csv) %>%  
  bind_rows()  
  clean_names() %>%  
  remove_empty(which = c())  

Ovaj korak može malo potrajati u zavisnosti od jačine vašeg računara tako da mu dajte malo vremena da vam se all_data pojavi u vašem environment tabu. Takođe koristimo dve funkcije koje služe za čišćenje podataka. Clean_names koja nam obezbeđuje konzistentna imena kolona u tabelama i remove_empty koja uklanja sve redove koji imaju vrednost N/ARStudio

Za našu analizu želimo da dodamo dve kolone, ride_length i day_of_week kako bismo imali dužinu svake vožnje i koji dan je u pitanju. Za računanje dužine vožnje ćemo vrednost kolone ended_at od started_at, dok ćemo za weekday koristiti funkciju wday.
Dodali smo i posebne kolone za mesec, dan i godinu kako bismo mogli da imamo dodatne vrste agregiranja podataka.

merged_and_cleaned_df <- all_data %>%   
  distinct(ride_id, .keep_all = TRUE) %>%   
  mutate(  
    day_of_week = wday(started_at, label = TRUE),  
    ride_length = as.numeric(difftime(ymd_hms(ended_at), ymd_hms(started_at))),  
    date = as.Date(started_at),  
    month = format(as.Date(started_at), "%m"),  
    day = format(as.Date(started_at), "%d"),  
    year = format(as.Date(started_at), "%Y"),  
  ) %>%  
  remove_empty(which = c()) %>%   
  filter(ride_length > 0 )  

Koristili smo funkciju ymd_hms za parsiranje datuma, kako potom dobili razliku između kraja i početka vožnje u sekundama. Dalje čišćenje podataka smo napravili sklanjajući redove koji imaju N/A vrednost, sve redove kojima je ride_length 0 sekundi i sve redove koji imaju isti ride_id.
Na ovaj način smo iz svih podataka sklonili 1095 zapisa. Za kraj, snimićemo očišćene podatake u csv fajl, kako bismo mogli da ih importujemo u druge alate

write_csv(merged_and_cleaned_df, file = "cyclistic_df.csv")

Analiziraj (Analyze) i Podeli(Share)

Pitanje na koje treba da pružimo odgovor je Na koji način godišnji članovi i povremeni korisnici različito koriste bicikle Cyclistic-a? Uz vizuelizacije, deliću sa vama i kod kojim sam ih generisao u RSTudio.

Broj vožnji po danima u nedelji po tipu vozača

Broj vožnji po danima u nedelji po tipu vozača

merged_and_cleaned_df %>%  
  group_by(member_casual, day_of_week) %>%  
  summarise(number_of_rides = n(),  
            average_duration = mean(ride_length)) %>%  
  arrange(member_casual, day_of_week)  %>%  
  ggplot(aes(x = day_of_week, y = number_of_rides, fill = member_casual)) +  
  geom_col(position = "dodge") +  
  scale_y_continuous(labels = comma) +  
  labs(title = "Number of Rides by Day of the Week",  
       x = "Day of the Week",  
       y = "Number of Rides",  
       fill = "User Type")  

Prosečno trajanje vožnje po tipu vozača

Average duration by rider type

merged_and_cleaned_df %>%   
    group_by(member_casual, day_of_week) %>%   
    summarise(number_of_rides = n()  
              ,average_duration = mean(ride_length)) %>%   
    arrange(member_casual, day_of_week)  %>%   
    ggplot(aes(x = day_of_week, y = average_duration, fill = member_casual)) +  
    geom_col(position = "dodge") +  
    scale_y_continuous(labels = comma) +  
    labs(title = "Average duration by Rider type",  
         x = "Day of the Week",  
         y = "Average duration",  
         fill = "User Type")  

Broj vožnji mesečno po tipu vozača

Number of rides by month

Broj vožnji po satu za svaki dan

Hourly bike usage by weekday

hourly_usage <- merged_and_cleaned_df %>%  
  group_by(day_of_week, start_hour, member_casual) %>%  
  summarise(number_of_rides = n(), .groups = "drop") %>%  
  arrange(day_of_week, start_hour)

ggplot(hourly_usage, aes(x = start_hour, y = number_of_rides, fill = member_casual)) +  
    geom_col(position = "dodge") +  
    facet_wrap(~ day_of_week, ncol = 3, scales = "free_y") +  # Separate chart for each weekday  
    scale_x_continuous(breaks = seq(0, 23, by = 1)) +         # Hourly breakdown  
    scale_y_continuous(labels = scales::comma_format()) +     # Comma-formatted Y-axis  
    labs(  
        title = "Hourly Bike Usage by Weekday",  
        x = "Hour of Day",  
        y = "Number of Rides",  
        fill = "User Type"  
    ) +  
    theme_minimal()  

Vrsta iznajmljenog bicikla po tipu vozača

Rideable type preference by member type

Na osnovu generisanih vizuelizacija možemo zaključiti sledeće:

  • Povremeni vozači u proseku voze duže bicikl kada se odluče na iznjamljivanje
  • Godišnji pretplatnici imaju u proseku veći broj vožnji
  • Povremeni korisnici približno imaju isti broj vožnji vikendom
  • Radnim danima je najveći broj vožnji tokom odlaska na posao (6-8) i u satima povratka sa posla (16-18)
  • Električni skuteri se koriste najmanje, dok se najviše koriste električni biciklovi.

Zatim sam napravio novi csv fajl, sa smanjenim brojem podataka kako bih ispoštovao limit od 1Gb koji Tableu Public ima. Vizuelizacije možete videti i na ovom linku.

Tableu viz 1 Tableu Map Viz

Sa mape možemo zaključiti da se biciklovi najviše iznajmljuju uz obalu, i pored poslovnih zgrada. Takođe ukoliko isključimo sa mape vožnje koje su od strane naših godišnjih pretplatnika, vidimo da su polasci najčešće uz plažu ili uz određene lokalitete koje bi turisti obilazili prilikom posete.
Ono što je interesantno je primetiti da povremeni korisnici usluga, duže voze biciklove i to tokom celog dana, a naročito je interesantno da vožnja najduže traje oko 1 ujutru. Najviše vožnji ima oko 17h što implicira da se tada ljudi vraćaju sa posla i da im je prevozno sredstvo za probijanje kroz gužvu bicikl.

Deluj (Act)

Ono što možemo zaključiti iz podataka koje smo dobili i obradili:

  1. Povremeni korisnici su mahom turisti, koji najviše voze vikendom, tokom letnjih meseci.
  2. Godišnji pretplatnici, su ljudi koji rade u kancelarijama i služe se biciklovima za lakše transportovanje kroz gužvu sa posla
  3. Trajanje vožnje povremenih korisnika je značajno veće u odnosu na godišnje pretplatnike

S obzirom da je naš zadatak bio da se osmisli marketinški pristup za privlačenje više korisnika da pretvorimo povremene korisnike u godišnje pretplatnike predlažem sledeće korake:

  1. Sezonske promocije: S obzirom na to da su povremeni korisnici najaktivniji tokom letnjih meseci, tada treba pojačati marketinške napore kako bismo ih privukli na platformu. Mogli bismo da im ponudimo probna članstva ili popuste tokom letnjih meseci.
  2. Kampanje za povremene korisnike: Ponuditi noćne ili vikend pakete, sa mogućnošću da se jednostavno “unaprede” u godišnju pretplatu.
  3. Digitalni marketing za članove koji putuju na posao: Ciljati stanovnike koji koriste bicikle tokom radnih dana uz naglasak na uštedi troškova i pogodnostima godišnjeg članstva.

Takođe možemo upotrebiti efekat mamca (tzv. Decoy effect) - povećavanje cene jedne vožnje ili dnevne karte, bi moglo da pogura korisnike u smeru da uzmu godišnju članarinu.

Hvala svima koji su došli do ovog dela članka i nadam se da vam se analiza podataka dopala, te ako imate komentara slobodno podelite.