Pengatar Data Science || UTS
~ Menganalisis Dataset Walmart ~
| Kontak | : \(\downarrow\) |
| mugemisausan05@gmail.com | |
| https://www.instagram.com/saram.05/ | |
| RPubs | https://rpubs.com/sausanramadhani/ |
Anggota Kelompok
Statistika Bisnis 2021
1. Calvin Riswandi
2. Sausan Ramadhani
3. Ferdinand Nathaniel Widjaya
Importing Library, Data , and CleanUp
library(ggplot2 )
library(tidyverse)
library(lubridate)
library(tidymodels)Tersedia dataset walmart berbentuk csv yang akan kita analisis. Pertama-tama kita harus memanggil data tersebut dengan fungsi read_csv.
getwd()## [1] "C:/Users/Lenovo/Documents/DOK. SAUSAN/Matana University/Semester 2/Pengantar Data Science"
walmart <- read_csv("Walmart.csv")
walmartDalam dataset walmart terdapat beberapa kolom, diantaranya yaitu:
• Store : Nomor Toko
• Date : Tanggal Penjualan
• Weekly_Sales : Total Penjualan Per-Minggu
• Holiday_ Flag : Apakah di Week tersebut terdapat hari libur (1=Holiday Week, 0=Normal week)
• Temperature : Temperatur di tanggal penjualan
• Fuel_Price : Harga bahan bakar di Daerah tersebut
• CPI (Cunsumer Price Index) : Index harga konsumen
• Unemployment : Angka Pengangguran
Seluruh Data yang ada ini bisa memungkinkan kita membuat sebuah prediksi terhadap Periode, Lokasi dan digunakan untuk mencapai keuntungan yang maksimal. Menentukan Langkah dan Strategi apa yang bisa diambil
str(walmart)## spec_tbl_df [6,435 x 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Store : num [1:6435] 1 1 1 1 1 1 1 1 1 1 ...
## $ Date : chr [1:6435] "05-02-2010" "12-02-2010" "19-02-2010" "26-02-2010" ...
## $ Weekly_Sales: num [1:6435] 1643691 1641957 1611968 1409728 1554807 ...
## $ Holiday_Flag: num [1:6435] 0 1 0 0 0 0 0 0 0 0 ...
## $ Temperature : num [1:6435] 42.3 38.5 39.9 46.6 46.5 ...
## $ Fuel_Price : num [1:6435] 2.57 2.55 2.51 2.56 2.62 ...
## $ CPI : num [1:6435] 211 211 211 211 211 ...
## $ Unemployment: num [1:6435] 8.11 8.11 8.11 8.11 8.11 ...
## - attr(*, "spec")=
## .. cols(
## .. Store = col_double(),
## .. Date = col_character(),
## .. Weekly_Sales = col_double(),
## .. Holiday_Flag = col_double(),
## .. Temperature = col_double(),
## .. Fuel_Price = col_double(),
## .. CPI = col_double(),
## .. Unemployment = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
terlihat jelas bahwa dataset walmart disimpan sebagai data frame. kita mengetahui bahwa dataset walmart memiliki 6435 baris dan 8 kolom dengan jenis data per kolomnya adalah numeric kecuali kolom Date
a<-as.factor(c(walmart$Date))
abis<-strptime(a,format="%d-%m-%Y") #defining what is the original format of your date
b<-as.Date(abis,format="%d-%m-%Y")
walmart$Date = b
class(b)## [1] "Date"
Sekarang, di cek type datanya per collumn
str(walmart)## spec_tbl_df [6,435 x 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Store : num [1:6435] 1 1 1 1 1 1 1 1 1 1 ...
## $ Date : Date[1:6435], format: "2010-02-05" "2010-02-12" ...
## $ Weekly_Sales: num [1:6435] 1643691 1641957 1611968 1409728 1554807 ...
## $ Holiday_Flag: num [1:6435] 0 1 0 0 0 0 0 0 0 0 ...
## $ Temperature : num [1:6435] 42.3 38.5 39.9 46.6 46.5 ...
## $ Fuel_Price : num [1:6435] 2.57 2.55 2.51 2.56 2.62 ...
## $ CPI : num [1:6435] 211 211 211 211 211 ...
## $ Unemployment: num [1:6435] 8.11 8.11 8.11 8.11 8.11 ...
## - attr(*, "spec")=
## .. cols(
## .. Store = col_double(),
## .. Date = col_character(),
## .. Weekly_Sales = col_double(),
## .. Holiday_Flag = col_double(),
## .. Temperature = col_double(),
## .. Fuel_Price = col_double(),
## .. CPI = col_double(),
## .. Unemployment = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Penanganan missing values
colSums(is.na(walmart))## Store Date Weekly_Sales Holiday_Flag Temperature Fuel_Price
## 0 0 0 0 0 0
## CPI Unemployment
## 0 0
Maka bisa disimpulkan bahwa tidak ada missing values pada setiap variable dalam data walmart.
Explore Data Set
Kita melihat Data Set dari Walmart dan melihat hubungan antara beberapa Faktor dengan Total Penjualan menggunakan grafik atau visualisasi Data.
Melihat Relation antara Temperature dan Total Sales
walmart%>%
ggplot(aes(Temperature))+
geom_histogram(fill = "saddlebrown", bins=100)+
labs(title = 'Temperature effects on Sales',
y='Weekly sales',
x='Temperature')+
theme_minimal()Orang-Orang Cenderung semakin sering belanja ketika suhu semakin hangat, tidak terlalu dingin dan tidak terlalu panas.Atau bisa dibilang penjualan mengikuti Kondisi Temperatur yang cocok dan optimal untuk orang-orang beraktifitas keluar rumah di sekitar.
Relationship SAles dan Fuel Price
walmart%>%
ggplot(aes(Fuel_Price))+
geom_histogram(fill = "blueviolet", bins=50)+
labs(title = 'Cost of Fuels effects on Sales',
y='Weekly sales',
x='Fuel Cost')+
theme_minimal()Terdapat 2 Puncak dimana Sales paling banyak, yaitu di Area atau Daerah dengan harga Fuel Sekitar 2,6 sampai 2,8 dan 3,5 sampai 3,8.
Relation antara Angka Pengangguran (Unemployment) dan Sales
walmart%>%
ggplot(aes(Unemployment, Weekly_Sales))+
geom_point(color = "blue", alpha =1/5)+
labs(title = 'Unemployment Rate to weekly sales',
y='Weekly sales',
x='Unemployment')+
theme_minimal()Dilihat dari Scatter Plot, Makin Rendah Angka Pengangguran semakin banyak Penjualan.
Relation antara CPI dan Sales
walmart%>%
ggplot(aes(CPI, Weekly_Sales))+
geom_point(color = 'gold' , alpha =1/4)+
labs(title = 'CPI and sales Correlations ',
y='Weekly sales',
x='CPI')+
theme_minimal()Terdapat 2 Puncak juga dimana CPI Rendah dan Tinggi terjadi banyakk Penjualan. Terdistribusi di 2 titik.
Apakah Holiday Week mempengaruhi Sales ?
walmart%>%
ggplot(aes(as_factor(Holiday_Flag), Weekly_Sales))+
geom_boxplot()+
labs(title = 'Holiday Flag Effects on sales',
y='Weekly sales',
x='Holiday Flag')+
theme_minimal()Tidak ada Perbedaan yang signifikan antara Minggu Regular dan Minggu Holiday, Tapi dilihat ada Outliers atau Jumlah yang besar si Week Non-Holiday.
Regression Models using K-Nearest Neighbor Test
Menggunakan pendekatan berbasis K-nearest neighbor dalam regresi untuk membuat prediksi.
Untuk mengetahui cara kerja Regression dari KNN kita akan mencobanya dengan sample untuk menggambarkan cara kerjanya. Menggunakan command slice_sample untuk mengambil 50 data sampel secara acak
set.seed(1)
mini_walmart <- slice_sample(walmart, n = 50)One-Predictor Regression
Yang, kita tahu dari Visualisasi diatas. Temperatur Udara mempengaruhi Jumlah Penjualan dari Walmart. Let’s Say jika suhu ada di sekitar 50 Derajat (Average Suhu Saat Natal di USA). Kira-kira berapakah pendapatan yang akan didapat di minggu tersebut.
small_plot <- ggplot(mini_walmart, aes(x = Temperature, y = Weekly_Sales)) +
geom_point() +
xlab("Temperature (Fahrenheit)") +
ylab("Total Weekly Sales (USD)") +
scale_y_continuous(labels = dollar_format()) +
geom_vline(xintercept = 100, linetype = "dotted") +
theme(text = element_text(size = 12))
small_plotMenggunakan titik-titik tetangga ke prediksi titik yang baru untuk menyarankan/memprediksi berapa kira-kira pendapatan seminggu. Kita menemukan dan memberi label 7 tetangga terdekat dengan pengamatan kami terhadap pendapatan di minggu dimana suhu di 50 Derajat.
nearest_neighbors <- mini_walmart |>
mutate(diff = abs(50 - Temperature)) |>
arrange(diff) |>
slice(1:7) #subset the first 7 rows
nearest_neighborsKita ambil rata-rata total Penjualannya
predict <- nearest_neighbors |>
summarise(predict = mean(Weekly_Sales))
predictDengan Menggunakan Regresi, Di Minggu dimana Suhu di Outdoor sekitar 50 Derajat Fahrenheit, Diprediksi sebuah store Walmart akan mendapat keuntungan sekitar $991.523,4 atau hampir 1 Juta USD.
Tapi, Another Questionsnya adalah Apakah hanya Temperatur saja yang mempengaruhi dari Total Weekly Sales? Bagaimana jika kita coba Regresion dengan menggunakan Faktor lainnya yang berpengaruh
Dalam regresi KNN seperti pada klasifikasi : memiliki lebih banyak prediktor tidak selalu lebih akurat , dan pilihan prediktor mana yang akan digunakan berpotensi besar mempengaruhi kualitas prediksi.
Kami sekarang akan mendemonstrasikan analisis regresi KNN multivariabel dari data walmart menggunakan tidymodels . Kali ini kami akan menggunakan Angka Pengangguran sebagai prediktor kami, dan terus menggunakan Total Sales sebagai variabel hasil/target yang kami coba prediksi.
plot_wm <- walmart |>
ggplot(aes(x = Unemployment, y = Weekly_Sales)) +
geom_point(alpha = 0.4) +
labs(x = 'Unemployments Rate', y = 'Total Sales (USD)') +
theme(text = element_text(size = 12))
plot_wmDi Scatter Plot, Kelihatannya angka Unemployment rendah mendorong jumlah Sales. Apakah Akan meningkatkan akurasi Regresson jika kita selipkan Predictor ini?
regre2 <- mini_walmart |>
mutate(diff = abs( 9 - Unemployment)) |>
arrange(diff) |>
slice(1:7) #subset the first 7 rows
regre2predict2 <- regre2 |>
summarise(predict = mean(Weekly_Sales))
predict2Artinya, Di Daerah dimana Unemployement Rate mencapai 9, Perkiraan pendapatan Toko Weekly sekitar $805 Ribu.
Multi-Predictor Regression
Menggunakan 2 Prediktor yang sama-sama Berpengaruh, kita bisa mencoba melakukan prediksi melibatkan 2 faktor.
regre3 <- mini_walmart |>
mutate(diff = abs( 9 - Unemployment + 55 - Temperature)) |>
arrange(diff) |>
slice(10)
predict3 <- regre3 |>
summarise(predict = mean(Weekly_Sales))
predict3APakah angka segitu sudah benar-benar mendekati?
Classification Algorithm
Clasification dilakukan dengan menggunakan KNN (K-Nearest Neighbour) adalah sebuah algoritma pelatihan untuk mengklasifikasikan suatu data baru berdasarkan kategori mayoritas banyaknya K data pelatihan yang terdekat dengannya (nearest neighbor). Tujuan utama dari algoritma ini adalah untuk mengklasifikasikan suatu obyek baru berdasarkan atribut dan sampel pelatihan
Melihat data walmart kita bisa melakukan klasifikasi dari apakah Sales terjadi di Holiday Week atau tidak menggunakan algoritma KNN
walmart <- walmart |>
mutate(Holiday_Flag = as_factor(Holiday_Flag))
walmart |>
pull(Holiday_Flag) |>
levels()## [1] "0" "1"
Setelah itu, kita harus mencari proporsi Sales di Minggu Holiday dan yang di Minggu Non-Holiday
wal_prop <- nrow(walmart)
walmart |>
group_by(Holiday_Flag) |>
summarize(
count = n(),
percentage = n() / wal_prop * 100
)Sebanyak 93% dari Sales terjadi di Week Non-Holiday dan 7% di Week Holiday Selanjutnya kita buat Scatter Plot dengan variabel Total Sales dan Temperature
saletempo<- walmart |>
ggplot(aes(x = Temperature, y = Weekly_Sales, color = Holiday_Flag)) +
geom_point(alpha = 0.6) +
labs(x = "Temperature (standardized)",
y = "Weekly Revenue (standardized)",
color = "Holidays Week") +
scale_color_manual(labels = c("No", "Yes"),
values = c("red", "yellow")) +
theme(text = element_text(size = 12))
saletempoMetode Distance Between Points
new_obs_Revenue <- 1750000
new_obs_Temperature <- 60
walmart |>
select(Store, Date, Weekly_Sales, Temperature, Holiday_Flag) |>
mutate(dist_from_new = sqrt((Weekly_Sales- new_obs_Revenue)^2 +
(Temperature- new_obs_Temperature)^2)) |>
arrange(dist_from_new) |>
slice(1:10) # take the first 10 rowsKNN With tidymodels
Classification apakah Sales terjadi di Holiday Week berdasarkan Tanggal
Kita ingin mengetahui apakah transaksi di suatu hari merupakan Holiday Week atau tidak.
knn_spechol <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
set_engine("kknn") |>
set_mode("classification")
knn_spechol## K-Nearest Neighbor Model Specification (classification)
##
## Main Arguments:
## neighbors = 5
## weight_func = rectangular
##
## Computational engine: kknn
library(kknn)
knn_fihol <- knn_spechol |>
fit(Holiday_Flag ~Date, data = walmart)Kita menggunakan Prediksi untuk mengetes, kita tahu bahwa 31 Desember merupakan Christmas Week, dimana holiday Flag bernilai 1. Tapi apakah kklasifikasi bisa menebak dengan benar?
testhol = tibble(Date = as.Date(365, origin = '2010-12-31'))
predict(knn_fihol, testhol)Classification menentukan apakah Sales Terjadi di Holiday Week berdasarkan Sales dan Temperature
knn_spec <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
set_engine("kknn") |>
set_mode("classification")
knn_spec## K-Nearest Neighbor Model Specification (classification)
##
## Main Arguments:
## neighbors = 5
## weight_func = rectangular
##
## Computational engine: kknn
.
library(kknn)
knn_fit <- knn_spec |>
fit(Holiday_Flag ~ Temperature + Weekly_Sales, data = walmart)
Di sini Anda dapat melihat ringkasan model terlatih terakhir. Ini menegaskan bahwa mesin komputasi yang digunakan untuk melatih model adalah kknn::train.kknn.
new_obs <- tibble(Temperature = 60, Weekly_Sales = 1750000)
predict(knn_fit, new_obs)Prediksi Mengatakan jika Transaksi Tersebut dilaksanakan pada Week Non-Holiday
Akan tetapi, sebuah prediksi tidaklah 100% benar, selalu ada ruang untuk kesalahan. Prediksi pengklasifikasi mungkin besar kemungkinannya untuk benar, maka dari itu tidak ada salahnya akan membuat prediksi kita lebih akurat untuk memperbesar peluang benar.
Akan Tetapi karena Proporsi yang berat sebelah (93-7) Maka Semua Prediksi akan mengikut Mayoritass, Karena begitu kita akan mencoba mengklasifikasikan hal lainn. Contohnya Nomor Store
Classification menentukan Nomor Outlet/Store
walmart <- walmart |>
mutate(Store = as_factor(Store))
walmart |>
pull(Store) |>
levels()## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
## [16] "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30"
## [31] "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45"
Setelah itu, kita harus mencari proporsi Stores
wal_stor <- nrow(walmart)
walmart |>
group_by(Store) |>
summarize(
count = n(),
percentage = n() / wal_stor * 100
)knn_lah <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
set_engine("kknn") |>
set_mode("classification")
knn_lah## K-Nearest Neighbor Model Specification (classification)
##
## Main Arguments:
## neighbors = 5
## weight_func = rectangular
##
## Computational engine: kknn
library(kknn)
knn_fitu <- knn_lah |>
fit(Store ~ Temperature + Weekly_Sales + Unemployment, data = walmart)Test Prediksi
new_store <- tibble(Temperature = 60, Weekly_Sales = 1450000, Unemployment = 6)
predict(knn_fitu, new_store)Evaluating and Tuning the Regression
Kita sudah membuat Model Regresi diatas, tapi apakah itu yang paling akurat? kita akan mencoba menggunakan metode Split Set mencari nilai k dan RMSPE paling Optimal.
set.seed(7)
walmart_split <- initial_split(walmart, prop = 0.75, strata = Weekly_Sales)
walmart_train <- training(walmart_split)
walmart_test <- testing(walmart_split)Selanjutnya, kita akan menggunakan validasi silang untuk memilih K. Dalam klasifikasi KNN, kita menggunakan akurasi untuk melihat seberapa baik prediksi kami cocok dengan label sebenarnya. Kita tidak dapat menggunakan metrik yang sama dalam pengaturan regresi, karena prediksi kita hampir tidak akan pernah sama persis dengan nilai variabel respons yang sebenarnya. Oleh karena itu dalam konteks regresi KNN kita akan menggunakan root mean square prediksi error (RMSPE) sebagai gantinya. Jika prediksi sangat mendekati nilai sebenarnya, maka RMSPE akan kecil. Sebaliknya, jika prediksi sangat berbeda dari nilai sebenarnya, maka RMSPE akan cukup besar. Saat kami menggunakan validasi silang, kami akan memilih K yang memberi kita RMSPE terkecil.
Membuat Recipe dan melakukan Cross-Validation silang sebanyak 5 kali
Cross-Validation Regresi 1 Prediktor
walm_recipe2 <- recipe(Weekly_Sales ~ Unemployment, data = walmart_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
walm_specx <- nearest_neighbor(weight_func = "rectangular",
neighbors = tune()) |>
set_engine("kknn") |>
set_mode("regression")
walm_vfold <- vfold_cv(walmart_train, v = 5, strata = Weekly_Sales)
walm_wkflwx <- workflow() |>
add_recipe(walm_recipe2) |>
add_model(walm_specx)
walm_wkflwx## == Workflow ====================================================================
## Preprocessor: Recipe
## Model: nearest_neighbor()
##
## -- Preprocessor ----------------------------------------------------------------
## 2 Recipe Steps
##
## * step_scale()
## * step_center()
##
## -- Model -----------------------------------------------------------------------
## K-Nearest Neighbor Model Specification (regression)
##
## Main Arguments:
## neighbors = tune()
## weight_func = rectangular
##
## Computational engine: kknn
gridvalsx <- tibble(neighbors = seq(from = 1, to = 100 ,by=4))
walm_resultsx <- walm_wkflwx |>
tune_grid(resamples = walm_vfold, grid = gridvalsx) |>
collect_metrics() |>
filter(.metric == "rmse")
# show the results
walm_resultsxwalm_minx <- walm_resultsx |>
filter(mean == min(mean))
walm_minxkminx <- walm_minx |> pull(neighbors)
walm_specx <- nearest_neighbor(weight_func = "rectangular", neighbors = kminx) |>
set_engine("kknn") |>
set_mode("regression")
walm_fitx <- workflow() |>
add_recipe(walm_recipe2) |>
add_model(walm_specx) |>
fit(data = walmart_train)
walm_summaryx <- walm_fitx |>
predict(walmart_test) |>
bind_cols(walmart_test) |>
metrics(truth = Weekly_Sales, estimate = .pred) |>
filter(.metric == 'rmse')
walm_summaryxRMSE Untuk Regresi 1 variabel dengan Unemployment adalah 531253.1
Cross-Validation Multi-Predictor Regression
walm_recipe <- recipe(Weekly_Sales ~ Temperature + Unemployment, data = walmart_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
walm_spec <- nearest_neighbor(weight_func = "rectangular",
neighbors = tune()) |>
set_engine("kknn") |>
set_mode("regression")
walm_vfold <- vfold_cv(walmart_train, v = 5, strata = Weekly_Sales)
walm_wkflw <- workflow() |>
add_recipe(walm_recipe) |>
add_model(walm_spec)
walm_wkflw## == Workflow ====================================================================
## Preprocessor: Recipe
## Model: nearest_neighbor()
##
## -- Preprocessor ----------------------------------------------------------------
## 2 Recipe Steps
##
## * step_scale()
## * step_center()
##
## -- Model -----------------------------------------------------------------------
## K-Nearest Neighbor Model Specification (regression)
##
## Main Arguments:
## neighbors = tune()
## weight_func = rectangular
##
## Computational engine: kknn
Selanjutnya kita menjalankan validasi silang untuk kisi jumlah tetangga mulai dari 1 hingga 200. Kode berikut menyetel model dan mengembalikan RMSPE untuk setiap jumlah tetangga. Dalam output dari frame data hasil walm_results, kita melihat bahwa variabel tetangga berisi nilai K, mean (mean) berisi nilai RMSPE yang diperkirakan melalui validasi silang, dan kesalahan standar (std_err) berisi nilai yang sesuai dengan ukuran seberapa tidak pasti kita dalam nilai mean.
gridvals <- tibble(neighbors = seq(from = 1, to = 100 ,by=4))
walm_results <- walm_wkflw |>
tune_grid(resamples = walm_vfold, grid = gridvals) |>
collect_metrics() |>
filter(.metric == "rmse")
# show the results
walm_results** Mengambil RMSPE Terkeil**
walm_min <- walm_results |>
filter(mean == min(mean))
walm_minDengan nilai K=53 kita dapat nilai RMSE terkecil yang bisa kita coba kepada Test Set
kmin <- walm_min |> pull(neighbors)
walm_spec2 <- nearest_neighbor(weight_func = "rectangular", neighbors = kmin) |>
set_engine("kknn") |>
set_mode("regression")
walm_fit2 <- workflow() |>
add_recipe(walm_recipe) |>
add_model(walm_spec2) |>
fit(data = walmart_train)
walm_summary <- walm_fit2 |>
predict(walmart_test) |>
bind_cols(walmart_test) |>
metrics(truth = Weekly_Sales, estimate = .pred) |>
filter(.metric == 'rmse')
walm_summaryRMSPE Yang besar juga dipengaruhi oleh perilaku individu yang unpredictable beda seperti menentukan nilai barang.
Mencari R2 atau Rsquared
modelx <- lm(Weekly_Sales ~ Temperature + Unemployment ,data = walmart)
summary(modelx)##
## Call:
## lm(formula = Weekly_Sales ~ Temperature + Unemployment, data = walmart)
##
## Residuals:
## Min 1Q Median 3Q Max
## -889076 -483894 -80309 380220 2744355
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1388955.9 36596.5 37.953 < 2e-16 ***
## Temperature -1640.6 380.8 -4.309 1.67e-05 ***
## Unemployment -30311.7 3743.9 -8.096 6.73e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 560500 on 6432 degrees of freedom
## Multiple R-squared: 0.01412, Adjusted R-squared: 0.01381
## F-statistic: 46.06 on 2 and 6432 DF, p-value: < 2.2e-16
Nilai R-Squared di atas menjelaskan bahwa hubungan Linearnya sangatlah lemah, hanya 1,4% Mengapa? Karena model prediksi ini bukan memprediksi sebuah harga benda secara fisik (i.e. Rumah, Mobil, dan Assets) Tapi Jumlah Sales yang dilakukan oleh orang-orang, People are harder to Predict, Walaupun Variabel Temperature dan Unemployment memiliki pengaruh, tapi perilaku individu yang berbeda-beda membuat susah memprediksi.
Dari Regresi diatas, Di perkirakan bahwa Rumus Sales atau Pendapatan yaitu : \[ Weeklysales = 1,388,955.9 + (-1,640.6 * Temperature) + (-30,311.7 * Unemployment) \]
P = 1388955.9 + (-1640.6 * T) -30311.7 * 9
T = 50
u = 9
P## [1] 1114510
Dengan Suhu sekitar 50 Derajat Fahrenheit dan Angka Pengangguran 9, diperkirakan Nilai Sales mencapai 1,114,510 USD
newm <- walmart %>% filter(Temperature > 46, Temperature < 54 , Unemployment >= 8.5 , Unemployment <= 9.5 )
mean (newm$Weekly_Sales)## [1] 1058700
Bisa Dilihat, Pendapatan saat Suhu berkisar 50 ∓ 5 Derajat dan Unemployment Rate 9 ∓ 0.5 Maka Rata-Rata Sales mencapai 1,058,700 USD
Terjadi Perbedaan sekitar 56 Ribu USD Dari Prediktor, APakah Sudah Cukup Baik?
Evaluating Classification
Accuracy Store Classifier
walmart_split2 <- initial_split(walmart, prop = 0.75, strata = Store)
stor_train <- training(walmart_split2)
stor_test <- testing(walmart_split2)Cek Proporsi
walm_proportions <- stor_train |>
group_by(Store) |>
summarize(n = n()) |>
mutate(percent = 100*n/nrow(stor_train))
walm_proportionswmart_recipe <- recipe(Store ~ Temperature + Weekly_Sales + Unemployment, data = stor_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
knn_wal <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
set_engine("kknn") |>
set_mode("classification")
knn_fitt <- workflow() |>
add_recipe(wmart_recipe) |>
add_model(knn_wal) |>
fit(data = stor_train)
store_predictions <- predict(knn_fitt, stor_test) |>
bind_cols(stor_test)
store_predictionsMenghitung accuracy dari classifier menggunakan metric dari package tidyverse dengan perhitungan truth dengan argument sebagai perhitungan akurasi.
store_predictions |>
metrics(truth = Store, estimate = .pred_class) |>
filter(.metric == "accuracy")Melihat Hasil Prediksinya :
confusion <- store_predictions |>
conf_mat(truth = Store, estimate = .pred_class)
confusion## Truth
## Prediction 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## 1 13 0 0 0 0 3 0 0 0 2 1 0 0 0 0 0 0 0 5 0 0 0 0
## 2 0 14 0 1 0 1 0 0 0 3 0 0 5 3 0 0 0 0 0 3 0 0 0
## 3 0 0 27 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## 4 0 0 0 19 0 0 0 0 0 2 0 0 5 0 0 0 0 0 0 2 0 0 2
## 5 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## 6 3 0 0 2 0 20 0 1 0 0 7 0 0 0 0 0 0 0 0 0 0 0 2
## 7 0 0 0 0 0 0 18 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0
## 8 0 0 0 0 0 0 0 27 0 0 0 0 0 0 0 0 5 0 0 0 1 0 1
## 9 0 0 0 0 1 0 0 0 31 0 0 0 0 0 0 2 0 0 0 0 0 0 0
## 10 0 0 0 1 0 0 0 0 0 17 1 0 0 1 0 0 0 0 0 0 0 0 0
## 11 0 0 0 0 0 1 0 0 0 0 18 0 0 0 0 0 0 0 0 0 0 0 0
## 12 0 0 0 0 0 0 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0
## 13 1 3 0 5 0 1 0 0 0 0 0 0 18 0 0 0 0 0 1 3 0 0 0
## 14 0 0 0 2 0 0 0 0 0 3 0 0 0 41 0 0 0 1 0 0 0 0 0
## 15 0 0 0 0 0 0 2 0 0 0 0 0 0 0 24 0 0 0 0 0 2 0 0
## 16 0 0 1 0 2 0 0 0 9 0 0 0 0 0 0 32 0 0 0 0 1 0 0
## 17 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 26 0 0 0 0 0 0
## 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 5 0
## 19 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 17 0 0 2 0
## 20 2 2 0 4 0 1 0 0 0 3 1 0 5 0 0 0 0 0 0 24 0 0 0
## 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 18 0 0
## 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 1 16 0
## 23 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35
## 24 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 4 0 1 2 0
## 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 4 1 0
## 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 6 0
## 27 5 5 0 1 0 0 0 0 0 1 0 0 4 3 0 0 0 0 4 0 1 0 0
## 28 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
## 29 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 30 0 0 5 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
## 31 4 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 2 1 0 0 0
## 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 0 1 0
## 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0
## 36 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 37 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 39 3 1 0 0 0 3 0 0 0 0 2 0 0 0 0 0 0 1 1 0 0 1 0
## 40 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4
## 41 0 0 0 0 0 2 0 2 0 0 5 0 0 0 0 0 1 0 0 0 0 1 0
## 42 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
## 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 44 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 45 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0
## Truth
## Prediction 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
## 1 0 0 0 3 0 0 0 3 0 0 0 0 0 0 0 3 0 1 0 0 0 0
## 2 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 10 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
## 4 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 5 0
## 6 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 5 0 0 0 0
## 7 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 5 0 0 2
## 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0
## 9 0 0 0 0 0 0 1 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0
## 10 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0
## 11 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 4 0 0 0 0
## 12 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 13 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 14 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0
## 15 0 1 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0
## 16 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
## 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## 18 0 0 3 0 0 0 0 0 7 0 5 4 0 0 0 0 0 0 0 0 0 0
## 19 10 0 1 1 0 0 0 4 1 0 0 0 0 0 0 1 0 0 0 0 0 0
## 20 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0
## 21 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 22 0 0 11 0 0 0 0 0 2 0 0 0 0 0 0 1 0 1 0 0 0 0
## 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0
## 24 15 0 0 0 0 0 0 2 7 0 0 2 0 0 0 3 0 0 0 0 0 1
## 25 0 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0
## 26 0 2 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
## 27 1 0 0 26 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## 28 0 0 0 0 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 29 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0
## 30 0 0 0 0 0 0 23 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0
## 31 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 2 0 0 0 0 0 0
## 32 3 0 2 0 0 0 0 2 13 0 0 1 0 0 0 1 0 0 0 0 0 1
## 33 0 0 0 0 0 0 0 0 0 29 0 0 1 0 0 0 0 0 0 0 1 0
## 34 0 0 0 0 0 1 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0
## 35 0 0 0 0 0 0 0 0 1 0 0 15 0 0 0 0 0 0 0 0 0 3
## 36 0 0 0 0 0 0 1 0 0 3 0 0 23 2 0 0 0 0 1 0 0 0
## 37 0 0 0 0 0 0 1 0 0 0 0 0 4 37 0 0 0 0 4 0 0 0
## 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0
## 39 4 0 0 0 0 0 0 5 3 0 0 0 0 0 0 19 0 0 0 0 0 0
## 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 0 0 0 0 0
## 41 0 2 7 0 0 0 0 1 0 0 0 0 0 0 0 0 0 26 0 0 0 0
## 42 0 1 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0
## 43 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 9 34 0 0
## 44 0 0 0 0 0 0 0 0 0 2 0 0 4 0 0 0 0 0 0 0 23 0
## 45 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 22
Accuracy of Holiday Flag Class by Sales and Temperature
walmart_split3 <- initial_split(walmart, prop = 0.75, strata = Holiday_Flag)
holi_train <- training(walmart_split3)
holi_test <- testing(walmart_split3)holi_proportions <- holi_train |>
group_by(Holiday_Flag) |>
summarize(n = n()) |>
mutate(percent = 100*n/nrow(stor_train))
holi_proportionsholi_recipe <- recipe(Holiday_Flag ~ Temperature + Weekly_Sales, data = holi_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
knn_holi <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
set_engine("kknn") |>
set_mode("classification")
knn_fith <- workflow() |>
add_recipe(holi_recipe) |>
add_model(knn_holi) |>
fit(data = holi_train)
holi_predictions <- predict(knn_fith, holi_test) |>
bind_cols(holi_test)
holi_predictionsholi_predictions |>
metrics(truth = Holiday_Flag, estimate = .pred_class) |>
filter(.metric == "accuracy")Accuracy yang cukup besar sekitar 91%
confusionx <- holi_predictions |>
conf_mat(truth = Holiday_Flag, estimate = .pred_class)
confusionx## Truth
## Prediction 0 1
## 0 1495 92
## 1 15 7
Tapi Kebanyakan benar memprediksi NonHoliday karena proporsi data yang Mayoritas Non-Holiday, kurang tepat ketika memprediksi Holiday Weeksnya.