MTRD, oddaja po izpitu.
Raziskovalno vprašanje: Kako na znesek, porabljen na vinu, vplivajo različni vzorci nakupovanja na drugih kategorijah hrane (sadje, meso, ribe in sladkarije)”
Razlaga: Izbral sem metodo analize glavnih komponent (PCA), saj želim raziskati, kateri dejavniki najbolj vplivajo na znesek, ki ga stranke porabijo za vino. PCA mi omogoča identifikacijo ključnih vzorcev in odnosov med različnimi spremenljivkami v izbranem datasetu. Moj cilj je bolje razumeti, kateri faktorji so najbolj odgovorni za variabilnost v porabi za vino ter kako so te spremenljivke povezane med seboj. Spremenljivke, ki sem jih vključil v analizo so bolj natančno predstavljene znotraj analize: Income, MntWines, MntFruits, MntMeatProducts, MntFishProducts in MntSweetProducts.
Vir podatkov: Kaggle.com. (2023). Naslov: Customer Personality Analysis. Pridobljeno s: https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis
Podatki: So povezani s posamezniki (kupci), ter njihovami navadami pri nakupoavnju v trgovini. Podatki omogočajo podjetju bolj podrobno razumevanje svojih strank ter glavnih segmentov.
Uvozimo podatke in prikažemo prvih 6 vrstic
podatki <- read.table("/Users/jakakranjc/Downloads/marketing_campaign.csv", header=TRUE, sep = "\t", dec = ".")
head(podatki)
## ID Year_Birth Education Marital_Status Income Kidhome Teenhome Dt_Customer
## 1 5524 1957 Graduation Single 58138 0 0 04-09-2012
## 2 2174 1954 Graduation Single 46344 1 1 08-03-2014
## 3 4141 1965 Graduation Together 71613 0 0 21-08-2013
## 4 6182 1984 Graduation Together 26646 1 0 10-02-2014
## 5 5324 1981 PhD Married 58293 1 0 19-01-2014
## 6 7446 1967 Master Together 62513 0 1 09-09-2013
## Recency MntWines MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## 1 58 635 88 546 172 88
## 2 38 11 1 6 2 1
## 3 26 426 49 127 111 21
## 4 26 11 4 20 10 3
## 5 94 173 43 118 46 27
## 6 16 520 42 98 0 42
## MntGoldProds NumDealsPurchases NumWebPurchases NumCatalogPurchases
## 1 88 3 8 10
## 2 6 2 1 1
## 3 42 1 8 2
## 4 5 2 2 0
## 5 15 5 5 3
## 6 14 2 6 4
## NumStorePurchases NumWebVisitsMonth AcceptedCmp3 AcceptedCmp4 AcceptedCmp5
## 1 4 7 0 0 0
## 2 2 5 0 0 0
## 3 10 4 0 0 0
## 4 4 6 0 0 0
## 5 6 5 0 0 0
## 6 10 6 0 0 0
## AcceptedCmp1 AcceptedCmp2 Complain Z_CostContact Z_Revenue Response
## 1 0 0 0 3 11 1
## 2 0 0 0 3 11 0
## 3 0 0 0 3 11 0
## 4 0 0 0 3 11 0
## 5 0 0 0 3 11 0
## 6 0 0 0 3 11 0
Za lažje razumevanje naših podatkov
summary(podatki)
## ID Year_Birth Education Marital_Status
## Min. : 0 Min. :1893 Length:2240 Length:2240
## 1st Qu.: 2828 1st Qu.:1959 Class :character Class :character
## Median : 5458 Median :1970 Mode :character Mode :character
## Mean : 5592 Mean :1969
## 3rd Qu.: 8428 3rd Qu.:1977
## Max. :11191 Max. :1996
##
## Income Kidhome Teenhome Dt_Customer
## Min. : 1730 Min. :0.0000 Min. :0.0000 Length:2240
## 1st Qu.: 35303 1st Qu.:0.0000 1st Qu.:0.0000 Class :character
## Median : 51382 Median :0.0000 Median :0.0000 Mode :character
## Mean : 52247 Mean :0.4442 Mean :0.5062
## 3rd Qu.: 68522 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :666666 Max. :2.0000 Max. :2.0000
## NA's :24
## Recency MntWines MntFruits MntMeatProducts
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0
## 1st Qu.:24.00 1st Qu.: 23.75 1st Qu.: 1.0 1st Qu.: 16
## Median :49.00 Median : 173.50 Median : 8.0 Median : 67
## Mean :49.11 Mean : 303.94 Mean : 26.3 Mean : 167
## 3rd Qu.:74.00 3rd Qu.: 504.25 3rd Qu.: 33.0 3rd Qu.: 232
## Max. :99.00 Max. :1493.00 Max. :199.0 Max. :1725
##
## MntFishProducts MntSweetProducts MntGoldProds NumDealsPurchases
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.000
## 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 9.00 1st Qu.: 1.000
## Median : 12.00 Median : 8.00 Median : 24.00 Median : 2.000
## Mean : 37.53 Mean : 27.06 Mean : 44.02 Mean : 2.325
## 3rd Qu.: 50.00 3rd Qu.: 33.00 3rd Qu.: 56.00 3rd Qu.: 3.000
## Max. :259.00 Max. :263.00 Max. :362.00 Max. :15.000
##
## NumWebPurchases NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.: 2.000 1st Qu.: 0.000 1st Qu.: 3.00 1st Qu.: 3.000
## Median : 4.000 Median : 2.000 Median : 5.00 Median : 6.000
## Mean : 4.085 Mean : 2.662 Mean : 5.79 Mean : 5.317
## 3rd Qu.: 6.000 3rd Qu.: 4.000 3rd Qu.: 8.00 3rd Qu.: 7.000
## Max. :27.000 Max. :28.000 Max. :13.00 Max. :20.000
##
## AcceptedCmp3 AcceptedCmp4 AcceptedCmp5 AcceptedCmp1
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.07277 Mean :0.07455 Mean :0.07277 Mean :0.06429
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
##
## AcceptedCmp2 Complain Z_CostContact Z_Revenue
## Min. :0.00000 Min. :0.000000 Min. :3 Min. :11
## 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:3 1st Qu.:11
## Median :0.00000 Median :0.000000 Median :3 Median :11
## Mean :0.01339 Mean :0.009375 Mean :3 Mean :11
## 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:3 3rd Qu.:11
## Max. :1.00000 Max. :1.000000 Max. :3 Max. :11
##
## Response
## Min. :0.0000
## 1st Qu.:0.0000
## Median :0.0000
## Mean :0.1491
## 3rd Qu.:0.0000
## Max. :1.0000
##
Razlaga podatkov: Enota opazovanja - Vsaka vrstica v nizu podatkov predstavlja informacije o določeni stranki.
Velikost vzorca - Velikost vzorca je število strank, vključenih v niz podatkov. V našem primeru je to 2240
Spremenljivke - Relevantne/predstavljene so same spremenljivke, ki se navezujejo na izbrano vprašanje:
ID: Edinstven identifikator stranke.
Year_Birth: Leto rojstva stranke.
Income: Letni dohodek gospodinjstva stranke.
MntWines - Znesek, porabljen za vino v zadnjih 2 letih
MntFruits: Znesek, porabljen za sadje v zadnjih 2 letih.
MntMeatProducts: Znesek, porabljen za meso v zadnjih 2 letih.
MntFishProducts: Znesek, porabljen za ribe v zadnjih 2 letih.
MntSweetProducts: Znesek, porabljen za sladkarije v zadnjih 2 letih.
Enote merjenja - So razvidne iz niza podatkov (npr. količina enot, dohodek v ustrezni valuti, …)
Uredimo podatke
podatki_vino <- podatki[,-c(2,3,4,6,7,8,9,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29)]
colnames(podatki_vino) <- c("ID", "Prihodek", "Znesek_vino", "Znesek_sadje", "Znesek_meso", "Znesek_ribe", "Znesek_sladko")
head(podatki_vino)
## ID Prihodek Znesek_vino Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## 1 5524 58138 635 88 546 172 88
## 2 2174 46344 11 1 6 2 1
## 3 4141 71613 426 49 127 111 21
## 4 6182 26646 11 4 20 10 3
## 5 5324 58293 173 43 118 46 27
## 6 7446 62513 520 42 98 0 42
Ustvarimo novo tabelo na kateri se nato ‘igramo’.
Opisna statistika
library(psych)
describe(podatki_vino[, -1])
## vars n mean sd median trimmed mad min max
## Prihodek 1 2216 52247.25 25173.08 51381.5 51763.99 24548.15 1730 666666
## Znesek_vino 2 2240 303.94 336.60 173.5 248.99 243.89 0 1493
## Znesek_sadje 3 2240 26.30 39.77 8.0 16.98 11.86 0 199
## Znesek_meso 4 2240 166.95 225.72 67.0 119.33 87.47 0 1725
## Znesek_ribe 5 2240 37.53 54.63 12.0 25.08 17.79 0 259
## Znesek_sladko 6 2240 27.06 41.28 8.0 17.35 11.86 0 263
## range skew kurtosis se
## Prihodek 664936 6.75 159.13 534.75
## Znesek_vino 1493 1.17 0.59 7.11
## Znesek_sadje 199 2.10 4.03 0.84
## Znesek_meso 1725 2.08 5.49 4.77
## Znesek_ribe 259 1.92 3.08 1.15
## Znesek_sladko 263 2.13 4.36 0.87
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:psych':
##
## logit
OLS metoda - linearna regresija
fit <- lm(Znesek_vino ~ Prihodek + Znesek_sadje + Znesek_meso + Znesek_ribe + Znesek_sladko,
data = podatki_vino)
vif(fit)
## Prihodek Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## 1.596194 1.865162 2.037230 1.953510 1.828894
Vidimo, da imajo vse spremenljivke višje vrednosti, hočemo čim bližje 1. (Do nekje 1.5 je OK) Z VIF nato preverimo multikolinearnost - kolinearnost je prisotna, ce to ne preverimo so lahko regresijski koeficienti napačni.
mean(vif(fit))
## [1] 1.856198
Povprečen VIF si tudi želimo čim bližje 1.
Nov subset, nato opisna statistika
podatki_MGK <- podatki_vino[,c("Prihodek", "Znesek_sadje", "Znesek_meso", "Znesek_ribe", "Znesek_sladko")]
library(pastecs)
round(stat.desc(podatki_MGK, basic = FALSE), 2)
## Prihodek Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## median 51381.50 8.00 67.00 12.00 8.00
## mean 52247.25 26.30 166.95 37.53 27.06
## SE.mean 534.75 0.84 4.77 1.15 0.87
## CI.mean.0.95 1048.67 1.65 9.35 2.26 1.71
## var 633683788.58 1581.93 50947.43 2984.33 1704.08
## std.dev 25173.08 39.77 225.72 54.63 41.28
## coef.var 0.48 1.51 1.35 1.46 1.53
Znesek_sladko ima največji coef.var, zato najbolj variera. Podatke moram za naprej standardizirati, ker ima prihodek izjemno visoko vrednost var in bo imela ogromen vpliv.
Korelacijska matrika
R <- cor(podatki_MGK)
round(R, 3)
## Prihodek Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## Prihodek 1 NA NA NA NA
## Znesek_sadje NA 1.000 0.543 0.595 0.567
## Znesek_meso NA 0.543 1.000 0.568 0.524
## Znesek_ribe NA 0.595 0.568 1.000 0.580
## Znesek_sladko NA 0.567 0.524 0.580 1.000
5x5 matrika, po diagonali 1, ostalo Pearsonovi koeficienti. Koeficient Znesek_meso/Znesek_sladko -> linarna povezava je pozitivna in srednje močna. Prihodek ima vrednosti NA, zato ga ne smemo upoštevati.
Popravimo brez ‘Prihodka’
podatki_MGK_nova <- podatki_vino[,c("Znesek_sadje", "Znesek_meso", "Znesek_ribe", "Znesek_sladko")]
library(pastecs)
round(stat.desc(podatki_MGK_nova, basic = FALSE), 2)
## Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## median 8.00 67.00 12.00 8.00
## mean 26.30 166.95 37.53 27.06
## SE.mean 0.84 4.77 1.15 0.87
## CI.mean.0.95 1.65 9.35 2.26 1.71
## var 1581.93 50947.43 2984.33 1704.08
## std.dev 39.77 225.72 54.63 41.28
## coef.var 1.51 1.35 1.46 1.53
R <- cor(podatki_MGK_nova)
round(R, 3)
## Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## Znesek_sadje 1.000 0.543 0.595 0.567
## Znesek_meso 0.543 1.000 0.568 0.524
## Znesek_ribe 0.595 0.568 1.000 0.580
## Znesek_sladko 0.567 0.524 0.580 1.000
Naredimo Bartlettov test
cortest.bartlett(R, n = nrow(podatki_MGK_nova))
## $chisq
## [1] 3363.307
##
## $p.value
## [1] 0
##
## $df
## [1] 6
H0 - P = I H1 - P =/= I ničelno domnevo lahko zavrnem, p = 0, podatki so primerni
KMO statistika
KMO(R)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R)
## Overall MSA = 0.82
## MSA for each item =
## Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## 0.81 0.83 0.80 0.82
KMO = 0.82, vrednost je dobra. MSA = znesek_meso je najbolj primerna, znesek_ribe najmanj primerna, še vedno so vrednosti dovolj visoke. Največ informacij bi izgubil pri znesek_ribe. Podatki so primerni.
Naredimo PCA - Principal Component Analysis
library(FactoMineR)
mgk <- PCA(podatki_MGK_nova,
scale.unit = TRUE,
graph = FALSE)
library(factoextra)
## Loading required package: ggplot2
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
get_eigenvalue(mgk)
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 2.6893021 67.23255 67.23255
## Dim.2 0.4803929 12.00982 79.24237
## Dim.3 0.4313011 10.78253 90.02490
## Dim.4 0.3990040 9.97510 100.00000
Z scale-unit standardiziramo, analiza bo sedaj na korelacijski matriki. Z eigenvalue ugotovimo lastne vrednosti. Izpiše se nam max vrednosti komponent (v tem primeru 4), vsaka naslednja ima nižjo lastno vrednost. LV = varianca komponente. (npr. dim 2 = 0.48) Pri variance.percent nam pove kok % informacije je na posamezno komponento padlo. Varianca prvih 4 spremenljivk bo torej 4. (od teh 4 bo na prvo glavno komponento prišlo 2.689 = 67.2%) Zadnji stolpec je komulativa, vedno bo 100.
Kaiserjovo priporočilo - vzamemo samo prvo komponento (samo vrednosti nad 1) če bi gledali samo vrednosti, ker rabimo 70% vzamemo prve dve. Ker imamo še pravilo zadnjih 5%, bi lahko tudi tretjo in četrto.
Diagram lastnih vrednosti za določanje števila analitično pomembnih glavnih komponent
fviz_eig(mgk,
choice = "eigenvalue",
main = "Diagram lastnih vrednosti",
ylab = "lastna vrednost",
xlab = "glavna komponenta",
addlabels = TRUE)
Iščemo kje se diagram prelomi, ta se zgodi pri 2. Vzamemo 1 manj, torej samo prvo. Sicer naj bi vzel samo prvo komponento, ker se pri drugi že močno prelomi in vzamem eno manj, vendar sem imel težave z risanjem fviz_pca_var in biplot, zato sem za vizualizacijo vzel dve. Upam, da si nisem s tem naredil večje škode.
Naredimo še paralelno analizo
library(psych)
fa.parallel(podatki_MGK_nova,
sim = FALSE,
fa = "pc")
## Parallel analysis suggests that the number of factors = NA and the number of components = 1
Določiti moramo pc torej glavno komponento. Dokler je empirična vrednost nad teoretično je vzamemo glavno komponento. Ta nam potrdi, da vzamemo samo prvo. tudi fa.parallel mi pove , da bi rabil vzeti samo eno, vendar sem se nato zapletel z grafi pri le eni osi
Rešitev z (eno) glavno komponento
mgk <- PCA(podatki_MGK_nova,
scale.unit = TRUE,
graph = FALSE,
ncp = 2)
mgk
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 2240 individuals, described by 4 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
Ncp mu povemo koliko glavnih komponent hočemo. Nato izberemo 4,6,8. npc = 2 nam vzame 2 glavni komponenti, npc = 1 samo eno
var$cor
print(mgk$var$cor)
## Dim.1 Dim.2
## Znesek_sadje 0.8260039 -0.15257645
## Znesek_meso 0.8002894 0.56354405
## Znesek_ribe 0.8393935 -0.02595429
## Znesek_sladko 0.8136185 -0.37263623
print(mgk$var$contrib)
## Dim.1 Dim.2
## Znesek_sadje 25.37024 4.8459446
## Znesek_meso 23.81522 66.1087888
## Znesek_ribe 26.19942 0.1402238
## Znesek_sladko 24.61512 28.9050428
S cor dobimo reskalirane koeficiente oz uteži glavnih komponent. (pearsonovi korelacijski koeficienti med posamenzimi začetnimi spremenljivkami in posamezno glavno komponento). Vse 4 spremenljivke za dim1 imajo pozitiven predznak (poz povezava). Več ko bo oseba zapravila na sadju, mesu, ribah in sladkem, višji bo zapravljen znesek na vinu pri GK1. GK2 ponavadi predstavlja neke kontraste, saj ima pogostjo tako pozitivne kot negativne koeficiente. LS = vzamem koeficient vsake GK in ga kvadriram ter sesštejem z ostalimi. na primeru sadja - 0.82’ + (-0.15)’ = 0,69 = 69% informacij se je prenselo, 31% se je zgubilo v primeru le ene gk: -> Vse 4 spremenljivke imajo negativno povezavo s prvo glavno komponento, torej višji ko bo zapravljen znesek za sadje, meso, ribe in sladko, manjši bo zapravljen znesek za vino.
S contrib nam pove kakšen odstotek celotne informaicje glavne komponente je prispevala posamezna merjena spremenljivka. V našem primeru je na GK1 največ prispevala Znesek_ribe.
Grafično prikažemo merjene spremenljikve
fviz_pca_var(mgk,
repel = TRUE)
V primeru ene osi -> Ker imamo samo eno glavno komponento je zahteva ‘axes = c(1,1)’ imela težave prikazati graf z dvema osema. Se opravičujem za slabšo razvidnost, upam da je (1,1) sprejemljiv pristop, stack overflow ni bil v neko hudo pomoč. Dim1 - 67.2 nam pove da je bilo na komponento prenešeno 67.2% informacij. Dim2 nam pove da je bilo preneseno 12%. Vsaka os predstavlja svojo GK z svojimi vrednostnmi. (meso -> 0.6, 0.6; sadje -> 0.7, -0.2)
Biplot vizualizacija
fviz_pca_biplot(mgk)
Ker je celotni vzorec ogromen, je graf nerazločljiv. Z opcijo REPEL = TRUE bi lahko probal popraviti graf, vendar je tudi ta nerazberljiv. ‘Najboljšo’ enoto lahko še vedno razberemo, to je številka 361, ki je več kot 6 standardnih odklonov v desno.
Preverimo za posameznote enote vrednosti
head(mgk$ind$coord)
## Dim.1 Dim.2
## 1 3.5940251 0.13814880
## 2 -1.3148042 -0.07595754
## 3 0.8168131 -0.24098899
## 4 -1.1475119 -0.07366193
## 5 0.1843154 -0.27379588
## 6 -0.1223814 -0.50418399
V kolikor bi nas zanimala posamezna oseba, bi lahko ugotovili njene kooridnate ter uporabili funkcijo scale (standardizirali vrednosti)
Shranimo podatke v glavno tabelo
podatki_vino$GK1 <- mgk$ind$coord[,1]
podatki_vino$GK2 <- mgk$ind$coord[,2]
head(podatki_vino,3)
## ID Prihodek Znesek_vino Znesek_sadje Znesek_meso Znesek_ribe Znesek_sladko
## 1 5524 58138 635 88 546 172 88
## 2 2174 46344 11 1 6 2 1
## 3 4141 71613 426 49 127 111 21
## GK1 GK2
## 1 3.5940251 0.13814880
## 2 -1.3148042 -0.07595754
## 3 0.8168131 -0.24098899
Preverimo korelacijo
cor(x=podatki_vino$GK1, y=podatki_vino$GK2)
## [1] -1.43366e-15
Če so neodvisno more bit korelacija 0. Ta številka je praktično 0, torej med njimi praktično ni povezave.
Metoda glavnih komponent je bila izvedena na 4 standardiziranih spremenljivkah (n=2240). KMO potrjuje ustreznost spremenljivk s KMO = 0.82. MSA statistika pri spremenljivkah je pri vsaki nah 0.5. Na podlagi paralelne analize ter drugih pravil, je najbolj smiselno obdržati le eno glavno komponento, vendar sem za lažji izris grafov izbral dve (skupaj povzameta 79.2%). Razlaga za samo eno spremenljivko je krej je to možno tudi podana. Na podlagi uteži ugotavljamo, da GK 1 predstavlja znesek, zapravljen na vinu, GK 2 pa kontrast med zneskom, zapravljenim na mesnih in nemesnih izdelkih.
Vrnemo se na LM
fit <- lm(Znesek_vino ~ Prihodek + GK1 + GK2,
data = podatki_vino)
vif(fit)
## Prihodek GK1 GK2
## 1.573817 1.520697 1.053617
mean(vif(fit))
## [1] 1.38271
Vrednosti so sedaj mnogo boljše
Mankanjoče vrednosti
NA_vrednosti <- complete.cases(podatki_vino)
sum(NA_vrednosti)
## [1] 2216
podatki_vino[!NA_vrednosti, ]
## ID Prihodek Znesek_vino Znesek_sadje Znesek_meso Znesek_ribe
## 11 1994 NA 5 5 6 0
## 28 5255 NA 5 1 3 3
## 44 7281 NA 81 11 50 3
## 49 7244 NA 48 5 48 6
## 59 8557 NA 11 3 22 2
## 72 10629 NA 25 3 43 17
## 91 8996 NA 230 42 192 49
## 92 9235 NA 7 0 8 2
## 93 5798 NA 445 37 359 98
## 129 8268 NA 352 0 27 10
## 134 1295 NA 231 65 196 38
## 313 2437 NA 861 138 461 60
## 320 2863 NA 738 20 172 52
## 1380 10475 NA 187 5 65 26
## 1383 2902 NA 19 4 12 2
## 1384 4345 NA 5 1 9 2
## 1387 3769 NA 25 1 13 0
## 2060 7187 NA 375 42 48 94
## 2062 1612 NA 23 0 15 0
## 2079 5079 NA 71 1 16 0
## 2080 10339 NA 161 0 22 0
## 2082 3117 NA 264 0 21 12
## 2085 5250 NA 532 126 490 164
## 2229 8720 NA 32 2 1607 12
## Znesek_sladko GK1 GK2
## 11 2 -1.2708592 -0.109756974
## 28 263 1.8376721 -3.500482372
## 44 2 -1.0715918 0.013502812
## 49 10 -1.0276316 -0.066758963
## 59 2 -1.2428488 -0.042408140
## 72 4 -1.0328169 -0.003082932
## 91 37 0.4800048 -0.133962395
## 92 0 -1.3351673 -0.050188723
## 93 28 1.1288368 0.579066045
## 129 0 -1.2191053 0.012783484
## 134 71 1.0856275 -0.682247954
## 313 30 2.2966770 0.387440838
## 320 50 0.3424776 -0.255637116
## 1380 20 -0.6832205 -0.149488565
## 1383 2 -1.2518073 -0.083974198
## 1384 0 -1.3203380 -0.052121676
## 1387 0 -1.3304313 -0.036338393
## 2060 66 0.9389466 -1.061426921
## 2062 2 -1.3147303 -0.049650078
## 2079 0 -1.3239437 -0.025529364
## 2080 0 -1.3236353 0.001624655
## 2082 6 -1.1412090 -0.088366814
## 2085 126 4.3360980 -0.763520965
## 2229 4 2.2898619 5.640988224
Prihodek ima mankajoče vrednosti, kar ovira ustavitev stdost in stdocenvred.
Dopolnimo NA vrednosti z Mean
Mean_prihodki <- mean(podatki_vino$Prihodek, na.rm = TRUE)
podatki_vino$Prihodek[is.na(podatki_vino$Prihodek)] <- Mean_prihodki
sum(is.na(podatki_vino$Prihodek))
## [1] 0
Izračunamo Mean prihodkov, nato ga zamenjama oziroma vstavimo v vse vrednosti, kjer imamo vrednost NA. Da preverimo če je delovalo, seštejemo skupaj vse NA vrednosti v Prihodek stolpcu s sum.na. Če je 0 potem je OK.
LM ponovno
fit <- lm(Znesek_vino ~ Prihodek + GK1 + GK2,
data = podatki_vino)
vif(fit)
## Prihodek GK1 GK2
## 1.561592 1.511178 1.050414
Še enkrat zaženemo, če ne R sporoči napako.
Histogram in graf stdost/stdOcenVred
podatki_vino$stdost <- rstandard(fit)
podatki_vino$stdocenvred <- scale(fit$fitted.values)
hist(podatki_vino$stdost,
xlab = "Standardni ostanki",
ylab = "Frekvenca",
main = "Histogram")
ggplot(podatki_vino, aes(y=stdost, x=stdocenvred)) + theme_dark() + geom_point(color = "snow") + ylab("stand ostanki") + xlab("stand ocen vred")
library(olsrr)
##
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
##
## rivers
Preverimo BP test
ols_test_breusch_pagan(fit)
##
## Breusch Pagan Test for Heteroskedasticity
## -----------------------------------------
## Ho: the variance is constant
## Ha: the variance is not constant
##
## Data
## ---------------------------------------
## Response : Znesek_vino
## Variables: fitted values of Znesek_vino
##
## Test Summary
## ----------------------------
## DF = 1
## Chi2 = 3314.2980
## Prob > Chi2 = 0.0000
H0 lahko zavrnemo, p vrednost = 0. (prob > Chi2), imamo heteroskedastičnost.
Cookove razdalje
podatki_vino$cooksD <- cooks.distance(fit)
head(podatki_vino[order(-podatki_vino$cooksD), ], )
## ID Prihodek Znesek_vino Znesek_sadje Znesek_meso Znesek_ribe
## 2234 9432 666666.00 9 14 18 8
## 1654 4931 157146.00 1 0 1725 2
## 688 1501 160803.00 55 16 1622 17
## 165 8475 157243.00 20 2 1582 1
## 2229 8720 52247.25 32 2 1607 12
## 22 5376 2447.00 1 1 1725 1
## Znesek_sladko GK1 GK2 stdost stdocenvred cooksD
## 2234 1 -1.067955 -0.1088027 -16.773412 13.698702 54.03779603
## 1654 1 2.389926 6.1231520 -5.609555 5.167523 0.31431231
## 688 3 2.534472 5.6271286 -5.350420 5.129183 0.24966646
## 165 2 2.108667 5.5845085 -5.295233 4.904833 0.23911341
## 2229 4 2.289862 5.6409882 -3.267427 2.576174 0.09523541
## 22 1 2.393221 6.1183017 -2.601776 1.627426 0.08859137
podatki_vino <- podatki_vino[c(-2234,-1654,-688,-165,-2229,-22), ]
Odstranimo vse enote, ki imajo stdost izven meja (-3,+3) ter vse, ki imajo cooksD izven neke ‘normalnosti’, torej ko ni v nekem lepem padanju.
head(podatki_vino[order(-podatki_vino$cooksD), ], )
## ID Prihodek Znesek_vino Znesek_sadje Znesek_meso Znesek_ribe
## 2133 11181 156924 2 1 2 1
## 618 1503 162397 85 1 16 2
## 1301 5336 157733 39 1 9 2
## 656 5555 153924 1 1 1 1
## 1809 1619 90369 292 51 981 224
## 1899 4619 113734 6 2 3 1
## Znesek_sladko GK1 GK2 stdost stdocenvred cooksD
## 2133 1 -1.332826 -0.08968395 -2.835489 1.9622900 0.03258371
## 618 1 -1.293179 -0.03992744 -2.642926 2.1161109 0.03056891
## 1301 0 -1.320338 -0.05212168 -2.720565 1.9971201 0.03020320
## 656 1 -1.334989 -0.09328696 -2.778813 1.8917938 0.02978413
## 1809 23 3.771999 2.72138038 -2.504681 2.9209961 0.01562421
## 1899 262 1.819574 -3.49162026 -1.831961 0.7902984 0.01495170
Izpišemo rezultate
summary(fit)
##
## Call:
## lm(formula = Znesek_vino ~ Prihodek + GK1 + GK2, data = podatki_vino)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3256.5 -128.1 -68.7 80.0 1169.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.550e+01 1.524e+01 2.986 0.00285 **
## Prihodek 4.946e-03 2.723e-04 18.165 < 2e-16 ***
## GK1 6.532e+01 4.089e+00 15.976 < 2e-16 ***
## GK2 7.221e+01 8.066e+00 8.953 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 258.2 on 2236 degrees of freedom
## Multiple R-squared: 0.4125, Adjusted R-squared: 0.4117
## F-statistic: 523.4 on 3 and 2236 DF, p-value: < 2.2e-16
Multiple r squared - 41.25% variabilnosti rezultata pojasnimo z linearnim vplivom GK1, GK2 in prihodka.
F statistics - preverjamo linearno povezanost, ali smo z modelom pojasnili. Zelo nizka p vrednost, zavrnemo pri p < 0.001
Vse 4 spremenljivke imajo statistično značilen vpliv.
GK1 in GK2 imata oba pozitiven predznak. Če se več zapravi na drugih izdelkih, se bo več zapravilo na vinih, hkrati če se več zapravi na vinih se bo več zapravilo na mesu, ob predpostavkah da je ostalo nespremenjeno.