Raziskovalno vprašanje: Ali je opazna razlika pri zapravljeni količini na vinih med strankami, ki so sprejeli ponudbo v zadnji marketinški kampanji in tistimi, ki niso.

Vir: Kaggle.com. (2022). Classification: Customer Personality Analysis. Pridobljeno 7.1.2024 s https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis

Uvozi se podatke (csv file):

cust_pers <- read.table("/Users/jakakranjc/Downloads/marketing_campaign.csv", header=TRUE, sep = "\t", dec = ".")

Prikaže se prvih 6 vrstic izbranega dataseta:

head(cust_pers)
##     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

Odstrani se nepotrebne stolpce, tiste, ki ostanejo se preimenuje:

cust_personal <- cust_pers[,-c(2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28)]
colnames(cust_personal) <- c("ID", "Znesek_vino", "Odgovor")
head(cust_personal)
##     ID Znesek_vino Odgovor
## 1 5524         635       1
## 2 2174          11       0
## 3 4141         426       0
## 4 6182          11       0
## 5 5324         173       0
## 6 7446         520       0

Razlaga spremenljivk: ID - ID posamezne stranke Znesek_vino - znesek (v Eur, ki ga je posameznik zapravil na vinu v zadnjih dveh letih) Odgovor - 1 = je sprejel akcijo v zadnji marketinški kampanji / 2 = ni sprejel

ID_posameznika <- cust_personal$`ID`
Povprecen_znesek_zapravljen_na_vinu_zadnje_dve_leti <- cust_personal$`Znesek_vino`
Sodelovanje_v_kampanji <- cust_personal$`Odgovor`

Opisna statistika:

summary(cust_personal)
##        ID         Znesek_vino         Odgovor      
##  Min.   :    0   Min.   :   0.00   Min.   :0.0000  
##  1st Qu.: 2828   1st Qu.:  23.75   1st Qu.:0.0000  
##  Median : 5458   Median : 173.50   Median :0.0000  
##  Mean   : 5592   Mean   : 303.94   Mean   :0.1491  
##  3rd Qu.: 8428   3rd Qu.: 504.25   3rd Qu.:0.0000  
##  Max.   :11191   Max.   :1493.00   Max.   :1.0000

Nekaj razlag: min za ID je 0, max za ID je 11191 mean (povprečni znesek) zneska, zapravljenega na vinu je 303.94eur, mediana 173.5. povprečje je večje od mediane -> pozitivna nagnjenost povprečna vrednost je 0.1491 -> 14.91% odgovorov je enakih = 1

Naredi se Welch t-test:

group_1 <- cust_personal$Znesek_vino[cust_personal$Odgovor == 1]
group_2 <- cust_personal$Znesek_vino[cust_personal$Odgovor == 0]

t_test_rezultat <- t.test(group_1, group_2)
print(t_test_rezultat)
## 
##  Welch Two Sample t-test
## 
## data:  group_1 and group_2
## t = 9.5748, df = 394.67, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  185.6345 281.5639
## sample estimates:
## mean of x mean of y 
##  502.7036  269.1044

Welchov t-test je bil izveden za primerjavo povprecnih zneskov zapravljenih na vinih med tistimi, ki so sodelovali v zadnji kampanji in tistimi ki niso. P-vrednost je manjša od 0.05, kar pomeni, da lahko ničelno domnevo zavrnemo. Statistično pomembna razlika tako obstaja med povprečnimi zneski, porabljenimi za vino med strankami, ki so sprejele in tistimi strankami, ki niso sprejel zadnje kampanje. Prav tako imamo 95% interval zaupanja, ki še dodatno podpira ‘prednost’ oziroma pozitivno razliko skupine, ki je sprejela kampanjo

Naredi se še neparamtrični test - Wilcoxov test vsote rangov:

group_1_wr <- cust_personal$Znesek_vino[cust_personal$Odgovor == 1]
group_2_wr <- cust_personal$Znesek_vino[cust_personal$Odgovor == 0]

wilcox_rank_vsota <- wilcox.test(group_1_wr, group_2_wr)
print(wilcox_rank_vsota)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  group_1_wr and group_2_wr
## W = 420994, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0

Wilcoxov test vsote rangov je bil narejen za primerjavo porazdelitve povprečnih zneskov, porabljenih za vino med dvema skupinama (tisti, ki so sprejeli zadnjo kampanjo = 1, in tistimi, ki niso = 0). Rezultat podpira dokaze proti ničelni domnevi, kar nam pove da obstaja pomembna razlika v porazdelitvi zneskov. P-vrednost je manjša od 2.2e-16 in nam pove, da močno podpira zavrnitev ničelne domneve. Razlika v porazdelitvi torej ni enaka 0. To se ujema z prejšnjim t-testom.

Preveri se normalna porazdelitev z shapiro testom:

shapiro.test(cust_personal$Znesek_vino[cust_personal$Odgovor == 1])
## 
##  Shapiro-Wilk normality test
## 
## data:  cust_personal$Znesek_vino[cust_personal$Odgovor == 1]
## W = 0.91224, p-value = 4.87e-13
shapiro.test(cust_personal$Znesek_vino[cust_personal$Odgovor == 0])
## 
##  Shapiro-Wilk normality test
## 
## data:  cust_personal$Znesek_vino[cust_personal$Odgovor == 0]
## W = 0.82905, p-value < 2.2e-16

