在資料分析領域,理解多變數之間的關聯性至關重要。利用視覺化工具可以有效地呈現這些關聯,例如散佈圖、等高線圖、熱力圖可以呈現數值變數之間的關係,而列聯表則適用於類別變數。此外,箱形圖和提琴圖能比較數值變數在不同類別下的分佈。實務上,R 語言和 Python 提供了豐富的套件和函式來實作這些視覺化方法,方便資料分析師快速探索資料的特性。

有效地進行資料抽樣能提升資料分析的效率與準確性。簡單隨機抽樣適用於資料均勻分佈的場景,而分層抽樣則適用於資料分佈不均勻的情況,能確保每個子群體都有足夠的樣本量,提高樣本的代表性。選擇適當的抽樣方法和樣本大小,對於減少偏差、提高分析效率至關重要,尤其在處理大規模資料集時,更需要謹慎選擇抽樣策略。此外,瞭解選擇偏差和迴歸均值等常見陷阱,並採取相應的預防措施,才能確保資料分析結果的可靠性和有效性。

探討多變數之間的關聯

在資料分析中,探索兩個以上的變數之間的關係是非常重要的。本章節將介紹如何使用不同的視覺化工具來呈現多變數之間的關聯。

兩個數值變數的視覺化

要呈現兩個數值變數之間的關係,常用的視覺化工具有散佈圖(Scatterplot)、六邊形分箱圖(Hexagonal Binning)和等高線圖(Contour Plot)等。這些圖表可以有效地展示兩個變數之間的相關性和分佈情況。

等高線圖

等高線圖是一種特殊的視覺化工具,用於呈現兩個數值變數之間的密度分佈。Figure 1-9 展示了房屋的稅務評估價值與完工平方英尺之間的等高線圖。

熱力圖和其他視覺化工具

除了等高線圖外,熱力圖和六邊形分箱圖也是呈現兩個數值變數之間密度分佈的有效工具。這些圖表可以幫助我們更直觀地瞭解資料的分佈特徵。

兩個類別變數的視覺化

對於兩個類別變數的總結,列聯表(Contingency Table)是一種非常有用的工具。Table 1-8 展示了貸款等級與貸款狀態之間的列聯表。這個表格清晰地展示了不同貸款等級下的貸款狀態分佈。

列聯表的建立

在 R 語言中,可以使用 descr 套件中的 CrossTable 函式來建立列聯表。而在 Python 中,可以使用 pivot_table 方法來建立列聯表,並透過計算百分比來進一步分析資料。

library(descr)
x_tab <- CrossTable(lc_loans$grade, lc_loans$status,
                    prop.c=FALSE, prop.chisq=FALSE, prop.t=FALSE)
crosstab = lc_loans.pivot_table(index='grade', columns='status',
                                aggfunc=lambda x: len(x), margins=True)
df = crosstab.loc['A':'G',:].copy()
df.loc[:,'Charged Off':'Late'] = df.loc[:,'Charged Off':'Late'].div(df['All'],
                                                                  axis=0)
df['All'] = df['All'] / sum(df['All'])
perc_crosstab = df

類別變數與數值變數的比較

要比較一個數值變數在不同類別下的分佈,箱形圖(Boxplot)和提琴圖(Violin Plot)是非常有效的視覺化工具。Figure 1-10 和 Figure 1-11 分別展示了航空公司延誤率的箱形圖和提琴圖。

箱形圖與提琴圖的比較

箱形圖可以清晰地展示資料的四分位數和離群值,而提琴圖則可以更詳細地展示資料的密度分佈。兩者結合使用可以更全面地瞭解資料的特徵。

ggplot(data=airline_stats, aes(airline, pct_carrier_delay)) +
  ylim(0, 50) +
  geom_violin() +
  labs(x='', y='Daily % of Delayed Flights')
ax = sns.violinplot(airline_stats.airline, airline_stats.pct_carrier_delay,
                    inner='quartile', color='white')
ax.set_xlabel('')
ax.set_ylabel('Daily % of Delayed Flights')

多變數視覺化

要呈現多個變數之間的關係,可以使用條件視覺化(Conditioning)的方法。Figure 1-12 展示了房屋的稅務評估價值與完工平方英尺之間的關係,並根據郵政編碼進行了分組。

分面視覺化

分面視覺化是一種有效的多變數視覺化方法,可以清晰地展示不同條件下的資料分佈。在 R 語言中,可以使用 ggplot2 套件中的 facet_wrapfacet_grid 函式來實作分面視覺化。在 Python 中,可以使用 seaborn 套件來建立分面圖。

