R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Library dan Setup

Untuk dapat mengikuti materi ini, peserta diharapkan sudah menginstall beberapa packages di bawah ini. Apabila package tersebut belum terinstall, silahkan jalankan chunk atau baris kode berikut. Apabila sudah ter-install, lewati chunk berikut dan muat package yang dibutuhkan dengan menjalankan chunk selanjutnya.

#install.packages(c("tidyverse","rmarkdown", "plotly", "scales", "glue", "hrbrthemes", "viridis"))

Shortcut untuk menjalankan code:

# data cleaning
library(tidyverse)

# visualization
library(plotly)
library(scales)
library(glue)
library(hrbrthemes)
library(viridis)

Workflow Visualization

  1. Menentukan ukuran avocado dari setiap negara
  2. Mempersiapkan data (data wrangling)
  3. Membuat visualisasi

Harga Alpukat

Data historis tentang harga alpukat dan volume penjualan di beberapa pasar AS ## Read Data

avocado <- read.csv("avocado.csv")

Nama kolom numerik mengacu pada kode pencarian harga. - Date**: - **AveragePrice: - large Bags: - Total Volume**: - **large Bags**: - **extra large Bags**: - **XLarge Bags**: - **type**: - **year**: - **region:

head(avocado)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0 2015-12-27         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1 2015-12-20         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2 2015-12-13         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-12-06         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4 2015-11-29         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5 2015-11-22         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region
## 1    8603.62      93.25           0 conventional 2015 Albany
## 2    9408.07      97.49           0 conventional 2015 Albany
## 3    8042.21     103.14           0 conventional 2015 Albany
## 4    5677.40     133.76           0 conventional 2015 Albany
## 5    5986.26     197.69           0 conventional 2015 Albany
## 6    6556.47     127.44           0 conventional 2015 Albany

Eksplor data anda! Apakah tiap kolom sudah memiliki tipe data yang tepat?

Date, waktu jual -> date region -> character

Data Wrangling

Data wrangling adalah istilah lain dari data cleaning. Beberapa contohnya telah kita pelajari di kelas Programming for Data Science, seperti mengubah tipe data dan subsetting baris/kolom tertentu.

lubridate

lubridate adalah package yang sangat powerful untuk mengolah data waktu dan tanggal.

Sebelumnya kita mengubah data ke tipe date dengan menggunakan as.Date():

YEAR
%Y = YYYY
%y = YY

MONTH
%B = month name e.g. March
%b = month name(abbreviation) e.g. Mar
%m = 2 digits mo e.g. 03
%M = 1 digit mo e.g. 3

DAY
%A = weekday e.g. Friday
%d = weekday digit.

ubah Date menjadi tipe data date:

avocado$Date[17]
## [1] "2015-09-06"
# cara menggunakan base R
as.Date(avocado$Date[17], format="%y.%d.%m")
## [1] NA

menggunakan lubridate:

library(lubridate)
a <- "10/10/22"
b <- "10-October-2022"
c <- "Monday, 10-10-2022"
d <- "2022/10/10, 1:42PM"
# metode base
as.Date(a, "%d/%m/%y")
## [1] "2022-10-10"
# metode lubridate: masukan urutan d/m/y nya saja
ydm(avocado$Date[17])
## [1] "2015-06-09"
dmy(a)
## [1] "2022-10-10"
dmy(b)
## [1] "2022-10-10"
dmy(c)
## [1] "2022-10-10"
ymd_hm(d)
## [1] "2022-10-10 13:42:00 UTC"

🏄 Dive Deeper:

  1. Ubah kolom Date menjadi tipe date dengan fungsi dari package lubridate!