Shapiro-Wilk test nam pokaže, da je pravilo normalnosti kršeno za povprečni znesek, zapravljen s strani posameznika za vino v zadnjih dveh letih glede na skupino v katero pripada.

Oba testa tako podpirata zavrnitev ničelne domneve, ker pa imamo kršeno pravilo normalnosti se odločimo za ne-parametrični test oziroma wilcoxov test vsote rangov

2. DEL NALOGE Odločil sem se za multiplo linearno regresijo, vir za podatke je ostal isti.

Raziskovalno vprašanje: Kako se znesek zapravljen na vinih navezuje na prihodek in število otrok doma?

summary(cust_pers)
##        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  
## 

Izbere se samo za nas pomembne stolpce

cust_pers2 <- cust_pers[,-c(1,2,3,4,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29)]
colnames(cust_pers2) <- c("Prihodek", "Otroci_doma", "Znesek_vino")
summary(cust_pers2)
##     Prihodek       Otroci_doma      Znesek_vino     
##  Min.   :  1730   Min.   :0.0000   Min.   :   0.00  
##  1st Qu.: 35303   1st Qu.:0.0000   1st Qu.:  23.75  
##  Median : 51382   Median :0.0000   Median : 173.50  
##  Mean   : 52247   Mean   :0.4442   Mean   : 303.94  
##  3rd Qu.: 68522   3rd Qu.:1.0000   3rd Qu.: 504.25  
##  Max.   :666666   Max.   :2.0000   Max.   :1493.00  
##  NA's   :24

Preveri se, ali obstajajo NA vrednosti oziroma koliko praznih vrednosti je v Prihodku:

sum(is.na(cust_pers2))
## [1] 24

Vsem praznim vrednostim v prihodku se dodeli mediana prihodka

cust_pers2$Prihodek[is.na(cust_pers2$Prihodek)] <- median(cust_pers2$Prihodek, na.rm = TRUE)

V kolikor je torej prazna vrednost v stolpcu prihodek, se v celico zapiše mediana prihodka za lažje analiziranje.

Naredi se model za multiplo linearno regeresijo

fit <- lm(Znesek_vino ~ Prihodek + Otroci_doma, data = cust_pers2)
summary(fit)
## 
## Call:
## lm(formula = Znesek_vino ~ Prihodek + Otroci_doma, data = cust_pers2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3877.5  -143.3   -44.9    87.7  1110.2 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.537e+01  1.634e+01   4.612 4.21e-06 ***
## Prihodek     6.004e-03  2.413e-04  24.882  < 2e-16 ***
## Otroci_doma -1.915e+02  1.122e+01 -17.067  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 258.7 on 2237 degrees of freedom
## Multiple R-squared:  0.4097, Adjusted R-squared:  0.4092 
## F-statistic: 776.3 on 2 and 2237 DF,  p-value: < 2.2e-16

P-vrednost je izredno majhna (2.2e-16), kar pove da sta tako prihodek kot število otrok doma statistično pomembna napovedovalca vsote, ki bo zapravljena na vinu. model je statistično pomemben.

library(car)
## Loading required package: carData

Izračunamo vif in preverimo multikolinearnost

vif(fit)
##    Prihodek Otroci_doma 
##    1.220856    1.220856

Vrednosti sta pod 5 in sta sprejemljivi.

Preveri se povezavo med izbranima spremenljivkama

cor_matrix <- cor(cust_pers2)
print(cor_matrix)
##               Prihodek Otroci_doma Znesek_vino
## Prihodek     1.0000000  -0.4253265   0.5769031
## Otroci_doma -0.4253265   1.0000000  -0.4962969
## Znesek_vino  0.5769031  -0.4962969   1.0000000

Povezava med zneskom, zapravljenim na vinu in prihodkom je 0.57 kar pomeni da je zmerno pozitivno, kar pomeni, da se ob zvišanju prihodka zvišuje vsota zapravljena na vinu. Povezava med zneskom in otroci doma pa je -0.49, kar pomeni da je negativna in se ob višanju števila otrok doma količina zapravljena na vinu manjša.

library(corrplot)
## corrplot 0.92 loaded
corrplot(cor_matrix, method = "color")

Naredi se brauch pagan test za predpostavko o homoskedatičnosti

library(olsrr)
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
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          =    6178.5399 
##  Prob > Chi2   =    0.0000

ho hipoteza = variance je konstantna (homoskedastičnost), h1 hipoteza = varianca ni konstantna (heteroskedastičnost) prob nam pove da je p vrednost zelo majhen in manjši od (0.0000), zato lahko h0 zavrnemo. Variabilnost napak ni konstantna, kar namiguje na prisotnost heteroskedastičnosti.

Preveri se ustreznost modela z r2 in prilagojenim r2

summary(fit)$r.squared
## [1] 0.4096862
summary(fit)$adj.r.squared
## [1] 0.4091584

približno 41% variabilnosti zneska porabljenega na vinu ob upoštevanju spremenljivk pojasnjuje predstavljen model.