ggplot(subset(kc_tax0, ZipCode %in% c(98188, 98105, 98108, 98126)),
       aes(x=SqFtTotLiving, y=TaxAssessedValue)) +
  stat_binhex(color='white') +
  theme_bw() +
  scale_fill_gradient(low='white', high='blue') +
  labs(x='Finished Square Feet', y='Tax-Assessed Value') +
  facet_wrap('ZipCode')

程式碼解密:

  1. 選取特定郵政編碼的資料:使用 subset 函式篩選出特定郵政編碼的資料,以減少資料量並聚焦於特定的區域。
  2. 設定 ggplot 的美學屬性:使用 aes 函式設定 x 軸為房屋的完工平方英尺,y 軸為稅務評估價值。
  3. 使用六邊形分箱圖呈現資料密度stat_binhex 函式將資料分成六邊形的格子,並根據資料點的密度進行著色。
  4. 調整主題和顏色漸層:使用 theme_bw 將主題設定為黑白,並使用 scale_fill_gradient 設定顏色的漸層,從白色(低密度)到藍色(高密度)。
  5. 新增標籤和分面:使用 labs 函式新增 x 軸和 y 軸的標籤,並使用 facet_wrap 根據郵政編碼進行分面,每個郵政編碼顯示一個獨立的子圖。

透過上述步驟,可以清晰地比較不同郵政編碼區域的房屋稅務評估價值與完工平方英尺之間的關係。

資料視覺化與探索性資料分析

在進行資料分析時,視覺化是一種強大的工具,可以幫助我們瞭解資料的分佈和變數之間的關係。以下是使用Python進行資料視覺化的範例:

zip_codes = [98188, 98105, 98108, 98126]
kc_tax_zip = kc_tax0.loc[kc_tax0.ZipCode.isin(zip_codes),:]
kc_tax_zip

def hexbin(x, y, color, **kwargs):
    cmap = sns.light_palette(color, as_cmap=True)
    plt.hexbin(x, y, gridsize=25, cmap=cmap, **kwargs)

g = sns.FacetGrid(kc_tax_zip, col='ZipCode', col_wrap=2)
g.map(hexbin, 'SqFtTotLiving', 'TaxAssessedValue',
      extent=[0, 3500, 0, 700000])
g.set_axis_labels('Finished Square Feet', 'Tax-Assessed Value')
g.set_titles('Zip code {col_name:.0f}')

內容解密:

  1. 首先,定義了一個包含特定郵遞區號的列表zip_codes,並從kc_tax0資料集中篩選出這些郵遞區號對應的資料,儲存在kc_tax_zip中。
  2. 定義了一個名為hexbin的函式,用於建立六邊形箱圖。該函式使用了seabornlight_palette函式來建立一個顏色對映,並使用matplotlibhexbin函式來繪製六邊形箱圖。
  3. 使用seabornFacetGrid函式建立了一個分面網格圖,將資料根據郵遞區號分成多個子圖,並使用map函式將hexbin函式應用於每個子圖。
  4. 設定了x軸和y軸的標籤,以及每個子圖的標題。

資料視覺化的重要性

資料視覺化是探索性資料分析(EDA)的重要組成部分。透過視覺化,我們可以快速瞭解資料的分佈、找出異常值、並探索變數之間的關係。

探索性資料分析的關鍵概念

  • 六邊形箱圖和等高線圖是探索兩個數值變數之間關係的有效工具。
  • 列聯表是用於探索兩個類別變數之間關係的標準工具。
  • 箱圖和小提琴圖可以用於比較一個數值變數在不同類別之間的分佈。

資料取樣的重要性

在進行資料分析時,取樣是一種重要的技術,可以幫助我們減少資料量、提高計算效率、並減少偏差。隨機取樣是一種確保樣本代表性的有效方法。

隨機抽樣中的關鍵術語

樣本(Sample)

從一個較大的資料集中抽取的子集。

總體(Population)

較大的資料集或資料集的概念。

N(n)

總體(樣本)的大小。

隨機抽樣(Random Sampling)

隨機地將元素納入樣本中。

分層抽樣(Stratified Sampling)

將總體劃分為多個層(strata),然後從每個層中隨機抽取樣本。

層(Stratum,複數:strata)

總體中具有共同特徵的同質子群體。

簡單隨機樣本(Simple Random Sample)

未對總體進行分層,直接進行隨機抽樣所得到的樣本。