avocado$Date <- ydm(avocado$Date)
## Warning: 10906 failed to parse.
head(avocado)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0       <NA>         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1       <NA>         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2       <NA>         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-06-12         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4       <NA>         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5       <NA>         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region
## 1    8603.62      93.25           0 conventional 2015 Albany
## 2    9408.07      97.49           0 conventional 2015 Albany
## 3    8042.21     103.14           0 conventional 2015 Albany
## 4    5677.40     133.76           0 conventional 2015 Albany
## 5    5986.26     197.69           0 conventional 2015 Albany
## 6    6556.47     127.44           0 conventional 2015 Albany
  1. Ubah kolom publish_time menjadi tipe date-time dengan fungsi dari package lubridate!

Contoh:

a <- ymd_hms(avocado$Date) # ubah ke standard time UTC
## Warning: All formats failed to parse. No formats found.
a[17] # UTC
## [1] NA

Data Type and Structure

Kita sudah mempelajari bagaimana mengecek sample dari data, sekarang kita perlu mengetahui tipe data dari masing masing kolom yang ada. Kita bisa menggunakan fungsi str() untuk melihat struktur serta dimensi dari data.

str(avocado)
## 'data.frame':    18249 obs. of  14 variables:
##  $ X           : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ Date        : Date, format: NA NA ...
##  $ AveragePrice: num  1.33 1.35 0.93 1.08 1.28 1.26 0.99 0.98 1.02 1.07 ...
##  $ Total.Volume: num  64237 54877 118220 78992 51040 ...
##  $ X4046       : num  1037 674 795 1132 941 ...
##  $ X4225       : num  54455 44639 109150 71976 43838 ...
##  $ X4770       : num  48.2 58.3 130.5 72.6 75.8 ...
##  $ Total.Bags  : num  8697 9506 8145 5811 6184 ...
##  $ Small.Bags  : num  8604 9408 8042 5677 5986 ...
##  $ Large.Bags  : num  93.2 97.5 103.1 133.8 197.7 ...
##  $ XLarge.Bags : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ type        : chr  "conventional" "conventional" "conventional" "conventional" ...
##  $ year        : int  2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
##  $ region      : chr  "Albany" "Albany" "Albany" "Albany" ...

Exploratory Data Analysis

Sebelum masuk lebih dalam mengenai A/B testing, kita melakukan eksplorasi pada data yang ada. Kita bisa menghitung banyaknya user yang masuk dalam kelompok kontrol dan treatment.

  • grup control: gate_30
  • grup treatment: gate_40
# untuk menghitung frekuensi kemunculan data
table(avocado$type)
## 
## conventional      organic 
##         9126         9123

Konsep Piping ( %>% )

Tidying data menggunakan dplyr terdapat satu fungsi yang digunakan untuk mempermudah dalam melakukan tidying data yaitu piping ( %>% ). Analogi dari piping seperti ini:

Misal saya dari bangun tidur ingin pergi ke suatu tempat, kegiatan apa saja yang saya lakukan?

  1. bangun
  2. mandi
  3. ganti baju
  4. makan
  5. siap-siap pergi
  6. pergi

Pada R base untuk menjalankan fungsi saling sambung perlu memasukkan fungsi pertama dijalankan diletakkan paling dalam, sedangkan fungsi yang terakhir dijalankan diletakkan paling depan.

  1. mandi
  2. ganti_baju
  3. makan
#makan(ganti_baju(mandi()))

Jika kita terapkan dalam sebuah fungsi dan code, anggap beberapa fungsi yang kita miliki adalah:

  • bangun()
  • mandi()
  • ganti_baju()
  • makan()
  • siap_pergi()
  • pergi()

Maka jika kita ingin pergi dan mengaplikasikan dari beberapa fungsi serta step diatas:

  • tanpa piping
#pergi(siap_pergi(makan(ganti_baju(mandi(bangun(saya))))))

Jika kita menggunakan piping ( %>% ):

  • shortcut untuk membuat piping ( %>% ) -> ctrl+shift+m / command + shift + m

Kita akan coba melihat proporsi negara treatment pada region.

avocado %>% 
  filter(type == "conventional") %>%  # untuk melakukan filter data gate_40 saja
  select(region) %>% # memilih kolom pada dataframe
  table() %>% # menghitung frekuensi data
  prop.table() # mencari proporsi data
