1. 程式人生 > >資料特徵分析技能—— 統計分析

資料特徵分析技能—— 統計分析

資料特徵分析技能——統計分析

統計指標對定量資料進行統計描述,常從集中趨勢離中趨勢兩個方面進行分析

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

集中趨勢度量

指一組資料向某一中心靠攏的傾向,核心在於尋找資料的代表值或中心值

取得集中趨勢代表值的方法有兩種:數值平均數位置平均數
- 數值平均數
- 算數平均數
- 調和平均數
- 幾何平均數
- 位置平均數
- 眾數
- 中位數

數值平均數

算數平均數

關注數值,魯棒性弱(穩定性較弱,易受到異常值影響)

data = pd.DataFrame({'value':np.random.randint(100,120,100),
                    'f':np.random.rand(100)})
data['f'] = data['f'] / data['f'].sum()  # f為權重,這裡將f列設定成總和為1的權重佔比
print(data.head())
print('-----------------')

# 算數平均值
mean = data['value'].mean()
print('算數平均數為:%.2f'
%mean) mean_w = (data['value'] * data['f']).sum() / data['f'].sum() print('加權算數平均值為:%.2f'%mean_w) # 加權算數平均值 = (x1f1 + x2f2 + ... + xnfn) / (f1 + f2 + ... + fn)
          f  value
0  0.014970    118
1  0.007184    116
2  0.007459    101
3  0.005892    110
4  0.016599    119
-----------------
算數平均數為:110.09
加權算數平均值為:110.69

幾何平均數

計算幾何平均數要求各觀察值之間存在連乘積關係,它的主要用途是
1. 對比率、指數等進行平均
2. 計算平均發展速度
- 樣本資料非負,主要用於對數正態分佈
3. 複利下的平均年利率
4. 連續作業的車間求產品的平均合格率

G n = x 1 x 2 x 3 x 4 x . . . x n n

幾何平均數

# 一位投資者持有股票,1996年,1997年,1998年,1999年收益率分別為
# 4.5%, 2.0%, 3.5%, 5.4%,
# 求此4年內平均收益率
from scipy.stats import gmean
data_g = gmean(data['value'])
data_g
109.96165465844449

位置平均數

中位數:
- 關注順序,魯棒性強

眾數:
- 關注頻次

# 中位數
med = data['value'].median()
print('中位數為%i' % med)
# 中位數指將總體各單位標誌按照大小順序排列後,中間位置的數字


# 眾數
m = data['value'].mode()
print('眾數為',m.tolist())
# 眾數是一組資料中出現次數最多的數,這裡可能返回多個值


# 密度曲線
data['value'].plot(kind='kde',style='--k',grid=True,figsize=(10,6))



# 簡單算術平均
plt.axvline(mean,hold=None,color='r',linestyle='--',alpha=0.8)
plt.text(mean+5,0.005,'簡單算術平均值:%.2f' % mean,color='r',fontsize=15)


# 加權平均數
plt.axvline(mean_w,hold=None,color='b',linestyle='--',alpha=0.8)
plt.text(mean+5,0.01,'加權平均值:%.2f' % mean_w,color='b',fontsize=15)

# 幾何平均數
plt.axvline(data_g,hold=None,color='g',linestyle='--',alpha=0.8)
plt.text(mean+5,0.015,'幾何平均值:%.2f' % data_g,color='g',fontsize=15)

# 中位數
plt.axvline(med,hold=None,color='y',linestyle='--',alpha=0.8)
plt.text(mean+5,0.020,'幾何平均值:%.2f' % med,color='y',fontsize=15)
中位數為110
眾數為 [108]

這裡寫圖片描述

離中趨勢度

是指一組資料中個數據值以不同程度偏離其中心(平均數)的趨勢,又稱標誌變動度

# 建立資料,銷售資料
data = pd.DataFrame({'A_sale':np.random.rand(30)*1000,
                    'B_sale':np.random.rand(30)*1000},
                   index = pd.period_range('20170601','20170630'))
