1. 程式人生 > >第一章 資料特徵分析

第一章 資料特徵分析

一、幾個基礎分析思路

  • 分佈分析:研究資料的分佈特徵、分佈型別,按定量、定性資料區分基本統計量
  • 對比分析:兩個互相聯絡的指標進行比較
  • 統計分析:對定量資料進行統計分析,常從集中趨勢和離中趨勢兩個方面分析
  • 帕累託分析:貢獻度分析,帕累託原則:20/80定律
  • 正太性檢測:利用觀測資料判斷總體是否服從正態分佈的檢驗,是統計判決中重要的一種特殊的擬合優度假設檢驗
  • 相關性分析:分析連續變數之間的線性相關程度的強弱

二、分佈分析 1.極差:max-min

def d_range(df,*cols):
    krange = []
    for col in cols:
        crange = df[col].max() - df[col].min()
        krange.append(crange)
    return(krange)
# 建立函式求極差

2.頻率分佈情況 - 定量欄位 ① 通過直方圖直接判斷分組組數

data[key2].hist(bins=10)

② 求出分組區間

gcut = pd.cut(data[key2],10,right=False)
# pd.cut(x, bins, right):按照組數對x分組,且返回一個和x同樣長度的分組dataframe,right → 是否右邊包含,預設True

③ 求出目標欄位下頻率分佈的其他統計量 → 頻數,頻率,累計頻率

r_zj = pd.DataFrame(gcut_count)
r_zj.rename(columns ={gcut_count.name:'頻數'}, inplace = True)  # 修改頻數字段名
r_zj['頻率'] = r_zj / r_zj['頻數'].sum()  # 計算頻率
r_zj['累計頻率'] = r_zj['頻率'].cumsum()  # 計算累計頻率

④ 繪製頻率直方圖

3.頻率分佈情況 - 定性欄位 ① 通過計數統計判斷不同類別的頻率 ② 繪製頻率直方圖、餅圖

三、對比分析 1.絕對數比較 → 相減 ① 折線圖比較

data = pd.DataFrame()
data.plot(kind='line',...,title = 'AB產品銷量對比-折線圖')

② 多系列柱狀圖比較

data.plot(kind = 'bar',...,title = 'AB產品銷量對比-柱狀圖')

③ 柱狀圖堆疊圖+差值折線圖比較

plt.bar(x,y1,width = 1,facecolor = 'yellowgreen')
plt.bar(x,y2,width = 1,facecolor = 'lightskyblue')
plt.title('AB產品銷量對比-堆疊圖')
plt.plot(x,y3,'--go') 
plt.axhline(0,hold=None,color='r',linestyle="--",alpha=0.8)  # 新增y軸參考線
plt.title('AB產品銷量對比-差值折線')

2.相對數比較 → 相除 ① 結構分析 在分組基礎上,各組總量指標與總體的總量指標對比,計算出各組數量在總量中所佔比重,反映總體的內部結構

data['A_per'] = data['A_sale'] / data['A_sale'].sum()   # 計算出每天的營收佔比
data['A_per%'] = data['A_per'].apply(lambda x: '%.2f%%' % (x*100))   # 轉換為百分數
data[['A_sale','B_sale']].plot(kind='line',style = '--.',alpha = 0.8,ax=axes[0])
data[['A_per','B_per']].plot(kind='line',style = '--.',alpha = 0.8,ax=axes[1])
# 絕對值對比較難看出結構性變化,通過看銷售額佔比來看售賣情況的對比
# 同時可以反應“強度” → 兩個性質不同但有一定聯絡的總量指標對比,用來說明“強度”、“密度”、“普遍程度”

② 比例分析 在分組的基礎上,將總體不同部分的指標數值進行對比,其相對指標一般稱為“比例相對數” 比例相對數 = 總體中某一部分數值 / 總體中另一部分數值

data['c_s'] = data['consumption'] / data['salary']# 比例相對數 → 消費收入比
data['c_s'].plot.area(color = 'green',alpha = 0.5,ylim = [0.3,0.6],figsize=(8,3),grid=True)# 建立面積圖表達

③ 空間比較分析(橫向對比分析) 同類現象在同一時間不同空間的指標數值進行對比,反應同類現象在不同空間上的差異程度和現象發展不平衡的狀況 空間比較相對數 = 甲空間某一現象的數值 / 乙空間同類現象的數值

