2020-08-12

2020-08-12 14:16:29

數據挖掘(9-22):數據離散程度+數據清理+三大相關係數+數據庫索引(數據庫面試常問)+P值含義及理解

版權宣告:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處鏈接和本宣告。
本文鏈接:https://blog.csdn.net/Jasminexjf/article/details/101144545
收起
1.衡量數據離散程度的統計量:
數據的離散程度即衡量一組數據的分散程度如何,其衡量的標準和方式有很多,而具體選擇哪一種方式則需要依據實際的數據要求進行抉擇。

首先針對不同的衡量方式的應用場景大體歸納如下:

極差:極差爲數據樣本中的最大值與最小值的差值R=max(i)-min(i),是所有方式中最爲簡單的一種,它反應了數據樣本的數值範圍,是最基本的衡量數據離散程度的方式,受極值影響較大。如在數學考試中,一個班學生得分的極差爲60,放映了學習最好的學生與學習最差的學生得分差距爲60.

四分位差:即數據樣本的上四分之一位和下四分之一位的差值Q_{d}=Q_{u}-Q_{l},放映了數據中間50%部分的離散程度,其數值越小表明數據越集中,數值越大表明數據越離散,同時由於中位數位於四分位數之間,故四分位差也放映出中位數對於數據樣本的代表程度,越小代表程度越高,越大代表程度越低。

平均差:即M_{d}=\frac{\sum_{n}^{i=1}\left |x_{n} -\bar{x} \right |}{n},針對分組數據爲M_{d}=\frac{\sum_{n}^{i=1}\left |x_{n} -\bar{x} \right |f_{i}}{n}。各變數值與平均值的差的絕對值之和除以總數n,平均差以平均數爲中心,能全面準確的反應一組數據的離散狀況,平均差越大,說明數據離散程度越大,反之,離散程度越小。

方差/標準差:方差是各變數與平均值的差的平方和除以總數n-1s{2}=\frac{\sum_{n}{i=1}(x_{i}-\bar{x}){2}}{n-1},針對分組數據s{2}=\frac{\sum_{n}{i=1}(x_{i}-\bar{x}){2}f_{i}}{n-1},方差開根號後爲標準差,方差與標準差都能很好的反應數據的離散程度。

異種比率:是指非衆陣列的頻數佔總頻數的比例。V_{r}=\frac{\sum f_{i}-f_{m}}{\sum f_{i}}=1-\frac{f_{m}}{\sum f_{i}}其中\sum f_{i}爲變數值的總頻數,爲衆陣列的頻數。異種比率越大,說明非衆陣列的頻數佔總頻數的比重越大,衆數的代表性越差,即佔比越小,異種比率越小,說明衆數的代表性越好,即佔比越大。異種比率主要適合度量分類數據的離散程度,當然連續數據可以計算異種比率。

離散係數:即變異係數,針對不同數據樣本的標準差和方差,因數據衡量單位不同其結果自然無法直接進行對比,爲出具一個相同的衡量指標,則進行了離散係數的計算。離散係數爲一組數據的標準差與平均數之比V_{i}=\frac{s}{\bar{x}}。

import numpy as np
import stats as sts
scores = [31, 24, 23, 25, 14, 25, 13, 12, 14, 23,

      32, 34, 43, 41, 21, 23, 26, 26, 34, 42,

      43, 25, 24, 23, 24, 44, 23, 14, 52,32,

      42, 44, 35, 28, 17, 21, 32, 42, 12, 34]

#集中趨勢的度量
print(‘求和:’,np.sum(scores))
print(‘個數:’,len(scores))
print(‘平均值:’,np.mean(scores))
print(‘中位數:’,np.median(scores))
print(‘衆數:’,sts.mode(scores))
print(‘上四分位數’,sts.quantile(scores,p=0.25))
print(‘下四分位數’,sts.quantile(scores,p=0.75))
#離散趨勢的度量
print(‘最大值:’,np.max(scores))
print(‘最小值:’,np.min(scores))
print(‘極差:’,np.max(scores)-np.min(scores))
print(‘四分位差’,sts.quantile(scores,p=0.75)-sts.quantile(scores,p=0.25))
print(‘標準差:’,np.std(scores))
print(‘方差:’,np.var(scores))
print(‘離散係數:’,np.std(scores)/np.mean(scores))
#偏度與峯度的度量
print(‘偏度:’,sts.skewness(scores))
print(‘峯度:’,sts.kurtosis(scores))
2.數據清理引申出的知識點:
1、概述