## .
##              Albany             Atlanta BaltimoreWashington               Boise 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##              Boston    BuffaloRochester          California           Charlotte 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##             Chicago    CincinnatiDayton            Columbus       DallasFtWorth 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##              Denver             Detroit         GrandRapids          GreatLakes 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##  HarrisburgScranton HartfordSpringfield             Houston        Indianapolis 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##        Jacksonville            LasVegas          LosAngeles          Louisville 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##   MiamiFtLauderdale            Midsouth           Nashville    NewOrleansMobile 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##             NewYork           Northeast  NorthernNewEngland             Orlando 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##        Philadelphia       PhoenixTucson          Pittsburgh              Plains 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##            Portland   RaleighGreensboro     RichmondNorfolk             Roanoke 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##          Sacramento            SanDiego        SanFrancisco             Seattle 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##       SouthCarolina        SouthCentral           Southeast             Spokane 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##             StLouis            Syracuse               Tampa             TotalUS 
##          0.01851852          0.01851852          0.01851852          0.01851852 
##                West    WestTexNewMexico 
##          0.01851852          0.01851852

Exercise

Silahkan coba untuk menemukan insight persentase user yang berlangganan dan tidak untuk grup control berdasarkan keseluruhan informasi retention year

avocado %>% 
  filter(region=="conventional") %>% 
  select(type, year) %>% 
  table() %>% 
  prop.table()*100 
## <0 x 0 matrix>

Statistika Deskriptif

Statistika Deskriptif

Ahli statistik dan data scientist menggunakan statistika deskriptif untuk meringkas dan menggambarkan sejumlah besar pengukuran. Biasanya penyajian statistika deskriptif menggunakan grafik yang membantu menggambarkan ringkasan data. Contoh penerapannya dalam industri bisnis, statistik deskriptif adalah jumlah rata-rata transaksi per bulan. Contoh lain adalah persentase transaksi e-commerce dengan kode voucher yang diterapkan. Poin pentingnya adalah bahwa statistika deskriptif tidak melibatkan generalisasi di luar data yang tela diperoleh, dan hanya deskriptif tentang data yang dimiliki. Cabang statistika yang berhubungan dengan penarikan kesimpulan tentang populasi yang lebih besar disebut statistika inferensial.

Beberapa pengukuran dalam statistika deskriptif yang digunakan untuk menggambarkan data yaitu:

  • Ukuran pemusatan data (Measure of Central Tendency)
  • Ukuran penyebaran data (Measure of Spread)
  • Hubungan antar data (Variable Relationship)

Measure of Central Tendecy

measure of central tendency (ukuran pemusatan data) adalah suatu nilai yang cukup untuk mewakili seluruh nilai pada data. Ukuran pemusatan data biasanya digunakan untuk melihat gambaran dari data secara general seperti apa. Oleh karena itu, nilai ukuran pemusatan data dibuat agar memperoleh informasi yang cukup untuk mewakili seluruh nilai yang ada pada data. Ada beberapa acuan yang dapat digunakan untuk menggambarkan data secara umum; yaitu: mean, median, dan modus.

Mean

Cara paling umum untuk membuat perkiraan nilai tunggal dari data yang banyak adalah dengan merata-ratakannya.

  • Formula:

\[\bar x = \frac{\sum{x_i}}{n}\] * Fungsi pada R: mean()

Contoh:

Berapa rata-rata pada tabel avocado?

head(avocado)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0       <NA>         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1       <NA>         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2       <NA>         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-06-12         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4       <NA>         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5       <NA>         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region
## 1    8603.62      93.25           0 conventional 2015 Albany
## 2    9408.07      97.49           0 conventional 2015 Albany
## 3    8042.21     103.14           0 conventional 2015 Albany
## 4    5677.40     133.76           0 conventional 2015 Albany
## 5    5986.26     197.69           0 conventional 2015 Albany
## 6    6556.47     127.44           0 conventional 2015 Albany

mean di Total Bags

