Regression Model: Startups Data

1 Introduction

Regresi linier adalah teknik analisis statistik yang digunakan untuk memprediksi hubungan antara dua atau lebih variabel. Pada artikel ini kita akan membuat model regresi linier berganda menggunakan data startups. Kita ingin mengetahui variabel apa saja yang mempengaruhi Profit yang nantinya akan digunakan sebagai tim data untuk mengevaluasi dan meningkatkan ptofit perusahaan.

2 Data Preparation

2.1 Importing Libraries

Langkah pertama adalah memanggil library yang akan digunakan dalam pemodelan.

library(tidyverse)
library(caret)
library(plotly)
library(data.table)
library(GGally)
library(car)
library(scales)
library(lmtest)
library(tidymodels)
library(gridExtra)
library(ggstatsplot)
library(dplyr)
library(grid)
library(performance)
library(MLmetrics)

2.2 Importing Datasets

Selanjutnya, dilakukan import data 50 Startups dalam bentuk CSV yang disimpan dalam data frame yang disimpan dengan nama startups_data.

startups_data<- read.csv("50_Startups.csv", sep = ',', header = TRUE)
str(startups_data)
#> 'data.frame':    50 obs. of  5 variables:
#>  $ R.D.Spend      : num  165349 162598 153442 144372 142107 ...
#>  $ Administration : num  136898 151378 101146 118672 91392 ...
#>  $ Marketing.Spend: num  471784 443899 407935 383200 366168 ...
#>  $ State          : chr  "New York" "California" "Florida" "New York" ...
#>  $ Profit         : num  192262 191792 191050 182902 166188 ...

Data di atas memiliki 50 observasi dan 5 variables. Variabel state merupakan variabel menunjukkan negara bagian tempat perusahaan rintisan tersebut berada. Target variabel dalam case ini adalah Profit. Dalam case ini kita menggunakan variabel dependen yang bersifat numerik yaitu R&D Spend, Administration, Marketing Spend.

3 Exploratory Data Analysis

Sebelum melakukan pemodelan, kita harus memastikan bahwa data yang digunakan adalah data yang bersih dan useful. ### 3.1 Duplicates Langkah pertama dilakukan pengecekan data duplikat.

dup <- sum(duplicated(startups_data))
dup
#> [1] 0

Berdasarkan hasil pengecekan diatas, data startups_data tidak memiliki data duplikat.

3.2 Missing Values

Selanjutnya yaitu melakukan pengecekan missing values. Missing values akan menyebabkan data tidak valid saat dilakukan pemodelan. Terdapat beberapa uji yang tidak resisten terhadap missing values.

mv <- colSums(is.na(x=startups_data))
mv
#>       R.D.Spend  Administration Marketing.Spend           State          Profit 
#>               0               0               0               0               0

Berdasarkab hasil pengecekan diatas, data startups_data tidak memiliki missing values sehingga tidak perlu dilakukan handling missing value

3.3 Data Types

Selanjutnya, dilakukan pengecekan untuk tipe variabel. Variabel yang memiliki tipe data tidak sesuai akan mempengaruhi hasil pemodelan bahkan tidak bisa diproses dalam pemodelan.

datypes <- str(startups_data)
#> 'data.frame':    50 obs. of  5 variables:
#>  $ R.D.Spend      : num  165349 162598 153442 144372 142107 ...
#>  $ Administration : num  136898 151378 101146 118672 91392 ...
#>  $ Marketing.Spend: num  471784 443899 407935 383200 366168 ...
#>  $ State          : chr  "New York" "California" "Florida" "New York" ...
#>  $ Profit         : num  192262 191792 191050 182902 166188 ...
datypes
#> NULL

Berdasarkan pengecekan tipe data, variabel R.D.Spend, Administration, Marketing.Spend memiliki tipe yang sesuai sehingga variabel tidak perlu dilakukan perubahan tipe data.

3.4 Boxplot

Boxplot adalah grafik visualisasi data yang digunakan dalam statistik untuk menunjukkan distribusi data. Selain itu, kita bisa melihat apakah pada data terdapat outlier/pencilan.

