譯者 | 布加迪
審校 | 重樓
數據轉換是通過某些計算或方法將數據轉換為另一種值以更好地表示數據的過程。它通常用于滿足某些統(tǒng)計測試假設或澄清數據可視化。有許多數據轉換公式,但不是每種轉換都是一樣的、都能滿足你的需求。
一些流行的數據轉換(比如正態(tài)轉換和對數轉換)占據主導地位,因為它們很容易解釋,并且在不犧牲太多信息的情況下實現(xiàn)轉換目的。
本文將探討五種鮮為人知的數據轉換,它們有望改進分析。
1. Box-Cox轉換
Box-Cox轉換是一種使數據嚴格遵循正態(tài)分布,但由λ參數控制的技術。由于我們可以控制轉換的參數,因此它比簡單的對數轉換靈活得多。
當我們的數據必須嚴格遵循正態(tài)分布或我們想要穩(wěn)定數據方差時,通常使用Box-Cox轉換。通過改變λ參數,轉換器可以有多種轉換形式。比如說,λ = 1表示數據沒有變化,λ = 0表示對數變換,而任何其他λ值都是對數據進行冪變換。
我們可以用下面的Python代碼實現(xiàn)轉換。
import numpy as np
from scipy.stats import boxcox
data = np.random.exponential(scale=2, size=1000)
transformed_data = boxcox(data, lmbda = 0.5)
試一試各種λ,看看它是否適合你的分析。
2. Yeo-Johnson轉換
Box-Cox轉換是一種出色的數據轉換技術,因為我們可以控制轉換量,但它有一個缺點:它只適用于正值。基于Box-Cox轉換,Yeo-Johnson轉換可以處理負值。
與Box-Cox轉換一樣,Yeo-Johnson由λ參數控制,可以根據你的要求進行更改。此外,如果你需要滿足線性模型假設,它適用于改善數據正態(tài)性和均方差。
你可以使用以下代碼運用轉換。
import numpy as np
from scipy.stats import yeojohnson
data = np.random.normal(loc=0, scale=2, size=1000)
transformed_data = yeojohnson(data, lmbda = 0.5)
3. 秩轉換
秩轉換是一種非參數方法,它通過在數據排序時用數據秩替換數據對數據進行轉換。比如說,將最小的數據點轉換成1,下一個最小的數據點轉換成2,以此類推。它通常用于值比秩更不重要的情況。
當我們的數據有很多異常值,或者數據規(guī)??梢院雎詴r,秩轉換很有用。這種轉換可以降低異常值的影響,因為普遍的正態(tài)轉換會受到異常值的影響。秩轉換也常與參數統(tǒng)計檢驗結合使用。
我們可以用下面的Python代碼進行秩轉換:
from scipy.stats import rankdata
import numpy as np
data = np.random.normal(loc=0, scale=2, size=1000)
ranked_data = rankdata(data)
4. 倒數轉換
倒數轉換是一種數據轉換技術,將數據值替換成倒數(1/x),其中x是你可以自己決定的值。當你處理傾斜的數據分布、大多數數據值都很大時,它很有用。倒數轉換會盡量減少大值的影響,以便數據集適用于任何后續(xù)方法。
這種轉換還適用于數據包含遞減關系的情況,因為它可以幫助更線性地表示數據。然而,如果數據包含零或負值,倒數轉換就不好了,因為這種轉換不能正確地表示信息。
至于Python代碼實現(xiàn),你可以使用以下代碼:
import numpy as np
data = np.random.exponential(scale=2, size=1000) + 1
reciprocal_transformed_data = np.reciprocal(data)
5. 分箱轉換(離散化)
分箱轉換或離散化是一種數據轉換技術,它將連續(xù)的數據值分成一定的區(qū)間(分箱)。轉換將數據值替換成分箱標簽。這種實用的轉換技術將數據預處理成具有秩的分類數據,有助于簡化數據并降低噪聲。
這種轉換是有用的,特別是對于那些得益于分類輸入的技術,比如決策樹。它對于處理數據異常值和盡量減小影響也很有用。然而,你必須正確地決定分箱區(qū)間,因為它可能影響數據轉換。你可以嘗試遵循許多經驗法則。比如說,Sturges規(guī)則表示分箱的數量=log(N) + 1,其中N是數據的數量。
對于使用Sturges 規(guī)則的分箱轉換,你可以使用以下Python代碼:
import numpy as np
import pandas as pd
data = np.random.normal(loc=0, scale=1, size=1000)num_bins = int(np.ceil(np.log2(len(data)) + 1))
binned_data = pd.cut(data, bins=num_bins, labels=False)
結論
數據轉換是一種數據預處理技術,它將原始數據轉換成遵循某些計算的另一個值。數據轉換在許多情況下都很有用,可以遵循特定的數據分布或更直觀地獲得洞察力。有許多實用的數據轉換,但鮮為人知,因此本文探討了你應該了解的五種轉換技術。
原文標題:5 Lesser-Known Data Transformation Techniques for Better Analysis,作者:Cornellius Yudha Wijaya