mean(avocado$Total.Bags)
## [1] 239639.2
mean(avocado$Small.Bags)
## [1] 182194.7
mean(avocado$Large.Bags)
## [1] 54338.09
mean(avocado$XLarge.Bags)
## [1] 3106.427
  • Karakteristik dari mean

Tidak cocok untuk mendeskripsikan suatu data ketika data tersebut terdapat nilai ekstrem atau outlier karena hasil mean akan sangat bias bisa saja lebih kecil dari data general atau lebih besar. Solusinya jika kita ingin mendeskripsikan data namun terdapat nilai ekstrem kita bisa menggunakan menggunakan nilai trimmed mean atau nilai median.

Untuk mengecek outlier kita bisa memanfaatkan boxplot().

Boxplot menggambarkan :

boxplot(avocado$Total.Bags)

# fivenum digunakan untuk menampilkan min dan max
fivenum(avocado$Total.Bags)
## [1]        0.00     5088.64    39743.83   110783.37 19373134.37

Data Wrangling

Untuk dapat menganalisa retention rate dengan baik, kita akan coba melakukan wrangling data untuk menambahkan informasi pada data.

  • mutate() : digunakan untuk melakukan perubahan pada suatu kolom atau membuat kolom baru
  • str_replace(): untuk mengubah suatu pattern tertentu pada nilai suatu kolom
  • str_to_title(): untuk mengubah awalan kata menjadi huruf kapital
  • summary(): untuk menampilkan pengukurn deskriptif statistik pada masing-masing kolom data
#avocado <- avocado %>% 
#  mutate(AvaragePrice = as.character(AvaragePrice),
 #        region = str_replace(type, "_", " ") %>% 
 #          str_to_title() %>% 
 #          as.factor(),
 #        region = as.factor(region),
#         )
#summary(avocado)
avocado<- read.csv("avocado.csv")
head(avocado)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0 2015-12-27         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1 2015-12-20         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2 2015-12-13         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-12-06         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4 2015-11-29         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5 2015-11-22         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region
## 1    8603.62      93.25           0 conventional 2015 Albany
## 2    9408.07      97.49           0 conventional 2015 Albany
## 3    8042.21     103.14           0 conventional 2015 Albany
## 4    5677.40     133.76           0 conventional 2015 Albany
## 5    5986.26     197.69           0 conventional 2015 Albany
## 6    6556.47     127.44           0 conventional 2015 Albany

Kita akan coba melihat proporsi dari masing-masing grup yang ada.

prop.table(table(avocado$type))*100
## 
## conventional      organic 
##     50.00822     49.99178

Selanjutnya hal lain yang perlu diperhatikan yaitu memeriksa apakah ada nilai missing untuk setiap variabel.

# cara 1
anyNA(avocado)
## [1] FALSE
# cara 2
colSums(is.na(avocado)) 
##            X         Date AveragePrice Total.Volume        X4046        X4225 
##            0            0            0            0            0            0 
##        X4770   Total.Bags   Small.Bags   Large.Bags  XLarge.Bags         type 
##            0            0            0            0            0            0 
##         year       region 
##            0            0

Cek terlebih dahulu apakah terdapat duplikasi pada data yang ada.

duplicated(avocado) %>% sum()
## [1] 0

Note: Apabila terdapat data yang duplicate, maka kita bisa coba hapus data yang terduplikasi dan menyisakan satu data saja.

Data Exploration

Untuk mengetahui efek dari peletakan landing page yang berbeda pada type avocado, maka kita akan coba lakukan pengecekan distribusi dari rata-rata.

fig <- avocado %>%
  plot_ly(
    x = ~type,
    y = ~Total.Bags,
    split = ~type,
    type = 'violin',
    box = list(
      visible = T
    ),
    meanline = list(
      visible = T
    )
  ) 

fig <- fig %>%
  layout(
    xaxis = list(
      title = "Type Buah"
    ),
    yaxis = list(
      title = "Rata-rata",
      zeroline = F
    )
  )

fig

