數據質量通常是指數據值的質量,包括准確性、完整性和一致性。數據的准確性是指數據不包含錯誤或異常值、完整性是指數據不包含缺失值、一致性是數據在各個數據源中都是相同的。廣義的數據質量還包括數據整體的有效性,例如,數據整體是否是可信的、數據的取樣是否合理等。本文的數據質量分析,是指對原始數據值的質量進行分析,以檢查數據的質量。沒有可信的數據,數據分析將是空中樓閣,因此,數據分析的前提就是要保證數據質量是可信的。
數據質量分析的主要任務是檢測原始數據中是否存在臟數據,臟數據一般是指不符合要求,以及不能直接進行相應分析的數據,臟數據一般包括:
- 缺失值
- 異常值(離群點)
- 不一致的值
- 內容未知的值
通常情況下,原始數據中都會存在不完整(有缺失值)、不一致、數據異常等問題,這些臟數據會降低數據的質量,影響數據分析的結果,因此,在進行數據分析之前,需要對數據進行清洗、集成、轉換等處理,以提高數據的質量。對於內容未知和不一致的數據,通常需要人工識別,進而才能確定處理方法,本文重點介紹缺失值和異常值的分析方法。
一,缺失值分析
數據的缺失一般是指觀測的缺失和觀測中變量值的缺失,兩者都會造成分析結果的不准確。觀測的缺失會導致由樣本數據推斷出的總體數據的性質和特點出現偏差。
本小節涉及的是樣本中數據值的分析,使用簡單的統計分析,可以得到含有缺失值的屬性的個數和樣本空間的缺失率。缺失的數據可能會對數據分析的結果產生誤差,從而使樣本數據不能很好地代表數據總體。
用作分析缺失值的數據集:
df <- data.frame(col1 = c(1,3, NA,7,5), col2 = c("a", NA,"b", "a","d"), col3 = c(TRUE, FALSE, NA, TRUE,FALSE), col4 = c(2.5, 4.2, 3.2, NA,1.4), stringsAsFactors = TRUE)
1,識別缺失數據
在R語言中,缺失值通常以NA表示,可以使用函數is.na()判斷缺失值是否存在,另外,函數complete.cases()通過識別樣本數據是否完整,從而判斷缺失情況。
(1)is.na()標記出現NA的變量
is.na()返回邏輯值向量,當變量值為NA時,把該元素所在的值設置為TRUE,表明該元素是NA。
> is.na(df) col1 col2 col3 col4 [1,] FALSE FALSE FALSE FALSE [2,] FALSE TRUE FALSE FALSE [3,] TRUE FALSE TRUE FALSE [4,] FALSE FALSE FALSE TRUE [5,] FALSE FALSE FALSE FALSE
(2) complete.cases()函數測試觀測是否完整
complete.cases()是stats包中的一個函數,返回一個邏輯向量,向量的每個元素表示每個觀測是否完整,完整是指觀測中的所有變量都不包含缺失值。
complete.cases(df) [1] TRUE FALSE FALSE FALSE TRUE
2,缺失值分析
缺失值分析包括:含有缺失值的記錄和屬性,包含缺失值的觀測總數和缺失率。
(1)查看含有缺失值的記錄和屬性
使用complete.cases()函數來查看包含缺失值的觀測
df[!complete.cases(df), ] col1 col2 col3 col4 2 3 <NA> FALSE 4.2 3 NA b NA 3.2 4 7 a TRUE NA
(2)包含缺失值的統計數據
各列包含異常值的數量:
colSums(is.na(df)) col1 col2 col3 col4 1 1 1 1
包含異常值的總行數:
sum(!complete.cases(df)) [1] 3
(3)缺失率
包含缺失值的觀測數量占比是60%
mean(!complete.cases(df)) [1] 0.6
3,處理缺失值
對缺失值的處理,常用的處理方法是刪除缺失值所在的記錄,均值替換和插補。插補法比較復雜,本文暫不討論該主題。
(1)刪除
當缺失值所占的比例比較少時,可以使用刪除法,以減少樣本數據量來換取數據的完整性。
刪除缺失值可以通過na.omit()函數移除所有含有缺失值的觀測。
df <- na.omit(df)
通常情況下,字符類型的缺失值可以不做任何處理;如果缺失值是因子,且占比較少,可以直接刪除:
df <- df[!is.na(df$col2),]
(2)均值替換
均值替換法屬於插補法的一種簡單形式,適用於缺失率低的場景。
使用均值來替換缺失值,這是處理缺失值中比較常見的作法。對於數值類型的缺失值,一般用該變量在其他有效觀測中的均值來替換該缺失值。如果是非數值型變量,則使用該變量其他全部有效觀測值的眾數來替換。
df$col1[is.na(df$col1)] <- round(mean(df$col1, na.rm = TRUE)) df$col4[is.na(df$col4)] <- mean(df$col4, na.rm = TRUE)
眾數,簡單地說,就是在一組數據中出現次數最多的那個數據,是原數據,而不是出現的次數。例如:一組數據 1,2,3,3,4的眾數是3,而1,2,3,4,5沒有眾數。
不同於平均值和中位數,眾數可以是數字數據,也可以是字符數據。R沒有標准的內置函數來計算眾數,因此,我們將創建一個用戶自定義函數來計算數據集的眾數。
該函數將向量作為輸入,並將眾數值作為輸出。
getmode <- function(v) { uniqv <- unique(v) uniqv[which.max(tabulate(match(v, uniqv)))] }
對因子數據做眾數處理:
df$col2[is.na(df$col2)] <- getmode(na.omit(df$col2))
(3)不處理缺失值
在數據集中保留缺失值
二,異常值分析
異常值在統計學上的全稱是疑似異常值,也稱作離群點,異常值的分析也稱作離群點分析。異常值是指樣本中出現的“極端值”,數據值看起來異常大或異常小,其分布明顯偏離其余的觀測值。異常值分析是檢驗數據中是否存在不合常理的數據,在數據分析中,既不能忽視異常值的存在,也不能簡單地把異常值從數據分析中剔除。重視異常值的出現,分析其產生的原因,常常成為發現新問題進而改進決策的契機。
1,簡單統計量分析
對變量做一個描述性分析,進而查看哪些數據是不合理的。常用的統計量是最大值和最小值,用來判斷變量的取值是否超出了合理的范圍,例如,客戶年齡的最大值是199,該取值就存在異常。
2,3σ原則
如果數據服從正態分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過三倍標准差的值。在正態分布下,距離平均值3σ之外的值出現的概率為 P(|x-μ|>3σ)<=0.003,屬於極個別的小概率事件。
如果數據不服從正態分布,也可以用遠離平均值的多少倍標准差來描述。
3,箱型圖分析
箱線圖提供了識別異常值的一個標准方法:
異常值通常被定義為小於 QL - l.5 IQR 或者 大於 Qu + 1.5 IQR的值,QL稱為下四分位數, Qu稱為上四分位數,IQR稱為四分位數間距,是Qu上四分位數和QL下四分位數之差,其間包括了全部觀察值的一半。
4,異常值的處理
在數據處理時,異常值的處理方法,需視具體情況而定。有時,異常值也可能是正常的值,只不過異常的大或小,所以,很多情況下,要先分析異常值出現的可能原因,再判斷如何處理異常值。
處理的異常值的常用方法有:
- 刪除含有異常值的記錄;
- 插補,把異常值視為缺失值,使用缺失值的處理方法進行處理,好處是利用現有數據對異常值進行替換,或插補;
- 不處理,直接在含有異常值的數據集上進行數據分析;
三,一致性分析
數據不一致性是指數據的矛盾性,主要是由於數據源不同,導致數據編碼的不一致;例如,對於一組數據,性別是M和F,而其他數據源中使用Male和Female表示性別,那么這兩種數據就產生編碼不一致性的問題。
另外,數據更新不同步也容易導致的數據不一致性,例如,同一個人的工作地點,在不同的數據表中,可能是不同的,這就是在更新數據時,由於更新的不同步導致數據出現不一致性。
當數據出現不一致性時,需要對數據進行清洗和集成操作,去除冗余數據、統一變量名、統一數據的計量單位等,並使用最新的數據來消除不一致性。
參考文檔: