data <- read_excel("Data Pengantar Ekonometrika Kel 10 (1).xlsx")
data <- data %>%
  rename(
    KabKota = `Kab/Kota`,
    ketersediaan = `Ketersediaan Beras ton`,
    produktivitas = `Produktivitas Tanaman Padi (Ku/Ha)`,
    luas_panen = `Luas Panen (Ha)`
  )
clean_numeric <- function(x){
  x <- gsub(",", ".", x)
  x <- gsub(" ", "", x)
  x <- gsub("\\s+", "", x)
  x <- gsub("[^0-9\\.]", "", x)
  as.numeric(x)
}

data$ketersediaan   <- clean_numeric(as.character(data$ketersediaan))
data$produktivitas  <- clean_numeric(as.character(data$produktivitas))
data$luas_panen     <- clean_numeric(as.character(data$luas_panen))
data$Tahun          <- as.numeric(data$Tahun)

data$KabKota        <- as.factor(data$KabKota)
str(data)
## tibble [190 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Tahun        : num [1:190] 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
##  $ KabKota      : Factor w/ 38 levels "Kabupaten Bangkalan",..: 18 21 27 29 3 9 14 11 7 2 ...
##  $ ketersediaan : num [1:190] 48469 217880 62619 123798 113664 ...
##  $ produktivitas: num [1:190] 43.5 58 55.2 58.4 56.6 ...
##  $ luas_panen   : num [1:190] 83941 377333 108446 214398 196848 ...
summary(data)
##      Tahun                      KabKota     ketersediaan    produktivitas  
##  Min.   :2020   Kabupaten Bangkalan :  5   Min.   :  1901   Min.   :43.51  
##  1st Qu.:2021   Kabupaten Banyuwangi:  5   1st Qu.: 51214   1st Qu.:52.74  
##  Median :2022   Kabupaten Blitar    :  5   Median :124233   Median :57.42  
##  Mean   :2022   Kabupaten Bojonegoro:  5   Mean   :146609   Mean   :57.23  
##  3rd Qu.:2023   Kabupaten Bondowoso :  5   3rd Qu.:214922   3rd Qu.:61.04  
##  Max.   :2024   Kabupaten Gresik    :  5   Max.   :521920   Max.   :72.72  
##                 (Other)             :160                                   
##    luas_panen      
##  Min.   :   503.2  
##  1st Qu.: 18002.4  
##  Median : 43661.6  
##  Mean   : 87896.3  
##  3rd Qu.: 84187.7  
##  Max.   :886061.0  
## 
pdata <- pdata.frame(data, index = c("KabKota", "Tahun"))
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
# Model OLS untuk cek VIF (karena plm tidak bisa langsung dihitung VIF)
model_ols <- lm(ketersediaan ~ produktivitas + luas_panen, data = data)

# Hitung nilai VIF
vif(model_ols)
## produktivitas    luas_panen 
##      1.000735      1.000735
model_pool <- plm(ketersediaan ~ produktivitas + luas_panen,
                  data = pdata, model = "pooling")

model_fe <- plm(ketersediaan ~ produktivitas + luas_panen,
                data = pdata, model = "within")

model_re <- plm(ketersediaan ~ produktivitas + luas_panen,
                data = pdata, model = "random")

