免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用Python,pandas,seaborn和scikit-Learn進行探索性數據分析

在這篇文章中,我將使用流行的Python軟件包在Titanic機器學習數據集(https://www.kaggle.com/francksylla/titanic-machine-learning-from-disaster)上執(zhí)行EDA :pandas,matplotlib,seaborn和scikit-learn。

大綱:

  • 什么是數據
  • 分類分析
  • 定量分析
  • 聚類
  • 基于樹的估算器的特征重要性
  • 儀表板技術

1.什么是數據

首先是一些理論。“數據”一詞于1946年首次用于表示“可傳輸和存儲的計算機信息”。在最高層次上,數據可以大致分為兩大類:結構化和非結構化。結構化數據是預先定義的數據模型,通常駐留在具有固定模式的關系數據庫或數據倉庫中。常見的示例包括事務信息、客戶信息和日期等。非結構化數據沒有預先定義的數據模型,并且存在于NoSQL數據庫和數據湖中。示例包括圖像、視頻文件和音頻文件。

在這篇文章中,我們將專注于結構化數據,我將提出一種系統的方法來快速顯示您數據中的潛在統計數據。在結構化數據的框架下,我們可以進一步將它們分類為分類和定量。對于分類數據,算術規(guī)則不適用。在分類中,我們有定類數據和定序數據,而在定量中,我們有區(qū)間和比率。重要的是,我們需要花一些時間來清楚地定義和理解每個術語之間的細微差別,因為這將影響我們以后的分析和預處理技術。

4種不同類型的數據

定類數據(Nominal data)

“nominal”這個名字來自拉丁語nomen,意思是名字。定類數據是通過一個簡單的命名系統進行區(qū)分的對象。需要注意的一件重要事情是,定類數據可能也有分配給它們的數字。這可能看起來是有序,但它們不是。編號僅用于捕獲和引用。一些例子包括:

  • 一個國家集。
  • 運動員編號

定序數據(Ordinal data)

定序數據是順序重要的項。更正式地說,它們在序號上的相對位置為我們提供了意義。默認情況下,定序數據的順序是通過給它們分配數字來定義的。但是,字母或其他順序符號也可使用。一些例子包括:

  • 比賽的比賽排名(第1名,第2名,第3名)
  • 組織中的工資等級(Associate,AVP,VP,SVP)。

定距數據(Interval data)

與定序數據類似,定距數據沿著每個對象的位置彼此等距的標度來測量。這個獨特的屬性允許算術應用于它們。一個例子是

  • 以華氏度為單位的溫度,其中78度和79度之間的差值與45度和46度之間的差值相同。

定比數據(Ratio data)

與Interval數據一樣,Ratio數據的差異也很有意義。定比數據具有附加功能,使得對象的比率也有意義,即它們具有真正的零點。零表示缺少某種財產。因此,當我們說某些東西是零重量時,我們的意思是那個東西沒有質量。一些例子包括:

  • 一個人在體重秤上的重量

定距與定比

定距和定比之間的區(qū)別就是一個沒有真正的零點,而另一個有。這個例子很好地說明了這一點:當我們說某物是華氏0度時,它并不意味著它沒有熱量。這種獨特的特性使得“華氏80度是華氏40度的兩倍”等比率的說法不成立。

在我們深入研究其他部分之前,我想對一些概念進行形式化,以便您在思考過程中明確我們?yōu)槭裁匆獔?zhí)行下面所示的操作。

首先我要說的是,快速顯示數據摘要的最佳方法是通過2D圖。盡管我們生活在3D空間世界中,但發(fā)現難以感知第三維度,例如深度,3D繪圖在2D屏幕上的投影。因此,在隨后的章節(jié)中,您會看到我們只使用定類數據的條形圖和定量數據的箱形圖,因為它們分別簡潔地表達了數據分布。我們只關注單變量分析和雙變量分析與目標變量。

我們主要使用seaborn和pandas來實現這一目標。眾所周知,統計數據是任何數據科學家工具包的重要組成部分,而seaborn可以快速方便地使用matplotlib來精確地顯示數據的統計數據。matplotlib功能強大,但有時會變得復雜。Seaborn提供了matplotlib的高級抽象,使我們能夠輕松地繪制有吸引力的統計圖。為了充分利用seaborn,我們還需要pandas,因為seaborn最適合使用pandas的DataFrames。

