python数据科学-单变量数据分析
總第85篇
01|背景:
我們在做機器學習之前,需要自己先對數據進行深入的了解(這些數據是什么類型,總共有多少數據,有沒有缺失值,均值是多少之類的),只有自己對數據足夠了解了,才能夠更好地利用機器學習。我們把在正式開始機器學習之前對數據的了解過程成為探索性分析 , 簡稱 EDA。
02|單變量數據分析:
單邊量數據是指數據集中只有一個變量 ,也可以是多列中的某一列(可以理解成是某一個指標)。比如一個班的體測成績表是一個數據集(包含身高、體重、1000 米用時之類的各種指標),那么該數據集里面的某一個指標就可以看作是一個單變量數據。
我們本篇以美國總統歷年在國情咨詢中對國會提起的訴求數量作為實例。
2.1數據整體情況了解:
我們在拿到一批/列數據時,第一件事就是看一下這批數據的一個整體分布情況,而要看分布情況最好的方法就是繪制該批數據的散點圖。
#加載需要的庫%matplotlib inline import numpy as np plt.style.use("ggplot") from matplotlib.pylab import frange import matplotlib.pyplot as plt#導入相應的數據 fill_data=lambda x:int(x.strip() or 0)#用來處理缺失值,如果缺失,用0填充 data=np.genfromtxt("D:\\Data-Science\\Exercisedata\\python數據科學指南配套文件\\president.csv",\dtype=(int,int),delimiter=",",converters={1:fill_data}) x=data[:,0] y=data[:,1]#繪制數據圖表以觀察趨勢 ax1=plt.subplot(1,1,1) ax1.set_title("All data") ax1.scatter(x,y,c="r") ax1.set_xlabel("year") ax1.set_ylabel("No presdential Request")通過上圖我們可以看出,大部分數據分布還是相對比較集中,但是這是主觀上感覺,我們需要采用更科學的方法來進行衡量,這里采用分位數去衡量。
分位數是指在統計學中把所有數值由小到大排列按所處的位置進行分割,一般會把所有的數據用三個點(25、50、75位置的)分成四份。
#計算數據的百分位數(第25、50、75位數)以了解數據分布 perc_25=np.percentile(y,25) perc_50=np.percentile(y,50) perc_75=np.percentile(y,75) print("25th Percentile=%0.2f"%(perc_25)) print("50th Percentile=%0.2f"%(perc_50)) print("75th Percentile=%0.2f"%(perc_75))在得到相應的分位數以后,我們將分位數對應的圖表繪制到散點圖中。
#將這些百分位數添加到之前繪制的圖表中作為參考 ax1=plt.subplot(1,1,1) ax1.set_title("All data") ax1.scatter(x,y,c="r") ax1.set_xlabel("year") ax1.set_ylabel("No presdential Request") ax1.axhline(perc_25,label="25th",c="y") ax1.axhline(perc_50,label="50th",c="g") ax1.axhline(perc_75,label="75th",c="m") ax1.legend(loc="best")現在可以看到,大部分數據確實是分布在 50 分位數(中間值)的兩側,只有左上角和右下角的幾個點離 50 分位數比較遠,,這里把他們當作異常值來看待。
異常值的處理方式可以直接刪除,也可以把異常值當作缺失值對待進行值替換,具體選擇哪種根據不同情況來定,我們這里選擇把異常值刪除掉。
#在圖形中查找是否存在異常值 #使用mask函數刪除異常值 #刪除異常值0和54 y_masked=np.ma.masked_where(y==0,y) y_masked=np.ma.masked_where(y==54,y_masked)重新繪制圖表,并將對應的分位數線也繪制進去。
#在圖中添加25、50、75分位數線 ax2=plt.subplot(1,1,1) ax2.scatter(x,y_masked,c="r") ax2.set_title("Masked data") ax2.set_xlabel("year") ax2.set_ylabel("No Presedential Request") ax2.set_ylim(0,60) ax2.axhline(perc_25,label="25th perc",c="y") ax2.axhline(perc_50,label="50th perc",c="g") ax2.axhline(perc_75,label="75th perc",c="m") ax2.legend(loc="best")現在看起來是不是就順眼很多了哈。通過上表我們可以看出,該批數據大部分還是集中 50 分位數(中間位置數)附近,絕對值大小為 20 左右。散點圖能幫我們對數據有一個大概的認識,但是還不夠具體,我們接下來通過其他幾個角度繼續對該批數據集進行探索。
2.2對單變量數據進一步分析:
看了整體數據分布以后我們還想看得更具體一點,比如:哪一年的訴求量最多?哪個量級的訴求量最多之類的。
對訴求數量的絕對量級進行分析:
#對數據出現的頻率進行統計 x_freq=Counter(y) x_=list(x_freq.keys())#某一個量級訴求數量出現的次數 y_=list(x_freq.values())#訴求數量絕對值#繪制分組數據的點陣圖 plt.subplot(111) plt.title("Dot Plot by Frequency")#繪制頻率plt.plot(y_,x_,"yo") plt.xlabel("Count") plt.ylabel("Presdential Request")#設置x軸的最小值和最大值 plt.xlim(min(y_)-1,max(y_)+1) plt.ylim(-5,60)通過上圖可以看出,超過30的訴求數量只出現一次,出現2次,3次的訴求數量均低于30,說明生活還是很穩定,人們的訴求并不是那么多。(我瞎說的)
對不同年份的訴求數量分析:
#采用年份范圍進行分組 x_group=collections.OrderedDict() group=5group_count=1 keys=[] values=[] for i,xx in enumerate(x):keys.append(xx)values.append(y[i]) ? ?if group_count==group:x_group[tuple(keys)]=valueskeys=[]values=[]group_count=0group_count+=1x_group[tuple(keys)]=values print(x_group) #繪制散點圖plt.subplot(111) ? ? x_vals=[] x_labels=[] y_vals=[] x_tick=1 for k,v in x_group.items(): ? ?for i in range(len(k)):x_vals.append(x_tick)x_label="-".join([str(kk) if not i else str(kk)[-2:] for i ,kk in enumerate(k)])x_labels.append(x_label)y_vals.extend(list(v))x_tick+=1plt.title("Dot Plot by Year Grouping") plt.xlabel("Year Group") plt.ylabel("No Presedential Request")try:plt.plot(x_vals,y_vals,"co")except ValueError:print(len(x_vals),len(y_vals))plt.xticks(x_vals,x_labels,rotation=-50) plt.ylim(-5,60)年份分析里面我們以5年為一個界限進行分組,通過圖表我們可以看出1961-1965的訴求數量最低,且均低于20,1986-1990年的訴求數量較分散,且訴求數量的絕對值在該范圍內,1981-1985年之間的訴求數量較平穩,且5年中有4年的訴求數量是低于10的。
涉及的知識點總結:
-
np.genfromtxt()#numpy庫中用來讀取文件的,相當于pandas中的read_csv()。
-
np.percentile()#用來計算一批數據的分位數。
-
np.ma.masked_where()#用來屏蔽滿足某一條件的數值,常用來處理缺失數據。
-
Collections.OrderedDict()#用來創建一個有序字典。
-
Counter()#用于統計一批數據中不同點出現的次數,返回一個字典,鍵為值,值為鍵在該批數據中出現的次數。
-
enumerate()#用于返回一個值在一批數據中出現的順序。
-
np.repeat()#用于重復某一個序列數據。
總結
以上是生活随笔為你收集整理的python数据科学-单变量数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hzb格式文件怎么打开
- 下一篇: python数据科学-多变量数据分析