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
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.
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:
{r} -> ctrl+shift+enter / command+option/shift+enter# data cleaning
library(tidyverse)
# visualization
library(plotly)
library(scales)
library(glue)
library(hrbrthemes)
library(viridis)
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 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.
lubridatelubridate 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:
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
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
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" ...
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.
# untuk menghitung frekuensi kemunculan data
table(avocado$type)
##
## conventional organic
## 9126 9123
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?
Pada R base untuk menjalankan fungsi saling sambung perlu memasukkan fungsi pertama dijalankan diletakkan paling dalam, sedangkan fungsi yang terakhir dijalankan diletakkan paling depan.
#makan(ganti_baju(mandi()))
Jika kita terapkan dalam sebuah fungsi dan code, anggap beberapa fungsi yang kita miliki adalah:
Maka jika kita ingin pergi dan mengaplikasikan dari beberapa fungsi serta step diatas:
#pergi(siap_pergi(makan(ganti_baju(mandi(bangun(saya))))))
Jika kita menggunakan piping ( %>% ):
%>% ) -> ctrl+shift+m / command + shift + mKita 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>
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:
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.
Cara paling umum untuk membuat perkiraan nilai tunggal dari data yang banyak adalah dengan merata-ratakannya.
\[\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
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
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 barustr_replace(): untuk mengubah suatu pattern tertentu pada nilai suatu kolomstr_to_title(): untuk mengubah awalan kata menjadi huruf kapitalsummary(): 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.
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)
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
# 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).
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).