偏差(Bias)

系統性的錯誤。

樣本偏差(Sample Bias)

樣本不能代表總體的情況。

1936年,《文摘》(Literary Digest)預測阿爾夫·蘭登(Alf Landon)將在選舉中擊敗富蘭克林·羅斯福(Franklin Roosevelt),但結果卻大相徑庭。該雜誌對超過1000萬人進行了調查,但喬治·蓋洛普(George Gallup)僅調查了2000人,卻準確預測了羅斯福的勝利。兩者結果的差異在於選民的選擇方法。《文摘》注重數量,而忽略了選民的選擇方法,最終導致了樣本偏差。

自我選擇偏差(Self-Selection Sampling Bias)

在社交媒體上對餐廳、酒店等的評論容易產生偏差,因為發表評論的人並非隨機選擇,而是自發地撰寫評論。這種自我選擇偏差可能導致評論不能代表大多數人的意見。然而,在比較不同機構時,這種偏差可能會相互抵消,因此仍具有一定的參考價值。

偏差的型別

統計學中的偏差是指由測量或抽樣過程引起的系統性錯誤。區分隨機誤差和系統性偏差非常重要。考慮一個射擊靶子的例子,槍械本身可能存在偏差,但每次射擊仍會有隨機誤差。無偏差的過程會產生隨機誤差,但不會朝特定方向偏移,如圖2-2所示。而圖2-3則顯示了一個有偏差的過程,雖然仍有隨機誤差,但整體上傾向於落在右上象限。

隨機選擇

為了避免《文摘》預測錯誤的問題,喬治·蓋洛普採用了更科學的方法來獲得代表性的樣本。隨機抽樣是實作代表性的核心方法,但並不容易。首先,需要定義可接觸的總體。例如,在進行客戶調查時,需要定義什麼是客戶,並確定抽樣程式。如果涉及連續的資料流,如實時交易或網站訪客,則需要考慮時間因素。

在分層抽樣中,總體被劃分為多個層,然後從每個層中隨機抽取樣本。例如,民意調查可能會對不同種族的人群進行分層抽樣,以確保每個群體都有足夠的樣本量。

樣本大小與品質:何時規模重要?

在資料量龐大的時代,較小的樣本有時反而更好。花時間和精力進行隨機抽樣不僅可以減少偏差,還能讓我們更專注於資料探索和資料品質。例如,在數千條記錄的樣本中查詢缺失值或異常值比在數百萬條記錄中更容易做到。

那麼,什麼時候需要大量資料呢?典型的場景是資料不僅量大,而且稀疏。例如,谷歌處理的搜尋查詢可以形成一個巨大的矩陣,其中大多數條目為“0”。只有當積累了如此龐大的資料量時,才能為大多數查詢傳回有效的搜尋結果。對於熱門搜尋詞,這不是問題,但對於那些出現頻率極低的查詢,例如“一百萬分之一”,現代搜尋技術的價值在於能夠傳回詳細且有用的結果。

程式碼範例:簡單隨機抽樣

import random

def simple_random_sampling(data, sample_size):
    # 確保樣本大小不超過資料集大小
    sample_size = min(sample_size, len(data))
    # 進行簡單隨機抽樣
    return random.sample(data, sample_size)

# 測試資料
data = list(range(100))
sample = simple_random_sampling(data, 10)
print("簡單隨機抽樣結果:", sample)

內容解密:

  1. random.sample(data, sample_size):此函式用於從 data 中隨機選取 sample_size 個元素,確保每個元素只被選取一次。
  2. min(sample_size, len(data)):確保要求的樣本大小不會超過資料集的大小,避免錯誤。
  3. list(range(100)):生成一個包含0到99的測試資料集,用於測試簡單隨機抽樣函式。
  4. simple_random_sampling 函式封裝了簡單隨機抽樣的邏輯,使得重複使用變得容易。

分層抽樣的程式實作

import pandas as pd
import numpy as np

# 生成模擬資料
data = {
    'category': np.random.choice(['A', 'B', 'C'], size=1000),
    'value': np.random.rand(1000)
}
df = pd.DataFrame(data)

# 分層抽樣
def stratified_sampling(df, category_column, sample_size_per_category):
    sampled_df = pd.DataFrame()
    for category in df[category_column].unique():
        category_df = df[df[category_column] == category]
        # 對每個類別進行隨機抽樣
        sample = category_df.sample(min(sample_size_per_category, len(category_df)))
        sampled_df = pd.concat([sampled_df, sample])
    return sampled_df

