1. 程式人生 > >R語言之探索性資料分析篇

R語言之探索性資料分析篇

探索性資料分析(Exploratory Data Analysis,EDA):是通過分析資料集以決定選擇哪種方法適合統計推斷的過程。

4.1 主要分析工具

主要的圖形表示方法有(括號中為R語言繪圖函式):

(1)條圖(barplot):用於分類資料;

(2)直方圖(hist)、點圖(dotchart)、莖葉圖(stem):用於觀察數值型分佈的形狀;

(3)箱線圖(boxplot):給出數值型分佈的彙總資料,適用於不同分佈的比較和拖尾、截尾分佈的識別;

(4)正態概率圖(qqnorm):用於觀察資料是否近似地服從正態分佈;

例4-1:

從某大學統計系的學生中隨機抽取24人,對數學和統計學的考試成績進行調查,結果如下,試對這些學生的數學成績和統計成績進行探索性分析。

//將檔案存放在一個txt文件中

> MS=read.table("C:\\Users\\lenovo\\Desktop\\mathstat.txt",header=T)
> MS
   math stat
1    81   72
2    90   90
3    91   96
4    73   78
5    88   89
6    78   82
7    95   96
8    63   75
9    85   86
10   60   71
11   83   78
12   81   94
13   77   73
14   60   66
15   66   58
16   84   87
17   80   86
18   85   84
19   70   82
20   54   56
21   93   98
22   68   76
> stem(MS$stat)


  The decimal point is 1 digit(s) to the right of the |


  5 | 68
  6 | 6
  7 | 1235688
  8 | 2246679
  9 | 04668


> stem(MS$math)


  The decimal point is 1 digit(s) to the right of the |


  5 | 4
  6 | 00368
  7 | 0378
  8 | 01134558
  9 | 0135


> EDA<-function(x)
+ {
+ par(mfrow=c(2,2))#圖視窗為2行2列格式
+ hist(x);  # 直方圖
+ dotchart(x);  # 點圖
+ boxplot(x,horizontal=T);  # 箱式圖
+ qqnorm(x);qqline(x) 
+ par(mfrow=c(1,1))
+ }
> EDA(MS$math)
> EDA(MS$stat)

當資料成偏態分佈時,可使用穩健方法去分析,如使用中位數或進行資料變換

4.2  單變數資料分析

4.2.1 分型別資料

取值範圍是有限個值或是一個數列構成的變數稱為 離散變數,若表示分類情況的離散變數又稱為分類變數

對於分類資料,我們可以用頻數表來分析,也可以用條形圖和餅圖來表示

1 分類頻數表(table)

頻數表可以描述一個分類變數的數值分佈概況,R中的table命令可以生成頻數表。若X是分類資料,只要用table(X)就可以生成分類頻數表

例:

> x=c("是","否","是","否","是","否","是")
> table(x)
x
否 是 
 3  4 

2 條圖(Barplot)

R畫條圖的命令是barplot(),對分類資料作條圖,需先對原始資料進行分組,否則作出來的不是分類資料的條形圖

例:

> drink=c(3, 4,1,1,3,4,3,3,1,3,2,1,2,1,2,3,2,3,1,1,1,1,4,3,1) 
> barplot(drink)#沒有對Y軸資料進行分組的條圖
> barplot(table(drink)) #對Y軸資料進行分組的條圖
> barplot(table(drink)/length(drink)) #將y軸修改為頻率 
> barplot(table(drink),col=c("red","yellow","blue","green")) #給條圖填充不同的顏色


3 餅圖(Pie Graph)

對於分類資料還可以用餅圖來描述,餅圖用於表示各類別某種牲的構成比情況

> drink=c(3, 4,1,1,3,4,3,3,1,3,2,1,2,1,2,3,2,3,1,1,1,1,4,3,1) 
> drink.count=table(drink)
> pie(drink.count)
> names(drink.count)=c("紅酒","白酒","黃酒","啤酒")  #把各標記改成文字
> pie(drink.count)
> pie(drink.count,col=c("purple","green","cyan","white")) #修改各扇區的顏色

4.2.2 數值型資料

1 集中趨勢和離散程度

對於數值型資料,經常要分析一個分佈的集中趨勢和離散程度,用來描述集中趨勢的主要有均值(mean())、中位數(median())
描述離散程度的主要有方差(var())、標準差(sd())

fivenum( )對數值資料五等分法(運算)

summary()示出分位數

例:

