集中趨勢度量:分散性、變異性、強大的距
作者 白寧超
2015年10月14日10:13:13
摘要:程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨着科學技術的發展和機器智能的普及,統計學在機器智能中的作用越來越重要。本系列統計學的學習基於《深入淺出統計學》一書(偏向代碼實現,需要讀者有一定基礎,可以參見后面PPT學習)。正如(吳軍)先生在《數學之美》一書中闡述的,基於統計和數學模型對機器智能發揮重大的作用。諸如:語音識別、詞性分析、機器翻譯等世界級的難題也是從統計中找到開啟成功之門鑰匙的。尤其是在自然語言處理方面更顯得重要,因此,對統計和數學建模的學習是尤為重要的。最后感謝團隊所有人的參與。( 本文原創,轉載注明出處:集中趨勢度量:分散性、變異性、強大的距 )
目錄
【程序員眼中的統計學(1)】 信息圖形化:第一印象
【程序員眼中的統計學(2)】集中趨勢度量:分散性、變異性、強大的距
【程序員眼中的統計學(3)】概率計算:把握機會
【程序員眼中的統計學(4)】離散概率分布的運用:善用期望
【程序員眼中的統計學(5)】排列組合:排序、排位、排
【程序員眼中的統計學(6)】幾何分布、二項分布及泊松分布:堅持離散
【程序員眼中的統計學(7)】正態分布的運用:正態之美
【程序員眼中的統計學(8)】統計抽樣的運用:抽取樣本
【程序員眼中的統計學(9)】總體和樣本的估計:進行預測
【程序員眼中的統計學(10)】假設檢驗的運用:研究證據
【程序員眼中的統計學(11)】卡方分布的應用
【程序員眼中的統計學(12)】相關與回歸:我的線條如何?
1 平均值
1.1 均值算法的描述
均值的定義
均值有兩種計算方法:第一種計算方式是:將所有的數字加起來,然后除以數字的個數 。可用記為:µ=∑x/n
另一種計算方法是把每個數的頻數考慮進去了的,它表示如下:µ=∑fx/f
均值符號定義
n:表示的是輸入的數據的個數
µ:為數據的均值
∑:表示所有數據之和
均值算法中的計算方法
- 統計出輸入數據的個數n
- 計算出所有的數據之和 sum
- 計算出數據的均值avg=sum/n
1.2 均值算法的應用場景
案例描述:俱樂部中,各個舞蹈班的人數的清單為:1人,2人,3 人,4人,5人,6人,7人。
均值算法在該場景的定義
案例定義:這個俱樂部舞蹈班的總人數為28,總共有7個舞蹈班,知道了總的人數和總共有多少個班級,即可求出舞蹈班人數的均值。
該場景下算法中符號解釋
n:用來統計輸入的舞蹈班的個數
list:用來存儲輸入的舞蹈班的人數
sum:表示所有舞蹈班的人數之和
avg:表示n個舞蹈班的人數的均值
該場景下算法計算方法
案例中俱樂部舞蹈班的人數的總和為:sum=1+2+3+4+5+6+7,sum=28,
統計出俱樂部中舞蹈班級的個數為:n=7
計算出該俱樂部的人數的均值為:avg=sum/n,avg=28/7=4 ,
1.3 本算法優缺點
- 優點:能夠快速准確地計算出均值
- 缺點: 在輸入的數據過多時,會產出一定的誤差。
- 本算法采用的數據類型:本算法適用於double數據類型。
1.4 算法的輸入數據、中間結果以及輸出
本算法輸入數據
* @param i double,表示輸入的數據
* @param list List,存儲輸入的數據
算法中間結果
* @param sum double,表示輸入的所有的數據之和
本算法輸出結果
* @return avg double,表示數據的均值
1.5 算法中的異常及處理辦法
本算法可能異常或誤差
異常1:輸入數據不合法,如:輸入字母。
異常2:輸入數據特別大,會產生誤差。
本算法異常或誤差處理
異常1:解決,輸入不合法給予提示。
異常2:解決,擴大數據占有的空間
1.6 算法的代碼參考
源碼:
/**
* @Title: set
* @Description: 數據賦值
* @param a存儲的是輸入的數據
* @author cy
* @date 2015-7-29
*/
public static void set(double a[]) {
b = a;
n=a.length;
}
/**
* @Title: avg
* @Description: 計算平均值
* @param a存儲輸入的數據
* @param sum 表示輸入的所有的數據之和
* @param avg表示數據的均值
* @author cy
* @date 2015-7-29
*/
public static void avg(double a[]) {
// 定義一個平均值、和
double sum = 0;
for (double i : a) {
sum += i;
}
System.out.println("平均值為:" + sum / n);
}
類和方法基本描述
類源碼:見源程序:Average.java
該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,均值avg=sum/n;
類和方法調用接口
見源程序:Average.java
Average.java下包含如下方法:
List<Double> input() //輸入數據的函數
set(List<Double> list) //數據賦值
avg(List<Double> list) //計算均值的方法
2 中位數值
2.1 中位數算法的描述
中位數的定義永遠處於一組數據的中間,它是個中間值
中位數均值符號定義
n:表示的是輸入的數據的個數
中位數算法中的計算方法
- 按順序排列數字:從最小值排列到最大值
- 如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2
- 如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2。兩個中間數分別位於這個中間數位置的兩側
2.2 中位數算法的應用場景
案例描述:有兩組數據,分別求出兩組數據的中位數,並比較兩組數據的中位數的情況。
年齡 |
19 |
20 |
21 |
147 |
145 |
頻數 |
3 |
6 |
3 |
1 |
1 |
1 1 1 2 2 2 2 3 3 31 31 32 32 32 32 33 33 33
中位數算法在該場景的定義
案例定義:將兩組數據輸入到算法中,算法中用數組list接受,之后,算法就會自動的算出這兩組數據的中位數。
該場景下算法中符號解釋
n:用來統計輸入數據個數
list:用來存儲輸入數據
該場景下算法計算方法
①按順序排列數字:
1 1 1 2 2 2 2 3 3 31 31 32 32 32 32 33 33 33
②如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2:
③如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2:
該組數據中有18個數據為偶數。因此,用③中的方法,求出該組數據的中位數是17
2.3 本算法優缺點
- 優點:能夠快速准確地計算出數據的中位數
- 缺點: 在輸入的數據過多時,會產出一定的誤差。
- 本算法適用於double數據類型。
2.4 算法的輸入數據、中間結果以及輸出
本算法輸入數據
* @param i double,表示輸入的數據
本算法中間結果
* @param list List,存儲輸入的數據
本算法輸出結果
* @return med double,表示數據的中位數
2.5 算法中的異常及處理辦法
本算法可能異常或誤差
異常1:輸入數據不合法,如:輸入字母。
異常2:輸入數據特別大,會產生誤差。
本算法異常或誤差處理
異常1:解決,輸入不合法給予提示。
異常2:解決,擴大數據占有的空間
2.6 算法的代碼參考
源碼:
/**
* @Title: med
* @Description: 找中位數
* @param a存儲輸入的數據
* @param med表示中位數
* @param n表示中位數的個數
* @author cy
* @date 2015-7-29
*/
public static void med(double a[]) {
// 定義中位數
double med;
// 對數據進行排序
Arrays.sort(a);
// 數據個數為奇數的情況
if (n % 2 == 1) {
med = a[(n+1)/2];
// 數據個數為偶數的情況
} else {
med = (a[n / 2 ] + a[n/2+1]) / 2.0;
}
System.out.println("該組數據的中位數為:" + med);
}
類和方法基本描述
類源碼:見源程序:Median.java
算法中首先按輸入的數據存入到數組List中(輸入時以輸入0為結束),再講數組中的數字順序排列:從最小值排列到最大值,如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2,如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2。兩個數分別位於這個中間數位置的兩側。
類和方法調用接口
見源程序:Median.java
Median.java下包含如下方法:
List<Double> input() //輸入數據的函數
set(List<Double> list) //數據賦值
med(List<Double> list) //找出數據中的中位數
3 眾數
3.1 眾數算法的描述
眾數的定義
眾數:即頻率最大的數,與均值和中位數不同,眾數必須是數據集中的一個數值,而且是最頻繁出現的數值。
眾數符號定義
n:表示的是輸入的數據的個數
眾數算法中的計算方法
眾數的三步法:
- 把數據中的不同類別或數值全部找出來。
- 寫出每個數值或類別的頻數。
- 挑出具有最高頻數的一個或幾個數值,得出眾數。
3.2 眾數算法的應用場景
案例描述:有一組數據,求出這組數據的眾數。
年齡 |
19 |
20 |
21 |
147 |
145 |
頻數 |
3 |
6 |
3 |
1 |
1 |
眾數算法在該場景的定義
案例定義:將這組數據輸入到算法中,算法中用數組map接受,之后,算法就會自動的算出這組數據的眾數。
該場景下算法中符號解釋
n:用來統計輸入的值個數
map:用來存儲輸入的值和值出現的頻數
tm:存儲頻數
max:表示最大的頻數的值
該場景下算法計算方法
①首先按照要求將上述的數據輸入到算法中,並以輸入兩個#號為結束。
②將輸入的數據的頻數存儲到數組tm中
③找出tm數組中最大的數
④輸出tm中與max值相同的數,即為要求的眾數。
3.3 本算法優缺點
- 優點:能夠快速准確地計算出眾數
- 缺點: 在輸入的數據過多時,會產出一定的誤差。
- 本算法適用於double數據類型,String類型。
3.4 算法的輸入數據、中間結果以及輸出
本算法輸入數據
* @param i double,表示輸入的數據
* @param map Map,存儲輸入的值和該值出現的次數
本算法中間結果
* @param tm int[],存儲值得頻數
* @param max int 存儲頻數的最大值
本算法輸出結果
* @return int,表示數據的眾數
3.5 算法中的異常及處理辦法
本算法可能異常或誤差
異常1:輸入數據特別大,會產生誤差。
本算法異常或誤差處理
異常1:解決,擴大數據占有的空間
3.6 算法的代碼參考
源碼:
// 用於統計輸入了多少數據
static int n = 0;
static String a1[];
static int b1[];
/**
* @Title: set
* @Description: 數據賦值
* @param a存儲輸入的數值,b數值出現的次數
* @author cy
* @date 2015-7-29
*/
public static void set(String a[],int b[]) {
a1=a;
b1=b;
n=b.length;
}
/**
* 找眾數
* @param n輸入的數據的個數
* @param b存儲數值出現的次數的數組
* @param max表示次數的最大值
*/
public static void zs(String a[],int b[]) {
int i = 0;
Arrays.sort(b);
// 數組b中的最大值
int max;
// 獲取數組中的最大值
max = b[b.length - 1];
System.out.print("眾數為:");
for (int j =0;j<b.length;j++){
if(b[j]==max){
System.out.println(a[j]);
}
}
// 通過max得出數據的眾數
}
類和方法基本描述
類源碼:見源程序:Mode.java
算法中利用Map(映射,集合中的每一個元素包含一對鍵對象和值對象,鍵對象對應數據中的數值,值對象對應數值出現的頻數)來存儲輸入的數據,將數據存入到map中,以輸入兩個#為輸入結束。將map中的值對象即頻數讀出存入到數組tm中,在對數組tm進行排序,求出數組tm中的最大值max,最后將所有的最大值輸出即得到眾數。
類和方法調用接口
見源程序:Mode.java
Mode.java下包含如下方法:
Map<String, Object> input() //輸入數據的函數
set(Map<String, Object> map) //數據賦值
zs(Map<String, Object> map) //找出數據的眾數
4 方差
4.1 方差算法的描述
方差的定義
方差:量度數據分散性的一種方法,是數據與均值的距離的平方數的平值。
方差公式:∑(x-μ)^2/n
方差符號定義
n:表示的是輸入的數據的個數
u:為數據的均值
∑:表示所有數據之和
方差算法中的計算方法
n:表示的是輸入的數據的個數
u:為數據的均值
∑:表示所有數據之和
4.2 方差算法的應用場景
案例描述:有一組數據,求出這組數據的方差情況。
1 1 1 2 2 2 2 3 3 31 31 32 32 32 32 33 33 33
方差算法在該場景的定義
案例定義:將這組數據輸入到算法中,算法中用數組list接受,之后,算法就會先計算出這一組數據的均值,再統計出該組數據的個數,最后,計算出這組數據的方差。
該場景下算法中符號解釋
n:用來統計輸入的數據個數
list:用來存儲輸入數據
sum:表示所有的數據之和
u:表示n個數據的均值
該場景下算法計算方法
案例中數據的和:sum=306 ,
統計數據的個數為:n=18
計算出該組數據的均值為:avg=sum/n,avg=17 ,
再計算出該組數據的方差為226.4083044982699
4.3 本算法優缺點
- 優點:能夠快速准確地計算出方差
- 缺點: 在輸入的數據過多時,會產出一定的誤差。
- 本算法適用於double數據類型。
4.4 算法的輸入數據、中間結果以及輸出
本算法輸入數據
* @param i double,表示輸入的數據
* @param list List,存儲輸入的數據
本算法中間結果
* @param sum double,表示輸入的所有的數據之和
* @param n int,表示輸入的數據的個數
* @param u double表示數據的平均值
本算法輸出結果
* @return fc double,表示數據的方差
4.5 算法中的異常及處理辦法
本算法可能異常或誤差
異常1:輸入數據不合法,如:輸入字母。
異常2:輸入數據特別大,會產生誤差。
本算法異常或誤差處理
異常1:解決,輸入不合法給予提示。
異常2:解決,擴大數據占有的空間
4.6 算法的代碼參考
源碼:
/**
* @Title: calFac
* @Description: 計算方差
* @param a存儲輸入的數據
* @param sum1所有的數據之和
* @param u所有的數據的均值
* @author cy
* @date 2015-7-29
*/
public static double calFac(double a[]) {
// 數據的平均值
double u;
// 存儲數據之和
double sum1 = 0;
for (double s : a) {
sum1 += s;
}
// 計算平均值
u = sum1 / n;
for (double s : a) {
sum = sum + (s) * (s);
}
return (sum / n - u * u);
}
/**
* @Title: fac
* @Description: 輸出方差
* @param a存儲輸入的數據
* @author cy
* @date 2015-7-29
*/
public static void fac(double a[]) {
System.out.println("方差為:" + calFac(a));
}
類和方法基本描述
類源碼:見源程序:Facha.java
方差算法的描述:方差是數據與均值的距離的平方數的平值。該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,再求出數據的均值u=sum/n;最后根據方差的快速計算公式得出方差的值。
類和方法調用接口
見源程序:Facha.java
Facha.java下包含如下方法:
List<Double> input() //輸入數據的函數
set(List<Double> list) //數據賦值
5 標准差
5.1 標准差算法的描述
標准差的定義
標准差:是描述典型值與均值距離的一種方法,標准差越小,數值離均值越近 。
標准差公式:σ=方差開方
注:標准差也有可能為0,如果每個數值與均值的距離都是為0,則標准差將為0。
標准差符號定義
n:表示的是輸入的數據的個數
u:為數據的均值
∑:表示所有數據之和
σ:表示標准差
標准差算法中的計算方法
1、計算出該組數據的均值u
2、再統計該組數據的個數n
3、利用方差的公式計算出方差
4、利用標准差的公式計算出標准差
5.2 標准差算法的應用場景
案例描述:有一組數據,求出這組數據的標准差情況。
1 1 1 2 2 2 2 3 3 31 31 32 32 32 32 33 33 33
標准差算法在該場景的定義
案例定義:將這組數據輸入到算法中,算法中用數組list接受,之后,算法就會先計算出這一組數據的均值,再統計出該組數據的個數,計算出這組數據的方差,最后計算出該組數據的標准差。
該場景下算法中符號解釋
n:用來統計輸入的數據個數
list:用來存儲輸入數據
sum:表示所有的數據之和
u:表示n個數據的均值
該場景下算法計算方法
案例中數據的和:sum=306,
統計數據的個數為:n=18
計算出該組數據的均值為:avg=sum/n,avg=17 ,
再計算出該組數據的方差為226.408304498269
最后計算出該組數據的標准差:15.129074290546956
5.3 本算法優缺點
- 優點:能夠快速准確地計算出標准差
- 缺點: 在輸入的數據過多時,會產出一定的誤差。
- 本算法適用於double數據類型。
5.4 算法的輸入數據、中間結果以及輸出
本算法輸入數據
** @param i double,表示輸入的數據
* @param list List,存儲輸入的數據
本算法中間結果
* @param sum double,表示輸入的所有的數據之和
* @param n int,表示輸入的數據的個數
* @param u double表示數據的平均值
本算法輸出結果
* @return bzc double,表示數據的方差
5.5 算法中的異常及處理辦法
本算法可能異常或誤差
異常1:輸入數據不合法,如:輸入字母。
異常2:輸入數據特別大,會產生誤差。
本算法異常或誤差處理
異常1:解決,輸入不合法給予提示。
異常2:解決,擴大數據占有的空間
5.6 算法的代碼參考
源碼:
/**
* @Title: fac
* @Description: 計算標准差
* @param a存儲輸入的數據
* @param sum1所有的數據之和
* @param u所有的數據的均值
* @author cy
* @date 2015-7-29
*/
public static void bzc(double a[]){
double bzc;
// 計算方差
bzc = calFac(a);
// 標准差=方差開根號
System.out.println("標准差為:" + Math.sqrt(bzc));
}
類和方法基本描述
類源碼:見源程序:Bzc.java
該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,再求出數據的均值u=sum/n;最后根據方差的快速計算公式得出方差的值,將方差的值開根號即得到標准差的值。
類和方法調用接口
見源程序:Bzc.java
Bzc.java下包含如下方法:
List<Double> input() //輸入數據的函數
set(List<Double> list) //數據賦值
bzc(List<Double> list) //計算方差的方法
6 本章補充
6.1 基本概念
全距
全距:也叫極差,是用於來量度數據集分散程度的一種方法。
其算法為:上界減去下界,其中上界為最大值,下界為最小值。
- 優點:全距是量度數據分散程度的既簡單又方便的方法。
- 缺點:全距僅僅描述了數據的寬度,並沒有描述數據在上下界之前的分布形態,不能體現數據的實際分布形態。並且,全距很容易受到異常值的影響。
擺脫異常值的辦法:四分位數
四分位法:它將數據一分為四,最小的四分位數稱為下四分位數,最大的四分位數稱為上四分位數,中間的四分位數即為中位數。
四分位距=上四分位數-下四分位數
求下四分位數的位置
①首先計算n/4
②如果結果為整數,則下四分位數位於“n/4”這個位置和下一個位置的中間取這兩個位置上的數值的平均值,即得到下四分位數。
③如果“n/4”不是整數,則向上取整,結果即為下四分視為數的位置。
例如:如果你有6個數,首先計算6/4,得到1.5.向上取整的得到2,這表示下四分數的位置為2.
求上四分位數的位置
①首先計算3n/4
②如果結果為整數,則上四分位數位於“3n/4”這個位置這個位置和下一位置的中間,取這兩個位置上的數值的平均值,即得到上四分位數。
③如果“3n/4”不是整數,則向上取整,所得到的新數字即為上四分位數的位置。
百分位數:是將數據一分為百的數值。
箱線圖
用箱線圖繪制各種“距”
創建箱線圖:首先按標度畫出一個“箱”,想的左右兩邊分布代表下四分位數和上四分位數,然后在箱中畫出一條線,標示中位數,這個箱的寬度就是四分距的寬度,隨后,在箱的兩邊畫出“線”,顯示出全距的上界、下界和寬度。以下就是之前提到的舞蹈者的得分的箱線圖。
舞蹈者A的全距相對較小,她的得分中位數比舞蹈者B的高一些,舞蹈者B的全距非常大,有時候這位舞蹈者的得分比舞蹈者A高很多,但是有時又低很多,舞蹈者A發揮更穩定,通常得分高於舞蹈者B,所以,我們會選擇舞蹈者A
標准分
標准分是對不同環境下的相關數據進行比較的一種方法,可以對不同數據集的數據進行比較,可以使用標准分比較舞蹈者相對於其本人歷史紀錄的表現。
標准分的計算公式:z=(x-μ)/σ
計算標准分:
6.2 小結
學習的統計量:均值、中位數、眾數,它們只是讓我們知道了數據中心的情況,即數據集中的典型的具有代表性的數值,而第三章學的知識對讓我們對一個數據集有了更完整的了解,知道了數據集中數值的實際的分布形態,有助於我們對數據更好的掌握。
本章主要講的是分散性和變異性的量度,分散性的量度主要有全距(容易受異常值的影響)、四分位距(擺脫了異常值得影響)。異常性的量度主要有方差、標准差、標准分