Regresioni Linear: Hyrje dhe Koncepte Bazë
Seanca 1: Zbulimi i Marrëdhënieve Linear
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ë?
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:
Pikat shkojnë lart-djathtas → Kur sipërfaqja rritet, të ardhurat rriten
Pikat formojnë një vijë të drejtë → Marrëdhënie “linear”
Ka pak shpërndarje → Nuk janë të gjitha pikat në të njëjtën vijë
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
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²”
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² 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 🏠
Krijni një model regresioni me të dhëna të tjera nga interneti (p.sh. çmimi i shtëpive vs. sipërfaqja)
Interpretoni koeficientët dhe shkruani një paragraf shpjegues në shqip
Bëni 5 parashikime për vlera të ndryshme dhe krahasoni me realitetin
Analizoni grafikun e residuals - a ka probleme në model?