Regresioni Linear: Hyrje dhe Koncepte Bazë

Seanca 1: Zbulimi i Marrëdhënieve Linear

Author

Profesor i Statistikës

Published

July 15, 2025

1 Çfarë do të Mësojmë Sot? 🎯

Sot do të mësojmë se si të gjejmë marrëdhëniet mes dy gjërave që na interesojnë:

  • Si ndikon sipërfaqja e dyqanit tek shitjet?
  • Si mund të parashikojmë shitjet e ardhshme?
  • Si të matim sa i mirë është parashikimi ynë?

2 Rasti Jonë: Supermarketet 🏪

Imagjinoni që jeni pronar i një zinxhiri supermarketesh dhe doni të hapni një dyqan të ri.

Pyetja e madhe: Sa para do të fitoj në javë?

Problemi që Duam të Zgjidhim

Si mund të parashikoj sa para do të fitoj, nëse e di vetëm sa i madh do të jetë dyqani?


3 Le të Mendojmë së Bashku 🤔

Nga tabela e mësipërme, çfarë vini re?

  • Dyqani 1200m² → 75,000€/javë
  • Dyqani 600m² → 55,000€/javë
  • Dyqani 400m² → 32,000€/javë

A ka një model këtu? 🧐

3.1 Hipoteza jonë:

“Sa më i madh dyqani, aq më shumë para”

4 Le të Shohim të Dhënat Tona! 👀

# Shfaqim 8 rreshtat e parë të të dhënave
head(supermarkets, 8)
  revenues area
1     39.4  645
2     90.4 1246
3     42.8  791
4     99.4 1360
5    108.3 1429
6     28.8  355
7     82.9  934
8     82.8 1371
# Disa statistika të thjeshta për të kuptuar të dhënat
cat("Sa supermarkete kemi gjithsej:", nrow(supermarkets), "\n\n")
Sa supermarkete kemi gjithsej: 75 
cat("Të ardhurat (në mijë euro):\n")
Të ardhurat (në mijë euro):
cat("  Minimumi:", min(supermarkets$revenues), "\n")
  Minimumi: 17.4 
cat("  Maksimumi:", max(supermarkets$revenues), "\n") 
  Maksimumi: 119.7 
cat("  Mesatarja:", round(mean(supermarkets$revenues), 1), "\n\n")
  Mesatarja: 66.6 
cat("Sipërfaqja (në m²):\n")
Sipërfaqja (në m²):
cat("  Minimumi:", min(supermarkets$area), "\n")
  Minimumi: 301 
cat("  Maksimumi:", max(supermarkets$area), "\n")
  Maksimumi: 1493 
cat("  Mesatarja:", round(mean(supermarkets$area), 1), "\n")
  Mesatarja: 915.1 

5 Hapi i Parë: Le të Vizualizojmë! 📈

Para se të fillojmë llogaritjet, le të shohim të dhënat.

Pyetja: A duket sikur ka lidhje mes sipërfaqes dhe të ardhurave?

# Krijojmë një grafik me pika (scatterplot)
ggplot(supermarkets, aes(x = area, y = revenues)) +
  geom_point(size = 3, alpha = 0.7, color = "steelblue") +
  labs(
    title = "A Ka Lidhje Mes Sipërfaqes dhe të Ardhurave?",
    x = "Sipërfaqja e Dyqanit (m²)",
    y = "Të Ardhurat Javore (mijë €)",
    subtitle = "Çdo pikë = një supermarket"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 12)
  )


6 Çfarë Shihni në Grafik? 🔍

Le të analizojmë grafikun së bashku:

  1. Pikat shkojnë lart-djathtas → Kur sipërfaqja rritet, të ardhurat rriten

  2. Pikat formojnë një vijë të drejtë → Marrëdhënie “linear”

  3. Ka pak shpërndarje → Nuk janë të gjitha pikat në të njëjtën vijë

  4. Ka disa “outliers” → Disa dyqane janë të veçantë

6.1 Përfundimi:

Po, duket se ka një marrëdhënie linear!


7 Çfarë është Regresioni Linear? 📐