summary(model_pool)
## Pooling Model
## 
## Call:
## plm(formula = ketersediaan ~ produktivitas + luas_panen, data = pdata, 
##     model = "pooling")
## 
## Balanced Panel: n = 38, T = 5, N = 190
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -102171  -92994  -17678   44014  343398 
## 
## Coefficients:
##                  Estimate  Std. Error t-value Pr(>|t|)    
## (Intercept)    1.2041e+05  7.9630e+04  1.5121   0.1322    
## produktivitas -3.4234e+02  1.3801e+03 -0.2480   0.8044    
## luas_panen     5.2099e-01  5.5078e-02  9.4591   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    3.0267e+12
## Residual Sum of Squares: 2.0453e+12
## R-Squared:      0.32425
## Adj. R-Squared: 0.31702
## F-statistic: 44.8645 on 2 and 187 DF, p-value: < 2.22e-16
summary(model_fe)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = ketersediaan ~ produktivitas + luas_panen, data = pdata, 
##     model = "within")
## 
## Balanced Panel: n = 38, T = 5, N = 190
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -34355.09  -4129.36    456.38   4207.10  44306.96 
## 
## Coefficients:
##                 Estimate Std. Error t-value  Pr(>|t|)    
## produktivitas 1.4478e+03 2.9632e+02  4.8859 2.615e-06 ***
## luas_panen    3.0631e-02 5.9780e-03  5.1241 9.071e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1.8182e+10
## Residual Sum of Squares: 1.3537e+10
## R-Squared:      0.25548
## Adj. R-Squared: 0.061903
## F-statistic: 25.7358 on 2 and 150 DF, p-value: 2.4592e-10
summary(model_re)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = ketersediaan ~ produktivitas + luas_panen, data = pdata, 
##     model = "random")
## 
## Balanced Panel: n = 38, T = 5, N = 190
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 9.025e+07 9.500e+03 0.993
## individual    6.005e+05 7.749e+02 0.007
## theta: 0.01623
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -101476  -92214  -17862   43356  340345 
## 
## Coefficients:
##                  Estimate  Std. Error z-value Pr(>|z|)    
## (Intercept)    1.2142e+05  7.9779e+04  1.5220   0.1280    
## produktivitas -3.4294e+02  1.3828e+03 -0.2480   0.8041    
## luas_panen     5.0984e-01  5.4715e-02  9.3181   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.9298e+12
## Residual Sum of Squares: 1.999e+12
## R-Squared:      0.3177
## Adj. R-Squared: 0.3104
## Chisq: 87.0721 on 2 DF, p-value: < 2.22e-16
uji_chow <- pFtest(model_fe, model_pool)
uji_chow
## 
##  F test for individual effects
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## F = 608.48, df1 = 37, df2 = 150, p-value < 2.2e-16
## alternative hypothesis: significant effects
uji_hausman <- phtest(model_fe, model_re)
uji_hausman
## 
##  Hausman Test
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## chisq = 80.105, df = 2, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
uji_lm <- plmtest(model_pool, type = "bp")
uji_lm
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## chisq = 145.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
plmtest(model_re, effect = "individual")
## 
##  Lagrange Multiplier Test - (Honda)
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## normal = 12.082, p-value < 2.2e-16
## alternative hypothesis: significant effects
plmtest(model_re, effect = "time")
## 
##  Lagrange Multiplier Test - time effects (Honda)
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## normal = 8.877, p-value < 2.2e-16
## alternative hypothesis: significant effects
plmtest(model_re, effect = "twoways")
## 
##  Lagrange Multiplier Test - two-ways effects (Honda)
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## normal = 14.82, p-value < 2.2e-16
## alternative hypothesis: significant effects
#FE
pFtest(model_fe, model_pool)
## 
##  F test for individual effects
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## F = 608.48, df1 = 37, df2 = 150, p-value < 2.2e-16
## alternative hypothesis: significant effects
# RE (LM test)
plmtest(model_pool, type = "bp")
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  ketersediaan ~ produktivitas + luas_panen
## chisq = 145.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
summary(model_re)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = ketersediaan ~ produktivitas + luas_panen, data = pdata, 
##     model = "random")
## 
## Balanced Panel: n = 38, T = 5, N = 190
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 9.025e+07 9.500e+03 0.993
## individual    6.005e+05 7.749e+02 0.007
## theta: 0.01623
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -101476  -92214  -17862   43356  340345 
## 
## Coefficients:
##                  Estimate  Std. Error z-value Pr(>|z|)    
## (Intercept)    1.2142e+05  7.9779e+04  1.5220   0.1280    
## produktivitas -3.4294e+02  1.3828e+03 -0.2480   0.8041    
## luas_panen     5.0984e-01  5.4715e-02  9.3181   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.9298e+12
## Residual Sum of Squares: 1.999e+12
## R-Squared:      0.3177
## Adj. R-Squared: 0.3104
## Chisq: 87.0721 on 2 DF, p-value: < 2.22e-16
summary(model_re)$r.squared
##       rsq    adjrsq 
## 0.3176979 0.3104005
coeftest(model_re, vcov = vcovHC(model_re, type = "HC1"))
## 
## t test of coefficients:
## 
##                  Estimate  Std. Error t value Pr(>|t|)    
## (Intercept)    1.2142e+05  1.1847e+05  1.0249   0.3067    
## produktivitas -3.4294e+02  2.1064e+03 -0.1628   0.8708    
## luas_panen     5.0984e-01  4.4982e-02 11.3345   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Hitung rata-rata per tahun seluruh Jatim
jatim_mean <- data %>%
  group_by(Tahun) %>%
  summarise(rata_ketersediaan = mean(ketersediaan))

# Plot line chart rata-rata
ggplot(jatim_mean, aes(x = Tahun, y = rata_ketersediaan)) +
  geom_line(size = 1, color = "#2C75FF") +
  geom_point(size = 3, color = "#2C75FF") +
  labs(
    title = "Rata-rata Ketersediaan Beras Jawa Timur per Tahun",
    subtitle = "Data Gabungan Seluruh Kabupaten/Kota",
    x = "Tahun",
    y = "Rata-rata (Ton)"
  ) +
  theme_minimal(base_size = 14)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

jatim_total <- data %>%
  group_by(Tahun) %>%
  summarise(total_ketersediaan = sum(ketersediaan))

ggplot(jatim_total, aes(x = factor(Tahun), y = total_ketersediaan)) +
  geom_line(aes(group = 1), size = 1.3, color = "#2CA02C") +
  geom_point(size = 4, color = "#2CA02C") +
  labs(
    title = "Total Ketersediaan Beras Jawa Timur per Tahun",
    subtitle = "Akumulasi Seluruh Kabupaten/Kota",
    x = "Tahun",
    y = "Total Ketersediaan (Ton)"
  ) +
  theme_minimal(base_size = 14)

ggplot(jatim_total, aes(x = factor(Tahun), y = total_ketersediaan)) +
  geom_bar(stat = "identity", fill = "#F0D34D") +
  labs(
    title = "Jumlah Ketersediaan Beras Jawa Timur Tahun 2020–2024",
    subtitle = "Akumulasi Seluruh Kabupaten/Kota",
    x = "Tahun",
    y = "Ketersediaan (Ton)"
  ) +
  theme_minimal(base_size = 14)