# Boxplot
par(new=TRUE)
bp_RnDSpend <- boxplot(startups_data$R.D.Spend, col = "grey", xlab = "R&D Spend", ylab = "Value", main = "R&D Spend Var Boxplot")

# Boxplot
bp_Administration <- boxplot(startups_data$Administration, col = "grey", xlab = "Administration", ylab = "Value", main = "Administration Var Boxplot")

# Boxplot
bp_Marketing.Spend <- boxplot(startups_data$Marketing.Spend, col = "grey", xlab = "Marketing Spend", ylab = "Value", main = "Marketing Spend Var Boxplot")

Berdasarkan Boxplot seluruh variabel, tidak terdapat pengamatan yang keluar dari kotak distribusi data. Hal ini menunjukkan bahwa pada data Startups_data tidak terdapat outlier.

3.5 Descriptive Statistics

Statistika deskriptif adalah salah satu jenis statistik yang berfungsi untuk mendeskripsikan data yang fokus pada penyajian, managemen, dan klasifikasi data sehingga dapat memberikan informasi yang berguna.

desc_stats <- summary(startups_data)
desc_stats 
#>    R.D.Spend      Administration   Marketing.Spend     State          
#>  Min.   :     0   Min.   : 51283   Min.   :     0   Length:50         
#>  1st Qu.: 39936   1st Qu.:103731   1st Qu.:129300   Class :character  
#>  Median : 73051   Median :122700   Median :212716   Mode  :character  
#>  Mean   : 73722   Mean   :121345   Mean   :211025                     
#>  3rd Qu.:101603   3rd Qu.:144842   3rd Qu.:299469                     
#>  Max.   :165349   Max.   :182646   Max.   :471784                     
#>      Profit      
#>  Min.   : 14681  
#>  1st Qu.: 90139  
#>  Median :107978  
#>  Mean   :112013  
#>  3rd Qu.:139766  
#>  Max.   :192262

3.6 Correlation

Korelasi digunakan untuk melihat hubungan antar variabel. Korelasi ini dapat digunakan sebagai filter awal dalam memilih variabel independen (X). Namun, korelasi memiliki beberapa kekurangan. Korelasi hanya dapat melihat seberapa besar kekuatan hubungan kedua variabel, namun tidak dapat melihat peran yang mempengaruhi dan dipengaruhi.

column <- c("R.D.Spend", "Administration", "Marketing.Spend","Profit")
boxdat <- startups_data[column]
boxdat
#>    R.D.Spend Administration Marketing.Spend    Profit
#> 1  165349.20      136897.80       471784.10 192261.83
#> 2  162597.70      151377.59       443898.53 191792.06
#> 3  153441.51      101145.55       407934.54 191050.39
#> 4  144372.41      118671.85       383199.62 182901.99
#> 5  142107.34       91391.77       366168.42 166187.94
#> 6  131876.90       99814.71       362861.36 156991.12
#> 7  134615.46      147198.87       127716.82 156122.51
#> 8  130298.13      145530.06       323876.68 155752.60
#> 9  120542.52      148718.95       311613.29 152211.77
#> 10 123334.88      108679.17       304981.62 149759.96
#> 11 101913.08      110594.11       229160.95 146121.95
#> 12 100671.96       91790.61       249744.55 144259.40
#> 13  93863.75      127320.38       249839.44 141585.52
#> 14  91992.39      135495.07       252664.93 134307.35
#> 15 119943.24      156547.42       256512.92 132602.65
#> 16 114523.61      122616.84       261776.23 129917.04
#> 17  78013.11      121597.55       264346.06 126992.93
#> 18  94657.16      145077.58       282574.31 125370.37
#> 19  91749.16      114175.79       294919.57 124266.90
#> 20  86419.70      153514.11            0.00 122776.86
#> 21  76253.86      113867.30       298664.47 118474.03
#> 22  78389.47      153773.43       299737.29 111313.02
#> 23  73994.56      122782.75       303319.26 110352.25
#> 24  67532.53      105751.03       304768.73 108733.99
#> 25  77044.01       99281.34       140574.81 108552.04
#> 26  64664.71      139553.16       137962.62 107404.34
#> 27  75328.87      144135.98       134050.07 105733.54
#> 28  72107.60      127864.55       353183.81 105008.31
#> 29  66051.52      182645.56       118148.20 103282.38
#> 30  65605.48      153032.06       107138.38 101004.64
#> 31  61994.48      115641.28        91131.24  99937.59
#> 32  61136.38      152701.92        88218.23  97483.56
#> 33  63408.86      129219.61        46085.25  97427.84
#> 34  55493.95      103057.49       214634.81  96778.92
#> 35  46426.07      157693.92       210797.67  96712.80
#> 36  46014.02       85047.44       205517.64  96479.51
#> 37  28663.76      127056.21       201126.82  90708.19
#> 38  44069.95       51283.14       197029.42  89949.14
#> 39  20229.59       65947.93       185265.10  81229.06
#> 40  38558.51       82982.09       174999.30  81005.76
#> 41  28754.33      118546.05       172795.67  78239.91
#> 42  27892.92       84710.77       164470.71  77798.83
#> 43  23640.93       96189.63       148001.11  71498.49
#> 44  15505.73      127382.30        35534.17  69758.98
#> 45  22177.74      154806.14        28334.72  65200.33
#> 46   1000.23      124153.04         1903.93  64926.08
#> 47   1315.46      115816.21       297114.46  49490.75
#> 48      0.00      135426.92            0.00  42559.73
#> 49    542.05       51743.15            0.00  35673.41
#> 50      0.00      116983.80        45173.06  14681.40
corr_numvar <- ggcorrmat(
  data = boxdat,
  type = "parametric", # Person Correlation
  colors = c("darkred", "white", "steelblue")
)

