Python数据分析之单变量分析
0 引言
在數據分析或者機器學習過程中,我們需要對變量或者特征進行分析,在分析過程中,一般都會分為兩種:單變量分析、雙變量分析。今天,土豆簡單介紹一下單變量分析,單變量分析主要對單個變量或者特征進行分析,而變量可分為連續型變量、類別型變量,兩種類型不同的變量的分析方法也是不同的。
1 連續型變量
(1) 數據概覽
對于連續型變量,可以計算變量的統計值,來簡單描述數據。一般在實踐過程中,會使用pandas包中的describe方法來觀察數據(當然使用前需要轉換為Series或者DataFrame類型,DataFrame其實就是大表格,表格每一列的類型都是Series):
import numpy as np x = np.random.randint(1,100,100) # 隨機生成100個0-100之間的數字 x = pd.Series(x) x.describe()結果為:
count 100.000000 mean 44.350000 std 29.432812 min 1.000000 25% 16.000000 50% 44.500000 75% 71.250000 max 98.000000 dtype: float64可以看到,describe方法會計算出特征的count(個數)、mean(平均值)、std(標準差)、min(最小值)、max(最大值)、25% 50% 75%(分位數) ,由此可以簡單觀察數據的情況。除此之外,還可以用mode()、median()方法查看眾數以及中位數。之后,可以用info()方法,來查看每個變量或特征的type,有助于了解是否存在除了nan以外的特殊符號異常,但是info只能用于DataFrame類型,不可用于Series類型。這里我們把數據類型變為DataFrame類型,再查看info信息:
x = pd.DataFrame(x, columns=['v1']) # 把個特征命名為v1 x.info()結果為:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 100 entries, 0 to 99 Data columns (total 1 columns):# Column Non-Null Count Dtype --- ------ -------------- -----0 v1 100 non-null int32 dtypes: int32(1) memory usage: 528.0 bytes結果顯示有100條樣本,100 non-null表示v1列沒有缺失值,Dtype表示該列的數據類型是int32。
(2) 數據離散以及分布情況
數據離散情況的觀察可以查看范圍、分位數、分位差、方差、標準差、偏度(skewness)、峰度(kurtosis)等等。其中,范圍可由最大最小值確定,分位數分位差、標準差可由describe()方法確定,其中,四分位差IOR=Q3(第3四分位數)-Q1(第1四分位數 )確定。方差可由var()方法計算得到,偏度、峰度可由skew()、kurt()方法獲得。關于峰度和偏度,本文就不詳細介紹了,只需要簡單知道偏度是描述數據分布形態的統計量,其描述的是某總體取值分布的對稱性;峰度是描述某變量所有取值分布形態陡緩程度的統計量。下面代碼展示了方差、偏度、峰度的計算:
print(x.var()) print(x.skew()) print(x.kurt())結果為
789.2940404040404 -0.1727686492729214 -1.171386373921091除此之外,還可以通過可視化的方法去觀察變量的分布情況,比較常用的方法是直方圖、QQ圖、核密度估計圖。
-  直方圖用于展示變量的分布情況,核密度估計圖的功能與直方圖相似,不過可以理解為是直方圖的加窗平滑。直方圖調用方法為sns.distplot(),核密度估計圖的調用方法為sns.kdeplot() import seaborn as sns sns.set() # 切換到sns的默認運行配置 y = np.random.randn(100) # 生成具有標準正態分布的數據樣本 sns.distplot(y) # 可以看到數據大致呈正態分布,kde曲線也是呈現正態
再來看看核密度估計圖,其實上圖中的那條曲線就是該數據的核密度估計,不過既然有這個方法,那就調用一下:
plt.figure(1);sns.kdeplot(y) plt.figure(2);sns.kdeplot(y, shade=True)得到以下兩圖:
左圖其實就是直方圖中的曲線,右圖則是展示了曲線下的陰影部分,更美觀更好判斷罷了。
-  QQ圖是變量的分位數和正態分布的分位數對比參照圖,如果數據符合正態分布,則所有的點都會落在直線上。 from scipy import stats plt.figure() stats.probplot(y, plot=plt) plt.show()
因為小編是用randn方法生成的正態分布的數據,因此從QQ圖中可以發現,繪圖數據基本與直線重合。
(3) 缺失值判斷
缺失值可以用isnull()或者isna()方法判斷,這兩個方法的返回值都是布爾值,即:缺失值為True,反之為False。如果你不需要知道具體是哪個樣本有缺失值的話,一般都會使用isnull().sum()直接統計缺失值數量
y.isnull().sum()該結果結果為0,因為我們生成的數據不存在缺失值,所以缺失值為0。因為我們這里采用了一維Serise數據進行實驗,但實際中的數據一般都是具有多個特征,讀取后為DataFrame格式,所以一般會用df.isnull.sum(axis=0)的方式去按列(每列為一個特征或變量)統計缺失值。對于缺失值的可視化,一般會使用msno.matrix()方法以及msno.bar()方法。具體代碼演示小編會在后面的實戰文章中具體演示。
(4) 異常值判斷
異常值是指遠遠偏離總體樣本的觀測值。異常值的存在會降低數據的正態性以及模型的擬合能力等等。異常值的檢測主要用箱型圖、直方圖、散點圖等等,最常用的應該是箱型圖:
plt.figure() sns.boxplot(y=y)因為數據是按照正態分布的規則生成的,因此不存在異常值,這里只是進行代碼的演示。后文的實踐中,會進一步展示箱型圖在實際數據中的應用。數據缺失值、異常值的可視化以及處理方法的內容比較多,在這篇文章中便不過多解釋。
2 類別型變量
類別型變量或特征的分析方法沒有連續型特征那么豐富,比較單一,一般使用頻率(占比)或頻次(次數)來表示變量的分布情況,并使用柱形圖進行可視化。
(1) 數據統計
這里同樣進行人工生成數據,用于方法的講解。比如,現在一個學校將學生的成績劃分為三檔:不及格、良好、優秀,將學生的成績表示為計算機能看懂的數據,將不及格賦予狀態值1,良好賦予狀態值2,優秀賦予狀態值3。一個班級中,各同學的成績如下:
grades = [1, 1, 2, 2, 2, 2, 3, 1, 2, 3, 1, 2, 2, 3, 3, 2, 1, 2, 2, 2, 2, 3, 3, 2] grades = pd.Series(grades)unique()方法會返回序列去重之后的不同值,nunique()方法則直接返回不同值的個數,以例子進行解釋:unique()方法會統計grades中有哪幾種成績表示,nunique()方法會統計grades中有幾種成績表示:
print('grades中不同值的個數是:', grades.nunique()) print('grades中不同值分別是:', grades.unique())結果為:
grades中不同值的個數是: 3 grades中不同值分別是: [1 2 3]并且使用value_counts()方法進一步查看每種數值的個數:
grades.value_counts()結果為:
2 13 3 6 1 5 dtype: int64可以看得到狀態值2的個數為13個,即成績良好的同學有13個;狀態值3的個數為6個,即成績優秀的同學有6個;狀態值1的個數為5個,即成績不及格的同學有5個。
(2) 數據分布可視化
再利用countplot()函數對類別及其頻次進行可視化,countplot()會將數據的各個類別進行計數count,再進行作圖plot:
plt.figure() sns.countplot(grades) plt.show()這個方法其實也可以應用于查看變量分布和異常值檢測,比如一個班級里20個同學,我們統計出來有19個良好,1個優秀,那其實該變量是不能很好地描述和區分樣本的,所以在EDA的時候就可以把該特征進行刪除。
這就是單變量分析,但是真實場景中,我們往往會有很多特征,那此時便需要進行多變量分析了。關于多變量分析,小編會在后面再進行介紹。
總結
以上是生活随笔為你收集整理的Python数据分析之单变量分析的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在windoes系统中github访问出
- 下一篇: 5G IMT-2020