Regresioni Linear është një metodë që:

  • Gjen vijën më të mirë që kalon nëpër pikat
  • Mat sa fortë është lidhja mes X dhe Y
  • Parashikon vlera të reja
  • Tregon nëse lidhja është e rëndësishme apo rastësore
Në Thelb

Regresioni linear gjen vijën më të mirë që shpjegon si ndryshon Y kur ndryshon X.


8 Formula Bazë (Mos u Trembni!) 🧮

8.1 Formula e Thjeshtë:

\[Y = a + b \times X\]

Ku: - Y = Çfarë duam të parashikojmë (të ardhurat) - X = Çfarë dimë (sipërfaqja)
- a = Ku fillon vija (intercept) - b = Sa shpejt rritet vija (slope)

8.2 Në Gjuhën e Përditshme:

“Të ardhurat = Vlera bazë + (Efekti i sipërfaqes × Sipërfaqja)”

Shembull konkret: Të ardhurat = 10,000€ + (50€ × m²)


9 Shpjegim Vizual i Formulës 🎨

# Një shembull i thjeshtë për ta kuptuar
x_simple <- c(100, 200, 300, 400, 500)
y_simple <- 10 + 0.05 * x_simple  # Formula: Y = 10 + 0.05 * X

demo_data <- data.frame(x = x_simple, y = y_simple)

ggplot(demo_data, aes(x = x, y = y)) +
  geom_point(size = 5, color = "red") +
  geom_line(size = 2, color = "blue") +
  
  # Tregojmë intercept
  geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.5) +
  geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.5) +
  
  # Etiketat
  annotate("text", x = 50, y = 10, label = "a = 10\n(Intercept)", 
           size = 5, color = "red", fontface = "bold") +
  annotate("text", x = 350, y = 20, label = "Y = 10 + 0.05 × X", 
           size = 6, color = "blue", fontface = "bold") +
  
  labs(
    title = "Shembull i Thjeshtë: Y = 10 + 0.05 × X",
    x = "X (Sipërfaqja)",
    y = "Y (Të Ardhurat)"
  ) +
  theme_minimal(base_size = 14) +
  xlim(0, 600) + ylim(0, 40)


10 Intercept (a): Ku Fillon Vija? 📍

Intercept është vlera e Y kur X = 0.

10.1 Në rastin tonë:

  • X = 0 do të thotë “dyqan me 0 m²”
  • Y do të jetë “të ardhurat e një dyqani 0 m²”
Kujdes!

A ka kuptim një dyqan 0 m²? JO!

Prandaj intercept shpesh është vetëm një vlerat matematikore, jo diçka reale.

# Tregojmë intercept në mënyrë vizuale
ggplot(demo_data, aes(x = x, y = y)) +
  geom_line(size = 2, color = "blue") +
  geom_point(size = 4, color = "red") +
  
  # Theksojmë intercept
  geom_point(x = 0, y = 10, size = 8, color = "green", shape = 17) +
  
  # Vijat ndihmëse
  geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.3) +
  geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.3) +
  
  # Shigjetë që tregon intercept
  annotate("segment", x = 50, xend = 5, y = 15, yend = 11, 
           arrow = arrow(length = unit(0.3, "cm")), color = "green", size = 1.5) +
  annotate("text", x = 80, y = 17, label = "INTERCEPT\nKur X=0, Y=10", 
           size = 4, color = "green", fontface = "bold") +
  
  labs(title = "Intercept: Vlera kur X = 0") +
  xlim(0, 600) + ylim(0, 40) +
  theme_minimal(base_size = 12)


11 Slope (b): Sa Shpejt Rritet Vija? 📈

Slope tregon se sa ndryshon Y kur X rritet me 1 njësi.

11.1 Formula:

\[\text{Slope} = \frac{\text{Ndryshimi në Y}}{\text{Ndryshimi në X}} = \frac{\Delta Y}{\Delta X}\]

11.2 Në rastin tonë:

  • Slope = 0.05 do të thotë:
  • Për çdo 1 m² shtesë, të ardhurat rriten me 0.05 mijë € = 50€

