生活随笔
收集整理的這篇文章主要介紹了
数据特征分析方法总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據特征分析方法總結
21世紀是大數據的時代,因為這些大數據中蘊含著時代發展的信息。如何科學地分析數據特征是數據分析師必須掌握的基礎技能之一。因此,我今天主要希望通過理論推導并實現一些常用的數據特征分析方法來加強對數據特征處理的能力。
分布分析
分布分析:研究數據的分布特征和分布類型,分為定量數據和定性數據,并通過這兩種類型來區分基本統計量。
常用指標為:極差、頻率分布情況、分組組距及組數
# 讀取數據
data
= pd
.read_csv('data/深圳羅湖二手房信息.csv', engine
='python', encoding
='gbk')
plt
.scatter(data
['經度'], data
['緯度'],s
=data
['房屋單價'] / 500,c
=data
['參考總價'], cmap
='Reds',alpha
=0.4)
plt
.grid()
plt
.show()
data
.head()
通過散點圖大致看一下數據分布情況,如圖1所示:
圖1 顏色越深代表房價越高,經緯度可以確定深圳羅湖不同二手房的位置,從而表現出在不同位置二手房的房價。
# 極差
def
d_range(df
, *cols
):krange
= []for col in cols
:crange
= df
[col
].max() - df
[col
].min()krange
.append(crange
)return krange
key1
= '參考總價'
key2
= '參考首付'
dr
= d_range(data
, key1
, key2
)
print("%s極差為:%f\n%s極差為:%f" % (key1
, dr
[0], key2
, dr
[1]))
圖2 計算結果如圖所示。
# 頻率分布情況
data
[key2
].hist(bins
=8)
# 頻數分布情況,分組區間
gcut
= pd
.cut(data
[key1
], 10, right
=False
)
gcut_count
= gcut
.value_counts(sort
=False
)
data1
= data
['%s分組區間' % key1
] = gcut
.value_counts
# 區間出現頻率
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()
r_zj
['頻率%'] = r_zj
['頻率'].apply(lambda x
: "%.2f%%" % (x
* 100))
r_zj
['累計頻率%'] = r_zj
['累計頻率'].apply(lambda x
: "%.2f%%" % (x
* 100))
r_zj
.style
.bar(subset
=['頻率', '累計頻率'])
# 直方圖
r_zj
['頻率'].plot(kind
='bar', figsize
=(12, 2),grid
=True
, color
='k', alpha
=0.4)
plt
.show()
圖3 通過直方圖,我們可以看出不同區間二手房首付價格的大致分布情況。
對比分析
對比分析就是用兩組或兩組以上的數據進行比較,是最通用的方法。我們知道孤立的數據、圖像沒有意義,有對比才有差異。比如在時間維度上的同比和環比、增長率、定基比,與競爭對手的對比、類別之間的對比、特征和屬性對比等。對比法可以發現數據變化規律,使用頻繁,經常和其他方法搭配使用。該方法一般會結合其他方法在后文呈現,這里不加贅述。
統計分析
1、集中趨勢度量:指一組數據向某一中心靠攏的傾向,核心在于尋找數據的代表值或者中心值————統計平均數
常用指標為: 算數平均數(均值)、位置平均數(中位數)、 眾數
2、離中趨勢量:指一組數據中各數據以不同程度的距離偏離中心的趨勢。
常用指標為:極差、標準差
# 算數平均數
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的權重占比
mean
= (data
['value']*data
['f'].sum()/data
)
帕累托分析
帕累托分析(貢獻度分析)即為我們常說的帕累托法則:20/80定律?!霸蚝徒Y果、投入和產出、努力和報酬之間本來存在著無法解釋的不平衡。一般來說,投入和努力可以分為兩種不同的類型:
1、多數,它們只能造成少許的影響;
2、少數,它們造成主要的、重大的影響?!?br /> 比如說,一個公司80%利潤來自于20%的暢銷產品,而其他80%的產品只產生了20%的利潤,通過二八原則,尋找關鍵的20%決定性因素!
# 獲取數據
data
= pd
.Series(np
.random
.randn(10) * 1200 + 3000,index
=list('ABCDEFGHIJ'))
# 排序
data
.sort_values(ascending
=False
, inplace
=True
)
# 畫圖
plt
.figure(figsize
=(10, 4))
fig
= data
.plot(kind
='bar', color
='g', alpha
=0.8, width
=0.6)
p
= data
.cumsum() / data
.sum()
key
= p
[p
> 0.8].index
[0]
key_num
= data
.index
.tolist().index(key
)
# 找到累計占比超過
80%時的index
# 找到key所對應的索引位置
# 輸出決定性因素產品
print('超過80%累計占比的節點值索引為: ', key
)
print('超過80%累計占比的節點值索引位置為: ', key_num
)## 圖像表示
p
.plot(style
='--ko', secondary_y
=True
)
plt
.axvline(key_num
, color
='r', linestyle
='--')
plt
.text(key_num
+ 0.2, p
[key
], '累計占比為:%.3f%%' % (p
[key
] * 100), color
='r')
plt
.ylabel('營收比例')
# 繪制營收累計占比曲線
key_product
= data
.loc
[:key
]
print('核心產品為: ')
print(key_product
)
plt
.show()
圖4 即為帕累托可視化圖像。J~F占所有種類的70%,貢獻了80.082%的利潤,企業應增加J-F的投入,減少C~B的投入以獲得更高的盈利額。
圖5 運行結果,通過結合圖像可以很快地找到超過80%累計占比的節點以及對應的節點值。
正態性分析
正態性檢驗:
利用觀測數據判斷總體是否服從正態分布的檢驗稱為正態性檢驗,它是統計判決中重要的一種特殊的擬合優度假設檢驗。
常用方法:直方圖初判/QQ圖判斷/K-S檢驗
## 方法
1:直方圖
data
= pd
.DataFrame(np
.random
.randn(1000)+10, columns
=['value'])
fig
= plt
.figure(figsize
=(10, 6))
ax1
= fig
.add_subplot(2, 1, 1)
ax1
.scatter(data
.index
, data
.values
)ax2
= fig
.add_subplot(2, 1, 2)
data
.hist(bins
=20, ax
=ax2
)
data
.plot(kind
='kde', secondary_y
=True
, ax
=ax2
)
plt
.show()
圖6 第2個子圖即為直方圖。利用散點圖和直方圖,我們可以清晰地看出該組數據滿足正態分布。
## 方法
2:QQ圖判斷
# QQ圖通過把測試樣本數據的分位數與已知分布比較,從而檢驗數據的分布情況'''
--元素
--
QQ圖是一種散點圖,對應于正太分布的QQ圖,就是由標準正太分布的分位數為橫坐標,
樣本值為縱坐標的散點圖
參考元素:四分之一分位點和四分之三分位點這兩點確定參考線,看散點是否分布在參考線附近。
--繪制思路
--
1、在做好數據清洗后,對數據進行排序
(此排序統計量:
x(1)<x(2)<x(3)<...<x(n
))
2、排序后,計算出每個數據對應的百分位p
[i
],即第i個數據
x(i
)為
p(i
)的百分位
其中,
p(i
)=(i
-0.5)/n
3、繪制直方圖加QQ圖,直方圖作為參考
'''
data
= pd
.DataFrame(np
.random
.randn(1000)+10, columns
=['value'])
mean
= data
['value'].mean()
std
= data
['value'].std()
print('均值為: %.2f,標準差為: %.2f' % (mean
, std
))# 計算均值,標準差
data
.sort_values(by
='value', inplace
=True
) # 排序
data_re
= data
.reset_index(drop
=False
)
# 計算Q值,百分位
data_re
['p'] = (data_re
.index
-0.5)/len(data_re
)
data_re
['q'] = (data_re
['value']-mean
)/std
st
= data
['value'].describe()
x1
, y1
= 0.25, st
['25%']
x2
, y2
= 0.75, st
['75%']
fig
= plt
.figure(figsize
=(10, 9))
ax1
= fig
.add_subplot(3, 1, 1)
ax1
.scatter(data
.index
, data
.values
)
plt
.grid()# 繪制數據分布圖
ax2
= fig
.add_subplot(3, 1, 2)
data
.hist(bins
=30, alpha
=0.8, ax
=ax2
)
data
.plot(kind
='kde', secondary_y
=True
, ax
=ax2
)
plt
.grid()ax3
= fig
.add_subplot(3, 1, 3)
ax3
.plot(data_re
['p'], data_re
['value'], 'k', alpha
=0.8)
ax3
.plot([x1
, x2
], [y1
, y2
], '-r')
plt
.grid()
plt
.show()
圖7 第3個子圖即為QQ圖。利用不同圖像的對比分析,我們可以清晰地看出QQ圖通過分位點的方式可以很好表現出正態分布特征。
'''
## 方法
3:K
-S檢驗(Kolmogorov
-Smirnov)是比較一個頻率分布
f(x
)與理論分布
g(x
)或者兩個觀測值分布的檢驗方法。
以樣本數據的累計頻數分布與特定的理論分布比較(如正態分布),如果兩者差距小,則推論樣本分布取自某特定分布。假設檢驗問題:
H0:樣本的總體分布服從某特定分布
H1:樣本的總體分布不服從某特定分布
Fn(x
)->樣本的累計分布函數
F0(x
)->理論分布的分布函數
D
->F0(x
)與
Fn(x
)差值的絕對值最大值
D
= max
|Fn(x
)-F0(x
)|D
> D(n
,a
)相比較
->
p
>0.05則接受H0
,p
<0.05則拒絕H0,接受H1。
'''
# 直接用算法做KS檢驗
from scipy import stats
# 樣本數據是
35位健康男性在未進食之前的血糖濃度
data
= [87, 77, 92, 68, 80, 78, 84, 77, 81, 80, 80, 77, 92, 86,76, 80, 81, 75, 77, 72, 81, 72, 84, 86, 80, 68, 77, 87,76, 77, 78, 92, 75, 80, 78]
df
= pd
.DataFrame(data
, columns
=['value'])
u
= df
['value'].mean()
std
= df
['value'].std()
print("樣本均值為:%.2f,樣本標準差為:%.2f " % (u
, std
))
print("------")
# KS 方法:ks檢驗,參數分別是:待檢驗的數據,檢驗方法(norm 即正態分布),均值和標準差
# 返回兩個值:
static->D值,pvalue
->P值
# p大于0.05時為正態分布
s
= df
['value'].value_counts().sort_index()
df_s
= pd
.DataFrame({'血糖濃度': s
.index
, '次數': s
.values
})
df_s
['累計次數'] = df_s
['次數'].cumsum()
df_s
['累計頻率'] = df_s
['累計次數'] / len(data
)
df_s
['標準化取值'] = (df_s
['血糖濃度'] - u
) / std
# 查表得到理論分布數值
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
['理論分布'])
dmax
= df_s
['D'].max()
print("實際觀測D值為: %.4f" % dmax
)
df_s
['累計頻率'].plot(style
='--k.')
df_s
['理論分布'].plot(style
='--r.')
plt
.legend(loc
='upper left')
plt
.grid()
plt
.show()
圖8 通過理論推導得出的結果如圖所示。
ks
= stats
.kstest(df
['value'], 'norm', (u
, std
))
print("ks值為:", ks
)
圖9 但在scipy包種有該正態分布檢驗方法,即ks代碼塊兒。
相關性分析
相關性分析:是指對兩個或者多個具備相關性的變量元素進行分析,從而衡量兩個變量因素的相關密切程度,且相關性的元素之間需要存在一定的聯系或者概率才可以進行相關性分析。
圖示判斷:
Pearson相關系數(皮爾遜相關系數)
Sperman秩相關系數(斯皮爾曼相關系數)
## (
1)兩個變量之間的線性相關性
# 創建三個數據:data1為
0-100的隨機數并從小到大排序,data2為
0-50的隨機數并從小到大排序,data3為
0-500的隨機數并從大到小排序
data1
= pd
.Series(np
.random
.rand(50)*100).sort_values()
data2
= pd
.Series(np
.random
.rand(50)*50).sort_values()
data3
= pd
.Series(np
.random
.rand(50)*500).sort_values(ascending
=False
)fig
= plt
.figure(figsize
=(10, 4))
ax1
= fig
.add_subplot(1, 2, 1)
ax1
.scatter(data1
, data2
) # 正相關
plt
.grid()ax2
= fig
.add_subplot(1, 2, 2)
ax2
.scatter(data1
, data3
) # 負相關
plt
.grid()
圖10 左圖為正相關,右圖為負相關。
##(
2)散點圖矩陣判斷多變量間關系
data
= pd
.DataFrame(np
.random
.randn(200, 4) * 100, columns
=['A', 'B', 'C', 'D'])
pd
.plotting
.scatter_matrix(data
, figsize
=(8, 8),color
='k',marker
='+',diagonal
='hist', alpha
=0.8, range_padding
=0.1)
data
.head()
plt
.show()
圖11 多變量之間可以用散點矩陣圖,但該數據無法看出不同變量之間的相關性。
以上皆為通過圖像來判斷數據相關性的方法,我們還可以通過數據的方式來判斷不同變量之間的相關性。
'''
皮爾遜相關系數:即皮爾森積矩相關系數,是一種線性相關系數。
可以衡量向量相似度的一種方法》輸出范圍為
-1到
+1,
0代表無相關性,負值代表負相關,正值代表正相關。
0<|r
|<1代表存在不同程度線性相關
》
|r
|<=0.3 -->不存在線性相關
》
|r
|<=0.5 -->低度線性相關
》
|r
|<=0.8 -->顯著線性相關
》
|r
|> 0.8 -->高度線性相關前提條件
--> 正態分布
'''
data1
= pd
.Series(np
.random
.rand(100)*100).sort_values()
data2
= pd
.Series(np
.random
.rand(100)*50).sort_values()
data
= pd
.DataFrame({'value1': data1
.values
,'value2': data2
.values
})
# 檢驗是否滿足正態分布
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
)))
print('value2正正態檢驗:\n', stats
.kstest(data
['value2'], 'norm', (u2
, std2
)))
圖12 pvalue均大于0.05,則滿足正態分布。
## 計算Pearson相關系數
data
['(x-u1)*(y-u2)'] = (data
['value1']-u1
)*(data
['value2']-u2
)
data
['(x-u1)**2'] = (data
['value1']-u1
)**2
data
['(y-u2)**2'] = (data
['value2']-u2
)**2
r
= data
['(x-u1)*(y-u2)'].sum() / (np
.sqrt(data
['(x-u1)**2'].sum() * data
['(y-u2)**2'].sum()))
print("Pearson相關系數為:%.4f" % r
)# 等價于下列代碼
p
= data
.corr()
print(p
)
圖13 通過推導得出相關系數和導入函數包結果對比如圖所示。由計算出的結果大于0.05,我們可以看出該組數據存在相關性。
然而,Pearson相關系數主要用于服從正態分布的連續變量,不服從正態分布的變量、分類的關聯性可采用Sperman秩關聯系數,也稱等級相關系數。
計算邏輯:
(1)對兩個變量成對的取值按照從小到大順序編秩,Rx代表Xi的秩次, Ry代表Yi的秩次,如果兩個值大小一樣,則秩次為(index1 + index2) / 2;
(2)di = Rx - Ry
Spearson系數和Pearson 系數在效率上等效
# 判斷看電視和智商的相關性
data
= pd
.DataFrame({'智商': [106, 86, 100, 101, 99, 103, 97, 113, 112, 110],'每周看電視小時數': [7, 0, 27, 50, 28, 29, 20, 12, 6, 17]})
data
.sort_values('智商', inplace
=True
)
n
= len(data
)
data
['range1'] = np
.arange(1, n
+1)
data
.sort_values('每周看電視小時數', inplace
=True
)
data
['range2'] = np
.arange(1, n
+1)
data
['d'] = data
['range1'] - data
['range2']
data
['d2'] = data
['d']**2
rs
= 1-6*(data
['d2'].sum()) / (n
* (n
**2-1))
print('Pearson相關系數為: %.4f' % rs
)# 以上皆為利用公式推導結果,等價于以下代碼
s
= data
.corr(method
='spearman')
print(s
)
圖14 結果為負值,代表看電視和智商并不相關。
總結
以上就是今天需要總結的數據特征方法。但是我們需要清楚地知道,在實際案例中,我們需要結合不同的方法科學地分析不同數據蘊含的數據特征。在相關性分析當中,還有幾種分別kendall(和諧系數)和GRA(GreyRelationAnalysis,GRA)灰色關聯度分析,以及幾個重要性分析(MDI、MDA)后期再更。
總結
以上是生活随笔為你收集整理的数据特征分析方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。