> salary = c(2000,2100,2200,2300,2350,2450,2500 ,2700,2900,2850, 
+ 3500,3800,2600,3000,3300,3200,4000,3100,4200) 
> mean(salary) #求均值
[1] 2897.368
> median(salary)#求中位數
[1] 2850
> var(salary) #求方差
[1] 414853.8
> sd(salary)  #求標準差
[1] 644.0915
> fivenum(salary)  #對數值資料五等分分法(運算)
[1] 2000 2400 2850 3250 4200
> summary(salary)  #求分位數
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2000    2400    2850    2897    3250    4200 

2 穩健的集中趨勢和離散程度

利用均值和方差描述集中趨勢和離散程度往往基於正態分佈,而若資料是長尾或是有異常值時,這時用均值和方差就不能正確地描述集中趨勢和離散程度。

而此時用中位數來描述集中趨勢則是穩健的,不易受異常值影響。

可對mean函式裡對trim引數進行設定

例:

> salarym=c(salary,15000)
> mean(salarym)
[1] 3502.5
> median(salarym)
[1] 2875
> mean(salarym,trim=0.2) #用R計算截尾均值  即去兩頭20%後的均值
[1] 2870.833 
> mean(salarym,0.5)   #去兩頭50%後的均值,trim可以省略,實際上就是中位數
[1] 2875
> IQR(salarym)   #四分位間距
[1] 925
> mad(salarym)  #平均差
[1] 704.235

3 莖葉圖(Stem-and-Leaf Graph)

由於繪製直方圖時需要先對資料進行分組彙總,故對樣本量較小的情形,直方圖會損失一部分資訊,此時可以使用莖葉圖來進行更精確的描述。

4 對數值資料分組

統計分析中經常要碰到 對數值資料進行分組,在R裡可以用cut函式對數值資料進行分組

例:

我們需要對工資按2 000~3 000,3 000~4 000,4 000以上進行分組,並用table()函式整理成頻數表形式: 

> salaryg=cut(salary,breaks=c(2000,3000,4000,max(salary)))
> table(salaryg)
salaryg
  (2e+03,3e+03]   (3e+03,4e+03] (4e+03,4.2e+03] 
             11               6               1 

5 直方圖(Histogram)

直方圖用於表示(描述)連續性變數的頻數分佈,實際應用中常用於考察變數的分佈是否服從某種分佈型別,如正態分佈

用R來作直方圖的函式是hist()

圖形以矩陣的面積表示各組段的頻數(或頻率),各矩陣的面積總和為總頻數(或等於1)

作頻率直方圖時,只要把 probability引數設定為T可以了,預設為F

R中還可以用rug()命令把各個資料豎線描繪在X軸上

6 箱線圖(Boxplot Graph)

箱線圖和直方圖一樣用於考察連續變數的分佈情況,但直方圖側重於一個連續變數的分佈情況進行詳細考察,而箱線圖更注重於勾勒出統計的主要資訊,並便於對多個連續變數同時考察,或對一個變數分組進行考察,在使用上要比直方圖更為靈活,用途更為廣泛。

函式為:boxplot() 可設定垂直和水平型,預設為垂直型,要得到水平型箱線圖,只要把引數horizontal設為T就可以了

> boxplot(salary)
> boxplot(salary,horizontal=T)
> boxplot(salary,horizontal=F)

7 密度函式線(Densities)

把直方圖各個中點連線起來就是密度函式線

函式為:density()

> hist(faithful$eruptions,prob=T,breaks=25)
> lines(density(faithful$eruptions),col='red')

4.3  雙變數資料分析 

4.3.1 分類資料對分類資料

1 二維表

table()可以把雙變數分類資料整理成二維表形式,table命令處理雙變數資料類似於處理單變數資料,只是引數由原來的不念舊惡變成了兩個。

邊緣概率函式:

prop.table( )

其句法是:prop.table(x,margin) 當margin=1時,表示各個資料佔行彙總數的比例,margin=2表示各個資料佔列彙總數的比例,省略時,表示佔總和的比例。