data.sum().plot(kind = 'bar',color = ['r','g','b','k'], alpha = 0.8, grid = True) # 通過柱狀圖做橫向比較 → 4個產品的銷售額總量
data[:10].plot(kind = 'bar',color = ['r','g','b','k'], alpha = 0.8, grid = True, figsize = (12,4),width = 0.8) # 多系列柱狀圖,橫向比較前十天4個產品的銷售額
# 同比 → 產品A在2015.3和2016.3的比較(相鄰時間段的同一時間點)
# 環比 → 產品A在2015.3和2015.4的比較(相鄰時間段的比較)

④ 動態對比分析(縱向對比分析) 同一現象在不同時間上的指標數值進行對比,反應現象的數量隨著時間推移而發展變動的程度及趨勢,最基本方法:計算動態相對數 → 發展速度 動態相對數(發展速度) = 某一現象的報告期數值 / 同一現象的基期數值 基期:用來比較的基礎時期 報告期:所要研究的時期,又稱計算期

data['base'] = 1000  # 假設基期銷售額為1000,後面每一天都為計算期
data['l_growth'] = data['A'] - data['base']  # 累計增長量 = 報告期水平 - 固定基期水平
data['z_growth'] = data['A'] - data.shift(1)['A']  # 逐期增長量 = 報告期水平 - 報告期前一期水平
data[['l_growth','z_growth']].plot(...)
data['lspeed'] = data['l_growth'] / 1000  # 定基增長速度
data['zspeed'] = data['z_growth'] / data.shift(1)['A']  # 環比增長速度
data[['lspeed','zspeed']].plot(...)
# 通過折線圖檢視發展速度

四、統計分析 1.集中趨勢度量 指一組資料向某一中心靠攏的傾向,核心在於尋找資料的代表值或中心值 —— 統計平均數 ① 算術平均數

data['f'] = data['f'] / data['f'].sum()  # f為權重,這裡將f列設定成總和為1的權重佔比
mean = data['value'].mean()   # 簡單算數平均值 = 總和 / 樣本數量 (不涉及權重)
mean_w = (data['value'] * data['f']).sum() / data['f'].sum()   # 加權算數平均值 = (x1f1 + x2f2 + ... + xnfn) / (f1 + f2 + ... + fn)

② 位置平均數

m = data['value'].mode()   # 眾數是一組資料中出現次數最多的數,這裡可能返回多個值
med = data['value'].median()   # 中位數指將總體各單位標誌按照大小順序排列後,中間位置的數字
data['value'].plot(kind = 'kde',style = '--k',grid = True)   # 密度曲線

2.離中趨勢度量 ① 極差、分位差

# 極差,沒有考慮中間變數的變動,測定離中趨勢不穩定
sta = data['A_sale'].describe()
a_iqr = sta.loc['75%'] - sta.loc['25%'] # 分位差
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data.plot.box(vert=False,grid = True,color = color,figsize = (10,3))   # 箱型圖

② 方差與標準差

sta = data['A_sale'].describe()
a_std = sta.loc['std']   # 方差 → 各組中數值與算數平均數離差平方的算術平均數
a_var = data['A_sale'].var()   標準差 → 方差的平方根
# 標準差是最常用的離中趨勢指標 → 標準差越大,離中趨勢越明顯

五、帕累託分析

data.sort_values(ascending=False, inplace= True)   # 由大到小排列
plt.figure(figsize = (10,4))
data.plot(kind = 'bar', color = 'g', alpha = 0.5, width = 0.7)  
plt.ylabel('營收_元')   # 建立營收柱狀圖
p = data.cumsum()/data.sum()  # 建立累計佔比,Series
key = p[p>0.8].index[0]     # 找到累計佔比超過80%時候的index
key_num = data.index.tolist().index(key)   # 找到key所對應的索引位置
print('超過80%累計佔比的節點值索引為:' ,key)
print('超過80%累計佔比的節點值索引位置為:' ,key_num)
p.plot(style = '--ko', secondary_y=True)   # secondary_y → y副座標軸
plt.axvline(key_num,hold=None,color='r',linestyle="--",alpha=0.8)  
plt.text(key_num+0.2,p[key],'累計佔比為:%.3f%%' % (p[key]*100), color = 'r')  # 累計佔比超過80%的節點
plt.ylabel('營收_比例')   # 繪製營收累計佔比曲線
key_product = data.loc[:key] 
print('核心產品為:',key_product)    # 輸出決定性因素產品

