
數據分析中非常實用的自編函數和代碼模塊整理
搞了接近四個周的模型開發工作,今天整理代碼文件,評分卡模型基本告一段落了。那么在模型開發或者是我們日常的數據分析工作中,根據我們具體的業務需求,經常會重復地用到某些模塊的功能。而這些模塊的功能在R的packages里是沒有的,這個時候,我們一般是通過自己寫代碼實現功能。通俗的說,在數據分析工作中,我們經常會通過調用自編函數來實現某些高級的功能。
一般在結束某項數據分析的工作之后,對于使用頻率比較高的模塊功能,我會將實現代碼封裝在一個模塊函數當中,并命好名,方便下次調用。其實你可以把它理解為自己開發的一個package,通過模塊化的調用,提高我們在數據分析工作中的效率,而不用每次都用造輪子式的方法來敲代碼!
我一直認為這是一個很好的習慣,你的自編函數或者說是代碼模塊積累得越多,對于以后的建模工作來說會更加輕車熟路,這也是每一個數據分析師在工作的過程當中積累的寶貴經驗。
說了這么多,今天給大家分享幾個我平時用得比較多,實用性也比較強的自編函數和代碼模塊,方便大家借鑒參考。
1、centralImputation( )
根據樣本間的相似性填補缺失值方法,把實現代碼封裝在如下函數中,并將該函數命名為centralImputation
根據樣本之間的相似性填補缺失值是指用這些缺失值最可能的值來填補它們,通常使用能代表變量中心趨勢的值進行填補,因為代表變量中心趨勢的值反映了變量分布的最常見值。代表變量中心趨勢的指標包括平均值、中位數、眾數等,那么我們采用哪些指標來填補缺失值呢?最佳選擇是由變量的分布來確定,例如,對于接近正態分布的變量來說,由于所有觀測值都較好地聚集在平均值周圍,因此平均值就就是填補該類變量缺失值的最佳選擇。然而,對于偏態分布或者離群值來說,平均值就不是最佳選擇。因為偏態分布的大部分值都聚集在變量分布的一側,平均值不能作為最常見值的代表。對于偏態分布或者有離群值的分布而言,中位數是更好地代表數據中心趨勢的指標。對于名義變量(如定性指標),通常采用眾數填補缺失值。
我們將上述分析放在一個統一的函數centralImputation( )中,對于數值型變量,我們用中位數填補,對于名義變量,我們用眾數填補,函數代碼如下:
centralImputation<-function(data)
{
for(i in seq(ncol(data)))
if(any(idx<-is.na(data[,i])))
{
data[idx,i]<-centralValue(data[,i])
}
data}
centralValue<-function(x,ws=NULL)
{
if(is.numeric(x))
{
if(is.null(ws))
{
median(x,na.rm = T)
}
else if((s<sum(ws))>0)
{
sum(x*(ws/s))
}
else NA
}
else
{
x<-as.factor(x)
if(is.null(ws))
{
levels(x)[which.max(table(x))]
}
else
{
levels(x)[which.max(aggregate(ws,list(x),sum)[,2])]
}
}
}
調用上述函數對缺失值進行填補,代碼如下:
x<-centralImputation(data)
View(x) #查看填補結果
2、knnImputation( )
根據變量間的相關關系填補缺失值(基于knn算法)
上述按照中心趨勢進行缺失值填補的方法,考慮的是數據每列的數值或字符屬性,在進行缺失值填補時,我們也可以考慮每行的屬性,即根據變量之間的相關關系填補缺失值。
當我們采用數據集每行的屬性進行缺失值填補時,通常有兩種方法,第一種方法是計算k個(我用的k=10)最相近樣本的中位數并用這個中位數來填補缺失值。如果缺失值是名義變量,則使用這k個最近相似數據的加權平均值進行填補,權重大小隨著距離待填補缺失值樣本的距離增大而減小,本文我們采用高斯核函數從距離獲得權重,即如果相鄰樣本距離待填補缺失值的樣本的距離為d,則它的值在加權平均中的權重為:
在尋找跟包含缺失值的樣本最近的k個鄰居樣本時,最常用的經典算法是knn(k-nearest-neighbor) 算法,它通過計算樣本間的歐氏距離,來尋找距離包含缺失值樣本最近的k個鄰居,樣本x和y之間歐式距離的計算公式如下:
式中:δi()是變量i的兩個值之間的距離,即
在計算歐式距離時,為了消除變量間不同尺度的影響,通常要先對數值變量進行標準化,即:
我們將上述根據數據集每行的屬性進行缺失值填補的方法,封裝到knnImputation( )函數中,代碼如下:
knnImputation<-function(data,k=10,scale=T,meth="weighAvg",distData=NULL)
{
n<-nrow(data)
if(!is.null(distData))
{
distInit<-n+1
data<-rbind(data,distData)
}
else
{
disInit<-1
}
N<-nrow(data)
ncol<-ncol(data)
nomAttrs<-rep(F,ncol)
for(i in seq(ncol))
{
nomAttrs[i]<-is.factor(data[,1])
}
nomAttrs<-which(nomAttrs)
hasNom<-length(nomAttrs)
contAttrs<-setdiff(seq(ncol),nomAttrs)
dm<-data
if(scale)
{
dm[,contAttrs]<-scale(dm[,contAttrs])
}
if(hasNom)
{
for(i in nomAttrs)
dm[,i]<-as.integer(dm[,i])
}
dm<as.matrix(dm)
nas<-which(!complete.cases(dm))
if(!is.null(distData))
{
tgt.nas<-nas[nas<=n]
}
else
{
tgt.nas<-nas
}
if(length(tgt.nas)==0)
{
warning("No case has missing values. Stopping as there is nothing to do.")
}
xcomplete<-dm[setdiff(disInit:N,nas),]
if(nrow(xcomplete)<k)
{
stop("Not sufficient complete cases for computing neighbors.")
}
for(i in tgt.nas)
{
tgtAs<-which(is.na(dm[i,]))
dist<-scale(xcomplete,dm[i,],FALSE)
xnom<-setdiff(nomAttrs,tgtAs)
if(length(xnom))
{
dist[,xnom]<-ifelse(dist[,xnom]>0,1,dist[,xnom])
}
dist<-dist[,-tgtAs]
dist<-sqrt(drop(dist^2%*%rep(1,ncol(dist))))
ks<-order(dist)[seq(k)]
for(j in tgtAs) if(meth=="median")
{
data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j][ks])
}
else
{
data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j]
[ks],exp(-dist[ks]))
}
}
data[1:n,]
}
調用knnImputation( )函數,用knn方法填補缺失值,代碼如下:
d<-knnImputation(data)
View(d) #查看填補結果
以上兩個模塊化函數的分析和代碼實現,大家get到了嗎。在數據分析最頭痛,最花時間的數據清洗和數據預處理環節,通過直接調用模塊化函數,大大的節省了我們耗費的時間,提高數據分析工作的效率。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24