11.3 Shembuj:

  • 10 m² shtesë → 10 × 50€ = 500€ më shumë
  • 100 m² shtesë → 100 × 50€ = 5,000€ më shumë

12 Demonstrim Vizual i Slope 📊

# Tregojmë slope vizualisht
ggplot(demo_data, aes(x = x, y = y)) +
  geom_line(size = 2, color = "blue") +
  geom_point(size = 4, color = "red") +
  
  # Tregojmë ndryshimin
  # Shigjetë horizontale (ΔX)
  geom_segment(x = 200, xend = 300, y = 20, yend = 20, 
               color = "green", size = 3, arrow = arrow()) +
  annotate("text", x = 250, y = 18, label = "ΔX = 100", 
           size = 4, color = "green", fontface = "bold") +
  
  # Shigjetë vertikale (ΔY)  
  geom_segment(x = 300, xend = 300, y = 20, yend = 25, 
               color = "orange", size = 3, arrow = arrow()) +
  annotate("text", x = 320, y = 22.5, label = "ΔY = 5", 
           size = 4, color = "orange", fontface = "bold") +
  
  # Rezultati
  annotate("text", x = 400, y = 30, 
           label = "Slope = ΔY/ΔX = 5/100 = 0.05", 
           size = 5, color = "blue", fontface = "bold") +
  
  labs(title = "Slope: Sa Rritet Y për Çdo Njësi X") +
  theme_minimal(base_size = 12)


13 Tani le të Zbatojmë në të Dhënat Tona! 💻

Do të përdorim R për të gjetur vijën më të mirë.

Komanda magjike në R:

# Kjo është komanda kryesore për regresion linear
model_supermarket <- lm(revenues ~ area, data = supermarkets)

# Le ta shohim rezultatin
model_supermarket

Call:
lm(formula = revenues ~ area, data = supermarkets)

Coefficients:
(Intercept)         area  
    8.37526      0.06363  

13.1 Çfarë na tregon R?

Coefficients: - (Intercept): 8.689 → Kur area = 0, revenues = 8.689 mijë € - area: 0.06266 → Për çdo 1 m² shtesë, revenues rritet me 0.06266 mijë € = 62.66€

13.2 Pra formula jonë është:

Të Ardhurat = 8.689 + 0.06266 × Sipërfaqja


14 Le të Interpretojmë Rezultatet! 🎯

14.1 Formula që gjetëm:

Të Ardhurat = 8.689 + 0.06266 × Sipërfaqja

14.2 Çfarë do të thotë kjo?

  • 8.689: Të ardhurat “bazë” (kur sipërfaqja = 0)
  • 0.06266: Për çdo m² shtesë, fitojmë 62.66€ më shumë në javë
# Le të llogarisim disa shembuj konkretë

# Ekstraktojmë koeficientët
intercept <- coef(model_supermarket)[1]  # 8.689
slope <- coef(model_supermarket)[2]      # 0.06266

cat("Koeficientët tanë:\n")
Koeficientët tanë:
cat("Intercept (a):", round(intercept, 3), "\n")
Intercept (a): 8.375 
cat("Slope (b):", round(slope, 5), "\n\n")
Slope (b): 0.06363 
# Konvertojmë slope në euro (sepse është në mijë euro)
slope_euro <- slope * 1000
cat("Slope në euro:", round(slope_euro, 2), "€ për m²\n")
Slope në euro: 63.63 € për m²
# Sa është efekti i madhësive të ndryshme?
cat("Efekti i sipërfaqes në të ardhura:\n")
Efekti i sipërfaqes në të ardhura:
cat("→ 1 m² shtesë =", round(slope_euro, 0), "€ më shumë në javë\n")
→ 1 m² shtesë = 64 € më shumë në javë
cat("→ 10 m² shtesë =", round(slope_euro * 10, 0), "€ më shumë në javë\n") 
→ 10 m² shtesë = 636 € më shumë në javë
cat("→ 50 m² shtesë =", round(slope_euro * 50, 0), "€ më shumë në javë\n")
→ 50 m² shtesë = 3182 € më shumë në javë
cat("→ 100 m² shtesë =", round(slope_euro * 100, 0), "€ më shumë në javë\n")
→ 100 m² shtesë = 6363 € më shumë në javë
cat("→ 500 m² shtesë =", round(slope_euro * 500, 0), "€ më shumë në javë\n")
→ 500 m² shtesë = 31817 € më shumë në javë

15 Test Praktik: Le të Parashikojmë! 🔮

Situata: Dua të hap një dyqan 900 m². Sa do të fitoj?

15.1 Metoda 1: Manual

# Përdorim formulën tonë: Y = a + b × X
area_new <- 900
predicted_manual <- intercept + slope * area_new

cat("Për një dyqan", area_new, "m²:\n")
Për një dyqan 900 m²:
cat("Parashikimi =", round(intercept, 3), "+", round(slope, 5), "×", area_new, "\n")
Parashikimi = 8.375 + 0.06363 × 900 
cat("Parashikimi =", round(predicted_manual, 2), "mijë € në javë\n")
Parashikimi = 65.65 mijë € në javë
cat("Që është:", round(predicted_manual * 1000, 0), "€ në javë")
Që është: 65646 € në javë
# Metoda 2: Le ta lëmë R ta bëjë
predicted_r <- predict(model_supermarket, 
                       newdata = data.frame(area = 900))

cat("Parashikimi me R:", round(predicted_r, 2), "mijë € në javë\n")
Parashikimi me R: 65.65 mijë € në javë
cat("Që është:", round(predicted_r * 1000, 0), "€ në javë\n\n")
Që është: 65646 € në javë
# A janë të njëjta?
cat("A janë të njëjta metodat?", 
    round(predicted_manual, 3) == round(predicted_r, 3))
A janë të njëjta metodat? TRUE

16 Le të Testojmë Më Shumë Raste! 🏪

Dua të hap disa dyqane me madhësi të ndryshme.

# Krijojmë skenarë të ndryshëm
scenarios <- data.frame(
  Tipi = c("Mini market", "Dyqan i vogël", "Supermarket", 
           "Dyqan i madh", "Hipermarket"),
  area = c(300, 600, 900, 1200, 1500)
)

# Llogarisim parashikimet
scenarios$predicted_thousands <- predict(model_supermarket, 
                                       newdata = scenarios)
scenarios$predicted_euros <- round(scenarios$predicted_thousands * 1000, 0)
scenarios$monthly_euros <- round(scenarios$predicted_euros * 4.33, 0)

# Shfaqim rezultatet në mënyrë të bukur
cat("PARASHIKIMET TONA:\n")
PARASHIKIMET TONA:
cat("================\n")
================
for(i in 1:nrow(scenarios)) {
  cat(scenarios$Tipi[i], "(", scenarios$area[i], "m²):\n")
  cat("  →", scenarios$predicted_euros[i], "€/javë\n")
  cat("  →", scenarios$monthly_euros[i], "€/muaj\n\n")
}
Mini market ( 300 m²):
  → 27466 €/javë
  → 118928 €/muaj

Dyqan i vogël ( 600 m²):
  → 46556 €/javë
  → 201587 €/muaj

Supermarket ( 900 m²):
  → 65646 €/javë
  → 284247 €/muaj

Dyqan i madh ( 1200 m²):
  → 84736 €/javë
  → 366907 €/muaj

Hipermarket ( 1500 m²):
  → 103827 €/javë
  → 449571 €/muaj

17 A i Besojmë Parashikimeve Tona? 🤔

Pyetja e rëndësishme: Sa i mirë është modeli ynë?

Për ta matur këtë, përdorim R-squared (R²)

R-squared në Gjuhë të Thjeshtë

R² tregon sa përqind të variabilitetit të Y shpjegohet nga X

  • R² = 1.0 (100%) → Parashikim perfekt ⭐⭐⭐
  • R² = 0.5 (50%) → Gjysma shpjegohet ⭐⭐
  • R² = 0.0 (0%) → Nuk shpjegon asgjë ❌
