使用Python分析時序數(shù)據(jù)集中的缺失數(shù)據(jù)
簡介
時間序列數(shù)據(jù)幾乎每秒都會從多種來源收集,因此經(jīng)常會出現(xiàn)一些數(shù)據(jù)質(zhì)量問題,其中之一是缺失數(shù)據(jù)。
在序列數(shù)據(jù)的背景下,缺失信息可能由多種原因引起,包括采集系統(tǒng)的錯誤(例如傳感器故障)、傳輸過程中的錯誤(例如網(wǎng)絡(luò)連接的故障)或者數(shù)據(jù)收集過程中的錯誤(例如數(shù)據(jù)記錄過程中的人為錯誤)。這些情況經(jīng)常會在數(shù)據(jù)集中產(chǎn)生零散和明確的缺失值,對應(yīng)于采集數(shù)據(jù)流中的小缺口。
此外,缺失信息也可能由于領(lǐng)域本身的特性而自然產(chǎn)生,從而在數(shù)據(jù)中形成較大的缺口。例如,某個特征在一段時間內(nèi)停止采集,從而產(chǎn)生非顯性的缺失數(shù)據(jù)。
無論底層原因如何,時間序列中存在缺失數(shù)據(jù)會對預(yù)測和預(yù)測模型產(chǎn)生嚴(yán)重的不利影響,并且可能對個人(例如誤導(dǎo)的風(fēng)險(xiǎn)評估)和業(yè)務(wù)結(jié)果(例如偏差的業(yè)務(wù)決策、收入和機(jī)會的損失)造成嚴(yán)重后果。
因此,在為建模方法準(zhǔn)備數(shù)據(jù)時,一個重要的步驟是能夠識別這些未知信息的模式,因?yàn)樗鼈儗椭覀儧Q定處理數(shù)據(jù)的最佳方法,以提高數(shù)據(jù)的一致性和效率,可以通過某種形式的對齊校正、數(shù)據(jù)插值、數(shù)據(jù)填補(bǔ),或者在某些情況下,進(jìn)行逐案刪除(即,在特定分析中對具有缺失值的特征省略案例)。
因此,進(jìn)行全面的探索性數(shù)據(jù)分析和數(shù)據(jù)剖析是不可或缺的,這不僅有助于理解數(shù)據(jù)特征,還能就如何為分析準(zhǔn)備最佳數(shù)據(jù)做出明智決策。
在這個實(shí)踐教程中,我們將探索如何使用新版本ydata-profiling最近推出的功能來解決這些相關(guān)問題。本文將使用Kaggle上提供的美國污染數(shù)據(jù)集(許可證DbCL v1.0),該數(shù)據(jù)集詳細(xì)記錄了美國各州的NO2、O3、SO2和CO污染物的信息。
【ydata-profiling】:https://github.com/ydataai/ydata-profiling
【Kaggle上提供的美國污染數(shù)據(jù)集】:https://www.kaggle.com/datasets/sogun3/uspollution?resource=download
實(shí)踐教程:對美國污染數(shù)據(jù)集進(jìn)行剖析
為了開始我們的教程,首先需要安裝最新版本的ydata-profiling:
pip install ydata-profiling==4.5.1
然后就可以加載數(shù)據(jù),刪除不必要的特征,并專注于我們要研究的內(nèi)容。為了本例的目的,我們將重點(diǎn)研究亞利桑那州馬里科帕縣斯科茨代爾站測量的空氣污染物的特定行為:
import pandas as pd
data = pd.read_csv("data/pollution_us_2000_2016.csv")
data = data.drop('Unnamed: 0', axis = 1) # 刪除不必要的索引
# 從亞利桑那州,馬里科帕縣,斯科茨代爾站(站點(diǎn)編號:3003)選擇數(shù)據(jù)
data_scottsdale = data[data['Site Num'] == 3003].reset_index(drop=True)
現(xiàn)在,準(zhǔn)備開始對數(shù)據(jù)集進(jìn)行剖析!請記住,在使用時間序列剖析時,我們需要傳遞參數(shù)tsmode=True,以便ydata-profiling可以識別與時間相關(guān)的特征:
# 將'Date Local'改為日期時間格式
data_scottsdale['Date Local'] = pd.to_datetime(data_scottsdale['Date Local'])
# 創(chuàng)建概述報(bào)告
profile_scottsdale = ProfileReport(data_scottsdale, tsmode=True, sortby="Date Local")
profile_scottsdale.to_file('profile_scottsdale.html')
時間序列概述
輸出報(bào)告將與我們已經(jīng)知道的內(nèi)容一樣熟悉,但在體驗(yàn)上有所改進(jìn),并新增了時間序列數(shù)據(jù)的匯總統(tǒng)計(jì):
圖片
從概述中可以通過查看所提供的匯總統(tǒng)計(jì)數(shù)據(jù),從而對該數(shù)據(jù)集有一個整體的了解:
- 它包含14個不同的時間序列,每個時間序列有8674個記錄值;
- 該數(shù)據(jù)集報(bào)告了2000年1月至2010年12月的10年數(shù)據(jù);
- 時間序列的平均時間間隔為11小時零7分鐘左右。這意味著平均而言每11小時就進(jìn)行一次測量。
還可以獲取數(shù)據(jù)中所有序列的概覽圖,可以選擇以原始值或縮放值顯示:可以很容易地把握序列的總體變化情況,以及正在測量的組分(二氧化氮、臭氧、二氧化硫、一氧化碳)和特征(平均值、第一最大值、第一最大小時、空氣質(zhì)量指數(shù))。
檢查缺失數(shù)據(jù)
在對數(shù)據(jù)有一個總體了解之后,我們可以關(guān)注每個時間序列的具體情況。
在最新版本的ydata-profiling中,分析報(bào)告在針對時間序列數(shù)據(jù)方面進(jìn)行了大幅改進(jìn),即針對“時間序列”和“間隙分析”指標(biāo)進(jìn)行報(bào)告。這些新功能極大地方便了趨勢和缺失模式的識別,現(xiàn)在還提供了具體的匯總統(tǒng)計(jì)數(shù)據(jù)和詳細(xì)的可視化。
所有時間序列都會呈現(xiàn)不穩(wěn)定模式,其中在連續(xù)測量之間似乎存在某種“跳躍”。這表明存在缺失數(shù)據(jù)(缺失信息的“間隙”),應(yīng)該對其進(jìn)行更仔細(xì)的研究。本文以S02 Mean為例來看一下。
圖片
圖片
在研究間隙分析所提供的細(xì)節(jié)時,可以獲得對于已識別間隙特征的信息描述??傮w而言,時間序列中有25個間隙,最短間隔為4天,最長為32周,平均為10周。
從所呈現(xiàn)的可視化效果中,可以注意到較為“隨機(jī)”的細(xì)條紋代表的是較小的間隙,而較大的間隙似乎遵循著一種重復(fù)的模式。這表明我們的數(shù)據(jù)集中存在兩種不同的缺失數(shù)據(jù)模式。
較小的間隙對應(yīng)于產(chǎn)生缺失數(shù)據(jù)的零星事件,很可能是由于采集過程中的錯誤而發(fā)生的,通??梢院苋菀椎貙?shù)據(jù)進(jìn)行插值或從數(shù)據(jù)集中刪除。反之,較大的間隙則更為復(fù)雜,需要進(jìn)行更詳細(xì)的分析,因?yàn)樗鼈兛赡芙沂玖诵枰鼜氐捉鉀Q的潛在模式。
在本文的例子中,如果我們調(diào)查較大的間隙,實(shí)際上會發(fā)現(xiàn)它們反映了一個季節(jié)性模式:
df = data_scottsdale.copy()
for year in df["Date Local"].dt.year.unique():
for month in range(1,13):
if ((df["Date Local"].dt.year == year) & (df["Date Local"].dt.month ==month)).sum() == 0:
print(f'Year {year} is missing month {month}.')
# Year 2000 is missing month 4.
# Year 2000 is missing month 5.
# Year 2000 is missing month 6.
# Year 2000 is missing month 7.
# Year 2000 is missing month 8.
# (...)
# Year 2007 is missing month 5.
# Year 2007 is missing month 6.
# Year 2007 is missing month 7.
# Year 2007 is missing month 8.
# (...)
# Year 2010 is missing month 5.
# Year 2010 is missing month 6.
# Year 2010 is missing month 7.
# Year 2010 is missing month 8.
正如我們所猜測的那樣,時間序列中呈現(xiàn)出一些較大的信息間隙,它們似乎具有重復(fù)性,甚至是季節(jié)性的:在大多數(shù)年份中,從5月到8月(第5至8個月)之間未收集數(shù)據(jù)。出現(xiàn)這種情況可能是由于不可預(yù)測的原因,或者與業(yè)務(wù)決策有關(guān),例如與削減成本有關(guān)的決定,或者僅僅是與天氣模式、溫度、濕度和大氣條件相關(guān)的污染物的季節(jié)性變化有關(guān)。
根據(jù)這些發(fā)現(xiàn),我們可以進(jìn)一步調(diào)查為什么會發(fā)生這種情況,是否應(yīng)該采取措施防止今后出現(xiàn)這種情況,以及如何處理我們目前擁有的數(shù)據(jù)。
最后的思考:填補(bǔ)、刪除、重新對齊?
在本教程中,已經(jīng)了解到理解時間序列中缺失數(shù)據(jù)模式的重要性,以及有效的分析方法如何揭示缺失信息的奧秘。無論是電信、醫(yī)療、能源還是金融等所有收集時間序列數(shù)據(jù)的行業(yè),都會在某個時候面臨缺失數(shù)據(jù)的問題,并需要決定處理和從中提取所有可能知識的最佳方法。
通過全面的數(shù)據(jù)分析,我們可以根據(jù)手里擁有的數(shù)據(jù)特征做出明智而高效的決策:
- 信息間隙可能是由于采集、傳輸和收集過程中的零星事件導(dǎo)致的。我們可以通過修復(fù)問題以防止其再次發(fā)生,并根據(jù)間隙的長度進(jìn)行插值或填補(bǔ)缺失數(shù)據(jù)。
- 信息間隙也可能表示季節(jié)性或重復(fù)性模式。我們可以選擇重構(gòu)我們的流程,開始收集缺失的信息,或者用來自其他分布式系統(tǒng)的外部信息替代缺失的間隙。我們還可以確定檢索過程是否失?。ㄒ苍S是在數(shù)據(jù)工程方面輸入錯誤的查詢)。
希望本教程能夠幫助你正確識別和描述時間序列數(shù)據(jù)中的缺失數(shù)據(jù),期待你在間隙分析中的發(fā)現(xiàn)!