print(data.head())
                A_sale      B_sale
2017-06-01  574.693080  970.059264
2017-06-02  278.487440  683.602258
2017-06-03  830.472896  293.102768
2017-06-04  505.211093  268.009253
2017-06-05  316.383594  134.011541

極差與分位差

極差:
- 沒有考慮中間值的變動情況,測定離中趨勢時不準確

分位差:
- 從一組資料踢出部分極端值後的從新計算類似極差的指標,常用的有四分位差八分位差

a_r = data['A_sale'].max() - data['A_sale'].min()
b_r = data['B_sale'].max() - data['B_sale'].min()
print('A產品銷售額極差為:%.2f,B產品銷售額極差為:%.2f'%(a_r,b_r))
A產品銷售額極差為:920.98,B產品銷售額極差為:914.30
sta = data['A_sale'].describe()
stb = data['B_sale'].describe()
#print(sta)
a_iqr = sta.loc['75%'] - sta.loc['25%']
b_iqr = stb.loc['75%'] - stb.loc['25%']
print('A銷售額的分位差為:%.2f, B銷售額的分位差為:%.2f' % (a_iqr,b_iqr))
A銷售額的分位差為:481.57, B銷售額的分位差為:508.45
# 繪製箱型圖

color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data.plot.box(vert=False,grid = True,color = color,figsize = (10,6))
# 箱型圖

png

方差與標準差

  • 平均差:平均差是總體所有單位與其算術平均數的離差絕對值的算術平均數,1範數,異常值影響

    M D = N x x ¯ N

  • 方差:差的平方的均值,2範數,異常值影響

總體方差

σ 2 = N ( X E ( X ) ) 2 N

樣本方差

s 2 = N ( x x ¯ ) 2 N 1

  • 標準差:方差的算數平方根(應用最廣)

平均差 VS 方差:對異常值的敏感程度不同

  • 離散係數(常用的是標準差係數:資料標準差和算數平均數的比)

C V = σ μ

a_std = sta.loc['std']
b_std = stb.loc['std']
a_var = data['A_sale'].var()
b_var = data['B_sale'].var()
print('A銷售額的標準差為:%.2f, B銷售額的標準差為:%.2f' % (a_std,b_std))
print('A銷售額的方差為:%.2f, B銷售額的方差為:%.2f' % (a_var,b_var))
# 方差 → 各組中數值與算數平均數離差平方的算術平均數
# 標準差 → 方差的平方根
# 標準差是最常用的離中趨勢指標 → 標準差越大,離中趨勢越明顯
A銷售額的標準差為:292.12, B銷售額的標準差為:293.35
A銷售額的方差為:85331.19, B銷售額的方差為:86052.83
fig = plt.figure(figsize = (12,4))
ax1 = fig.add_subplot(1,2,1)
data['A_sale'].plot(kind = 'kde',style = 'k--',grid = True,title = 'A密度曲線')
plt.axvline(sta.loc['50%'],hold=None,color='r',linestyle="--",alpha=0.8)  
plt.axvline(sta.loc['50%'] - a_std,hold=None,color='b',linestyle="--",alpha=0.8)  
plt.axvline(sta.loc['50%'] + a_std,hold=None,color='b',linestyle="--",alpha=0.8)  
# A密度曲線,1個標準差

ax2 = fig.add_subplot(1,2,2)
data['B_sale'].plot(kind = 'kde',style = 'k--',grid = True,title = 'B密度曲線')
plt.axvline(stb.loc['50%'],hold=None,color='r',linestyle="--",alpha=0.8)  
plt.axvline(stb.loc['50%'] - b_std,hold=None,color='b',linestyle="--",alpha=0.8)  
plt.axvline(stb.loc['50%'] + b_std,hold=None,color='b',linestyle="--",alpha=0.8)  
# B密度曲線,1個標準差

這裡寫圖片描述