membuat hasil di setiap negara berdasarkan type buah

fig <- avocado %>%
  plot_ly(
    x = ~region,
    y = ~Total.Bags,
    split = ~type,
    type = 'violin',
    box = list(
      visible = T
    ),
    meanline = list(
      visible = T
    )
  ) 

fig <- fig %>%
  layout(
    xaxis = list(
      title = "Negara"
    ),
    yaxis = list(
      title = "Rata-rata",
      zeroline = F
    )
  )

fig
number_of_round <- avocado %>% 
  group_by(Total.Volume) %>% 
  count()
number_of_round
## # A tibble: 18,237 x 2
## # Groups:   Total.Volume [18,237]
##    Total.Volume     n
##           <dbl> <int>
##  1         84.6     1
##  2        380.      1
##  3        386.      1
##  4        420.      1
##  5        473.      1
##  6        482.      1
##  7        515.      1
##  8        531.      1
##  9        543.      1
## 10        561.      1
## # ... with 18,227 more rows
plot_100round <- number_of_round %>%
  filter(Total.Volume <= 100) %>% 
  ggplot(aes(x = Total.Volume, y = n
             )) +
    geom_area(fill = "#69b3a2", alpha = 0.5) +
    geom_line(color="#69b3a2") +
  labs(title = "Avocado", x = "Total Volume", y = "Avarage Pricr")+
    theme_minimal()

# Turn it interactive with ggplotly
ggplotly(plot_100round)

Analisis Retention Rate User

Sekarang kita akan hitung persentase avocado di setiap negar

prop.table(table("data avocado di negara" = avocado$region))*100
## data avocado di negara
##              Albany             Atlanta BaltimoreWashington               Boise 
##            1.852156            1.852156            1.852156            1.852156 
##              Boston    BuffaloRochester          California           Charlotte 
##            1.852156            1.852156            1.852156            1.852156 
##             Chicago    CincinnatiDayton            Columbus       DallasFtWorth 
##            1.852156            1.852156            1.852156            1.852156 
##              Denver             Detroit         GrandRapids          GreatLakes 
##            1.852156            1.852156            1.852156            1.852156 
##  HarrisburgScranton HartfordSpringfield             Houston        Indianapolis 
##            1.852156            1.852156            1.852156            1.852156 
##        Jacksonville            LasVegas          LosAngeles          Louisville 
##            1.852156            1.852156            1.852156            1.852156 
##   MiamiFtLauderdale            Midsouth           Nashville    NewOrleansMobile 
##            1.852156            1.852156            1.852156            1.852156 
##             NewYork           Northeast  NorthernNewEngland             Orlando 
##            1.852156            1.852156            1.852156            1.852156 
##        Philadelphia       PhoenixTucson          Pittsburgh              Plains 
##            1.852156            1.852156            1.852156            1.852156 
##            Portland   RaleighGreensboro     RichmondNorfolk             Roanoke 
##            1.852156            1.852156            1.852156            1.852156 
##          Sacramento            SanDiego        SanFrancisco             Seattle 
##            1.852156            1.852156            1.852156            1.852156 
##       SouthCarolina        SouthCentral           Southeast             Spokane 
##            1.852156            1.852156            1.852156            1.852156 
##             StLouis            Syracuse               Tampa             TotalUS 
##            1.852156            1.852156            1.852156            1.852156 
##                West    WestTexNewMexico 
##            1.852156            1.835717

menghitung cound dan percentage di setiap type avocado

ratio_per_group1 <- avocado %>% 
  group_by(type) %>% 
  summarize(count =n()) %>% 
  mutate(percentage = round(count/sum(count)*100,2)) %>% 
  arrange(type) %>% 
  ungroup() 

ratio_per_group1
## # A tibble: 2 x 3
##   type         count percentage
##   <chr>        <int>      <dbl>
## 1 conventional  9126       50.0
## 2 organic       9123       50.0

didapatkan bahwa type conventional lebih tinggi dari type organic

🧠 Dive Deeper mencari count dan percentage di setiap negara