2.定類分析

我們可以開始使用pd.read_csv()讀取數據。通過在數據框架上執(zhí)行.head(),我們可以快速查看數據的前5行。其他有用的方法是 .desribe(), .info():

后者會顯示:

我們現在看到,

定類數據:

  • PassengerId,
  • Survived,
  • Pclass,
  • Name,
  • Sex,
  • Ticket,
  • Cabin,
  • Embarked

而定量數據:

  • Age,
  • SibSp,
  • Parch,
  • Fare

現在,憑借這些知識以及我們在第1部分中學到的知識,讓我們編寫一個自定義輔助函數,可以用來處理大多數類別的定類數據,并快速總結它們。我們將借助panda方法和seaborn .countplot()方法來完成這些工作 。調用輔助函數categorical_summarized,Python實現如下所示。

def categorical_summarized(dataframe, x=None, y=None, hue=None, palette='Set1', verbose=True): ''' Helper function that gives a quick summary of a given column of categorical data Arguments ========= dataframe: pandas dataframe x: str. horizontal axis to plot the labels of categorical data, y would be the count y: str. vertical axis to plot the labels of categorical data, x would be the count hue: str. if you want to compare it another variable (usually the target variable) palette: array-like. Colour of the plot Returns ======= Quick Stats of the data and also the count plot ''' if x == None: column_interested = y else: column_interested = x series = dataframe[column_interested] print(series.describe()) print('mode: ', series.mode()) if verbose: print('='*80) print(series.value_counts()) sns.countplot(x=x, y=y, hue=hue, data=dataframe, palette=palette) plt.show()

categorical_summary的作用是它接受一個data frame,一些輸入參數和輸出如下:

  • 數值數據的計數,平均值,std,最小值,最大值和四分位數,或非數值數據的頂級類別的計數,唯一,頂級類和非數值數據的頂級類的頻率。
  • 感興趣列的類頻率,如果verbose設置為True
  • 感興趣的列的每個類的計數的條形圖

我們來談談輸入參數。x和y采用str類型,它對應于我們想要研究的感興趣的列。將列的名稱設置為x將創(chuàng)建一個條形圖,其中x軸顯示不同的類及其在y軸上的計數。將感興趣的列的名稱設置為y將翻轉先前圖的軸,其中不同的類將在y軸上,x軸顯示該計數。通過將色相設置為目標變量(在本例中Survived ),該函數將顯示目標變量w.r.t.對感興趣列的依賴關系。顯示categorical_summary用法的一些示例代碼如下:

單變量分析

# Target Variable: Survivalc_palette = ['tab:blue', 'tab:orange']categorical_summarized(train_df, y = 'Survived', palette=c_palette)

會給出以下內容:

雙變量分析

# Feature Variable: Gendercategorical_summarized(train_df, y = 'Sex', hue='Survived', palette=c_palette)

會給出以下內容:

在性別變量上輸出categorical_summarized,其中hue設置為Survived

3.定量分析

現在,從技術上講,我們可以使用條形圖進行定量數據處理,但它通常會相當混亂(您可以嘗試在Age列上使用categorical_summary)。一個更整潔的方法是使用一個箱型圖,它會根據一個5個數字的摘要來顯示分布,最小,Q1,中位數,Q3,和最大值。

下一個調用的輔助函數quantitative_summarized 定義如下:

def quantitative_summarized(dataframe, x=None, y=None, hue=None, palette='Set1', ax=None, verbose=True, swarm=False): ''' Helper function that gives a quick summary of quantattive data Arguments ========= dataframe: pandas dataframe x: str. horizontal axis to plot the labels of categorical data (usually the target variable) y: str. vertical axis to plot the quantitative data hue: str. if you want to compare it another categorical variable (usually the target variable if x is another variable) palette: array-like. Colour of the plot swarm: if swarm is set to True, a swarm plot would be overlayed Returns ======= Quick Stats of the data and also the box plot of the distribution ''' series = dataframe[y] print(series.describe()) print('mode: ', series.mode()) if verbose: print('='*80) print(series.value_counts()) sns.boxplot(x=x, y=y, hue=hue, data=dataframe, palette=palette, ax=ax) if swarm: sns.swarmplot(x=x, y=y, hue=hue, data=dataframe, palette=palette, ax=ax) plt.show()