實際的數據庫極易受噪聲、缺失值和不一致數據的侵擾,因爲數據庫太大,並且多半來自多個異種數據源。低品質的數據將會導致低品質的挖掘結果。有大量的數據預處理技術:

    • 數據清理:可以用來清楚數據中的噪聲,糾正不一致。
    • 數據整合:將數據由多個數據源合併成一個一致的數據儲存,如數據倉庫。
    • 數據歸約:可以通過如聚集、刪除冗餘特徵或聚類來降低數據的規模。
    • 數據變換:(例如,規範化)可以用來把數據壓縮到較小的區間,如0.0到1.0。

這可以提高設計距離度量的挖掘演算法的準確率和效率。這些技術不是排斥的,可以一起使用。

1.1、數據品質 數據如果能滿足其應用的要求,那麼它是高品質的。數據品質涉及許多因素,包括:準確率、完整性、一致性、時效性、可信性和可解釋性。

數據預處理(數據清理+整合+規約+變換) —— 特徵選擇(過濾式+包裹式+嵌入式) —— 降維(PCA+LDA)

  1. 三大統計相關係數:Pearson 相關係數+Spearman相關係數+Kendall相關係數
    相關係數:考察兩個事物(在數據裡我們稱之爲變數)之間的相關程度。

如果有兩個變數:X、Y,最終計算出的相關係數的含義可以有如下理解:

(1)、當相關係數爲0時,X和Y兩變數無關係。

(2)、當X的值增大(減小),Y值增大(減小),兩個變數爲正相關,相關係數在0.00與1.00之間。

(3)、當X的值增大(減小),Y值減小(增大),兩個變數爲負相關,相關係數在-1.00與0.00之間。

相關係數的絕對值越大,相關性越強,相關係數越接近於1或-1,相關度越強,相關係數越接近於0,相關度越弱。

通常情況下通過以下取值範圍判斷變數的相關強度:
相關係數 0.8-1.0 極強相關
0.6-0.8 強相關
0.4-0.6 中等程度相關
0.2-0.4 弱相關
0.0-0.2 極弱相關或無相關

1、pearson相關係數簡介

皮爾遜相關也稱爲積差相關(或積矩相關)是英國統計學家皮爾遜於20世紀提出的一種計算直線相關的方法。

假設有兩個變數X、Y,那麼兩變數間的皮爾遜相關係數可通過以下公式計算:

公式一:

皮爾遜相關係數計算公式

公式二:

皮爾遜相關係數計算公式

公式三:

皮爾遜相關係數計算公式

公式四:

皮爾遜相關係數計算公式

以上列出的四個公式等價,其中E是數學期望,cov表示協方差,N表示變數取值的個數。

2、pearson相關係數適用範圍

當兩個變數的標準差都不爲零時,相關係數纔有定義,皮爾遜相關係數適用於:

(1)、兩個變數之間是線性關係,都是連續數據。

(2)、兩個變數的總體是正態分佈,或接近正態的單峯分佈。

(3)、兩個變數的觀測值是成對的,每對觀測值之間相互獨立。

即:連續數據、正態分佈數據、線性關係數據更適合用pearson相關係數來衡量,用Spearman沒有pearson好。

3、Spearman相關係數簡介

在統計學中,斯皮爾曼等級相關係數以Charles Spearman命名,並經常用希臘字母ρ(rho)表示其值。斯皮爾曼等級相關係數用來估計兩個變數X、Y之間的相關性,其中變數間的相關性可以使用單調函數來描述。如果兩個變數取值的兩個集閤中均不存在相同的兩個元素,那麼,當其中一個變數可以表示爲另一個變數的很好的單調函數時(即兩個變數的變化趨勢相同),兩個變數之間的ρ可以達到+1或-1。

