Python 異常值檢測實戰(附代碼與可視化)

2021-12-09 Python數據科學
‍1介紹.什麼是異常值檢測?

異常值檢測也稱為離群值檢測、噪聲檢測、偏差檢測或異常挖掘。一般來說並沒有普遍接受的定義。(Grubbs,1969)給出的一個早期定義是: 異常值或離群值是似乎與其所在的樣本內其他成員明顯偏離的觀測值。(Barnett 和 Lewis,1994)的最新定義是: 與該組數據的其餘部分不一致的觀測值。

.成因

導致異常值的最常見原因有,

自然引入(並不是錯誤,而是數據多樣性導致的數據新穎性).應用

異常值/離群值檢測的應用比較廣泛,例如

活動監視,通過監視電話活動或股票市場中的可疑交易來檢測手機欺詐。網絡性能,監視計算機網絡的性能,例如檢測網絡瓶頸。故障診斷,檢測例如太空梭上的電動機、發電機、管道或太空儀器中的故障。時間序列監視,監視安全關鍵應用,例如鑽孔或高速銑削。檢測文本中的新穎性,檢測新聞事件的出現,進行主題檢測和跟蹤,或讓交易者查明股票、商品、外匯交易事件,表現出色或表現不佳的商品。檢測資料庫中的意外記錄,用於數據挖掘以檢測錯誤、欺詐或有效但異常的記錄。

有三類離群值檢測方法:

在沒有數據先驗知識的情況下確定異常值。這類似於無監督聚類。對正常和異常進行建模。這類似於監督分類,需要標記好數據。僅建模正常數據。這稱為新穎性檢測,類似於半監督識別。這種方法需要屬於正常類的標記數據。

我將處理第一種方法,這也是最常見的情況。大多數數據集並沒有關於異常值的標記數據。

.方法分類.離群值檢測算法

本篇採用的算法有:

2實踐.數據集

這裡將使用 Pokemon[1] 數據集並在 ['HP', 'Speed'] 這兩列上執行異常值檢測。這個數據集具有很少的觀測值,計算將很快。出於可視化目的而只選擇了其中兩列(二維),但該方法適用於多維度處理。

.上代碼

import numpy as np
import pandas as pd
from scipy import stats
import eif as iso
from sklearn import svm
from sklearn.cluster import DBSCAN
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

import matplotlib.dates as md
from scipy.stats import norm
%matplotlib inline 
import seaborn as sns 
sns.set_style("whitegrid") #possible choices: white, dark, whitegrid, darkgrid, ticks


import matplotlib.pyplot as plt
plt.style.use('ggplot')
import plotly.express as px
import plotly.graph_objs as go
import plotly.figure_factory as ff
from plotly import tools
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
pd.set_option('float_format', '{:f}'.format)
pd.set_option('max_columns',250)
pd.set_option('max_rows',150)

data = pd.read_csv('Pokemon.csv')

data.head().T

x1='HP'; x2='Speed'
X = data[[x1,x2]]
X.shape

(800, 2)

.孤立森林

我將使用 sklearn 庫中的 IsolationForest。定義算法時,有一個重要的參數稱為汙染。它是算法期望的離群值觀察值的百分比。我們將 X(具有 HP 和 Speed 2 個特徵)擬合到算法中,並在 X 上使用 fit_predict 來對其進行處理。這將產生普通的異常值(-1 為異常值,1 為異常值)。我們還可以使用函數 decision_function 來獲得 Isolation Forest 給每個樣本的分數。

clf = IsolationForest(max_samples='auto', random_state = 1, contamination= 0.02)

preds = clf.fit_predict(X)

data['isoletionForest_outliers'] = preds
data['isoletionForest_outliers'] = data['isoletionForest_outliers'].astype(str)
data['isoletionForest_scores'] = clf.decision_function(X)

print(data['isoletionForest_outliers'].value_counts())
data[152:156]