類似于categorical_summarized ,quantitative_summarized輸入data frame和一些輸入參數來輸出潛在統計數據,以及一個box plot和swarm plot(如果swarm被設置為true)。

quantitative_summary可以接受一個定量變量和兩個定類變量,其中定量變量必須分配給y,其他兩個定類變量可以分別分配給x和hue。下面是一些示例代碼,展示了它的用法:

單變量分析

# univariate analysisquantitative_summarized(dataframe= train_df, y = 'Age', palette=c_palette, verbose=False, swarm=True)

會給出以下內容:

雙變量分析

# bivariate analysis with target variablequantitative_summarized(dataframe= train_df, y = 'Age', x = 'Survived', palette=c_palette, verbose=False, swarm=True)

會給出以下內容:

多變量分析

# multivariate analysis with Embarked variable and Pclass variablequantitative_summarized(dataframe= train_df, y = 'Age', x = 'Embarked', hue = 'Pclass', palette=c_palette3, verbose=False, swarm=False)

會給出以下內容:

在Age變量上輸出quant_summarized,其中x設置為Survived,hue設置為Pclass

4.聚類

k-Means聚類

k-means聚類屬于劃分聚類。在劃分群集中,我們必須指定我們想要的聚類數k。這可以通過選擇下圖的“below”點來完成。

由于K Means計算特征之間的距離以確定以下觀察是否屬于某個質心,我們必須通過編碼定類變量并填充缺失值來預處理我們的數據。一個簡單的預處理函數如下所示。

def simple_preprocessing(dataframe, train=True): le = LabelEncoder() X = dataframe.drop(['PassengerId', 'Cabin', 'Name', 'Ticket'], axis=1) X['Age'] = X['Age'].fillna(value=X['Age'].mode()[0]) X['Embarked'] = le.fit_transform(X['Embarked'].fillna(value=X['Embarked'].mode()[0])) X['Sex'] = np.where(X['Sex'] == 'male', 1, 0) if train: X = X.drop(['Survived'], axis=1) y = np.where(dataframe['Survived'] == 1, 'Alive', 'Dead') y = pd.get_dummies(y, columns=['Survived']) return X, y else: return X

現在我們已經處理了數據,我們必須執(zhí)行特征縮放,以便可以比較特征之間的距離。這可以通過sklearn.preprocessing庫輕松完成。。運行k-means算法后,我們設置k = 2,我們可以繪制變量,Python如下所示。

import matplotlib as mplfig = plt.figure(figsize = (8,10))mpl.rcParams['image.cmap'] = 'jet'labels = pipeline.predict(sample_train)x_label = 'Survived'y_label = 'Age'plt.scatter(sample_train[x_label], sample_train[y_label], c = labels, alpha = 0.3)plt.xlabel(x_label)plt.xticks(sample_train[x_label])plt.ylabel(y_label)plt.show()

凝聚層次聚類

對于本小節(jié),我將介紹另一種通過聚類執(zhí)行EDA的快速方法。凝聚聚類使用自下而上的方法,其中個體觀察基于它們的距離迭代地連接在一起。我們將使用該scipy.cluster.hierarchy包來執(zhí)行鏈接并使用樹形圖顯示我們的結果。兩個聚類之間的距離通過最近鄰方法計算。

from scipy.cluster.hierarchy import linkagefrom scipy.cluster.hierarchy import dendrogramsample_train,sample_val, gt_train, gt_val = train_test_split(train_df, train_df['Survived'], test_size=0.05, random_state=99)sample_val_processed = simple_preprocessing(sample_val, train = False)sample_val_processed = scaler.fit_transform(sample_val_processed)mergings = linkage(sample_val_processed, method='complete')fig = plt.figure(figsize = (16,10))dendrogram(mergings, labels=np.array(sample_val['Name']), leaf_rotation=90, leaf_font_size=10)plt.show()

5.基于樹的估算器的特征重要性