ratio_per_group7 <- avocado %>% 
  group_by(region) %>% 
  summarize(count =n()) %>% 
  mutate(percentage = round(count/sum(count)*100,2)) %>% 
  arrange(region) %>% 
  ungroup() 
ratio_per_group7  
## # A tibble: 54 x 3
##    region              count percentage
##    <chr>               <int>      <dbl>
##  1 Albany                338       1.85
##  2 Atlanta               338       1.85
##  3 BaltimoreWashington   338       1.85
##  4 Boise                 338       1.85
##  5 Boston                338       1.85
##  6 BuffaloRochester      338       1.85
##  7 California            338       1.85
##  8 Charlotte             338       1.85
##  9 Chicago               338       1.85
## 10 CincinnatiDayton      338       1.85
## # ... with 44 more rows
# cek jumlah NA per kolom
colSums(is.na(avocado))
##            X         Date AveragePrice Total.Volume        X4046        X4225 
##            0            0            0            0            0            0 
##        X4770   Total.Bags   Small.Bags   Large.Bags  XLarge.Bags         type 
##            0            0            0            0            0            0 
##         year       region 
##            0            0

Base Plot

# plot(x)
#contoh penggunaan beberapa parameter dalam base plot
par(mar=c(5.1, 8.1, 2.1, 1.1)) #margin agar semua kategori terlihat pada plot
plot(avocado$Total.Volume, 
     horiz = T, 
     las = 1, 
     cex.names =.7,
     xlim = c(0, 800),
     col = "darkblue",
     xlab = "frequency",
     main = "Penjualan Avocado",
     sub = "Avocdo",
     font.sub = 13, # tipe font pada subtitle yang dipakai 
     cex.axis = .7 # ukuran label axis x
     )
## Warning in plot.window(...): "horiz" is not a graphical parameter
## Warning in plot.window(...): "cex.names" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "horiz" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "cex.names" is not a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "horiz" is not a
## graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "cex.names" is not
## a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "horiz" is not a
## graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "cex.names" is not
## a graphical parameter
## Warning in box(...): "horiz" is not a graphical parameter
## Warning in box(...): "cex.names" is not a graphical parameter
## Warning in title(...): "horiz" is not a graphical parameter
## Warning in title(...): "cex.names" is not a graphical parameter

# plot(x,y)
avocado$ratio <- avocado$Small.Bags/avocado$Large.Bags

# mengubah publish_hour menjadi sebuah factor karena tiap jamnya dilihat sebagai satu satuan kategori
plot(as.factor(avocado$year), avocado$ratio)
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 1 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 2 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 3 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 4 is not drawn

head(avocado$year)
## [1] 2015 2015 2015 2015 2015 2015
#dijalankan sekali saja. jika nilai NULL, sikana read kembali data vids atau run all chunks above

# dijadikan character tipe datanya karena untuk keynya tidak berurutan (1,2,3...dsb)

avocado$year <- sapply(X =  as.character(avocado$year), 
                           FUN = switch, 
                           "2015" = "2015",
                           "2016" = "2016", 
                           "2017" = "2017", 
                           "2018" = "2018", 
                          
                          )

