python数据科学-单变量数据分析
總第85篇
01|背景:
我們在做機器學習之前,需要自己先對數(shù)據(jù)進行深入的了解(這些數(shù)據(jù)是什么類型,總共有多少數(shù)據(jù),有沒有缺失值,均值是多少之類的),只有自己對數(shù)據(jù)足夠了解了,才能夠更好地利用機器學習。我們把在正式開始機器學習之前對數(shù)據(jù)的了解過程成為探索性分析 , 簡稱 EDA。
02|單變量數(shù)據(jù)分析:
單邊量數(shù)據(jù)是指數(shù)據(jù)集中只有一個變量 ,也可以是多列中的某一列(可以理解成是某一個指標)。比如一個班的體測成績表是一個數(shù)據(jù)集(包含身高、體重、1000 米用時之類的各種指標),那么該數(shù)據(jù)集里面的某一個指標就可以看作是一個單變量數(shù)據(jù)。
我們本篇以美國總統(tǒng)歷年在國情咨詢中對國會提起的訴求數(shù)量作為實例。
2.1數(shù)據(jù)整體情況了解:
我們在拿到一批/列數(shù)據(jù)時,第一件事就是看一下這批數(shù)據(jù)的一個整體分布情況,而要看分布情況最好的方法就是繪制該批數(shù)據(jù)的散點圖。
#加載需要的庫%matplotlib inline import numpy as np plt.style.use("ggplot") from matplotlib.pylab import frange import matplotlib.pyplot as plt#導入相應的數(shù)據(jù) fill_data=lambda x:int(x.strip() or 0)#用來處理缺失值,如果缺失,用0填充 data=np.genfromtxt("D:\\Data-Science\\Exercisedata\\python數(shù)據(jù)科學指南配套文件\\president.csv",\dtype=(int,int),delimiter=",",converters={1:fill_data}) x=data[:,0] y=data[:,1]#繪制數(shù)據(jù)圖表以觀察趨勢 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")通過上圖我們可以看出,大部分數(shù)據(jù)分布還是相對比較集中,但是這是主觀上感覺,我們需要采用更科學的方法來進行衡量,這里采用分位數(shù)去衡量。
分位數(shù)是指在統(tǒng)計學中把所有數(shù)值由小到大排列按所處的位置進行分割,一般會把所有的數(shù)據(jù)用三個點(25、50、75位置的)分成四份。
#計算數(shù)據(jù)的百分位數(shù)(第25、50、75位數(shù))以了解數(shù)據(jù)分布 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))在得到相應的分位數(shù)以后,我們將分位數(shù)對應的圖表繪制到散點圖中。
#將這些百分位數(shù)添加到之前繪制的圖表中作為參考 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")現(xiàn)在可以看到,大部分數(shù)據(jù)確實是分布在 50 分位數(shù)(中間值)的兩側,只有左上角和右下角的幾個點離 50 分位數(shù)比較遠,,這里把他們當作異常值來看待。
異常值的處理方式可以直接刪除,也可以把異常值當作缺失值對待進行值替換,具體選擇哪種根據(jù)不同情況來定,我們這里選擇把異常值刪除掉。
#在圖形中查找是否存在異常值 #使用mask函數(shù)刪除異常值 #刪除異常值0和54 y_masked=np.ma.masked_where(y==0,y) y_masked=np.ma.masked_where(y==54,y_masked)重新繪制圖表,并將對應的分位數(shù)線也繪制進去。
#在圖中添加25、50、75分位數(shù)線 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")現(xiàn)在看起來是不是就順眼很多了哈。通過上表我們可以看出,該批數(shù)據(jù)大部分還是集中 50 分位數(shù)(中間位置數(shù))附近,絕對值大小為 20 左右。散點圖能幫我們對數(shù)據(jù)有一個大概的認識,但是還不夠具體,我們接下來通過其他幾個角度繼續(xù)對該批數(shù)據(jù)集進行探索。
2.2對單變量數(shù)據(jù)進一步分析:
看了整體數(shù)據(jù)分布以后我們還想看得更具體一點,比如:哪一年的訴求量最多?哪個量級的訴求量最多之類的。
對訴求數(shù)量的絕對量級進行分析:
#對數(shù)據(jù)出現(xiàn)的頻率進行統(tǒng)計 x_freq=Counter(y) x_=list(x_freq.keys())#某一個量級訴求數(shù)量出現(xiàn)的次數(shù) y_=list(x_freq.values())#訴求數(shù)量絕對值#繪制分組數(shù)據(jù)的點陣圖 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的訴求數(shù)量只出現(xiàn)一次,出現(xiàn)2次,3次的訴求數(shù)量均低于30,說明生活還是很穩(wěn)定,人們的訴求并不是那么多。(我瞎說的)
對不同年份的訴求數(shù)量分析:
#采用年份范圍進行分組 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的訴求數(shù)量最低,且均低于20,1986-1990年的訴求數(shù)量較分散,且訴求數(shù)量的絕對值在該范圍內,1981-1985年之間的訴求數(shù)量較平穩(wěn),且5年中有4年的訴求數(shù)量是低于10的。
涉及的知識點總結:
-
np.genfromtxt()#numpy庫中用來讀取文件的,相當于pandas中的read_csv()。
-
np.percentile()#用來計算一批數(shù)據(jù)的分位數(shù)。
-
np.ma.masked_where()#用來屏蔽滿足某一條件的數(shù)值,常用來處理缺失數(shù)據(jù)。
-
Collections.OrderedDict()#用來創(chuàng)建一個有序字典。
-
Counter()#用于統(tǒng)計一批數(shù)據(jù)中不同點出現(xiàn)的次數(shù),返回一個字典,鍵為值,值為鍵在該批數(shù)據(jù)中出現(xiàn)的次數(shù)。
-
enumerate()#用于返回一個值在一批數(shù)據(jù)中出現(xiàn)的順序。
-
np.repeat()#用于重復某一個序列數(shù)據(jù)。
總結
以上是生活随笔為你收集整理的python数据科学-单变量数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hzb格式文件怎么打开
- 下一篇: python数据科学-多变量数据分析