另一種執(zhí)行EDA的快速方法是通過基于樹的估算器。決策樹在最終輸出預測的葉節(jié)點之前學習如何“最佳”地將機器學習數據集拆分成較小的子集。拆分通常由諸如基尼或信息增益熵的雜質標準定義。由于這是關于EDA而不是決策樹的帖子,我不會詳細解釋它們背后的數學,但我將向您展示如何使用它們更好地理解您的特征。

基于雜質標準,可以通過greedily picking有助于獲得最多信息增益的特征來構建樹。為了說明這一點,我將使用該scikit-learn庫。

構建隨機森林分類器

我們首先構建一個隨機森林分類器。默認情況下,雜質標準設置為Gini。使用以下Python代碼,我們可以看到我們的Titanic機器學習數據集的相應特征重要性。

from sklearn.ensemble import RandomForestClassifierrf_clf = RandomForestClassifier(n_estimators = 500, max_depth=12)rf_clf.fit(X_train, y_train)rf_y_pred = rf_clf.predict(X_val)pd.Series(rf_clf.feature_importances_, index = X_train.columns).nlargest(12).plot(kind = 'barh', figsize = (10, 10), title = 'Feature importance from RandomForest').invert_yaxis();

XGBoost

另一種創(chuàng)建決策樹集合的方法是通過XGBoost,它是梯度提升框架系列的一部分。使用以下Python代碼,我們可以看到哪個相應的特征對我們的XGBoost很重要。同樣,默認情況下,雜質標準設置為Gini。

from xgboost import XGBClassifierxgb_clf = XGBClassifier(max_depth=12, learning_rate=1e-4,n_estimators=500)xgb_clf.fit(X_train, np.argmax(np.array(y_train), axis = 1))xgb_y_pred = xgb_clf.predict(X_val)pd.Series(xgb_clf.feature_importances_, index = X_train.columns).nlargest(12).plot(kind = 'barh', figsize = (10, 10), title = 'Feature importance from XGBoost').invert_yaxis();

6.Dashboarding 技術

與圖表不同,Dashboarding 的創(chuàng)建是為了在一個屏幕上以干凈,簡潔的方式客觀地顯示重要信息,目的是告知并不誤導其讀者。通常,Dashboarding 是利用我們的視覺感知能力以擴大認知的數據的表示。他們展示的信息具有很高的圖形優(yōu)勢,所有人都能理解,不需要補充信息進行解釋。

要實現圖形卓越,必須遵循以下兩個關鍵方面:

  • 最大化數據:Ink 和最小化Chartjunk
  • 具有高圖形完整性

數據:Ink 和Chartjunk

數據:Ink 定義為用于表示數據的墨水,而Chartjunk就是圖中垃圾元素,這些元素不單讓閱讀者分心失去數據要表達的重點。

圖像顯示了一個男人的臉的側面,同時也能可看到他的正面。

實現圖形完整性

有六個原則來確保圖形完整性:

  • 使數字的表示與數量成比例
  • 使用清晰,詳細和完整的標簽
  • 顯示數據變化,而不是設計變化
  • 使用標準化單位,而不是標稱值
  • 用小于或等于'n'個可變維度描述'n'數據維度
  • 引用完整上下文中的數據

因此,我們避免使用餅狀圖或3D圖形或區(qū)域尺寸。條形圖和箱形圖是實現圖形完整性的良好示例,因為它們簡單(每個人都可以理解而沒有歧義)且強大。同樣重要的是不要忽略上下文,比如讓軸將定量數據顯示為0。

圖形完整性差的誤導圖形示例

到目前為止,Tableau在儀表板方面可能是行業(yè)領導者。他們采用最佳的儀表板實踐,并且通過拖放操作完成為您繪制圖表的繁重工作。我強烈建議任何對此領域感興趣的人來看看Tableau。另一個與Tableau類似的開源項目叫做Apache Superset。

結論

總而言之,有許多方法可以進行EDA。EDA是整個數據科學過程的一部分,這是一個高度迭代的過程。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Seaborn入門系列(三)
[數據可視化]Seaborn簡單介紹
第二熱門語言:從入門到精通,Python數據科學簡潔教程
數據可視化干貨:使用pandas和seaborn制作炫酷圖表(附代碼)
手把手|數據科學速成課:給Python新手的實操指南
最新頂尖數據分析師必用的15大Python庫(上)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服