"Alkstat 2. ZH - for dummies" #=============================================# # Függetlenségvizsgálat # [Gyakteszt 1] # és regresszió # #=============================================# "1. feladat: Olvassuk be a „MASS” csomagból a „survey” adatbázist, mely egyetemi hallgatók kérdőíves felmérésének eredményét tartalmazza. Teszteljük 5%-os szignifikancia szinten azt a nullhipotézist, hogy a dohányzási szokás (Smoke) független a testmozgás gyakoriságától (Exer). 1. állítás: p = 0,4828. 2. állítás: A kontingencia táblázat tartalmaz 5-nél kisebb gyakoriságot, így a kis elemszám miatt a döntésünk nem megbízható." library(MASS) input = data.frame(survey) attach(input) gyak.tablazat = table(Smoke,Exer) addmargins(gyak.tablazat) gyak.fuggetlen = margin.table(gyak.tablazat, 1) %*% t(margin.table(gyak.tablazat, 2)) / margin.table(gyak.tablazat) addmargins(gyak.fuggetlen) summary(gyak.tablazat) # amennyiben előfordul a kontingencia táblázatban 5-nél kisebb gyakoriság, szimuláljuk a p értékét (simulate.p.value=T) # vagy használjuk a fisher.test()-et "2.feladat Olvassuk be chickwts adatbázist. Teszteljük 5%-os szignifikancia szinten azt a nullhipotézist, hogy a csirkék átlagos tömege (weight) független a táplálék típusától (feed). p < 0,05, így a csirkék átlagos tömege független a táplálék típusától." input = data.frame(chickwts) attach(input) oneway.test(weight~feed, var.equal=FALSE) " 3. feladat: Olvassuk be az airquality adatbázist. Vizsgáljuk az ózon mennyisége (Ozone) és a hőmérséklet (Temp) közötti kapcsolatot. Írjuk fel az ózonmennyiséget a hőmérséklet lineáris függvényeként. - Adjuk meg az egyenes y-tengelymetszetének becslését. - Adjuk meg az egyenes meredekségének becslését. - A hőmérséklet hány százalékban magyarázza meg az ózonmennyiséget? Százalékjel nélkül adjuk meg. - Írjuk fel az ózonmennyiséget a hőmérséklet exponenciális függvényeként Ozone = exp(a + b*Temp) alakban. Adjuk meg az a együttható becslését. - Várhatóan mekkora lesz az ózonmennyiség 80 °F hőmérséklet esetén? - Melyik modell biztosítja a jobb illeszkedést?" input = data.frame(airquality) attach(input) model = lm(Ozone~Temp) (tengelymetszet = model$coefficient[1]) (meredekseg = model$coefficient[2]) (det_egyutthato = summary(model)$r.squared) # hány %-ban magyarázza # exponenciális függvényként model = lm(log(Ozone)~Temp) a = model$coefficient[1] b = model$coefficient[2] # várhatóan mekkora lesz az ózonmennyiség? f = function(x) exp(a+b*x) f(80) # melyik biztosítja a jobb illeszkedést? # először nézzük meg a lineáris hogy néz ki, és mennyi a det.e.h. model = lm(Ozone~Temp) plot(Ozone~Temp) abline(model) # det eh = 0.4877072 model = lm(log(Ozone)~Temp) plot(Ozone~Temp) curve(f,add=TRUE) # már itt látszik, hogy jobban illeszkedik (det_egyutthato = summary(model)$r.squared) # det eh = 0.5473353 #=============================================# # Főkomponens analízis # [Gyakteszt 2] #=============================================# "1. feladat: Olvassuk be a stackloss adatbázist. Milyen módszer segítségével tudjuk az adatbázis méretét csökkenteni?" # - Főkomponens analízissel " 2. feladat: Olvassuk be a stackloss adatbázist. Hány korrelálatlan változóval jellemezhető az adatbázis, ha legfeljebb 5 százalékos információvesztést szeretnénk elérni? " input = data.frame(stackloss) attach(input) model = princomp(input[1:4], cor = TRUE) summary(model) #Comp1 = 0.74 < 1-0.05 #Comp2 = 0.93 < 1-0.05 #Comp3 = 0.98 > 1-0.05 -> 3 változóval #Comp4 = 1.00 " 3. feladat: Olvassuk be a stackloss adatbázist. Pontosan hány százalék az információvesztés mértéke, ha az utolsó két főkomponenst elhagyjuk? Adjuk meg százalékjel nélkül. " # 1 - 0.9328791 = 0.0671209 ~ 6,71% " 4. feladat: Olvassuk be a stackloss adatbázist. Dimenziócsökkentés során hogyan áll elő a legfontosabb új változó az eredeti változók lineáris kombinációjaként? Három tizedes jegyre kerekítve adjuk meg az Air.Flow változó együtthatóját. " input = data.frame(stackloss) attach(input) model = princomp(input[1:4], cor = TRUE) (load = loadings(model)) # Air.Flow (Comp1) = -0.547 #=============================================# # Diszkriminancia és # [Gyakteszt 3] # klaszteranalízis # #=============================================# " 1. feladat: Az admission adatbázisban található GPA és GMAT pontszámok alapján szeretnénk megjósolni a főiskolára való bekerülés valószínűségét (De = admit, notadmit, borderline). Az adatbázis letölthető a következő címről: http://www.biz.uiowa.edu/faculty/jledolter/DataMining/admission.csv Térjünk át egy olyan új koordinátarendszerre, melyben jól szétválnak a csoportok. Adjuk meg a GPA változó első dimenzióhoz tartozó együtthatójának abszolút értékét. " library(MASS) input = read.csv("http://www.biz.uiowa.edu/faculty/jledolter/DataMining/admission.csv") attach(input) (model = lda(De~GPA+GMAT)) # 5.008766354 " 2.feladat: Az admission adatbázisban található GPA és GMAT pontszámok alapján szeretnénk megjósolni a főiskolára való bekerülés valószínűségét (De = admit, notadmit, borderline). Az adatbázis letölthető a következő címről: http://www.biz.uiowa.edu/faculty/jledolter/DataMining/admission.csv Várhatóan melyik csoportba fog tartozni az a jelentkező, akinek a következő pontszámai vannak: GPA=3.21, GMAT=497? " # legelőször hozzunk létre egy fájlt (pl. txt, lényegtelen) amelyben a megfelelő értékeket beírjuk, # így nézzen ki: # GPA GMAT # 3.21 497 # \n input2 = read.table("input2.txt", header=TRUE) (pred2 = data.frame(predict(model,input2))) # admit " 3. feladat? Az admission adatbázisban található GPA és GMAT pontszámok alapján szeretnénk megjósolni a főiskolára való bekerülés valószínűségét (De = admit, notadmit, borderline). Az adatbázis letölthető a következő címről: http://www.biz.uiowa.edu/faculty/jledolter/DataMining/admission.csv Térjünk át egy olyan új koordinátarendszerre, melyben jól szétválnak a csoportok. Az esetek hány százalékában működött jól az algoritmus? " pred = data.frame(predict(model)) mean(De == pred$class) # 0.9176471 -> 91,77% " 4. feladat: Az admission adatbázisban található GPA és GMAT pontszámok alapján szeretnénk megjósolni a főiskolára való bekerülés valószínűségét (De = admit, notadmit, borderline). Az adatbázis letölthető a következő címről: http://www.biz.uiowa.edu/faculty/jledolter/DataMining/admission.csv Várhatóan melyik csoportba fog tartozni az a jelentkező, akinek a következő pontszámai vannak: GPA=3.21, GMAT=497? Mekkora valószínűséggel került ebbe a csoportba? " (pred2) # 0.5180421 " 5. feladat: Olvassuk be a car_sales.csv adatbázist. Ha az adatbázist csak két korrelálatlan változóval jellemezzük, hány százalék az információvesztés mértéke? " input = read.csv2("car_sales.csv") attach(input) model = princomp(input[3:13], cor=TRUE) summary(model) # első 2 komponens, azaz Comp.2 = 0.7738575 # 1 - 0.7738575 =02261425 ~ 22,61% "6. feladat: Olvassuk be a car_sales.csv adatbázist. Vizsgáljuk meg a folytonos változók közötti Pearson-korrelációkat! Mekkora a korreláció a lóerő (horsepow) és az ár (price) között? " cor.test(horsepow,price,method="pearson") # 0.8534551 " 7. feladat: Olvassuk be a car_sales.csv adatbázist. Hány korrelálatlan változóval jellemezhető az adatbázis, ha legfeljebb 15 százalékos információvesztést szeretnénk elérni? " summary(model) #Comp1 = 0.55 < 1 - 0.15 #Comp2 = 0.77 < 1 - 0.15 #Comp3 = 0.84 < 1 - 0.15 #Comp4 = 0.90 > 1 - 0.15 -> 4 változóval " 8. feladat: Olvassuk be a car_sales.csv adatbázist. Jellemezzük az adatbázist kevesebb változóval. Hogyan áll elő a legfontosabb új változó az eredetiek lineáris kombinációjaként? Adja meg az mpg változó együtthatójának abszolút értékét. " (load = loadings(model)) # Comp1., mpg -> 0.342 " 9. feladat: Olvassuk be a vallalat.txt adatbázist. Standardizáljuk a folytonos változókat. Csoportosítsuk a vállalatokat a rendelkezésre álló folytonos változók alapján úgy, hogy jól szeparált klasztereket kapjunk. Melyik két vállalat került először egy csoportba, mekkora a köztük lévő távolság? " meret_st = scale(MERET) hatalmit_st = scale(HATALMIT) konzerva_st = scale(KONZERVA) tavmatrix= dist(cbind(meret_st,hatalmit_st,konzerva_st)) model = hclust(tavmatrix,method="single") model$merge model$height #[1] 0.2545374 0.3887915 0.3989439 0.4130610 0.5894237 #[6] 0.6000000 0.7044435 0.8043695 2.2131622 # az első összvonás távolsága 0.2545374 # az utolsó 2.2131622 # 5 elem került egy klaszterbe