> smoke=c("Y","N","N","Y","N","Y","Y","Y","N","Y")
> study=c("<5h","5-10h","5-10h",">10h",">10h","<5h","5-10h","<5h
+ ", ">10h","5-10h") 
> table(smoke,study)
     study
smoke <5h <5h\n >10h 5-10h
    N   0     0    2     2
    Y   2     1    1     2
> tab=table(smoke,study)
> prop.table(tab,1)
     study
smoke       <5h     <5h\n      >10h     5-10h
    N 0.0000000 0.0000000 0.5000000 0.5000000
    Y 0.3333333 0.1666667 0.1666667 0.3333333

2 複雜(複式)條圖

條圖用等寬直條的長短來表示相互獨立的各指標數值大小,該指標可以是連續性變數的某彙總指標,也可以是分類變數的頻數或構成比。

R作條形圖的函式是:barpolt()    在作條圖前需對資料進行分組

main  引數用來為影象新增標題;

sub新增副標題;

beside引數設定為False時,作出的圖是分段式條形圖,True時作出的條形圖是並式,R預設的是False;

legend.text作為圖新增的圖例來說明;

4.3.2 分類資料地數值型資料

例:

藥物臨床試驗,有實驗組和對照組兩組資料。
實驗組:5 5 5 13 7 11 11 9 8 9 
對照組:11 8 4 5 9 5 10 5 4 10 
可以用箱線圖粗略比較這兩組資料之間的關係,對於這種雙變數資料作箱線圖類似於單變數資料。
> x=c(5,5,13,7,11,11,9,8,9) 
> y=c(11,8,4,5,9,5,10,5,4,10) 
> boxplot(x,y) 

4.3.3 數值型資料對數值型資料

1 散點圖

plot()函式

2 相關係數

相關係數是用來反映兩個數值變數的相關程度

Person相關係數用來反映兩個變數的線性相關關係。

總體相關係數的定義式是:


樣本相關係數的定義公式是:


spearman等級相關係數:


其中di=(xi-yi),xi和yi分別是兩個變數按大小排位的等級,n是樣本的容量,spearman

R 語言中求相關係數的函式是:cor()

spearman等級相關係數(秩相關係數) spearman相關是一種秩相關,可先對資料求秩,然後計算它們的pearson相關

R裡的rank()函式提供了求秩功能

4.4 多變數資料分析

4.4.1 訪問資料框資料

R使用資料框(data frame)形式儲存多變數資料

1 資料框繫結“attach”

attach()函式將資料框“連線(繫結)”入當前的名字空間,從而可以直接用資料框中的變數名訪問而不必用“資料框名$變數名”這種格式;

對於資料框變數我們不能直接引用,要用“資料框名$變數名”的格式,或利用attach()把資料框“連線(繫結)”入當前的名字空間。

要取消連線,用函式detach()即可

2 以陣列形式訪問

資料框可以看作是特殊的陣列,故可以以陣列形式訪問資料框。

陣列可以按行或列訪問,故可利用"陣列名[行,列]"

3 以列表形式訪問資料框

列表是物件的集合,且這些物件可以是不同型別的。

資料框是特殊的列表,資料框的列看作向量,且標是同一型別的物件。

以列表形式訪問資料框:

在列表名稱後面加$,再加上變數名即可:yx$x 

列表名[[變數名(號)]]形式訪問:yx[['y']]    yx[[1]]   

4.4.2 資料框的拆分與合併

R中拆分資料框:unstack()

合併資料框:stack()

4.4.3 多變數資料的分析

1 多維列聯表

2 複式條形圖

多變數資料統計分析中經常用到複式條形圖,複式條形圖是指兩條或兩個以上小直條組成條圖的條形圖。與簡單條形圖相比,複式條形圖多考察了一個分組因素,常用於考察比較兩組研究物件的某觀察指標。

作複式條形圖時:先用table()函式作頻數表,作複式條形圖的函式是barplot()

R預設的分段式複式條形圖,要作並列式複式條形圖,要設定引數beside=TRUE

3 並列箱線圖

對於多變數資料結黨要用到箱線圖來分析各個變數的分佈情況

R作箱線圖的函式是:boxplot()

4 點帶圖(stripchart)

箱線圖經常用來比較各變數的分佈情況,尤其是當每個變數都有很(較)多的觀察值時

點帶圖也可以用來比較各變數的分佈情況,但主要用在樣本觀察值比較少時。

R作點帶圖的函式是:stripchart()

對於雙變數資料其用法是  stripchart(z~t)  z變數在t變數上的分佈情況,不同的是這裡z變數刻度在x軸上,而t變數在x軸上

5 多變數散點圖

(1)重疊散點圖

將兩個或多組兩個變數的散點圖繪製在同一個圖中,可以更好比較它們之間的相關關係,這時可以繪重疊散點圖

(2)矩陣式散點圖

當欲同時考察三個或三個以上的數值變數間的相關關係時,若一一繪製它們之間的簡單散點圖,十分麻煩,利用矩陣式散點圖比較合適,這樣可以快速發現多個變數間主要相關性,在多元線性迴歸顯得尤為重要。

R作矩陣式散點圖的函式是:pairs()