1 785
-1 15
Name: isoletionForest_outliers, dtype: int64

將結果繪製出來看看。

fig = px.scatter(data, x=x1, y=x2, color='isoletionForest_outliers', hover_name='Name')
fig.update_layout(title='Isolation Forest Outlier Detection', title_x=0.5, yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

fig = px.scatter(data, x=x1, y=x2, color="isoletionForest_scores")
fig.update_layout(title='Isolation Forest Outlier Detection (scores)', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

從視覺上看,這 15 個點不在主要數據點範圍內,判為離群值似乎合乎常理。

除了異常值和異常值顯示孤立森林的決策邊界外,我們還可以進行更高級的可視化。

data['isoletionForest_outliers']=='1'

0 True
1 True
2 True
3 True
4 True
...
795 True
796 True
797 True
798 True
799 True
Name: isoletionForest_outliers, Length: 800, dtype: bool

X_inliers = data.loc[data['isoletionForest_outliers']=='1'][[x1,x2]]
X_outliers = data.loc[data['isoletionForest_outliers']=='-1'][[x1,x2]]

xx, yy = np.meshgrid(np.linspace(X.iloc[:, 0].min(), X.iloc[:, 0].max(), 50), np.linspace(X.iloc[:, 1].min(), X.iloc[:, 1].max(), 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

fig, ax = plt.subplots(figsize=(15, 7))
plt.title("Isolation Forest Outlier Detection with Outlier Areas", fontsize = 15, loc='center')
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

inl = plt.scatter(X_inliers.iloc[:, 0], X_inliers.iloc[:, 1], c='white', s=20, edgecolor='k')
outl = plt.scatter(X_outliers.iloc[:, 0], X_outliers.iloc[:, 1], c='red',s=20, edgecolor='k')

plt.axis('tight')
plt.xlim((X.iloc[:, 0].min(), X.iloc[:, 0].max()))
plt.ylim((X.iloc[:, 1].min(), X.iloc[:, 1].max()))
plt.legend([inl, outl],["normal observations", "abnormal observations"],loc="upper left");
# plt.show()

顏色越深,該區域就越離群。下面代碼可以查看分數分布。

fig, ax = plt.subplots(figsize=(20, 7))
ax.set_title('Distribution of Isolation Forest Scores', fontsize = 15, loc='center')
sns.distplot(data['isoletionForest_scores'],color='#3366ff',label='if',hist_kws = {"alpha": 0.35});

分布很重要,可以幫助我們更好地確定案例的正確汙染值。如果我們更改汙染值,isoletionForest_scores 將會更改,但是分布將保持不變。該算法將調整分布圖中離群值的截止值。

.擴展孤立森林

孤立森林有一個缺點: 它的決策邊界是垂直或水平的。由於線只能平行於軸,因此某些區域包含許多分支切口,並且只有少量或單個觀測值,這會導致某些觀測值的異常分不正確。

安裝 pip install git+https://github.com/sahandha/eif.git

擴展孤立森林選擇如下操作,

1)分支剪切的隨機斜率,以及

2)從訓練數據的可用值範圍中選擇的隨機截距。這些項實際上是線性回歸線。

X_data = X.values.astype('double')
F1  = iso.iForest(X_data, ntrees=100, sample_size=256, ExtensionLevel=X.shape[1]-1) # X needs to by numpy array
# calculate anomaly scores
anomaly_scores = F1.compute_paths(X_in = X_data)
data['extendedIsoletionForest_scores'] = -anomaly_scores
# determine lowest 2% as outliers
data['extendedIsoletionForest_outliers'] =  data['extendedIsoletionForest_scores'].apply(lambda x: '-1' if x<=data['extendedIsoletionForest_scores'].quantile(0.02) else '1')
print(data['extendedIsoletionForest_outliers'].value_counts())

1 784
-1 16
Name: extendedIsoletionForest_outliers, dtype: int64

fig = px.scatter(data, x=x1, y=x2, color='extendedIsoletionForest_outliers', hover_name='Name')
fig.update_layout(title='Extended Isolation Forest Outlier Detection', title_x=0.5, yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

fig = px.scatter(data, x=x1, y=x2, color="extendedIsoletionForest_scores")
fig.update_layout(title='Extended Isolation Forest Outlier Detection (scores)', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

擴展孤立森林並不提供普通的異常值和正常值(如 -1 和 1)。我們只是通過將得分最低的 2% 作為離群值來創建它們。該算法的分數與基本孤立森林不同,所有分數均為負。

X_inliers = data.loc[data['extendedIsoletionForest_outliers']=='1'][[x1,x2]]
X_outliers = data.loc[data['extendedIsoletionForest_outliers']=='-1'][[x1,x2]]

xx, yy = np.meshgrid(np.linspace(X.iloc[:, 0].min(), X.iloc[:, 0].max(), 50), np.linspace(X.iloc[:, 1].min()-30, X.iloc[:, 1].max()+30, 50))

S1 = F1.compute_paths(X_in=np.c_[xx.ravel(), yy.ravel()])
S1 = S1.reshape(xx.shape)

fig, ax = plt.subplots(figsize=(15, 7))
plt.title("Extended Isolation Forest Outlier Detection with Outlier Areas", fontsize = 15, loc='center')
levels = np.linspace(np.min(S1),np.max(S1),50)
CS = ax.contourf(xx, yy, S1, levels, cmap=plt.cm.Blues)

inl = plt.scatter(X_inliers.iloc[:, 0], X_inliers.iloc[:, 1], c='white', s=20, edgecolor='k')
outl = plt.scatter(X_outliers.iloc[:, 0], X_outliers.iloc[:, 1], c='red',s=20, edgecolor='k')

plt.axis('tight')
plt.xlim((X.iloc[:, 0].min(), X.iloc[:, 0].max()))
plt.ylim((X.iloc[:, 1].min()-30, X.iloc[:, 1].max()+30))
plt.legend([inl, outl],["normal observations", "abnormal observations"],loc="upper left")
# plt.show()

fig, ax = plt.subplots(figsize=(20, 7))
ax.set_title('Distribution of Extended Isolation Scores', fontsize = 15, loc='center')
sns.distplot(data['extendedIsoletionForest_scores'],color='red',label='eif',hist_kws = {"alpha": 0.5});


3局部離群因子 LOF

clf = LocalOutlierFactor(n_neighbors=11)
y_pred = clf.fit_predict(X)

data['localOutlierFactor_outliers'] = y_pred.astype(str)
print(data['localOutlierFactor_outliers'].value_counts())
data['localOutlierFactor_scores'] = clf.negative_outlier_factor_

1 779
-1 21
Name: localOutlierFactor_outliers, dtype: int64

最重要的參數是 n_neighbors。默認值為 20,這給出了 45 個離群值。我將其更改為 11 以得到更少的離群值,接近 2%。

fig = px.scatter(data, x=x1, y=x2, color='localOutlierFactor_outliers', hover_name='Name')
fig.update_layout(title='Local Outlier Factor Outlier Detection', title_x=0.5, yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

fig = px.scatter(data, x=x1, y=x2, color="localOutlierFactor_scores", hover_name='Name')
fig.update_layout(title='Local Outlier Factor Outlier Detection', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

我們可以創建另一個有趣的圖,其中局部離群值越大,其周圍的圓圈越大。

fig, ax = plt.subplots(figsize=(15, 7.5))
ax.set_title('Local Outlier Factor Scores Outlier Detection', fontsize = 15, loc='center')

plt.scatter(X.iloc[:, 0], X.iloc[:, 1], color='k', s=3., label='Data points')
radius = (data['localOutlierFactor_scores'].max() - data['localOutlierFactor_scores']) / (data['localOutlierFactor_scores'].max() - data['localOutlierFactor_scores'].min())
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s=2000 * radius, edgecolors='r', facecolors='none', label='Outlier scores')
plt.axis('tight')
legend = plt.legend(loc='upper left')
legend.legendHandles[0]._sizes = [10]
legend.legendHandles[1]._sizes = [20]
plt.show();

fig, ax = plt.subplots(figsize=(20, 7))
ax.set_title('Distribution of Local Outlier Factor Scores', fontsize = 15, loc='center')
sns.distplot(data['localOutlierFactor_scores'],color='red',label='eif',hist_kws = {"alpha": 0.5});

該算法與以前的算法有很大不同,它以不同的方式找到離群值。

.DBSCAN

一種經典的聚類算法,其工作方式如下:

from sklearn.cluster import DBSCAN
outlier_detection = DBSCAN(eps = 20, metric='euclidean', min_samples = 5,n_jobs = -1)
clusters = outlier_detection.fit_predict(X)

data['dbscan_outliers'] = clusters
data['dbscan_outliers'] = data['dbscan_outliers'].apply(lambda x: str(1) if x>-1 else str(-1))
print(data['dbscan_outliers'].value_counts())

1 787
-1 13
Name: dbscan_outliers, dtype: int64

要調整的最重要參數是 eps。

fig = px.scatter(data, x=x1, y=x2, color="dbscan_outliers", hover_name='Name')
fig.update_layout(title='DBSCAN Outlier Detection', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

.單分類 SVM

有關單分類 SVM 的更多信息可參考,

Outlier Detection with One-Class SVMs[2]One-Class Classification Algorithms for Imbalanced Datasets[3]

clf = svm.OneClassSVM(nu=0.08, kernel='rbf', gamma='auto')
outliers = clf.fit_predict(X)
data['ocsvm_outliers'] = outliers
data['ocsvm_outliers'] = data['ocsvm_outliers'].apply(lambda x: str(-1) if x==-1 else str(1))
data['ocsvm_scores'] = clf.score_samples(X)
print(data['ocsvm_outliers'].value_counts())

-1 481
1 319
Name: ocsvm_outliers, dtype: int64

fig = px.scatter(data, x=x1, y=x2, color="ocsvm_outliers", hover_name='Name')
fig.update_layout(title='One Class SVM Outlier Detection', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

在此數據中找不到更好的 nu,參數在這個例子上似乎不起作用。對於其他 nu 值,離群值更是大於正常值。

.集成

最後,讓我們結合這 5 種算法來構成一種健壯的算法。我將簡單添加離群值列,其中 -1 代表離群值,1 代表正常值。

由於此例中效果不好,因此不使用 One Class SVM。

data['outliers_sum'] = data['isoletionForest_outliers'].astype(int)+data['extendedIsoletionForest_outliers'].astype(int)+data['localOutlierFactor_outliers'].astype(int)+data['dbscan_outliers'].astype(int)

data['outliers_sum'].value_counts()

3 774
1 11
-3 8
-1 7
Name: outliers_sum, dtype: int64

fig = px.scatter(data, x=x1, y=x2, color="outliers_sum", hover_name='Name')
fig.update_layout(title='Ensemble Outlier Detection', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

觀察值 outliers_sum=4 的意思是,所有 4 種算法均同意這是一個正常值,而對於離群值的完全一致是其和為 -4。

首先,讓我們看看所有算法中哪些被認為是離群值,然後將 sum = 4 的觀察值設為正常值,其餘則作為離群值。

data.loc[data['outliers_sum']==-4]['Name']

121 Chansey
155 Snorlax
217 Wobbuffet
261 Blissey
313 Slaking
316 Shedinja
431 DeoxysSpeed Forme
495 Munchlax
Name: Name, dtype: object

data['outliers_sum'] = data['outliers_sum'].apply(lambda x: str(1) if x==4 else str(-1))

fig = px.scatter(data, x=x1, y=x2, color="outliers_sum", hover_name='Name')
fig.update_layout(title='Ensemble Outlier Detection', title_x=0.5,yaxis=dict(gridcolor = '#DFEAF4'), xaxis=dict(gridcolor = '#DFEAF4'), plot_bgcolor='white')
# fig.show()

相關焦點

  • 【Python數據分析基礎】: 異常值檢測和處理
    在機器學習中,異常檢測和處理是一個比較小的分支,或者說,是機器學習的一個副產物,因為在一般的預測問題中,模型通常是對整體樣本數據結構的一種表達方式,這種表達方式通常抓住的是整體樣本一般性的性質,而那些在這些性質上表現完全與整體樣本不一致的點,我們就稱其為
  • 異常值檢測
    本文將帶你利用高斯分布這一有利工具來進行異常值檢測。實踐本次以吳恩達第八次作業為例,動手實驗異常值檢測,包括原始數據的可視化,二維高斯分布的概率密度函數及其參數估計,最佳閾值的選定和異常值的篩選及異常數據的可視化。
  • 四種檢測異常值的常用技術簡述
    在這篇博文中,將展示KNIME分析平臺中四種最常用的異常值檢測的技術。四種異常值檢測技術數字異常值|Numeric Outlier數字異常值方法是一維特徵空間中最簡單的非參數異常值檢測方法,異常值是通過IQR(InterQuartile Range)計算得的。
  • windows下如何安裝numpy、pandas、matplotlib、seaborn的python包?(附可視化展示+代碼)
    安裝pip安裝模塊numpypandasmatplotlibseabornpython數據可視化測試安裝python    如果想安裝numpy、pandas或matplotlib的python模塊,需要先安裝python。
  • 一文讀懂異常檢測 LOF 算法(Python代碼)
    上一篇介紹:一文讀懂層次聚類(Python代碼)本篇介紹一個經典的異常檢測算法:局部離群因子(Local Outlier Factor),簡稱LOF算法。在異常檢測模式下,只有fit_predict生成離群點預測的方法可用。可以使用negative_outlier_factor_屬性檢索訓練數據的異常值分數,但無法為未見過的數據生成分數。模型會根據contamination參數(默認值為 0.1)自動選擇異常值的閾值。
  • 使用模板匹配在Python上進行對象檢測!(附代碼)
    了解如何在沒有機器學習或任何框架的情況下在Python上進行對象檢測每當我們聽說「 對象檢測 」時,我們就會想到機器學習以及不同的框架。但是我們實際上可以在不使用機器學習或任何其他框架的情況下進行對象檢測。在本文中,我將向您展示如何僅使用Python進行操作。
  • 【Python教程】用Python進行數據可視化
    下面我們就用上面這個簡單的數據集作為例子,展示用 Python 做出9種可視化效果,並附有相關代碼。$ python --versionPython 3.6.9$ pip3 --versionpip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
  • 推薦 | Python機器學習項目實戰(附代碼 + 可下載)【一】
    今天是第一部分(1-3)從數據清理,到數據分析,到特徵工程,再到Baseline的構建,作者以淺顯易懂的語言和清晰的示例和代碼教你從頭開始走過一個機器學習之旅,並且附詳細的代碼,大家可以收藏和學習。 缺少數據和異常值除了不正確的數據類型外,處理真實世界數據時的另一個常見問題是缺失值。 這可能是由於許多原因引起的,在我們訓練機器學習模型之前必須填寫或刪除。首先,讓我們了解每列中有多少缺失值(請參閱notebook中的代碼)。
  • 獨家 | 在Python中使用廣義極端學生化偏差(GESD)進行異常檢測(附連結)
    ,展示了Python代碼示例和相關源碼。關鍵字:Python 異常值檢測 ESD圖源: Unsplash異常檢測在生活中起著非常重要的作用。通常,異常數據可能與某種問題或罕見事件有關,例如 銀行欺詐、醫療問題、結構缺陷、設備故障等。這種聯繫使得能夠挑選出哪些數據點可以被視為異常值是非常有趣的,因為從商業角度識別這些事件通常是十分有趣的事情。此外,許多統計方法對異常值的存在很敏感。
  • python數據可視化--matpltolib繪製箱線圖
    同理,下四分位數是升序排列後處在25%位置上的數,上限是最大值,下限是最小值,最上方的圓點是異常值,即與其它數據相比,顯得有些另類或不合群的數據。箱線圖在python中用plt.boxplot()函數進行繪製,具體見以下代碼:import matplotlib.pyplot as plt data=[2,4,5,6,7,4,5,6,4,5,6,10]plt.boxplot(data)plt.grid(ls='--',alpha=0.4)從結果圖反映出中位數是
  • python深度學習目標檢測自學全框架!
    深度學習——Python語言——pytorch實戰——目標檢測培訓——某一目標檢測算法研究——改進方案研究——測試修改測試修改——撰寫論文。 文章說明:大家都是從機械跨入計算機視覺領域的,如何正確的進入該領域,展開學習,完成論文的發表,是一件令人迷茫的事情。我曾經迷茫過,經過多方向、漫長、痛苦的探索,才慢慢明了。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • Python數據清洗(三):異常值識別與處理
    異常值也稱為離群點,就是那些遠離絕大多數樣本點的特殊群體,通常這樣的數據點在數據集中都表現出不合理的特性。如果忽視這些異常值,在某些建模場景下就會導致結論的錯誤(如線性回歸模型、K均值聚類等),所以在數據的探索過程中,有必要識別出這些異常值並處理好它們。
  • python人工智慧項目實戰,PDF+源碼
    《Python AI項目實戰本書中所有示例的原始碼都是可用的,使用Google OR-Tools以Python編寫。它還包括一個隨機問題生成器,可用於行業應用或研究。AI項目體驗地址 https://loveai.tech閱讀過本文的人還看了以下:分享《深度學習入門:基於Python的理論與實現》高清中文版PDF+原始碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼
  • 基於python的大數據分析-pandas數據讀取(代碼實戰)
    書籍推薦《大話軟體測試》出版啦,內容包括但不限於性能、自動化、接口、安全、移動APP非功能測試、抓包、loadrunner、jmeter、soapui、Appium、python
  • 【實戰+代碼+數據】Python機器學習隨筆之logistic回歸識別手寫數字
    代碼實現Python機器學習隨筆之非線性分類的logistic回歸擬合及正則化編者註:本文用logistic回歸來識別多分類問題的手寫數字,是之前logisitic回歸二分類問題的延續,該篇文章關於其思想以及編程原理見本人之前文章,在這裡只注重識別及其編程過程。
  • 【乾貨】Python機器學習機器學習項目實戰3——模型解釋與結果分析(附代碼)
    用python完成一個完整的機器學習項目:第三部分——Interpreting a machine learning model and presenting results本系列的第一部分【1】中,討論了數據清理、數據分析、特徵工程和特徵選擇。
  • 使用biopython可視化染色體和基因元件
    在biopython中,通過BiolGraphics子模塊可以對基因組結構進行可視化,支持線性和圈圖兩種可視化方式。其中,基因組結構信息存儲在genebank格式的文件中,首先通過Bio.SeqIO讀取結構信息,然後通過Bio.Graphics模塊進行可視化。
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    4、python全棧工程師後端 (1) Django入門 (2) Django高級 (3) Django實戰 5、python全棧工程師後端高級 (
  • Python數據可視化-seaborn Iris鳶尾花數據
    我們將紙鳶花數據集中不同種類花的petal length和petal width做swarmplot可視化。Boxplot箱形圖,主要包含六個數據節點,將一組數據從大到小排列,分別計算出上邊緣,上四分位數Q3,中位數,下四分位數Q1,下邊緣,還有異常值。