# 對每個類別抽取10個樣本
sampled_data = stratified_sampling(df, 'category', 10)
print("分層抽樣結果:\n", sampled_data)

內容解密:

  1. np.random.choice:用於生成具有指定分佈的隨機類別。
  2. df.sample:對每個類別進行隨機抽樣,min(sample_size_per_category, len(category_df)) 確保不會超過該類別的資料數量。
  3. pd.concat:將不同類別的樣本合併成一個DataFrame。
  4. stratified_sampling 函式:封裝了分層抽樣的邏輯,可重複使用。

圖表展示:不同抽樣方法的比較

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 多變數關聯視覺化與抽樣技術

package "統計分析流程" {
    package "資料收集" {
        component [樣本資料] as sample
        component [母體資料] as population
    }

    package "描述統計" {
        component [平均數/中位數] as central
        component [標準差/變異數] as dispersion
        component [分佈形狀] as shape
    }

    package "推論統計" {
        component [假設檢定] as hypothesis
        component [信賴區間] as confidence
        component [迴歸分析] as regression
    }
}

sample --> central : 計算
sample --> dispersion : 計算
central --> hypothesis : 檢驗
dispersion --> confidence : 估計
hypothesis --> regression : 建模

note right of hypothesis
  H0: 虛無假設
  H1: 對立假設
  α: 顯著水準
end note

@enduml

此圖示展示了簡單隨機抽樣和分層抽樣的區別,說明瞭分層抽樣如何提高樣本的代表性。

選擇偏差與迴歸均值:資料分析中的常見陷阱

在資料科學和統計學中,選擇偏差(Selection Bias)是一個常見且重要的問題。它發生在資料的選擇過程中,無論是有意識還是無意識地,導致結論具有誤導性或暫時性。這種現象在資料探勘和研究中尤其值得注意,因為重複檢視大量資料集是資料科學的核心價值主張之一。

選擇偏差的型別

選擇偏差有多種形式,包括但不限於:

  1. 非隨機抽樣:與前一節討論的隨機抽樣相對,非隨機抽樣可能導致樣本不能代表整體母體,從而產生偏差。
  2. 資料探勘(Data Snooping):在資料中廣泛搜尋有趣的模式或結果,可能會發現一些看似有趣但實際上只是偶然的結果。
  3. 大規模搜尋效應(Vast Search Effect):重複執行不同的模型或使用大量預測變數,可能會偶然發現一些有趣的結果,但這些結果不一定具有普遍意義或可重複性。
  4. 選擇時間間隔:選擇特定的時間間隔來強調某種統計效應。
  5. 在實驗結果看起來“有趣”時停止實驗:這可能會導致結果的偏差,因為它忽略了實驗過程中可能出現的隨機波動。

迴歸均值

迴歸均值(Regression to the Mean)是一種特殊的選擇偏差,發生在連續測量同一變數時。極端觀測值往往會被更中心的觀測值所接續。這種現象在體育領域很常見,例如“新秀年現象”和隨後的表現下滑。

為什麼會發生迴歸均值?

大多數體育表現都涉及兩個元素:

  • 技巧:運動員的技術水平。
  • 運氣:比賽中的隨機因素。

當我們選出表現最佳的新秀時,技巧和好運氣可能都發揮了作用。在下一賽季中,技巧仍然存在,但好運氣可能不再存在,因此表現就會下降——迴歸到平均值。

避免選擇偏差的方法

為了避免選擇偏差,可以採取以下幾種方法:

  1. 指定假設並進行實驗:在收集資料之前,先提出假設,並根據隨機化和隨機抽樣原則進行實驗。
  2. 使用保留集:將資料分成訓練集和測試集,以驗證模型的效能。
  3. 目標洗牌(Target Shuffling):一種排列測試,用於測試資料探勘模型所建議的預測關聯的有效性。

重點整理

  • 明確指定假設並遵循隨機化和隨機抽樣原則進行資料收集,可以避免偏差。
  • 其他形式的資料分析都存在因資料收集/分析過程而產生偏差的風險。
  • 重複執行模型、研究中的資料探勘和事後選擇有趣事件,都可能導致偏差。
內容解密:
  1. 本段重點在於闡述「選擇偏差」的概念及其對資料分析的影響,並提出了避免此類別偏差的方法。
  2. 進一步闡述「迴歸均值」的現象及其成因,並舉例說明其在體育領域的應用。
  3. 最後總結了避免選擇偏差和正確進行資料分析的重要性。