# Shohim R-squared të modelit tonë
summary_model <- summary(model_supermarket)
r_squared <- summary_model$r.squared

cat("R-squared i modelit tonë:", round(r_squared, 4), "\n")
R-squared i modelit tonë: 0.8073 
cat("Që është:", round(r_squared * 100, 1), "%\n\n")
Që është: 80.7 %
cat("Interpretimi:\n")
Interpretimi:
cat("→", round(r_squared * 100, 1), "% e variabilitetit të të ardhurave\n")
→ 80.7 % e variabilitetit të të ardhurave
cat("  shpjegohet nga sipërfaqja e dyqanit\n")
  shpjegohet nga sipërfaqja e dyqanit
cat("→", round((1-r_squared) * 100, 1), "% shpjegohet nga faktorë të tjerë\n")
→ 19.3 % shpjegohet nga faktorë të tjerë
cat("  (lokacioni, konkurrenca, menaxhimi, etj.)")
  (lokacioni, konkurrenca, menaxhimi, etj.)

18 Le të Shohim Modelin Tonë në Grafik! 📊

Tani që kemi gjetur vijën, le ta vendosim mbi të dhënat tona.

# Grafiku me vijën e regresionit
ggplot(supermarkets, aes(x = area, y = revenues)) +
  # Pikat e të dhënave
  geom_point(size = 3, alpha = 0.7, color = "steelblue") +
  
  # Vija e regresionit
  geom_smooth(method = "lm", se = TRUE, color = "red", size = 1.5) +
  
  # Etiketat
  labs(
    title = "Modeli Ynë: Vija e Kuqe = Parashikimet",
    subtitle = "Y = 8.689 + 0.063 × X",
    x = "Sipërfaqja e Dyqanit (m²)",
    y = "Të Ardhurat Javore (mijë €)"
  ) +
  
  # Tema të bukur
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 12)
  ) +
  
  # Shpjegim i zonës gri
  annotate("text", x = 1200, y = 30, 
           label = "Zona gri = sa të sigurt jemi\nme parashikimet", 
           size = 4, color = "gray30")


19 Çfarë Tregon Grafiku? 🔍

  • Vija e kuqe = Parashikimet tona (modeli)
  • Pikat blu = Të dhënat reale
  • Zona gri = Sa të pasigurt jemi (do ta mësojmë më vonë)
  • Pikat afër vijës = Parashikime të mira
  • Pikat larg vijës = Gabime në parashikim

19.1 Vëzhgim i rëndësishëm:

Shumica e pikave janë afër vijës → Modeli është i mirë! ✅


20 Gabimet e Modelit: “Residuals” 📏

Residuals = Diferenca mes realitetit dhe parashikimit

20.1 Formula:

Gabimi = Vlera Reale - Vlera e Parashikuar

# Llogarisim gabimet për çdo supermarket
supermarkets$fitted <- fitted(model_supermarket)  # Parashikimet
supermarkets$residuals <- residuals(model_supermarket)  # Gabimet

# Shohim disa shembuj
cat("Shembuj të gabimeve (residuals):\n")
Shembuj të gabimeve (residuals):
cat("=================================\n")
=================================
# Marrim 5 raste të rastësishëm
sample_rows <- sample(1:nrow(supermarkets), 5)
for(i in sample_rows) {
  cat("Supermarketi", i, ":\n")
  cat("  Sipërfaqja:", supermarkets$area[i], "m²\n")
  cat("  Të ardhurat reale:", supermarkets$revenues[i], "mijë €\n")
  cat("  Parashikimi ynë:", round(supermarkets$fitted[i], 1), "mijë €\n")
  cat("  Gabimi (residual):", round(supermarkets$residuals[i], 1), "mijë €\n\n")
}
Supermarketi 46 :
  Sipërfaqja: 467 m²
  Të ardhurat reale: 39 mijë €
  Parashikimi ynë: 38.1 mijë €
  Gabimi (residual): 0.9 mijë €

