1. 程式人生 > >python資料預處理 :資料抽樣

python資料預處理 :資料抽樣

何為資料抽樣:

抽樣是資料處理的一種基本方法,常常伴隨著計算資源不足、獲取全部資料困難、時效性要求等情況使用。

抽樣方法:

一般有四種方法:

  • 隨機抽樣 直接從整體資料中等概率抽取n個樣本。這種方法優勢是,簡單、好操作、適用於分佈均勻的場景;缺點是總體大時無法一一編號
  • 系統抽樣 又稱機械、等距抽樣,將總體中個體按順序進行編號,然後計算出間隔,再按照抽樣間隔抽取個體。優勢,易於理解、簡便易行。缺點是,如有明顯分佈規律時容易產生偏差。
  • 群體抽樣 總體分群,在隨機抽取幾個小群代表總體。優點是簡單易行、便與組織;缺點是群體劃分容易造成誤差
  • 分層抽樣 先按照觀察指標影響較大的某一種特徵,將總體分若干個類別,再從每一層隨機抽取一定數量的單位合併成總體。優點樣本代表性好,少誤差

以上四種基本抽樣方法都屬單階段抽樣,實際應用中常根據實際情況將整個抽樣過程分為若干階段來進行,稱為多階段抽樣。
各種抽樣方法的抽樣誤差一般是:整群抽樣≥單純隨機抽樣≥系統抽樣≥分層抽樣

python程式碼實現

import random
import numpy as np
import pandas as pd

# 匯入資料
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv')

df.index.size
# 214

##########隨機抽樣##########
# # 使用pandas # DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None) # n是要抽取的行數。(例如n=20000時,抽取其中的2W行) # frac是抽取的比列。(有一些時候,我們並對具體抽取的行數不關係,我們想抽取其中的百分比,這個時候就可以選擇使用frac,例如frac=0.8,就是抽取其中80%) # replace:是否為有放回抽樣,取replace=True時為有放回抽樣。 # weights這個是每個樣本的權重,具體可以看官方文件說明。 # random_state這個在之前的文章已經介紹過了。
# axis是選擇抽取資料的行還是列。axis=0的時是抽取行,axis=1時是抽取列(也就是說axis=1時,在列中隨機抽取n列,在axis=0時,在行中隨機抽取n行) df_0 = df.sample(n=20, replace=True) df_0.index.size # 20 # 資料準備 data = df.values # 使用random data_sample = random.sample(list(data), 20) len(data_sample) # 20 ##########等距抽樣########## # 指定抽樣數量 sample_count = 50 # 獲取最大樣本量 record_count = data.shape[0] # 抽樣間距 width = record_count//sample_count data_sample = [] i = 0 # 本量小於等於指定抽樣數量並且矩陣索引在有效範圍內是 while len(data_sample) <= sample_count and i * width <= record_count -1: data_sample.append(data[i*width]) i += 1 len(data_sample) # 51 ##########分層抽樣########## # 資料只是隨便找的分層僅限於演示 # 定義每個分層的抽樣數量 each_sample_count = 6 # 定義分層值域 label_data_unique = np.unique(data[:, -1]) # 定義一些資料 sample_list, sample_data, sample_dict = [], [], {} # 遍歷每個分層標籤 for label_data in label_data_unique: for data_tmp in data: # 讀取每條資料 if data_tmp[-1] == label_data: sample_list.append(data_tmp) # 對每層資料都資料抽樣 each_sample_data = random.sample(sample_list, each_sample_count) sample_data.extend(each_sample_data) sample_dict[label_data] = len(each_sample_data) sample_dict # {1.0: 6, 2.0: 6, 3.0: 6, 5.0: 6, 6.0: 6, 7.0: 6} ##########整群抽樣########## # 資料分群僅限於演示,不符合實際情況 # 定義整群的標籤 label_data_unique = np.unique(data[:, -1]) # 隨機抽取2個群 sample_label = random.sample(list(label_data_unique), 2) # 定義空列表 sample_data = [] # 遍歷每個整群標籤值域 for each_label in sample_label: for data_tmp in data: if data_tmp[-1] == each_label: sample_data.append(data_tmp) len(sample_data) # 83

需要注意的問題

資料抽樣過程中要注意一些問題

  • 資料時效性 不能用過時的資料來分析現在的運營狀態
  • 關鍵因素資料 整體資料的關鍵性資料必須要在模型中,如雙十一帶來的銷售增長
  • 業務隨機性 抽樣資料要使各個場景的資料分佈均衡
  • 資料來源多樣性 資料覆蓋要全面

抽樣資料量問題

  • 時間分佈 能包含業務週期。月銷售預測,至少包含12個月資料;時間還要考慮季節、節假日、特定促銷日等週期性。
  • 做預測分析 考慮特徵資料和特徵值域的分佈,通常資料記錄要同時是特徵數量和特徵值域的100倍以上。例如資料集有5個特徵值,每個特徵有2個值域,那麼資料記錄數需要至少1000(10052)條以上
  • 做關聯規則分析 根據關聯前後項數量(每個前項或後項可包含多個要關聯的主體,例如品牌+商品+價格關聯),每個主體需要至少1000條資料。例如只做單品銷售關聯,那麼單品的銷售記錄需要在1000條以上;如果要同時做單品+品牌的關聯,那麼需要至少2000條資料。
  • 異常檢測 無論是監督室還是非監督式建模,對於異常資料本來就是小概率分佈的,因此異常資料記錄一般越多越好。

參考:
《python資料分析與資料化運營》 宋天龍