本文目錄一覽:
- 1、怎麼用python算p值和t檢驗
- 2、python數據統計分析
- 3、IP/UDP/TCP/ICMP數據報協議的校驗和的區別和計算
- 4、GPRMC校驗位如何計算 python csdn
- 5、校驗和求計算?計算過程最好給我講下?
怎麼用python算p值和t檢驗
引入相關模塊,這次我們使用stats的
產生兩列隨機變數,用到了stats。norm.rvs,參數loc表示平均數,scale表示標準差,size是樣本量這是產生的兩個變數的數據的一部分
ttest_rel的用法:輸出t和p值從p值可以看出,這兩列數據是沒有差異的。
當然,ttest_rel還可以接受pandas.DataFrame數據,先從excel中讀取數據我們可以看一下數據的基本內容:
我們可以選擇scoreA和ScoreB這兩列數據進行T檢驗輸出的結果可見兩列變數均值無差異
我們還可以同時對多個變數進行檢驗,比如:這是產生的結果可見:第一個array表示t值,兩個表示p值,因此我們可以知道p(scoreA)=0.1260.05
python數據統計分析
1. 常用函數庫
scipy包中的stats模塊和statsmodels包是python常用的數據分析工具,scipy.stats以前有一個models子模塊,後來被移除了。這個模塊被重寫並成為了現在獨立的statsmodels包。
scipy的stats包含一些比較基本的工具,比如:t檢驗,正態性檢驗,卡方檢驗之類,statsmodels提供了更為系統的統計模型,包括線性模型,時序分析,還包含數據集,做圖工具等等。
2. 小樣本數據的正態性檢驗
(1) 用途
夏皮羅維爾克檢驗法 (Shapiro-Wilk) 用於檢驗參數提供的一組小樣本數據線是否符合正態分布,統計量越大則表示數據越符合正態分布,但是在非正態分布的小樣本數據中也經常會出現較大的W值。需要查表來估計其概率。由於原假設是其符合正態分布,所以當P值小於指定顯著水平時表示其不符合正態分布。
正態性檢驗是數據分析的第一步,數據是否符合正態性決定了後續使用不同的分析和預測方法,當數據不符合正態性分布時,我們可以通過不同的轉換方法把非正太態數據轉換成正態分布後再使用相應的統計方法進行下一步操作。
(2) 示例
(3) 結果分析
返回結果 p-value=0.029035290703177452,比指定的顯著水平(一般為5%)小,則拒絕假設:x不服從正態分布。
3. 檢驗樣本是否服務某一分布
(1) 用途
科爾莫戈羅夫檢驗(Kolmogorov-Smirnov test),檢驗樣本數據是否服從某一分布,僅適用於連續分布的檢驗。下例中用它檢驗正態分布。
(2) 示例
(3) 結果分析
生成300個服從N(0,1)標準正態分布的隨機數,在使用k-s檢驗該數據是否服從正態分布,提出假設:x從正態分布。最終返回的結果,p-value=0.9260909172362317,比指定的顯著水平(一般為5%)大,則我們不能拒絕假設:x服從正態分布。這並不是說x服從正態分布一定是正確的,而是說沒有充分的證據證明x不服從正態分布。因此我們的假設被接受,認為x服從正態分布。如果p-value小於我們指定的顯著性水平,則我們可以肯定地拒絕提出的假設,認為x肯定不服從正態分布,這個拒絕是絕對正確的。
4.方差齊性檢驗
(1) 用途
方差反映了一組數據與其平均值的偏離程度,方差齊性檢驗用以檢驗兩組或多組數據與其平均值偏離程度是否存在差異,也是很多檢驗和演算法的先決條件。
(2) 示例
(3) 結果分析
返回結果 p-value=0.19337536323599344, 比指定的顯著水平(假設為5%)大,認為兩組數據具有方差齊性。
5. 圖形描述相關性
(1) 用途
最常用的兩變數相關性分析,是用作圖描述相關性,圖的橫軸是一個變數,縱軸是另一變數,畫散點圖,從圖中可以直觀地看到相關性的方向和強弱,線性正相關一般形成由左下到右上的圖形;負面相關則是從左上到右下的圖形,還有一些非線性相關也能從圖中觀察到。
(2) 示例
(3) 結果分析
從圖中可以看到明顯的正相關趨勢。
6. 正態資料的相關分析
(1) 用途
皮爾森相關係數(Pearson correlation coefficient)是反應兩變數之間線性相關程度的統計量,用它來分析正態分布的兩個連續型變數之間的相關性。常用於分析自變數之間,以及自變數和因變數之間的相關性。
(2) 示例
(3) 結果分析
返回結果的第一個值為相關係數表示線性相關程度,其取值範圍在[-1,1],絕對值越接近1,說明兩個變數的相關性越強,絕對值越接近0說明兩個變數的相關性越差。當兩個變數完全不相關時相關係數為0。第二個值為p-value,統計學上,一般當p-value0.05時,可以認為兩變數存在相關性。
7. 非正態資料的相關分析
(1) 用途
斯皮爾曼等級相關係數(Spearman』s correlation coefficient for ranked data ),它主要用於評價順序變數間的線性相關關係,在計算過程中,只考慮變數值的順序(rank, 值或稱等級),而不考慮變數值的大小。常用於計算類型變數的相關性。
(2) 示例
(3) 結果分析
返回結果的第一個值為相關係數表示線性相關程度,本例中correlation趨近於1表示正相關。第二個值為p-value,p-value越小,表示相關程度越顯著。
8. 單樣本T檢驗
(1) 用途
單樣本T檢驗,用於檢驗數據是否來自一致均值的總體,T檢驗主要是以均值為核心的檢驗。注意以下幾種T檢驗都是雙側T檢驗。
(2) 示例
(3) 結果分析
本例中生成了2列100行的數組,ttest_1samp的第二個參數是分別對兩列估計的均值,p-value返回結果,第一列1.47820719e-06比指定的顯著水平(一般為5%)小,認為差異顯著,拒絕假設;第二列2.83088106e-01大於指定顯著水平,不能拒絕假設:服從正態分布。
9. 兩獨立樣本T檢驗
(1) 用途
由於比較兩組數據是否來自於同一正態分布的總體。注意:如果要比較的兩組數據不滿足方差齊性, 需要在ttest_ind()函數中添加參數equal_var = False。
(2) 示例
(3) 結果分析
返回結果的第一個值為統計量,第二個值為p-value,pvalue=0.19313343989106416,比指定的顯著水平(一般為5%)大,不能拒絕假設,兩組數據來自於同一總結,兩組數據之間無差異。
10. 配對樣本T檢驗
(1) 用途
配對樣本T檢驗可視為單樣本T檢驗的擴展,檢驗的對象由一群來自正態分布獨立樣本更改為二群配對樣本觀測值之差。它常用於比較同一受試對象處理的前後差異,或者按照某一條件進行兩兩配對分別給與不同處理的受試對象之間是否存在差異。
(2) 示例
(3) 結果分析
返回結果的第一個值為統計量,第二個值為p-value,pvalue=0.80964043445811551,比指定的顯著水平(一般為5%)大,不能拒絕假設。
11. 單因素方差分析
(1) 用途
方差分析(Analysis of Variance,簡稱ANOVA),又稱F檢驗,用於兩個及兩個以上樣本均數差別的顯著性檢驗。方差分析主要是考慮各組之間的平均數差別。
單因素方差分析(One-wayAnova),是檢驗由單一因素影響的多組樣本某因變數的均值是否有顯著差異。
當因變數Y是數值型,自變數X是分類值,通常的做法是按X的類別把實例成分幾組,分析Y值在X的不同分組中是否存在差異。
(2) 示例
(3) 結果分析
返回結果的第一個值為統計量,它由組間差異除以組間差異得到,上例中組間差異很大,第二個返回值p-value=6.2231520821576832e-19小於邊界值(一般為0.05),拒絕原假設, 即認為以上三組數據存在統計學差異,並不能判斷是哪兩組之間存在差異 。只有兩組數據時,效果同 stats.levene 一樣。
12. 多因素方差分析
(1) 用途
當有兩個或者兩個以上自變數對因變數產生影響時,可以用多因素方差分析的方法來進行分析。它不僅要考慮每個因素的主效應,還要考慮因素之間的交互效應。
(2) 示例
(3) 結果分析
上述程序定義了公式,公式中,”~”用於隔離因變數和自變數,」+「用於分隔各個自變數, “:”表示兩個自變數交互影響。從返回結果的P值可以看出,X1和X2的值組間差異不大,而組合後的T:G的組間有明顯差異。
13. 卡方檢驗
(1) 用途
上面介紹的T檢驗是參數檢驗,卡方檢驗是一種非參數檢驗方法。相對來說,非參數檢驗對數據分布的要求比較寬鬆,並且也不要求太大數據量。卡方檢驗是一種對計數資料的假設檢驗方法,主要是比較理論頻數和實際頻數的吻合程度。常用於特徵選擇,比如,檢驗男人和女人在是否患有高血壓上有無區別,如果有區別,則說明性別與是否患有高血壓有關,在後續分析時就需要把性別這個分類變數放入模型訓練。
基本數據有R行C列, 故通稱RC列聯表(contingency table), 簡稱RC表,它是觀測數據按兩個或更多屬性(定性變數)分類時所列出的頻數表。
(2) 示例
(3) 結果分析
卡方檢驗函數的參數是列聯表中的頻數,返回結果第一個值為統計量值,第二個結果為p-value值,p-value=0.54543425102570975,比指定的顯著水平(一般5%)大,不能拒絕原假設,即相關性不顯著。第三個結果是自由度,第四個結果的數組是列聯表的期望值分布。
14. 單變數統計分析
(1) 用途
單變數統計描述是數據分析中最簡單的形式,其中被分析的數據只包含一個變數,不處理原因或關係。單變數分析的主要目的是通過對數據的統計描述了解當前數據的基本情況,並找出數據的分布模型。
單變數數據統計描述從集中趨勢上看,指標有:均值,中位數,分位數,眾數;從離散程度上看,指標有:極差、四分位數、方差、標準差、協方差、變異係數,從分布上看,有偏度,峰度等。需要考慮的還有極大值,極小值(數值型變數)和頻數,構成比(分類或等級變數)。
此外,還可以用統計圖直觀展示數據分布特徵,如:柱狀圖、正方圖、箱式圖、頻率多邊形和餅狀圖。
15. 多元線性回歸
(1) 用途
多元線性回歸模型(multivariable linear regression model ),因變數Y(計量資料)往往受到多個變數X的影響,多元線性回歸模型用於計算各個自變數對因變數的影響程度,可以認為是對多維空間中的點做線性擬合。
(2) 示例
(3) 結果分析
直接通過返回結果中各變數的P值與0.05比較,來判定對應的解釋變數的顯著性,P0.05則認為自變數具有統計學意義,從上例中可以看到收入INCOME最有顯著性。
16. 邏輯回歸
(1) 用途
當因變數Y為2分類變數(或多分類變數時)可以用相應的logistic回歸分析各個自變數對因變數的影響程度。
(2) 示例
(3) 結果分析
直接通過返回結果中各變數的P值與0.05比較,來判定對應的解釋變數的顯著性,P0.05則認為自變數具有統計學意義。
IP/UDP/TCP/ICMP數據報協議的校驗和的區別和計算
首先,IP、ICMP、UDP和TCP報文頭部都有校驗和欄位,大小都是16bit,演算法也基本一樣:
在發送數據時,為了計算數據包的校驗和。應該按如下步驟:
(1)把校驗和欄位置為0;
(2)把需校驗的數據看成以16位為單位的數字組成,依次進行二進位反碼求和;(3)把得到的結果存入校驗和欄位中。在接收數據時,計算數據包的校驗和相對簡單,按如下步驟:
(1)把首部看成以16位為單位的數字組成,依次進行二進位反碼求和,包括校驗和欄位;
(2)檢查計算出的校驗和的結果是否為0;
(3)如果等於0,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。
雖然上面四種報文的校驗和演算法一樣,但在作用範圍存在不同:IP校驗和只校驗20位元組的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12位元組的IP偽首部,包括源IP地址(4位元組)、目的IP地址(4位元組)、協議(2位元組,第一位元組補0)和TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(注意,填充位元組只是為了計算校驗和,可以不被傳送)。
這裡還要提一點,UDP的校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦呢?書上有這麼一句話:「如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進位反碼計算中是等效的。」
講了這麼多,那這個校驗和到底是怎麼算的呢?
1. 什麼是二進位反碼求和
對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進位加法規則一樣),若最高位有進位,則向最低位進1。
首先這裡的反碼好像跟我們以前學的有符號數的反碼不一樣(即正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各位取反),這裡不分正負數,直接每個位都取反!
上面加粗的那句是跟我們一般的加法規則不太一樣的地方:最高位有進位,則向最低位進1。確實有些疑惑,為什麼要這樣做呢?仔細分析一下(為了方便說明,以 4bit二進位反碼求和舉例),上面的這種操作,使得在發生加法進位溢出時,溢出的值並不是10000,而是1111。也即是當相加結果滿1111時溢出,這樣也可以說明為什麼0000和1111都表示0了(你同樣可以發現,任何數與這兩個數做二進位反碼求和運算結果都是原數,這恰好符合數0的加法意義)。
下面再舉例兩種二進位反碼求和的運算:
原碼加法運算 反碼加法運算
3(0011)+ 5(0101)= 8(1000) 3(1100)+ 5(1010)= 8(0111)
8(1000)+ 9(1001)= 1(0001) 8(0111)+ 9(0110)= 2(1101)
從上面兩個例子可以看出,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢 出,所以相差正好是.
1。舉例只是為了形象地觀察二進位反碼求和的運算規則,至於為什麼要定義這樣的規則以及該運算規則還存在其它什麼特性,可能就需要涉及 代數理論的東西的了(嗚嗚~~數學理論沒學好啊,只能從表面上分析分析)。
另外關於二進位反碼求和運算需要說明的一點是,先取反後相加與先相加後取反,得到的結果是一樣的!(事實上我們的編程演算法里,幾乎都是先相加後取反。)
2. 校驗和演算法的實現
講了什麼是二進位反碼求和,那麼校驗和的演算法實現就簡單多了。廢話少說,直接上代碼:
[cpp] view plaincopy
//計算校驗和
USHORT checksum(USHORT *buffer,int size)
{
unsigned long cksum=0;
while(size1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR *)buffer;
}
//將32位數轉換成16
while (cksum16)
cksum=(cksum16)+(cksum 0xffff);
return (USHORT) (~cksum);
}
buffer是指向需校驗數據緩存區的指針,size是需校驗數據的總長度(位元組為單位)
4~13行代碼對數據按16bit累加求和,由於最高位的進位需要加在最低位上,所以cksum必須是32bit的unsigned long型,高16bit用於保存累加過程中的進位;另外代碼10~13行是對size為奇數情況的處理!
14~16行代碼的作用是將cksum高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上。這裡使用了while循環,判斷cksum高16bit是否非零,因為第16行代碼執行的時候,仍可能向cksum的高16bit進位。
有些地方是通過下面兩條代碼實現的:
cksum = (cksum 16) + (cksum 0xffff);
cksum += (cksum 16);
這裡只進行了兩次相加,即可保證相加後cksum的高16位為0,兩種方式的效果一樣。事實上,上面的循環也最多執行兩次!
17行代碼即對16bit數據累加的結果取反,得到二進位反碼求和的結果,然後函數返回該值。
3. 為什麼使用二進位反碼求和呢?
好了,最後一個問題,為什麼要使用二進位反碼來計算校驗和呢,而不是直接使用原碼或者補碼?
這個問題我想了很久,由於水平有限實在弄不明白,於是在百度上一陣狂搜,什麼都沒有(不知道是百度不給力,還是大家都不關注這個問題呢?)。果斷換google,敲了3個關鍵詞:why checksum tcp,嘿嘿 結果第二篇就是我想要的文章了!!!
先把鏈接給大家吧:
這篇文章主要介紹二進位反碼求和(the 1’s complement sum)與補碼求和(the 2’s complement sum)的區別,另外還說明了在TCP/IP校驗和中使用反碼求和的優點。
It may look awkword to use a 1’s complement addition on 2’s complement machines. This method however has its own benefits.
Probably the most important is that it is endian independent. Little Endian computers store hex numbers with the LSB last (Intel processors for example). Big Endian computers put the LSB first (IBM mainframes for example). When carry is added to the LSB to form the 1’s complement sum (see the example) it doesn’t matter if we add 03 + 01 or 01 + 03. The result is the same.
Other benefits include the easiness of checking the transmission and the checksum calculation plus a variety of ways to speed up the calculation by updating only IP fields that have changed.
上面是原文的一部分,說明在TCP/IP校驗和中使用反碼求和的一些優點:
a. 不依賴系統是大端還是小端。 即無論你是發送方計算或者接收方檢查校驗和時,都不需要調用htons 或者 ntohs,直接通過上面第2節的演算法就可以得到正確的結果。這個問題你可以自己舉個例子,用反碼求和時,交換16位數的位元組順序,得到的結果相同,只是位元組順序相應地也交換了;而如果使用原碼或者補碼求和,得到的結果可能就不相同!
b. 計算和驗證校驗和比較簡單,快速。說 實話,這個沒怎麼看明白,感覺在校驗和計算方面,原碼或者補碼求和反而更簡單一些(從C語言角度),在校驗和驗證上面,通過一樣的演算法判斷結果是否為全 0,確實要方便一些,所以可能從綜合考慮確實反碼求和要簡便一些。另外,IP報文在傳輸過程中,路由器經常只修改TTL欄位(減1),此時路由器轉發該報 文時可以直接增加它的校驗和,而不需要對IP整個首部進行重新計算。當然,可能從彙編語言的角度看,反碼求和還有很多高效的地方,這裡就不在深入追究 了~~~
GPRMC校驗位如何計算 python csdn
如果是當作無符號整數來計算,則演算法要簡單很多,實際上都可以縮減為一句代碼的事。如果是當作帶符號整數來計算,則演算法要複雜一下,要處理各種上溢出和下溢出的情形。正如文章開頭指出的,不論使用哪種方式,最後的二進位表示都是一樣的。
所以一般情況下可以使用無符號整數來計算校驗和,簡單快速。
校驗和求計算?計算過程最好給我講下?
校驗和演算法
unsigned short check_sum(unsigned short *addr,int len)
{
register int nleft=len;
register int sum=0;
register short *w=addr;
short answer=0;
while(nleft1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsigned char *)(answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum16)+(sum0xffff);
sum+=(sum16);
answer=~sum;
return(answer);
}
首先,IP、ICMP、UDP和TCP報文頭都有檢驗和欄位,大小都是16bit,演算法基本上也是一樣的。
在發送數據時,為了計算數據包的檢驗和。應該按如下步驟:
1、把校驗和欄位設置為0;
2、把需要校驗的數據看成以16位為單位的數子組成,依次進行二進位反碼求和;
3、把得到的結果存入校驗和欄位中
在接收數據時,計算數據包的檢驗和相對簡單,按如下步驟:
1、把首部看成以16位為單位的數字組成,依次進行二進位反碼求和,包括校驗和欄位;
2、檢查計算出的校驗和的結果是否為0;
3、如果等於0,說明被整除,校驗和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。
雖然說上面四種報文的校驗和演算法一樣,但是在作用範圍存在不同:IP校驗和只校驗20位元組的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12個位元組的IP偽首部,包括源IP地址(4位元組)、目的IP地址(4位元組)、協議(2位元組)、TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(填充位元組只是為了計算校驗和,可以不被傳送)。
在UDO傳輸協議中,校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦?書上有一句話:「如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進位反碼計算中是等效的」
那麼校驗和到底怎麼計算了?
1、什麼是二進位反碼求和
對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有益處則向高位進1(和一般的二進位法則一樣),若最高位有進位,則向最低位進1.
首先這裡的反反碼好像和以前學的有符號反碼不一樣,這裡不分正負數,直接每個為都取反。
上面加粗的那句話和我們平時的加法法則不一樣,最高位有進位,則向最低位進1。確實有些疑惑,為什麼要這樣呢?自習分析一下,上面的這種操作,使得在發送加法進位溢出時,溢出值並不是10000,而是1111.也即是當相加結果滿1111時溢出,這樣也可以說明為什麼0000和1111都表示0了。
下面是兩種二進位反碼求和的運算:
原碼加法運算:3(0011)+5(0101)=8(1000)
8(1000)+9(1001)=1(0001)
反碼加法運算:3(1100)+5(1010)=8(0111)
8(0111)+9(0110)=2(1101)
從上面的例子中,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1.
詳細代碼
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259391.html