Supermarketi 66 :
  Sipërfaqja: 838 m²
  Të ardhurat reale: 76 mijë €
  Parashikimi ynë: 61.7 mijë €
  Gabimi (residual): 14.3 mijë €

Supermarketi 75 :
  Sipërfaqja: 870 m²
  Të ardhurat reale: 69.4 mijë €
  Parashikimi ynë: 63.7 mijë €
  Gabimi (residual): 5.7 mijë €

Supermarketi 70 :
  Sipërfaqja: 828 m²
  Të ardhurat reale: 66.3 mijë €
  Parashikimi ynë: 61.1 mijë €
  Gabimi (residual): 5.2 mijë €

Supermarketi 44 :
  Sipërfaqja: 743 m²
  Të ardhurat reale: 50.5 mijë €
  Parashikimi ynë: 55.7 mijë €
  Gabimi (residual): -5.2 mijë €
# Disa statistika për gabimet
cat("STATISTIKA E GABIMEVE:\n")
STATISTIKA E GABIMEVE:
cat("======================\n")
======================
cat("Gabimi mesatar:", round(mean(supermarkets$residuals), 3), "(duhet të jetë ≈ 0)\n")
Gabimi mesatar: 0 (duhet të jetë ≈ 0)
cat("Gabimi më i madh pozitiv:", round(max(supermarkets$residuals), 1), "mijë €\n")
Gabimi më i madh pozitiv: 26.3 mijë €
cat("Gabimi më i madh negativ:", round(min(supermarkets$residuals), 1), "mijë €\n")
Gabimi më i madh negativ: -18.9 mijë €
cat("Devijimi standard i gabimeve:", round(sd(supermarkets$residuals), 1), "mijë €\n")
Devijimi standard i gabimeve: 10.8 mijë €

21 Visualizimi i Gabimeve 📉

Le të shohim se si janë shpërndarë gabimet tona.

# Grafiku i gabimeve vs parashikimeve
ggplot(supermarkets, aes(x = fitted, y = residuals)) +
  geom_point(size = 3, alpha = 0.7, color = "steelblue") +
  
  # Vija në zero (gabimi ideal)
  geom_hline(yintercept = 0, color = "red", linetype = "dashed", size = 1) +
  
  # Vijë trend (duhet të jetë e sheshtë)
  geom_smooth(se = FALSE, color = "blue", linetype = "dotted") +
  
  labs(
    title = "Analiza e Gabimeve (Residuals)",
    subtitle = "Gabimet duhet të jenë të shpërndara rastësisht rreth zeros",
    x = "Parashikimet Tona (Fitted Values)",
    y = "Gabimet (Residuals)"
  ) +
  theme_minimal(base_size = 14) +
  
  # Shpjegim
  annotate("text", x = 70, y = 25, 
           label = "Zona e mirë:\nGabime të vogla dhe\ntë shpërndara rastësisht", 
           size = 4, color = "darkgreen")


22 A Janë Gabimet Tona të Pranueshme? ✅

22.1 Shenja të mira që shohim:

  • Gabimi mesatar ≈ 0 → Nuk kemi bias sistematik
  • Gabimet janë të shpërndara → Nuk ka model të qartë
  • Shumica e gabimeve janë të vogla → Parashikimet janë të sakta

22.2 Nëse do të shihnim probleme:

  • Gabime që formonjnë kurbë → Model i gabuar
  • Gabime që rriten me X → Problem me variancën
  • Gabime shumë të mëdha → Model i dobët

23 Ushtrime për Shtëpi 🏠

Detyra për javën e ardhshme:
  1. Krijni një model regresioni me të dhëna të tjera nga interneti (p.sh. çmimi i shtëpive vs. sipërfaqja)

  2. Interpretoni koeficientët dhe shkruani një paragraf shpjegues në shqip

  3. Bëni 5 parashikime për vlera të ndryshme dhe krahasoni me realitetin

  4. Analizoni grafikun e residuals - a ka probleme në model?

23.1 Burimi i të dhënave:

  • Kaggle.com (housing datasets)
  • Ose krijoni të dhëna artificiale si bëmë sot