avocado$year <- as.factor(avocado$year)
head(avocado)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0 2015-12-27         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1 2015-12-20         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2 2015-12-13         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-12-06         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4 2015-11-29         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5 2015-11-22         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region    ratio
## 1    8603.62      93.25           0 conventional 2015 Albany 92.26402
## 2    9408.07      97.49           0 conventional 2015 Albany 96.50292
## 3    8042.21     103.14           0 conventional 2015 Albany 77.97373
## 4    5677.40     133.76           0 conventional 2015 Albany 42.44468
## 5    5986.26     197.69           0 conventional 2015 Albany 30.28105
## 6    6556.47     127.44           0 conventional 2015 Albany 51.44750
levels(avocado$year)
## [1] "2015" "2016" "2017" "2018"
# cek jumlah NA per kolom
colSums(is.na(avocado))
##            X         Date AveragePrice Total.Volume        X4046        X4225 
##            0            0            0            0            0            0 
##        X4770   Total.Bags   Small.Bags   Large.Bags  XLarge.Bags         type 
##            0            0            0            0            0            0 
##         year       region        ratio 
##            0            0           15
# plot(x)
#contoh penggunaan beberapa parameter dalam base plot
par(mar=c(5.1, 8.1, 2.1, 1.1)) #margin agar semua kategori terlihat pada plot
plot(avocado$year, 
     horiz = T, 
     las = 1, 
     cex.names =.7,
     xlim = c(0, 10000),
     col = "darkblue",
     xlab = "Total",
     main = "Data penjualan Avocado selama 4 Tahun",
     sub = "Avocado",
     font.sub = 13, # tipe font pada subtitle yang dipakai 
     cex.axis = .7 # ukuran label axis x
     )

# plot(x,y)
avocado$ratio <- avocado$Small.Bags/avocado$Large.Bags

#mengubah  year menjadi sebuah factor karena tiap tahun dilihat sebagau satuan
plot(as.factor(avocado$year), avocado$Total.Bags)

levels(avocado$year)
## [1] "2015" "2016" "2017" "2018"
# code here
avocado_agt <- avocado[avocado$year %in% c("2015", "2016", "2018", "2019"), ]
levels(avocado_agt$year)
## [1] "2015" "2016" "2017" "2018"
avocado_agt$year <- droplevels(avocado_agt$year)
levels(avocado_agt$year)
## [1] "2015" "2016" "2018"
# visualisasi
plot(avocado_agt$Small.Bags, avocado_agt$Large.Bags)

plot(avocado_agt$Small.Bags, avocado_agt$Large.Bags, col = avocado_agt$year)
legend("topright", legend = levels(avocado_agt$year), fill = 1:3)
abline(lm(avocado_agt$Large.Bags ~ avocado_agt$Small.Bags), col = "yellow")

# your code here
plot(avocado$year, avocado$ratio, 
     las = 2) # untuk merotate y label
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 1 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 2 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 3 is not drawn
## Warning in bplt(at[i], wid = width[i], stats = z$stats[, i], out = z$out[z$group
## == : Outlier (Inf) in boxplot 4 is not drawn

# layer 1: boxplot
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags)) +
  geom_boxplot()

# layer 2: scatterplot
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags)) +
  geom_boxplot() +
  geom_point()

geom_point vs geom_jitter

ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags)) +
  geom_boxplot(outlier.shape = NA) + #menghapus outlier karena jika tidak, akan rancu dengan data point dari geom_jitter
  geom_jitter()

# buat kolom commentp (comment/view)
avocado_agt$XLarge.Bags <- avocado_agt$Total.Bags/avocado_agt$Total.Bags

# cek data
head(avocado_agt)
##   X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1 0 2015-12-27         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2 1 2015-12-20         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3 2 2015-12-13         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4 3 2015-12-06         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5 4 2015-11-29         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6 5 2015-11-22         1.26     55979.78 1184.27  48067.99  43.61    6683.91
##   Small.Bags Large.Bags XLarge.Bags         type year region    ratio
## 1    8603.62      93.25           1 conventional 2015 Albany 92.26402
## 2    9408.07      97.49           1 conventional 2015 Albany 96.50292
## 3    8042.21     103.14           1 conventional 2015 Albany 77.97373
## 4    5677.40     133.76           1 conventional 2015 Albany 42.44468
## 5    5986.26     197.69           1 conventional 2015 Albany 30.28105
## 6    6556.47     127.44           1 conventional 2015 Albany 51.44750
# masukan parameter di dalam aes() bila berdasarkan data
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(size = XLarge.Bags))
## Warning: Removed 15 rows containing missing values (geom_point).

🔹 Mewarnai plot agar lebih menarik:

# col di dalam `ggplot()` akan mewarnai semua geom
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags, col = year)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(size = XLarge.Bags))
## Warning: Removed 15 rows containing missing values (geom_point).

