#charger les données
clients=read.csv("http://goo.gl/qw303p")
##inspecter les donneés
head(clients)
## age gender income kids ownHome subscribe Segment
## 1 47.31613 Male 49482.81 2 ownNo subNo Suburb mix
## 2 31.38684 Male 35546.29 1 ownYes subNo Suburb mix
## 3 43.20034 Male 44169.19 0 ownYes subNo Suburb mix
## 4 37.31700 Female 81041.99 1 ownNo subNo Suburb mix
## 5 40.95439 Female 79353.01 3 ownYes subNo Suburb mix
## 6 43.03387 Male 58143.36 4 ownYes subNo Suburb mix
summary(clients)
## age gender income kids
## Min. :19.26 Length:300 Min. : -5183 Min. :0.00
## 1st Qu.:33.01 Class :character 1st Qu.: 39656 1st Qu.:0.00
## Median :39.49 Mode :character Median : 52014 Median :1.00
## Mean :41.20 Mean : 50937 Mean :1.27
## 3rd Qu.:47.90 3rd Qu.: 61403 3rd Qu.:2.00
## Max. :80.49 Max. :114278 Max. :7.00
## ownHome subscribe Segment
## Length:300 Length:300 Length:300
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
str(clients)
## 'data.frame': 300 obs. of 7 variables:
## $ age : num 47.3 31.4 43.2 37.3 41 ...
## $ gender : chr "Male" "Male" "Male" "Female" ...
## $ income : num 49483 35546 44169 81042 79353 ...
## $ kids : int 2 1 0 1 3 4 3 0 1 0 ...
## $ ownHome : chr "ownNo" "ownYes" "ownYes" "ownNo" ...
## $ subscribe: chr "subNo" "subNo" "subNo" "subNo" ...
## $ Segment : chr "Suburb mix" "Suburb mix" "Suburb mix" "Suburb mix" ...
#changer de nom des variables et rendre les var quali en facteur
names(clients)=c("age","sexe","revenu","enfants","proprio","abonné","segments")
clients$sexe=as.factor(clients$sexe)
clients$proprio=as.factor(clients$proprio)
clients$abonné=as.factor(clients$abonné)
clients$segments=as.factor(clients$segments)
str(clients)
## 'data.frame': 300 obs. of 7 variables:
## $ age : num 47.3 31.4 43.2 37.3 41 ...
## $ sexe : Factor w/ 2 levels "Female","Male": 2 2 2 1 1 2 2 2 1 1 ...
## $ revenu : num 49483 35546 44169 81042 79353 ...
## $ enfants : int 2 1 0 1 3 4 3 0 1 0 ...
## $ proprio : Factor w/ 2 levels "ownNo","ownYes": 1 2 2 1 2 2 1 1 1 2 ...
## $ abonné : Factor w/ 2 levels "subNo","subYes": 1 1 1 1 1 1 1 1 1 1 ...
## $ segments: Factor w/ 4 levels "Moving up","Suburb mix",..: 2 2 2 2 2 2 2 2 2 2 ...
#les fonctions by agregate et with
*by
by(clients$revenu,clients$segments,mean)#moyenne des revenu en fonction des segments
## clients$segments: Moving up
## [1] 53090.97
## ------------------------------------------------------------
## clients$segments: Suburb mix
## [1] 55033.82
## ------------------------------------------------------------
## clients$segments: Travelers
## [1] 62213.94
## ------------------------------------------------------------
## clients$segments: Urban hip
## [1] 21681.93
by(clients$revenu,list(clients$segments,clients$proprio),mean)#moyenne des revenu en fonction de segments et proprio
## : Moving up
## : ownNo
## [1] 54497.68
## ------------------------------------------------------------
## : Suburb mix
## : ownNo
## [1] 54932.83
## ------------------------------------------------------------
## : Travelers
## : ownNo
## [1] 63188.42
## ------------------------------------------------------------
## : Urban hip
## : ownNo
## [1] 21337.59
## ------------------------------------------------------------
## : Moving up
## : ownYes
## [1] 50216.37
## ------------------------------------------------------------
## : Suburb mix
## : ownYes
## [1] 55143.21
## ------------------------------------------------------------
## : Travelers
## : ownYes
## [1] 61889.12
## ------------------------------------------------------------
## : Urban hip
## : ownYes
## [1] 23059.27
aggregate même role que by* mais rendus sous forme de tableau
tableau=aggregate(revenu~segments,mean,data = clients)
tableau
## segments revenu
## 1 Moving up 53090.97
## 2 Suburb mix 55033.82
## 3 Travelers 62213.94
## 4 Urban hip 21681.93
tableau2=aggregate(revenu~segments+proprio,mean,data = clients)
tableau2
## segments proprio revenu
## 1 Moving up ownNo 54497.68
## 2 Suburb mix ownNo 54932.83
## 3 Travelers ownNo 63188.42
## 4 Urban hip ownNo 21337.59
## 5 Moving up ownYes 50216.37
## 6 Suburb mix ownYes 55143.21
## 7 Travelers ownYes 61889.12
## 8 Urban hip ownYes 23059.27
*with
with(clients, table(segments,proprio)) #tableau de frequence pour var quali
## proprio
## segments ownNo ownYes
## Moving up 47 23
## Suburb mix 52 48
## Travelers 20 60
## Urban hip 40 10
with(clients, prop.table(table(segments,proprio),margin=1))
## proprio
## segments ownNo ownYes
## Moving up 0.6714286 0.3285714
## Suburb mix 0.5200000 0.4800000
## Travelers 0.2500000 0.7500000
## Urban hip 0.8000000 0.2000000
with(clients, prop.table(table(segments,proprio),margin=2)) #tableau de frequence pour var quali
## proprio
## segments ownNo ownYes
## Moving up 0.29559748 0.16312057
## Suburb mix 0.32704403 0.34042553
## Travelers 0.12578616 0.42553191
## Urban hip 0.25157233 0.07092199
#margin=1 par ligne margin=2 par colonne
#representation des données
library(lattice)
histogram(~abonné | segments , data = clients)
histogram(~sexe | segments , data = clients)
histogram(~abonné|segments, data = clients, type = "count", layout=c(4,1),col=c("red","blue"))
histogram(~abonné | segments+proprio , data = clients)
prop.table(table(clients$abonné,clients$segments),margin = 2)
##
## Moving up Suburb mix Travelers Urban hip
## subNo 0.800 0.940 0.875 0.800
## subYes 0.200 0.060 0.125 0.200
#histogram(~abonné | segments+revenu.fac , data = clients)
barchart(prop.table(table(clients$abonné,clients$segments),margin = 2)[2,],xlab = "titre",col="red")
##student dans notre bd
by(clients$revenu,clients$proprio, var)
## clients$proprio: ownNo
## [1] 358692875
## ------------------------------------------------------------
## clients$proprio: ownYes
## [1] 430890091
boxplot(clients$revenu~clients$proprio)
visiblement les mean sont différente
hist(clients$revenu)
shapiro.test(clients$revenu)
##
## Shapiro-Wilk normality test
##
## data: clients$revenu
## W = 0.97765, p-value = 0.0001244
normalité rejeté !!
pour visualiser la distribution d’une variable avec une seule modalite il faut:
par(mfrow=c(1,2))
with(clients,hist(revenu[proprio=="ownYes"]))
with(clients,hist(revenu[proprio=="ownNo"]))
#t.test(clients$revenu~clients$proprio, var.equal=FALSE)
#lorsque les deux echantillon sont depezndant et numerique la syntaxe adequat est la suivante
#t.test(echan1,echan2, var.equal=T, paired=T)
#non paramétrique
by(clients$revenu,clients$proprio, median)
## clients$proprio: ownNo
## [1] 51412.56
## ------------------------------------------------------------
## clients$proprio: ownYes
## [1] 52953.41
wilcox.test(clients$revenu~clients$proprio,correct = F)
##
## Wilcoxon rank sum test
##
## data: clients$revenu by clients$proprio
## W = 9325, p-value = 0.01197
## alternative hypothesis: true location shift is not equal to 0
rejet de H0
test de conformité
median(clients$revenu)
## [1] 52014.35
wilcox.test(clients$revenu, mu=52050)
##
## Wilcoxon signed rank test with continuity correction
##
## data: clients$revenu
## V = 21579, p-value = 0.508
## alternative hypothesis: true location is not equal to 52050
H0 accepté: oui le revenu moyen peut être assimilable/conforme a 52050
library(pastecs)
by(clients$revenu,clients$proprio,stat.desc)
## clients$proprio: ownNo
## nbr.val nbr.null nbr.na min max range
## 1.590000e+02 0.000000e+00 0.000000e+00 1.198525e+04 1.134568e+05 1.014715e+05
## sum median mean SE.mean CI.mean.0.95 var
## 7.535171e+06 5.141256e+04 4.739101e+04 1.501975e+03 2.966540e+03 3.586929e+08
## std.dev coef.var
## 1.893919e+04 3.996367e-01
## ------------------------------------------------------------
## clients$proprio: ownYes
## nbr.val nbr.null nbr.na min max
## 1.410000e+02 0.000000e+00 0.000000e+00 -5.183354e+03 1.142783e+05
## range sum median mean SE.mean
## 1.194616e+05 7.745790e+06 5.295341e+04 5.493468e+04 1.748130e+03
## CI.mean.0.95 var std.dev coef.var
## 3.456147e+03 4.308901e+08 2.075789e+04 3.778650e-01
##test du khi-deux lien entre deux var quali
#tableau de frequence
t=table(clients$abonné,clients$proprio)
t
##
## ownNo ownYes
## subNo 137 123
## subYes 22 18
HO: pas de lien H1: existance de lien Notons ici que le risque represente une ERREUR D’INFERENCE( donc en general c’est sur 100 echantillon je peux me tromper sur 5 echantillons)
chisq.test(t,correct =F )
##
## Pearson's Chi-squared test
##
## data: t
## X-squared = 0.074113, df = 1, p-value = 0.7854
pas de lien !!!!
H0: Pval inf 0.5 H1:Pval sup/=0.5
#binom.test(x,n,p,alternative = "greater")
#?binom.test
# Supposons que nous avons 30 tirages de pièces de monnaie et que nous voulons tester si la probabilité de succès est de 0.5
nombre_de_succes <- 18
taille_de_l_echantillon <- 30
probabilite_theorique <- 0.5
# Effectuer le test binomial
resultat_test <- binom.test(nombre_de_succes, taille_de_l_echantillon, p = probabilite_theorique, alternative = "two.sided")
# Afficher les résultats
print(resultat_test)
##
## Exact binomial test
##
## data: nombre_de_succes and taille_de_l_echantillon
## number of successes = 18, number of trials = 30, p-value = 0.3616
## alternative hypothesis: true probability of success is not equal to 0.5
## 95 percent confidence interval:
## 0.4060349 0.7734424
## sample estimates:
## probability of success
## 0.6
x:nbre observé qui repondent aux succeès , n:total , p=0.5(generalement), H1 (alternative)=superieure pour conclure on compare la prob de succes a 0.5
il complète le test de stutend qui se limite a un facteur et 2 modalités exclusivement
*passons à la visualisation tout d’abord
library(ggplot2)
visua=ggplot(clients,aes(segments,revenu))+geom_boxplot()
visua
*passons a anova proprement dit ( un facteur plus de deux modalités)
segmentanova=aov(revenu~segments,data = clients)
anova(segmentanova)
## Analysis of Variance Table
##
## Response: revenu
## Df Sum Sq Mean Sq F value Pr(>F)
## segments 3 5.4970e+10 1.8323e+10 81.828 < 2.2e-16 ***
## Residuals 296 6.6281e+10 2.2392e+08
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
F value est le quotient de la moyenne de la somme des carrées du model sur la moyenne de la somme des carrées par groupe
il est bien significatif donc on peut conclur que les types de segment ont un impact sur la moyenne des revenu
model2=aov(revenu~segments+proprio,data = clients)
anova(model2) #proprio pas significatif supsons de multicolinearité!!!!
## Analysis of Variance Table
##
## Response: revenu
## Df Sum Sq Mean Sq F value Pr(>F)
## segments 3 5.4970e+10 1.8323e+10 81.6381 <2e-16 ***
## proprio 1 6.9918e+07 6.9918e+07 0.3115 0.5772
## Residuals 295 6.6211e+10 2.2444e+08
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model3=lm(revenu~segments+proprio,data = clients)
summary(model3)
##
## Call:
## lm(formula = revenu ~ segments + proprio, data = clients)
##
## Residuals:
## Min 1Q Median 3Q Max
## -67135 -6931 -270 6259 52327
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 53436 1894 28.208 < 2e-16 ***
## segmentsSuburb mix 2102 2352 0.894 0.372240
## segmentsTravelers 9566 2577 3.712 0.000246 ***
## segmentsUrban hip -31544 2785 -11.328 < 2e-16 ***
## proprioownYes -1050 1882 -0.558 0.577175
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14980 on 295 degrees of freedom
## Multiple R-squared: 0.4539, Adjusted R-squared: 0.4465
## F-statistic: 61.31 on 4 and 295 DF, p-value: < 2.2e-16
*comparaison des modèles anova
anova(segmentanova, model2)
## Analysis of Variance Table
##
## Model 1: revenu ~ segments
## Model 2: revenu ~ segments + proprio
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 296 6.6281e+10
## 2 295 6.6211e+10 1 69918004 0.3115 0.5772
Pr(F)= 0.5772 donc H0 accepté (pas d’amelioration dans le model ) model1 mieux que model2