corr_numvar <- corr_numvar +  labs(title = NULL, subtitle = NULL) + theme(
  plot.margin = margin(0.15, 0, 0.1, 0.01, "npc")) 

corr_numvar

grid.text(
  "Correlation: Numeric Variable", 
  0, 
  0.900,
  just = c("left", "bottom"),
  gp = gpar(
    fontsize = 22,
    fontface = "bold",
    fontfamily = "Econ Sans Cnd"
  )
)

grid.lines(
  x = c(0, 1),
  y = 1,
  gp = gpar(col = "#e5001c", lwd = 4)
)

grid.rect(
  x = 0,
  y = 1,
  width = 0.05,
  height = 0.025,
  just = c("left", "top"),
  gp = gpar(fill = "#e5001c", lwd = 0)
)

Korelasi menunjukkan bahwa variabel R & D Spend dan Marketing Spend, memiliki korelasi positif yang kuat satu sama lain (mendekati nilai 1). Dalam hal ini ketika satu variabel meningkat maka variabel lainnya juga akan mengalami peningkatan. Namun, dengan hasil korelasi yang tinggi akan menimbulkan multikolinieritas pada model regresi.

3.7 Scatter Plot

Scatter plot adalah jenis grafik yang digunakan dalam statistik dan analisis data untuk menampilkan serta menganalisis hubungan antara dua variabel numerik.

# 1. Profit Score dan RnD Spend
plot(startups_data$Profit, startups_data$R.D.Spend)

# 2. Profit Score dan Marketing Spend
plot(startups_data$Profit, startups_data$Marketing.Spend)

# 3. Profit Score dan Administrasi
plot(startups_data$Profit, startups_data$Administrasi)

Hasil scatter plot R & D Spend dan Marketing Spend align dengan hasil korelasi, dimana setiap penambahan variabel independen, variabel dependen juga akan meningkat. Selanjutnya variabel independen yang digunakan adalah R & D Spend dan Marketing Spend

4 Modeling : Linear Regression

Setelah dilakukan preprocessing data, selanjutnya dilakukan pemodelan regresi.

4.1 Initial Model

Pada model regresi, digunakan 2 variabel independen X yaitu (R&D Spend,Marketing Spend) dan 1 variabel dependen Y yaitu Profit

# Fungsi
model_ols <- lm(formula = Profit ~ R.D.Spend + Marketing.Spend,
                data = startups_data)

# Hasil Model
model_ols
#> 
#> Call:
#> lm(formula = Profit ~ R.D.Spend + Marketing.Spend, data = startups_data)
#> 
#> Coefficients:
#>     (Intercept)        R.D.Spend  Marketing.Spend  
#>     46975.86422          0.79658          0.02991