#warna gradasi karena color berdasarkan tipe data commentp, yaitu numerik
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags, col = XLarge.Bags)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(size = XLarge.Bags))
## Warning: Removed 15 rows containing missing values (geom_point).

# col di dalam `geom_jitter` untuk mewarnai jitternya saja
# masuk ke fungsi aes() di geom_jitter karena warna berdasarkan value dari dataframe
ggplot(data = avocado_agt, mapping = aes(x = year, y = Small.Bags)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(size = XLarge.Bags, col = year))
## Warning: Removed 15 rows containing missing values (geom_point).

# buat data frame
avocado_chan <- as.data.frame(table(avocado$year))
head(avocado_chan)
##   Var1 Freq
## 1 2015 5615
## 2 2016 5616
## 3 2017 5722
## 4 2018 1296
#colnames(vids_chan) <- c("Title", "Freq")
avocado_chan <- avocado_chan[avocado_chan["Freq"] >= 10,]
avocado_chan
##   Var1 Freq
## 1 2015 5615
## 2 2016 5616
## 3 2017 5722
## 4 2018 1296

melakukan pengurutan dari frekuensi tertinggi ke terendah, menggunakan fungsi order

# urutkan data
avocado_chan <- avocado_chan[order(avocado_chan$Freq, decreasing = T),]
avocado_chan
##   Var1 Freq
## 3 2017 5722
## 2 2016 5616
## 1 2015 5615
## 4 2018 1296

x = region y = Total Volume visualisasi = Bar plot

# plot dasar
ggplot(data = avocado_chan, mapping = aes(x = Var1, y = Freq)) +
  geom_col()

🔷 Task percantik plot 🔷

flip koordinat x - y / mengganti orientasi sumbu X dan Y

ggplot(data = avocado_chan, mapping = aes(x = Freq, y = Var1)) +
  geom_col()

Diurutkan berdasarkan channel yang paling tinggi jumlah video trendingnya

ggplot(data = avocado_chan[1:10,], 
       mapping = aes(x = Freq, 
                     y = reorder(Var1, Freq))) + #reorder(var apa, berdasarkan var apa)
  geom_col()
## Warning: Removed 6 rows containing missing values (position_stack).

Mewarnai berdasarkan data kontinu/numerik

ggplot(data = avocado_chan[1:10,], 
       mapping = aes(x = Freq, 
                     y = reorder(Var1, Freq))) + 
  geom_col(aes(fill = Freq)) +
  scale_fill_gradient(low = "red", high = "black")
## Warning: Removed 6 rows containing missing values (position_stack).

Mewarnai berdasarkan data factor

ggplot(data = avocado_chan[1:10,], 
       mapping = aes(x = Freq, 
                     y = reorder(Var1, Freq))) + 
  geom_col(aes(fill = Var1)) +
   scale_fill_brewer(palette = "Set3")
## Warning: Removed 6 rows containing missing values (position_stack).

    1. menambahkan text pada plot
ggplot(data = avocado_chan[1:10,], 
       mapping = aes(x = Freq, 
                     y = reorder(Var1, Freq))) + 
  geom_col(aes(fill = Freq)) +
  scale_fill_gradient(low = "red", high = "black") +
  geom_label(aes(label = Freq))
## Warning: Removed 6 rows containing missing values (position_stack).
## Warning: Removed 6 rows containing missing values (geom_label).

ggplot(data = avocado_chan[1:10,], 
       mapping = aes(x = Freq, 
                     y = reorder(Var1, Freq))) + 
  geom_col(aes(fill = Freq)) +
  scale_fill_gradient(low = "red", high = "black") +
  geom_label(aes(label = Freq)) +
  labs(
    title = "Penjualan Avocado ",
    subtitle = "from 2015 - 2019",
    y = NULL,
    x = "Total"
  )
## Warning: Removed 6 rows containing missing values (position_stack).
## Warning: Removed 6 rows containing missing values (geom_label).