假設兩個隨機變數分別爲X、Y(也可以看做兩個集合),它們的元素個數均爲N,兩個隨即變數取的第i(1<=i<=N)個值分別用Xi、Yi表示。對X、Y進行排序(同時爲升序或降序),得到兩個元素排行集合x、y,其中元素xi、yi分別爲Xi在X中的排行以及Yi在Y中的排行。將集合x、y中的元素對應相減得到一個排行差分集合d,其中di=xi-yi,1<=i<=N。隨機變數X、Y之間的斯皮爾曼等級相關係數可以由x、y或者d計算得到,其計算方式如下所示:

由排行差分集合d計算而得(公式一):

斯皮爾曼等級相關係數公式一

由排行集合x、y計算而得(斯皮爾曼等級相關係數同時也被認爲是經過排行的兩個隨即變數的皮爾遜相關係數,以下實際是計算x、y的皮爾遜相關係數)(公式二):

斯皮爾曼等級相關係數公式二

4、Spearman相關係數適用範圍

斯皮爾曼等級相關係數對數據條件的要求沒有皮爾遜相關係數嚴格,只要兩個變數的觀測值是成對的等級評定資料,或者是由連續變數觀測資料轉化得到的等級資料,不論兩個變數的總體分佈形態、樣本容量的大小如何,都可以用斯皮爾曼等級相關係數來進行研究。【單調相關性】

5、Kendall相關係數簡介

在統計學中,肯德爾相關係數是以Maurice Kendall命名的,並經常用希臘字母τ(tau)表示其值。肯德爾相關係數是一個用來測量兩個隨機變數相關性的統計值。一個肯德爾檢驗是一個無參數假設檢驗,它使用計算而得的相關係數去檢驗兩個隨機變數的統計依賴性。肯德爾相關係數的取值範圍在-1到1之間,當τ爲1時,表示兩個隨機變數擁有一致的等級相關性;當τ爲-1時,表示兩個隨機變數擁有完全相反的等級相關性;當τ爲0時,表示兩個隨機變數是相互獨立的。

假設兩個隨機變數分別爲X、Y(也可以看做兩個集合),它們的元素個數均爲N,兩個隨即變數取的第i(1<=i<=N)個值分別用Xi、Yi表示。X與Y中的對應元素組成一個元素對集合XY,其包含的元素爲(Xi, Yi)(1<=i<=N)。當集合XY中任意兩個元素(Xi, Yi)與(Xj, Yj)的排行相同時(也就是說當出現情況1或2時;情況1:Xi>Xj且Yi>Yj,情況2:Xi<Xj且Yi<Yj),這兩個元素就被認爲是一致的。當出現情況3或4時(情況3:Xi>Xj且Yi<Yj,情況4:Xi<Xj且Yi>Yj),這兩個元素被認爲是不一致的。當出現情況5或6時(情況5:Xi=Xj,情況6:Yi=Yj),這兩個元素既不是一致的也不是不一致的。

這裏有三個公式計算肯德爾相關係數的值

公式一:

肯德爾相關係數公式1

其中C表示XY中擁有一致性的元素對數(兩個元素爲一對);D表示XY中擁有不一致性的元素對數。

注意:這一公式僅適用於集合X與Y中均不存在相同元素的情況(集閤中各個元素唯一)。

公式二:

肯德爾相關係數公式2

注意:這一公式適用於集合X或Y中存在相同元素的情況(當然,如果X或Y中均不存在相同的元素時,公式二便等同於公式一)。

其中C、D與公式一中相同;

肯德爾相關係數公式2-子公式1;肯德爾相關係數公式2-子公式2;肯德爾相關係數公式2-子公式3

N1、N2分別是針對集合X、Y計算的,現在以計算N1爲例,給出N1的由來(N2的計算可以類推):