六、正太性檢測 1.直方圖初判

s.hist(bins=30,alpha = 0.5,ax = ax2)  # 繪製直方圖
s.plot(kind = 'kde', secondary_y=True,ax = ax2)
plt.grid()
# 呈現較明顯的正太性

2.QQ圖判斷 QQ圖通過把測試樣本資料的分位數與已知分佈相比較,從而來檢驗資料的分佈情況 QQ圖是一種散點圖,對應於正態分佈的QQ圖,就是由標準正態分佈的分位數為縱座標,樣本值為橫座標的散點圖 參考直線:四分之一分位點和四分之三分位點這兩點確定,看散點是否落在這條線的附近

# 繪製思路
# ① 在做好資料清洗後,對資料進行排序(次序統計量:x(1)<x(2)<....<x(n))
# ② 排序後,計算出每個資料對應的百分位p{i},即第i個數據x(i)為p(i)分位數,其中p(i)=(i-0.5)/n (pi有多重演算法,這裡以最常用方法為主)
# ③ 繪製直方圖 + qq圖,直方圖作為參考
st = s['value'].describe()
x1 ,y1 = 0.25, st['25%']
x2 ,y2 = 0.75, st['75%']  # 計算四分之一位數、四分之三位數
ax3 = fig.add_subplot(3,1,3)  # 建立子圖3
ax3.plot(s_r['p'],s_r['value'],'k.',alpha = 0.1)
ax3.plot([x1,x2],[y1,y2],'-r')   # 繪製QQ圖,直線為四分之一位數、四分之三位數的連線,基本符合正態分佈

3.K-S檢驗 K-S檢驗是比較一個頻率分佈f(x)和理論分佈g(x)或者兩個觀測值分佈的檢驗方法,若兩者差距小,則推論樣本分佈取自某特定分佈。 ① KS檢驗,理論推導

s = df['value'].value_counts().sort_index()
df_s['累計頻率'] = df_s['累計次數'] / len(data)
df_s['理論分佈'] =[0.0244,0.0968,0.2148,0.2643,0.3228,0.3859,0.5160,0.5832,0.7611,0.8531,0.8888,0.9803]  # 通過查閱正太分佈表
df_s['D'] = np.abs(df_s['累計頻率'] - df_s['理論分佈'])   # D值序列計算結果表格
# df_s['累計頻率']、df_s['理論分佈']用密度圖表示

② 直接用演算法做KS檢驗

from scipy import stats   # scipy包是一個高階的科學計算庫,它和Numpy聯絡很密切,Scipy一般都是操控Numpy陣列來進行科學計算
u = df['value'].mean()  # 計算均值
std = df['value'].std()  # 計算標準差
stats.kstest(df['value'], 'norm', (u, std))
# .kstest方法:KS檢驗,引數分別是:待檢驗的資料,檢驗方法(這裡設定成norm正態分佈),均值與標準差
# 結果返回兩個值:statistic → D值,pvalue → P值
# p值大於0.05,為正態分佈

七、相關性分析 1.圖示初判 ① 變數之間的線性相關性 正線性相關、負線性相關 ② 散點圖矩陣初判多變數間關係

2.Pearson相關係數(皮爾遜相關係數) 前提條件→滿足正態分佈

u1,u2 = data['value1'].mean(),data['value2'].mean()  # 計算均值
std1,std2 = data['value1'].std(),data['value2'].std()  # 計算標準差
print('value1正態性檢驗:\n',stats.kstest(data['value1'], 'norm', (u1, std1)))   # 正態性檢驗 → pvalue >0.05
r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum()))   # |r| > 0.8 → 高度線性相關

data.corr()   # pandas相關性方法:data.corr(method='pearson', min_periods=1) → 直接給出資料欄位的相關係數矩陣
# method預設pearson

3.Sperman秩相關係數(斯皮爾曼相關係數) 這裡寫圖片描述

ata['d'] = data['range1'] - data['range2']   #秩次index差
data['d2'] = data['d']**2
n = len(data)
rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1))   求出rsPearson相關係數

data.corr(method='spearman')
# pandas相關性方法:data.corr(method='pearson', min_periods=1) → 直接給出資料欄位的相關係數矩陣
# method預設pearson