
數(shù)據(jù)分析中非常實(shí)用的自編函數(shù)和代碼模塊整理
搞了接近四個(gè)周的模型開發(fā)工作,今天整理代碼文件,評(píng)分卡模型基本告一段落了。那么在模型開發(fā)或者是我們?nèi)粘5臄?shù)據(jù)分析工作中,根據(jù)我們具體的業(yè)務(wù)需求,經(jīng)常會(huì)重復(fù)地用到某些模塊的功能。而這些模塊的功能在R的packages里是沒有的,這個(gè)時(shí)候,我們一般是通過自己寫代碼實(shí)現(xiàn)功能。通俗的說,在數(shù)據(jù)分析工作中,我們經(jīng)常會(huì)通過調(diào)用自編函數(shù)來實(shí)現(xiàn)某些高級(jí)的功能。
一般在結(jié)束某項(xiàng)數(shù)據(jù)分析的工作之后,對(duì)于使用頻率比較高的模塊功能,我會(huì)將實(shí)現(xiàn)代碼封裝在一個(gè)模塊函數(shù)當(dāng)中,并命好名,方便下次調(diào)用。其實(shí)你可以把它理解為自己開發(fā)的一個(gè)package,通過模塊化的調(diào)用,提高我們?cè)跀?shù)據(jù)分析工作中的效率,而不用每次都用造輪子式的方法來敲代碼!
我一直認(rèn)為這是一個(gè)很好的習(xí)慣,你的自編函數(shù)或者說是代碼模塊積累得越多,對(duì)于以后的建模工作來說會(huì)更加輕車熟路,這也是每一個(gè)數(shù)據(jù)分析師在工作的過程當(dāng)中積累的寶貴經(jīng)驗(yàn)。
說了這么多,今天給大家分享幾個(gè)我平時(shí)用得比較多,實(shí)用性也比較強(qiáng)的自編函數(shù)和代碼模塊,方便大家借鑒參考。
1、centralImputation( )
根據(jù)樣本間的相似性填補(bǔ)缺失值方法,把實(shí)現(xiàn)代碼封裝在如下函數(shù)中,并將該函數(shù)命名為centralImputation
根據(jù)樣本之間的相似性填補(bǔ)缺失值是指用這些缺失值最可能的值來填補(bǔ)它們,通常使用能代表變量中心趨勢的值進(jìn)行填補(bǔ),因?yàn)榇碜兞恐行内厔莸闹捣从沉俗兞糠植嫉淖畛R娭?。代表變量中心趨勢的指?biāo)包括平均值、中位數(shù)、眾數(shù)等,那么我們采用哪些指標(biāo)來填補(bǔ)缺失值呢?最佳選擇是由變量的分布來確定,例如,對(duì)于接近正態(tài)分布的變量來說,由于所有觀測值都較好地聚集在平均值周圍,因此平均值就就是填補(bǔ)該類變量缺失值的最佳選擇。然而,對(duì)于偏態(tài)分布或者離群值來說,平均值就不是最佳選擇。因?yàn)?a href='/map/piantaifenbu/' style='color:#000;font-size:inherit;'>偏態(tài)分布的大部分值都聚集在變量分布的一側(cè),平均值不能作為最常見值的代表。對(duì)于偏態(tài)分布或者有離群值的分布而言,中位數(shù)是更好地代表數(shù)據(jù)中心趨勢的指標(biāo)。對(duì)于名義變量(如定性指標(biāo)),通常采用眾數(shù)填補(bǔ)缺失值。
我們將上述分析放在一個(gè)統(tǒng)一的函數(shù)centralImputation( )中,對(duì)于數(shù)值型變量,我們用中位數(shù)填補(bǔ),對(duì)于名義變量,我們用眾數(shù)填補(bǔ),函數(shù)代碼如下:
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])]
}
}
}
調(diào)用上述函數(shù)對(duì)缺失值進(jìn)行填補(bǔ),代碼如下:
x<-centralImputation(data)
View(x) #查看填補(bǔ)結(jié)果
2、knnImputation( )
根據(jù)變量間的相關(guān)關(guān)系填補(bǔ)缺失值(基于knn算法)
上述按照中心趨勢進(jìn)行缺失值填補(bǔ)的方法,考慮的是數(shù)據(jù)每列的數(shù)值或字符屬性,在進(jìn)行缺失值填補(bǔ)時(shí),我們也可以考慮每行的屬性,即根據(jù)變量之間的相關(guān)關(guān)系填補(bǔ)缺失值。
當(dāng)我們采用數(shù)據(jù)集每行的屬性進(jìn)行缺失值填補(bǔ)時(shí),通常有兩種方法,第一種方法是計(jì)算k個(gè)(我用的k=10)最相近樣本的中位數(shù)并用這個(gè)中位數(shù)來填補(bǔ)缺失值。如果缺失值是名義變量,則使用這k個(gè)最近相似數(shù)據(jù)的加權(quán)平均值進(jìn)行填補(bǔ),權(quán)重大小隨著距離待填補(bǔ)缺失值樣本的距離增大而減小,本文我們采用高斯核函數(shù)從距離獲得權(quán)重,即如果相鄰樣本距離待填補(bǔ)缺失值的樣本的距離為d,則它的值在加權(quán)平均中的權(quán)重為:
在尋找跟包含缺失值的樣本最近的k個(gè)鄰居樣本時(shí),最常用的經(jīng)典算法是knn(k-nearest-neighbor) 算法,它通過計(jì)算樣本間的歐氏距離,來尋找距離包含缺失值樣本最近的k個(gè)鄰居,樣本x和y之間歐式距離的計(jì)算公式如下:
式中:δi()是變量i的兩個(gè)值之間的距離,即
在計(jì)算歐式距離時(shí),為了消除變量間不同尺度的影響,通常要先對(duì)數(shù)值變量進(jìn)行標(biāo)準(zhǔn)化,即:
我們將上述根據(jù)數(shù)據(jù)集每行的屬性進(jìn)行缺失值填補(bǔ)的方法,封裝到knnImputation( )函數(shù)中,代碼如下:
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,]
}
調(diào)用knnImputation( )函數(shù),用knn方法填補(bǔ)缺失值,代碼如下:
d<-knnImputation(data)
View(d) #查看填補(bǔ)結(jié)果
以上兩個(gè)模塊化函數(shù)的分析和代碼實(shí)現(xiàn),大家get到了嗎。在數(shù)據(jù)分析最頭痛,最花時(shí)間的數(shù)據(jù)清洗和數(shù)據(jù)預(yù)處理環(huán)節(jié),通過直接調(diào)用模塊化函數(shù),大大的節(jié)省了我們耗費(fèi)的時(shí)間,提高數(shù)據(jù)分析工作的效率。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03