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