4.2 Assumption

Setelah dilakukan pemodelan, dari hasil model tersebut dilakukan uji asumsi regresi. #### Linearity Linearity artinya target variabel dengan prediktornya memiliki hubungan yang linear atau hubungannya bersifat garis lurus.

# Linearity
plot(model_ols, which = 1)
abline(h = 10, col = "green")
abline(h = -10, col = "green")

Dari plor dapat diluhat bahwa nilai residual berada di sekitar nilai 0, karena nilai residual berada di sekitar angka 0, maka uji asumsi linearity TERPENUHI.

Normality of Residuals

Uji Normalitas adalah sebuah uji yang dilakukan dengan tujuan untuk menilai sebaran data pada sebuah kelompok data atau variabel, apakah sebaran data tersebut berdistribusi normal atau tidak. Model linear regression diharapkan menghasilkan error yang berdistribusi normal. Dengan begitu, error lebih banyak berkumpul di sekitar angka nol. Pada uji ini digunakan pengujian menggunakan metode Shapiro Test.

  • H0: error berdistribusi normal
  • H1: error TIDAK berdistribusi normal

Kondisi yang diharapkan: H0 - p_value > alpha -> gagal tolak h0 (terima h0) - p_value < alpha -> tolak h0 (terima h1)

# Normality by Shapiro Test
shapiro.test(model_ols$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_ols$residuals
#> W = 0.93717, p-value = 0.01042

Kesimpulan: Karena p-value < alpha, maka: - Tolak h0 - Terima h1 - Error tidak berdistribusi normal

Status: Uji asumsi Normality of Residuals [TIDAK TERPENUHI].

Homoscedasticity of Residuals

Pengujian homoskedastisitas dilakukan dengan melihat grafik residual vs fitted values untuk mengetahui apakah dalam model regresi terdapat ketidaksamaan variabs dari residual pengamatan ke pengamatan lain. Diharapkan error yang dihasilkan oleh model menyebar secara acak atau dengan variasi konstan. Apabila divisualisasikan maka error tidak berpola.

Breusch-Pagan hypothesis test:

  • H0: error menyebar konstan atau homoscedasticity
  • H1: error menyebar TIDAK konstan atau heteroscedasticity

Kondisi yang diharapkan: H0 p_value > alpha -> gagal tolak h0 (terima h0) p_value < alpha -> tolak h0 (terima h1)

# Homoscedasticity by BP Test
bptest(model_ols)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_ols
#> BP = 2.8431, df = 2, p-value = 0.2413

Kesimpulan: Karena p-value < alpha, maka: - Tolak h0 - Terima h1

Status: Uji asumsi Homoscedasticity of Residuals [TIDAK TERPENUHI].

Non Multicollinearity

Pengujian multikolinieritas adalah uji yang dilakukan untuk memastikan apakah di dalam sebuah model regresi ada interkorelasi atau kolinieritas antar variabel bebas.

Uji VIF (Variance Inflation Factor) dengan fungsi vif() dari package car: * nilai VIF > 10: terjadi multicollinearity pada model * nilai VIF < 10: tidak terjadi multicollinearity pada model

Kondisi yang diharapkan: VIF < 10

# Non Multicollinearity
vif(model_ols)
#>       R.D.Spend Marketing.Spend 
#>        2.103206        2.103206

Kesimpulan: Nilai VIF < 10 maka model ols tidak terjadi Multicollinearity.

Status: Uji asumsi No Multicollinearity [TERPENUHI].

4.3 Metrics Evaluation

Metrics Evaluation menggunakan residual model dalam perhitungannya.

Error/Residual

Error/residual adalah selisih antara hasil prediksi dengan nilai aktual.

\[ Error = prediction - actual = \hat y - y \] Metrics Evaluation

Metriks evaluation yang digunakan adalah Ajdusted R-squared dan MAPE

Adjusted R-squared - Rentang nilai 0 sampai 1 - Semakin mendekati 1, semakin baik prediktor dalam menjelaskan target

# Goodness of Fit : Ajdusted R-squared
summary(model_ols)$adj.r.squared
#> [1] 0.9483418

Model OLS memiliki nilai Adjusted R-squared sebesar 0.9483418 artinya prediktor yang digunakan sangat baik dalam menjelaskan target yaitu Profit.

Mean Absolute Percentage Error (MAPE) MAPE menunjukkan seberapa besar penyimpangannya dalam bentuk persentase. \[ MAPE = \frac{1}{n} \sum\frac{|\hat y - y|}{y} \] Digunakan 10% (di bawah 10% dianggap baik)

# MAPE
MAPE(model_ols$fitted.values, startups_data$Profit)
#> [1] 0.1060871

Interpretasi MAPE: Hasil prediksi menyimpang sejauh 10% dari nilai aktualnya. MAPE memiliki range dalam bentuk persen, semakin kecil nilai MAPE, semakin bagus model yang kita miliki.

4.4 Variable Interpretation

Setelah dilakukan pengujian asumsi dan evaluasi metriks model, selanjutnya dapat dilakukan interpretasi hasil pemodelan.

Formula Regresi

\[\hat{y} = \beta_0 + \beta_1 x_1 + ... + \beta_n x_n\]

summary(model_ols)
#> 
#> Call:
#> lm(formula = Profit ~ R.D.Spend + Marketing.Spend, data = startups_data)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -33645  -4632   -414   6484  17097 
#> 
#> Coefficients:
#>                    Estimate  Std. Error t value            Pr(>|t|)    
#> (Intercept)     46975.86422  2689.93292  17.464 <0.0000000000000002 ***
#> R.D.Spend           0.79658     0.04135  19.266 <0.0000000000000002 ***
#> Marketing.Spend     0.02991     0.01552   1.927                0.06 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 9161 on 47 degrees of freedom
#> Multiple R-squared:  0.9505, Adjusted R-squared:  0.9483 
#> F-statistic: 450.8 on 2 and 47 DF,  p-value: < 0.00000000000000022

Formula regresi untuk model di atas:

\[ Profit = 46975.86422 - 0.79658 * R&D Spend + 0.02991 * Marketing SPend \] Interpretasi dari model linear regression:

1. Intercept

Nilai variable target ketika semua nilai prediktor sama dengan nol. `Profit = 46975.86422 - 0.79658 * R&D Spend + 0.02991 * Marketing SPend

Arti: Ketika seluruh prediktor = 0, maka Profit bernilai 46975.86422. -> Naik sebesar 46975.86422

2. Coefficient/Slope

Besarnya perubahan nilai variable target ketika nilai prediktor bertambah 1 satuan. + Koefisien yang positif = meningkatkan nilai variable target + Koefisien yang negatif = menurunkan nilai variable target

Target: Profit Prediktor: - R & D Spend : memiliki koef. positif ; semakin tinggi R&D spend maka profit semakin besar - Marketing Spend : memiliki koef. positif; semakin tinggi biaya marketing semakin tinggi profit - Administrasi : memiliki koef. negatif ; semakin tinggi biaya administrasi semakin kecil profit

3. Signifikansi Prediktor

Mengetahui apakah setiap prediktor berpengaruh signifikan terhadap variable targetnya. + Sebuah prediktor dikatakan signifikan ketika p-value < 0.05 (alpha)

Uji hipotesis yang digunakan:

  • H0: Prediktor tidak signifikan berpengaruh (Estimate = 0)
  • H1: Prediktor signifikan berpengaruh (Estimate != 0)

Hasil Uji Signifikansi: - Hanya dua prediktor (R&D Spend,Marketing Spend) yang signifikan terhadap variabel target (Profit).

5 Conclusion

Model regresi pada case Profit memiliki metriks evaluasi yang baik ditunjukkan dengan nilai Adjusted R-squared yang tinggi dan MAPE yang rendah. Hanya terdapat dua prediktor yang signifikan mempengaruhi Profit secara positif yaitu (R&D Spend,Marketing Spend). Namun, untuk uji asumsi seluruhnya tidak memenuhi. Hal ini perlu dilakukan penanganan uji asumsi agar hasil pemodelan lebih valid.