將X中的相同元素分別組合成小集合,s表示集合X中擁有的小集合數(例如X包含元素:1 2 3 4 3 3 2,那麼這裏得到的s則爲2,因爲只有2、3有相同元素),Ui表示第i個小集合所包含的元素數。N2在集合Y的基礎上計算而得。

公式三:

肯德爾相關係數公式3

注意:這一公式中沒有再考慮集合X、或Y中存在相同元素給最後的統計值帶來的影響。公式三的這一計算形式僅適用於用表格表示的隨機變數X、Y之間相關係數的計算。

6.Kendall相關係數的適用範圍:

肯德爾相關係數與斯皮爾曼相關係數對數據條件的要求相同,

單調相關性;與spearman區別在於某一比較數據需要有序,在有序情況下計算速度比spearman快。

三個相關係數關係如上。

python實現:

def pearson(vector1, vector2):
n = len(vector1)
#simple sums
sum1 = sum(float(vector1[i]) for i in range(n))
sum2 = sum(float(vector2[i]) for i in range(n))
#sum up the squares
sum1_pow = sum([pow(v, 2.0) for v in vector1])
sum2_pow = sum([pow(v, 2.0) for v in vector2])
#sum up the products
p_sum = sum([vector1[i]vector2[i] for i in range(n)])
#分子num,分母den
num = p_sum - (sum1
sum2/n)
den = math.sqrt((sum1_pow-pow(sum1, 2)/n)*(sum2_pow-pow(sum2, 2)/n))
if den == 0:
return 0.0
return num/den
用兩個向量進行測試:

vector1 = [2,7,18,88,157,90,177,570]

vector2 = [3,5,15,90,180, 88,160,580]

執行結果爲0.998,可見這兩組數是高度正相關的。

import pandas as pd
df = pd.DataFrame({‘A’:[5,91,3],‘B’:[90,15,66],‘C’:[93,27,3]})
print(df.corr())
print(df.corr(‘spearman’))
print(df.corr(‘kendall’))
df2 = pd.DataFrame({‘A’:[7,93,5],‘B’:[88,13,64],‘C’:[93,27,3]})
print(df2.corr())
print(df2.corr(‘spearman’))
print(df2.corr(‘kendall’))
一些結論:

A.pearson相關係數的取值範圍是[-1,1],值越接近1,表明兩個隨機變數越正線性相關。

B.如果兩隨機變數有嚴格的單調函數關係,則他們是Spearman相關

C.Pearson相關係數要求變數服從正態分佈。

D.Kendall相關係數主要用於分析有序數據(單調相關性)。

4.關於數據庫索引:
1 首先數據量小的表不需要建立索引,因爲小的表即使建立索引也不會有大的用處,還會增加額外的索引開銷
2 不經常參照的列不要建立索引,因爲不常用,即使建立了索引也沒有多大意義
3 經常頻繁更新的列不要建立索引,因爲肯定會影響插入或更新的效率
思考:表中建立了索引後,匯入大量數據爲什麼會慢?或者說表中建立索引後,爲什麼更新數據會很慢?

答:對已經建立了索引的表中插入數據時,插入一條數據就要對該記錄【按索引排序】。因此,匯入大量數據的時候速度會很慢。

解決辦法:在沒有任何索引的情況下插入數據,然後再建立索引。而更新就無法避免了。就像3說的一樣,經常更新的列就不要建立索引。

4 索引並不是一勞永逸的,用的時間長了需要進行整理或者重建。
初學者在Oracle中使用索引,可以使用EM的建議(EM的Advisor Central中找SQL Access Advisor)
注意:有時候查詢語句中的索引沒有發揮作用,這又是爲什麼呢?
答:在很多情況下,雖然查詢語句使用了索引,但是索引並沒有發揮作用。例如:在WHERE條件的LIKE關鍵字匹配的字串以」%「開頭,這種情況下,索引是不會起到作用的;WHERE條件中使用OR關鍵字來連線多個查詢條件,如果有一個條件沒有使用索引,那麼其他的索引也不會起作用;多列索引的第一個欄位沒有使用,那麼這個多列索引也不會起作用。
解決辦法:根據這些情況,必須對這些語句進行相應的優化。

