對(duì)于非結(jié)構(gòu)化數(shù)據(jù),EDA探索性數(shù)據(jù)分析該怎么做?
探索性數(shù)據(jù)分析是機(jī)器學(xué)習(xí)開(kāi)發(fā)生命周期的關(guān)鍵階段之一,在任何現(xiàn)實(shí)生活中的數(shù)據(jù)分析項(xiàng)目中,它幾乎占用了整個(gè)項(xiàng)目50-60%的時(shí)間,因?yàn)槲覀儽仨氂脕?lái)尋找洞察力的數(shù)據(jù)是原始數(shù)據(jù),在應(yīng)用機(jī)器學(xué)習(xí)算法之前必須進(jìn)行處理,以獲得最佳性能。這個(gè)步驟必須包括以下內(nèi)容:
- 涉及更好地分析和總結(jié)數(shù)據(jù)集,以了解其潛在的模式、關(guān)系和趨勢(shì)。
- 識(shí)別基本的數(shù)據(jù)特征,檢測(cè)異?;虍惓V?,并確定最合適的建模技術(shù)來(lái)預(yù)測(cè)未來(lái)的結(jié)果。
讓我們通過(guò)一個(gè)故事來(lái)理解EDA在數(shù)據(jù)分析中的意義。
從一個(gè)故事理解EDA的重要性
一家小公司剛剛在市場(chǎng)上開(kāi)展業(yè)務(wù)。這家公司有一群對(duì)自己的角色充滿熱情的專業(yè)人士,他們以一種方式工作使整個(gè)公司都能獲利。隨著公司開(kāi)始在員工或用戶方面增加對(duì)其推廣產(chǎn)品的了解,管理團(tuán)隊(duì)意識(shí)到,他們需要幫助了解用戶或客戶對(duì)公司提供的產(chǎn)品或服務(wù)的需求和行為。
為了克服這個(gè)問(wèn)題,他們開(kāi)始聘請(qǐng)一些技術(shù)專業(yè)人員。最終,他們?cè)跀?shù)據(jù)分析師的職位下找到了一個(gè)技術(shù)人員,以便他們能夠更好地了解客戶數(shù)據(jù)。該分析師將能夠從中找到重要的信息或見(jiàn)解。他們聘請(qǐng)的分析師在他們主要從事探索性數(shù)據(jù)分析的同一類型技術(shù)或項(xiàng)目中具有良好的實(shí)踐經(jīng)驗(yàn)。
因此,對(duì)于這個(gè)問(wèn)題,他們開(kāi)始通過(guò)網(wǎng)絡(luò)抓取從多個(gè)API收集數(shù)據(jù),其中包括公司網(wǎng)站、社交媒體、論壇等。收集完數(shù)據(jù)后,他們開(kāi)始清理和處理數(shù)據(jù),以便他們能夠從這些數(shù)據(jù)中找到一些見(jiàn)解。他們使用統(tǒng)計(jì)技術(shù)如假設(shè)測(cè)試和商業(yè)智能工具來(lái)探索數(shù)據(jù),并使用模式識(shí)別技術(shù)發(fā)現(xiàn)隱藏的模式。
在建立管道后,他們觀察到公司的客戶對(duì)購(gòu)買環(huán)保和可持續(xù)的產(chǎn)品最感興趣。公司管理層基于這些見(jiàn)解推出了環(huán)保和可持續(xù)的產(chǎn)品。于是,基于這些更新,新產(chǎn)品得到了客戶的喜歡,最終,公司的收入開(kāi)始成倍增長(zhǎng)。管理層已經(jīng)開(kāi)始意識(shí)到探索性數(shù)據(jù)分析的重要性,并聘請(qǐng)了更多的數(shù)據(jù)分析師。
因此,在本文中,受上述故事的啟發(fā),我們將了解管道的探索性數(shù)據(jù)分析階段里面的不同技術(shù),并在這個(gè)過(guò)程中使用流行的工具。本文為初學(xué)者和有經(jīng)驗(yàn)的數(shù)據(jù)分析師提供了EDA的全面概述及其在數(shù)據(jù)科學(xué)中的重要性。
實(shí)施的不同技術(shù)
為了理解EDA內(nèi)部使用的每一種技術(shù),本文將研究一個(gè)數(shù)據(jù)集,并使用用于數(shù)據(jù)科學(xué)的Python庫(kù)(例如NumPy、Pandas、Matplotlib等)來(lái)實(shí)現(xiàn)分析。
本文將在分析中使用的數(shù)據(jù)集是Titanic數(shù)據(jù)集,它可以從這里(https://www.kaggle.com/c/titanic/data)下載。本文將使用train.csv進(jìn)行模型訓(xùn)練。
1.導(dǎo)入必要的庫(kù)和依賴項(xiàng)
在實(shí)施之前,首先導(dǎo)入必要的庫(kù),本文將利用這些庫(kù)來(lái)實(shí)現(xiàn)不同的EDA技術(shù),包括:
- 用于矩陣操作的NumPy
- 用于數(shù)據(jù)分析的Pandas
- 用于數(shù)據(jù)可視化的Matplotlib和Seaborn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
2.加載和分析數(shù)據(jù)集
在導(dǎo)入所有需要的庫(kù)之后,我們將使用Pandas dataframe加載Titanic數(shù)據(jù)集。然后我們可以開(kāi)始執(zhí)行不同的數(shù)據(jù)預(yù)處理技術(shù),為進(jìn)一步建模和歸納準(zhǔn)備數(shù)據(jù)。
passenger_data = pd.read_csv('titanic.csv')
passenger_data.head(5)
輸出:
圖 1
3.獲取統(tǒng)計(jì)摘要
下面的分析為我們提供了數(shù)據(jù)中所有數(shù)值列的統(tǒng)計(jì)數(shù)據(jù)。我們可以從這個(gè)函數(shù)中得到的統(tǒng)計(jì)數(shù)據(jù)是:
- 計(jì)數(shù)
- 平均數(shù)和中位數(shù)
- 標(biāo)準(zhǔn)偏差
- 最小值和最大值
- 不同的四分位數(shù)值
passenger_data.describe()
輸出:
圖 2
通過(guò)解釋上述輸出,我們可以看到有891名乘客,平均存活率為38%。年齡欄的最小值和最大值在0.42至80之間,平均年齡約為30歲。另外,至少有50%的乘客沒(méi)有兄弟姐妹/配偶,至少有75%的乘客沒(méi)有父母/子女,票價(jià)一欄的數(shù)值也有很大變化。
讓我們?cè)囍ㄟ^(guò)從頭開(kāi)始編寫代碼來(lái)計(jì)算生存率。
4.計(jì)算乘客的總體存活率
為了計(jì)算總體存活率,首先選擇Survived列,檢查數(shù)值為1的行,然后計(jì)算所有這些行。最后,為了找到百分比,我們將用它除以總行數(shù)并輸出結(jié)果。
survived_data = passenger_data[passenger_data['Survived'] == 1]
survived = survived_data.count().values[1]
survival_percent = (survived/891) * 100
print('The percentage of survived people in training data are {}'.format(survival_percent))
輸出:
The percentage of survived people in training data are 38.38383838383838
5.按gender和Pclass列計(jì)算存活率
現(xiàn)在,我們必須用聚合運(yùn)算找到不同列的存活率,我們將使用gender和 Pclass列,然后應(yīng)用均值函數(shù)來(lái)找到它,然后輸出結(jié)果。
survival_rate = passenger_data[['Pclass', 'Sex','Survived']].groupby(['Pclass', 'Sex'], as_index = False).mean().sort_values('Survived', ascending = False)
print(survival_rate)
輸出:
Pclass Sex Survived
0 1 female 0.968085
2 2 female 0.921053
4 3 female 0.500000
1 1 male 0.368852
3 2 male 0.157407
5 3 male 0.135447
6.將Passenger Id、Survived、Pclass的數(shù)據(jù)類型改為String。
由于某些列具有不同的數(shù)據(jù)類型,我們將所有這些列轉(zhuǎn)換為一個(gè)固定數(shù)據(jù)類型。即String(字符串)。
Cols = [ 'PassengerId', 'Survived', 'Pclass' ]
for index in Cols:
passenger_data[index] = passenger_data[index].astype(str)
passenger_data.dtypes
7.數(shù)據(jù)集中重復(fù)的行
在進(jìn)行數(shù)據(jù)建模時(shí),如果存在重復(fù)的行,我們的性能可能會(huì)下降。因此,始終建議刪除重復(fù)的行。
passenger_data.loc[passenger_data.duplicated(), :]
8.創(chuàng)建直方圖以檢查數(shù)據(jù)分布情況
為了根據(jù)該列的可能值找到幸存列的分布,以便我們可以檢查類偏差,如果有任何問(wèn)題,我們可以應(yīng)用諸如過(guò)量取樣、欠量取樣、SMOTE等技術(shù)來(lái)克服該問(wèn)題。
sb.set_style("white")
g = sb.FacetGrid(data = train[train['Age'].notna()], col = 'Survived')
g.map(plt.hist, "Age");
輸出:
圖 3
現(xiàn)在,如果我們比較上述兩個(gè)分布,那么建議使用相對(duì)頻率,而不是使用累積密度函數(shù)等的絕對(duì)頻率。由于我們以年齡一欄為例,具有絕對(duì)頻率的直方圖表明,在20-30歲的年齡組中受害者比幸存者多得多。
9.按生存值繪制年齡中缺失值百分比圖
在這里,我們創(chuàng)建了餅狀圖來(lái)尋找按生存值計(jì)算的缺失值的百分比,然后查看分區(qū)。
dt0 = train['Age'][train['Survived']=='0']
dt1 = train['Age'][train['Survived']=='1']
plt.figure(figsize = [15, 5])
plt.subplot(1, 2, 1)
age_na_pie(dt0)
plt.title('Survived: No');
plt.subplot(1, 2, 2)
age_na_pie(dt1)
plt.title('Survived: Yes');
輸出:
圖 4
餅狀圖顯示,年齡缺失的乘客更有可能成為受害者。
10.尋找每一列中的缺失值數(shù)量
passenger_data.isnull().sum()
從輸出結(jié)果中,可以觀察到Cabin列具有最大的缺失值,所以我們將從分析中刪除該列。
11.每列空值的百分比
passenger_data.isna().sum()/passenger_data.shape[0]
在Age一欄中,大約有20%的數(shù)據(jù)缺失,Cabin一欄中大約有77%的數(shù)據(jù)缺失,Embarked一欄中有0.2%的數(shù)據(jù)缺失。我們的目的是在建模之前處理缺失的數(shù)據(jù)。
12.從數(shù)據(jù)集中刪除Cabin一列
刪除Cabin這一列,因?yàn)樗泻芏嗳笔У闹怠?/p>
drop_column = passenger_data.drop(labels = ['Cabin'], axis = 1)
print(drop_column)
為了處理Age列,首先,我們將檢查Age列的數(shù)據(jù)類型并將其轉(zhuǎn)換為整數(shù)數(shù)據(jù)類型,然后用Age列的中位數(shù)來(lái)填補(bǔ)Age列中所有的缺失值。
datatype = passenger_data.info('Age')
fill_values = passenger_data['Age'].fillna(int(passenger_data['Age'].median()),inplace=True)
print(fill_values)
在這之后,數(shù)據(jù)集在缺失值、離群值等方面看起來(lái)不錯(cuò)?,F(xiàn)在,如果我們應(yīng)用機(jī)器學(xué)習(xí)算法來(lái)查找數(shù)據(jù)集中的模式,然后在測(cè)試數(shù)據(jù)上進(jìn)行測(cè)試,與沒(méi)有預(yù)處理和探索性數(shù)據(jù)分析或數(shù)據(jù)處理的數(shù)據(jù)相比,模型的性能會(huì)更強(qiáng)。
來(lái)自EDA的收獲
以下是幸存者與受害者相比的特征:
- 幸存者很可能有父母或子女陪伴;與其他人相比,他們的機(jī)票更貴。
- 與所有年齡段的受害者相比,兒童更有可能存活下來(lái)。
- 年齡缺失的乘客成為幸存者的可能性較小。
- pclass(SES)較高的乘客更有可能存活下來(lái)。
- 女性比男性更有可能存活下來(lái)。
- Cherbourg的乘客比Queenstown和Southampto的乘客有更高的生存機(jī)會(huì)。
總結(jié)
本文的討論到此結(jié)束。當(dāng)然,在EDA中還有很多技術(shù)比本文在這里介紹的要多得多,這取決于用戶在問(wèn)題陳述中要使用的數(shù)據(jù)集??偠灾?,EDA在使用數(shù)據(jù)來(lái)訓(xùn)練模型之前,了解數(shù)據(jù)是有益的。這種技術(shù)在任何數(shù)據(jù)科學(xué)項(xiàng)目中都起著至關(guān)重要的作用,使簡(jiǎn)單模型在項(xiàng)目中使用時(shí)能有更好的表現(xiàn)。因此,每個(gè)有抱負(fù)的數(shù)據(jù)科學(xué)家、數(shù)據(jù)分析師、機(jī)器學(xué)習(xí)工程師和分析經(jīng)理都需要正確了解這些技術(shù)。