【1、合理的建立索引能夠加速數據讀取效率,不合理的建立索引反而會拖慢數據庫的響應速度。2、索引越多,更新數據的速度越慢。】

  1. 主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。

  2. 一個表中可以有多個唯一性索引,但只能有一個主鍵。

  3. 主鍵列不允許空值,而唯一性索引列允許空值。

  4. 索引可以提高查詢的速度。

主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵,意思就是主鍵不實際存在,而索引實際存在在數據庫中

  • 索引的缺點是更新數據時效率低,因爲需要更新索引(應該先更新數據,再建立索引 ; 先插入數據,再建立索引)

  • 區分度與索引長度的權衡

  1. 索引長度越低,索引在記憶體中佔的長度越小,排序越快,然而區分度就越低。這樣不利於查詢。

2.索引長度越長,區分度就高,雖然利於查詢了,但是索引在記憶體中佔得空間就多了。

數據庫索引的優缺點:

索引最大的好處是提高查詢速度,
缺點是更新數據時效率低,因爲要同時更新索引
對數據進行頻繁查詢進建立索引,如果要頻繁更改數據不建議使用索引。
數據庫常見面試問題集錦(多看):數據庫常見面試問題(附答案) !!!!!!

5.統計量P值含義及優缺點:[原/零假設+備擇假設]
P-值是在原假設爲真的條件下某一統計量的取值以其觀察值爲最小值或最大值的事件的小概率,或說某一統計量的取值以其觀察值爲最小值或最大值是一個小概率事件,此小概率就是 P。(我所理解的)

P值的各路定義:在一個假設檢驗問題中,利用觀測值能夠做出拒絕原假設的最小顯著性水平稱爲 P-值。對於 P-值的理解,一般情況下有這幾種認識:
(1) 拒絕原假設的最小顯著性水平。
(2) 觀察到的(範例樣本的) 顯著性水平。
(3) 表示對原假設的支援程度,是用於確定是否應該拒絕原假設的另一種方法。
(4) 一種概率,一種在原假設爲真的前提下出現觀察樣本以及更極端情況的概率。
(5) 我們在拒絕原假設的犯的最小的第一類錯誤,而所規定的顯著性水平(具有主觀性)是事先給定的犯第一類錯誤的最大錯誤。

P 值:在假設原假設(H0)正確時,出現現狀或更差的情況的概率。P值越小,我們拒絕原假設的理由越充分。
顯著性水平:拒絕零假設時的 P 值閾值,一般取 5%。
解釋:P值就是指在原假設爲真的情況下,當前觀測樣本(或更極端的情況)所發生的條件概率。如果這個概率很小,說明是小概率事件。在原假設成立的情況下,竟然發生了小概率事件,那麼當然要拒絕原假設了。

other:

假設檢驗傳統方法:

假設檢驗新方法:

找到估算參數的最佳統計量,然後使用自助法模擬抽樣分佈。然後你可以利用抽樣分佈,幫助選擇合適的假設檢驗。

模擬從總體中抽取一個樣本,實際中一般沒有這一步

sample = df.sample(n)
diff = []
for _ in range(10000):
# 從實際樣本中有放回抽樣,容量與實際樣本容量相同,模擬抽樣分佈
sample_xbar = sample(sample.shape[0],replace=True)
# 天新增每個樣本的統計量,此處假設是樣本是某屬性的均值
diff.append(sample_xbar[‘col_name’].mean)

以原假設中等式成立時的值爲均值,看其在抽樣分佈的標準差下的零假設分佈(即用零假設的特殊值模擬正態分佈)

null_vals = np.random.normal(x_mean, np.std(diff),10000)

計算實際樣本統計量在零假設分佈中被抽到的概率,即P值。

(null_vals > sample[‘col_name’].mean()).mean()

上圖中紅線代表實際樣本統計量在零假設分佈中的位置。