數據分析師-分析工具

***創建函數時,如果有多個未知參數,可以用*args,在使用時可以用for arg in args:遍歷

df的重命名方法:

方法1:r_cx.columns = ['頻數']這種重命名方法是直接在原來的dataframe上修改。但需要對所有的列名重命名。

方法2:df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})

s_r = s.reset_index(drop=False)#.reset_index保留index同時,對index重新排序

一、分布分析

1.定量字段的分布分析

第一步:極差:越小越穩定,越大越不穩定

第二步:頻率分布情況:分組區間pd.cut,判斷每個區間出現的頻率,頻數,累計頻率,累計頻數

r_zj['累計頻率%'] = r_zj['累計頻率'].apply(lambda x:'%.2f%%' %(x*100))

r_zj.style.bar(subset = ['頻率','累計頻率'])#表格樣式

第三步:畫直方圖(區間)

x = len(r_zj)? y = r_zj['頻率']? m = r_zj['頻數']

for i,j,k in zip(range(x),y,m):#zip可以有多個值不止兩個

? ? plt.text(i-0.1,j+0.01,'%i'%k,color='k')

2.定性字段的分布分析

定性字段:除了和定量一樣外還要做個餅圖

二、對比分析

1.絕對值的比較:相減 --相互對比在量級上差距不能太大(1)折線圖比較(2)多系列柱狀圖比較 (3)堆疊圖正負數比較

2.相對值的比較:相除

(1)結構比較:同時可以反應“強度” → 兩個性質不同但有一定聯系的總量指標對比,用來說明“強度”、“密度”、“普遍程度”? 例如:國內生產總值“元/人”,人口密度“人/平方公里”

a.各組占總體的比重,反應總體的內部結構,b.折線圖

(2)比例比較:在分組的基礎上,將總體不同部分的指標數值進行對比,a.消費/工資? b.面積圖

(3)空間比較(同一時間橫向比較):同類現象在同一時間不同空間的指標數值進行對比,反應同類現象在不同空間上的差異程度和現象發展不平衡的狀況 a.四個產品在一個月內銷售情況的比較 b.柱狀圖

(4)縱向比較(不同時間):a.計算累計增長量,逐期增長量,定基增長速度=累計增長量/基期水平-1,環比增長速度=報告期/上一期水平-1

b.折線圖:同一現象在不同時間上的指標數值進行對比,反應現象的數量隨著時間推移而發展變動的程度及趨勢

# 最基本方法,計算動態相對數 → 發展速度

# 動態相對數(發展速度) = 某一現象的報告期數值 / 同一現象的基期數值

# 基期:用來比較的基礎時期

# 報告期:所要研究的時期,又稱計算期

三、統計分析:密度圖

對定量數據統計描述,從集中趨勢和離中趨勢兩方面 :平均數、眾數、中位數、四分位數、方差

1.集中趨勢:算術平均數mean 加權平均數 眾數mode、中位數median

2.離中趨勢:極差、分位差.describe、方差、標準差.var

四、帕累托分析

(1)先對值由大到小排序,畫柱狀圖

(2)計算累計占比data.cumsum()/data.sum(),畫出次坐標軸折線圖

(3)求出大于80%的第一個index,即這個index之前都是80%的

(4)求出該index是第幾個索引

五、正態分布

正態分布:均值決定位置,標準差決定分布幅度-越胖越離散,越瘦越集中;當均值=0時,標準分布

#集中性:高峰位于正中央,即均值所在位置;對稱性:以均值為中心,左右對稱;均勻變動性:中間是主要分布點,周圍會均勻下降;總面積=1

第一步:直方圖初檢:密度圖、直方圖+密度圖

fig = plt.figure(figsize=(10,6))

ax1 = fig.add_subplot(2,1,1)

ax1.scatter(s.index,s.values)

ax2 = fig.add_subplot(2,1,2)

s.hist(bins=20,ax=ax2)

s.plot(kind='kde',secondary_y=True,ax=ax2)

第二步:qq圖檢驗:即散點圖。將值由小到大排序,橫坐標是每個數據對應的百分位p(百分位p[i],p[i]=(i-0.5)/n );縱坐標是對應的值;會出的散點圖是否在直線(三分位數-一分位數)上。縱坐標也可以是q值為(值-均值)/標準差,是每個值標準化后的結果;

st = s['value'].describe()

x1,y1 = 0.25,st['25%']? x2,y2 = 0.75,st['25%']

ax3 = fig.add_subplot(3,1,3)

ax3.plot(s_r['p'],s_r['value'],'k.',alpha=0.1)--沒有指定什么圖形,就是用xy繪制

ax1.plot([x1,x2],[y1,y2],'-r',color='R')

第三步:K-s檢驗

K_S檢驗:樣本數據累計頻數分布f(x)和理論分布g(x)(如正態分布)比較,f(x)-g(x)最大值,p值>0.05接受f(x),p<0.05拒絕f(x)接受g(x)

1. #推導過程:(1)累計頻率分布:次數、累計次數、累計頻率(2)標準化取值-把非正態分布變成正態分布:(值-均值u)/std標準差(3)查閱標準正態分布,對應出理論值(4)D=累計頻率-理論分布的最大值(5)所得出的最大值對照顯著性對照表,求出p值是否大于0.05,若大于則滿足g(x)

2. #直接K-s檢驗算法:(1)求均值和標準差(2)導入stats模塊,stats.kstest(df['value'],'norm',(u,std))(3)statistic就是D值,pvalue就是p值

from scipy import stats

stats.kstest(df['value'],'norm',(u,std))

六、相關性分布

1.相關性分析:(1)先用簡單散點方法看相關性:a.兩個變量:正相關、負相關b.多個變量相關性分析:散點矩陣(2)

2.pearson相關系數:必須滿足正態分布,通過公式得到系數>0.5就相關

(1)檢驗正態分布-K_S檢驗 (2)如果符合正態分布,則求系數:r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum()))--xy分別為多變量的值(3)通過r得出相關性

#pearson相關系數算法:data.corr()

3.sperman相關系數:適用于非正態分布

(1)將多個變量的列分別按照有小到大排序并列出'秩'(2)求出d=秩1-秩2以及d的平方 (3)rs = 1-6*(data['d2'].sum())/(n*(n**2-1))其中n = len(data)

spearman相關系數算法:data.corr(method='spearman')

七、數據處理

1.缺失值處理:刪除記錄 數據插補 不處理

(1)判斷是否有缺失值:isnull notnull返回布爾型

(2)刪除缺失值dropna

(3)填充缺失數據:.fillna(method='pad'/'ffill'用之前填充=backfill/bfill用之后的填充)

(4)替換缺失數據:.replace(old列表,new,inplace)

2.缺失值插補

(1)均值、中位數、眾數插補

(2)臨近值填充:.fillna(method='pad'/'ffill'用之前填充=backfill/bfill用之后的填充)

(3)拉格朗日插值法:數學知識平面上的n個點可以用多項式表示:y=a0+a1x1+a2x2+...+a(n-1)x(n-1),只要求出a0,a1..的值就可以

from scipy.interpolate import lagrange

x = [3, 6, 9] y = [10, 8, 4]

print(lagrange(x,y))#得到多項式方程,三個值分別為a0,a1,a2

print(lagrange(x,y)(10))

df = pd.DataFrame({'x':np.arange(15)})

df['y'] = lagrange(x,y)(df['x'])#根據(x,y)的值插值新x的新y 值

plt.plot(df['x'],df['y'],linestyle='--',color='k')

例子:#lagrange的實際應用

a.中位數填充缺失值,畫密度圖

b.不處理,畫密度圖--作圖時自動排除缺失值

c.lagerand插值:缺失值位置前5后5個數據來插值即可

def f(s,n,k=5):--s值,n缺失值位置,k根據前后k個數據插值

? ? y = s[list(range(n-k,n+1+k))]

? ? y = y[y.notnull()]

? ? return lagrange(y.index,list(y))(n)

for i in range(len(data)):

? ? if data.isnull()[i]:

? ? ? ? data[i] = f(data,i)

? ? ? ? print(f(data,i))

data.dropna(inplace=True)

data.plot(kind='kde',ax=axes[3],style='--k',grid=True,title='lagrange插值')

3.異常值處理:異常值分析:箱型圖/3西格瑪原則;異常值處理方法:刪除/修正填補

3西格瑪原則:如果數據服從正態分布,異常值被定義為測定值與平均值偏差超過3倍標準差的值 (正態分布中符合這一原則的p(|x-u|>3西格瑪)<=0.03)

步驟:(1)正態分布檢驗:k-s檢驗(2)繪制數據的密度曲線和+-3倍標準差的豎線(3)求出異常值和正常值,并畫散點圖error = data[np.abs(data-u)>3*std]?data_c = data[np.abs(data-u)<=3*std]

箱型圖--較3西格瑪更準確些(1)畫出箱型圖,確定以內限還是外限定義缺失值(例子以內限)(2)分別計算q1,q3,iqr,內限(3)error大于內限(q3+1.5*iqr) 小于內線(q1-1.5*iqr);正常值:在(q1-1.5*iqr)和(q3+1.5*iqr)之間 (4)畫散點圖

4.數據標準化

(1)0-1標準化:比z-score用得較多些;

# 將數據的最大最小值記錄下來,并通過Max-Min作為基數(即Min=0,Max=1)進行數據的歸一化處理

# x = (x - Min) / (Max - Min)

def f(df,*cols):

? ? df_n = df.copy()

? ? for col in cols:

? ? ? ? ma = df_n[col].max()

? ? ? ? mi = df_n[col].min()

? ? ? ? df_n[col+'_n'] = (df_n[col]-mi)/(ma-mi)

? ? return df_n

df_n = f(df,'value1','value2')

應用:value1權重0.6,value2權重0.4,判斷那個指標綜合狀況最好

a.標準化0-1處理 b.根據權重算綜合指標,并由大到小排序 c.繪制折線圖

(2)z-score標準化:樣本從服從一般分布標準化到服從正態分布;數值越大代表離均值越遠;在分類和聚類算法中,兩個不同數據的相似性:平均水平、離中趨勢

#Z分數(z-score),是一個分數與平均數的差再除以標準差的過程 → z=(x-μ)/σ,其中x為某一具體分數,μ為平均數,σ為標準差

#Z值的量代表著原始值和平均值之間的距離,是以標準差為單位計算。在原始分數低于平均值時Z則為負數,反之則為正數

def f_z(df,*cols):

? ? df_n = df.copy()

? ? for col in cols:

? ? ? ? u = df_n[col].mean()

? ? ? ? std = df_n[col].std()

? ? ? ? df_n[col+'_zn'] = (df_n[col]-u)/std

? ? return df_n

f_z(df,'value1','value2')

5.數據連續屬性離散化

(1)等寬法:pd.cut(數據,劃分,左右開閉,labels組名)

cats.codes#等級標簽

cats.categories#每個值所在區間

pd.value_counts(cats)#每個區間的頻數

(2)等頻法:pd.qcut()相同數量的記錄放入區間

三、數學建模

np.random.RandomState → 隨機數種子,對于一個隨機數發生器,只要該種子(seed)相同,產生的隨機數序列就是相同的

監督學習:通過已有的數據訓練得出模型,有樣本值x和結果值y,包括回歸-線性回歸(得到具體的連續性數值)和分類-KNN最鄰近分類(離散數值)比如:醫生看病問癥狀:回歸是通過5個癥狀的描述來判斷拿幾天計量的藥;分類是通過現有癥狀判斷得的什么病;

非監督學習:沒有結果值y,全是樣本值(特征量)x;做聚類或降維-PCA主成分分析、K-means聚類

隨機算法:蒙特卡洛模擬算法

監督學習-線性回歸:指確定兩種或兩種以上變量間相互依賴的定量關系的統計分析方法,分位線性回歸和非線性回歸

監督學習-KNN最鄰近分類:在距離空間里,如果一個樣本最接近的K個鄰居里,絕大多數屬于某個類別,那么該樣本也屬于這個類別

非監督學習-PCA主成分分析:無監督算法+基礎降維算法,通過線性變換將原始數據變換為一組各維度線性無關的表示,用于提取數據的主要特征分量

主成分分析:(統計分析中屬于中間步驟,其實是降維的結果)

降維:假如有100個維度降成10個維度,主要考慮如何提取核心特征量,通過核心特征量描述新的特征

比如現在做一個線性回歸,發現參數非常多100個,如果直接做回歸擬合導致曲線很復雜甚至會過度擬合,

現在就要把100個參數變為10個參數當成回歸因子,就要用到主成分分析

非監督學習-K-means聚類:典型的基于距離的聚類算法

k均值:基于原型、劃分的距離技術,發現用戶指定個數(k)的簇

以歐式距離作為相似度測度

隨機算法-蒙特卡洛模擬: 又稱隨機抽樣,統計試驗方法,使用隨機數解決計算問題的方法。

將所求解的問題同一定的概率模型聯系,用計算機實現統計模擬或抽樣,獲得問題的相似解

1.回歸

#導入線性回歸模塊

from sklearn.linear_model import LinearRegression

回歸分為線性回歸和非線性回歸

一、線性回歸

np.random.RandomState(1) 隨機數種子

x=[1,2,3]?

將x變為3*1:x[:,np.newaxis]

得:[[1],

? ? ? ? [2],

? ? ? ? [3]? ]

將x變為1*3:x[np.newaxis,:]

得:[[1,2,3]]

1. 一元線性回歸https://www.cnblogs.com/nxld/p/6123239.htmlhttps://www.cnblogs.com/magle/p/5881170.html

(1) 構建回歸模型:model=LinearRegression()

(2)輸入自變量x因變量y:model.fit(xtrain[:,np.newaxis],ytrain)--以矩陣方式傳入

(3)擬合結果:斜率model.coef_? 截距model.intercept_

(4)擬合曲線:xtest=np.linespace(0,10,1000)? ytest=model.prdeict(xtest[:,np.newaxis]) --預測方法

(5)畫出散點圖和擬合的直線圖

**誤差:#誤差:擬合的線和實際值相差的值符合均值為0,服從標準差的正態分布

xtrain、ytrain:散點圖;xtest、ytest:直線;xtrain,ytest2--用xtrain的擬合直線算出的ytest2:直線,看擬合直線和點的豎直距離,即誤差

2.多元線性回歸

np.dot(a,b):如果ab為一維,則內積方法求 x1y1+x2y2+x3y3

如果ab為多維,則矩陣相乘法求

3.線性回歸模型的評估

from sklearn import metrics 計算均方差

#SSE和方差:擬合數據和原始數據的誤差平方和,接近于0擬合越完整(回歸線無法解釋的偏差)

#MSE均方差:擬合數據和原數據的誤差平方和的均值mse = metrics.mean_absolute_error(ytrain,ytest)

#RMSE均方根:MSE的平方根rmse = np.sqrt(mse)

#R-square確定系數:(1)SSR擬合數據與原始數據的均值之差的平方和 (2)SST原始數據和均值之差平方和(反應因變量取值的整體波動)

#SST=SSE+SSR? R-square=SSR/SST 取值范圍[0,1]越接近1,表明擬合的越好

R平方:r 2= model.score(xtrain[:,np.newaxis],ytrain)

#總結:r2接近于1(大于0.8就很不錯了),mse更小的(適用于多個回歸模型哪個最好)

#在主成分分析時:如果有10個參數做回歸模型1,r2=0.85;把10個參數降維成3個參數成為3元回歸模型2,r2=0.93,所以主成分分析后的回歸模型優于之前

舉例應用:#給定建筑面積和物業費的情況下,預測總價:總價=影響因子1*建筑面積+影響因子2*物業費+回歸系數-截距

2.KNN最鄰近分類

根據已經分類好的數據建立模型,對未分類的數據進行分類。分類問題用于將事物打標簽,標簽屬于離散值

(1)導入KNN模塊并定義模型(2)輸入自變量x和因變量y(3)預測

KNN:樣本分出N個類別,每個類別在空間上有點,看新的樣本和哪個類別最鄰近,就屬于那個類別

例如:打斗次數x,親吻次數y,新的樣本xy分析出屬于那類型電影

a = [18,90]

knn.predict(a)

報錯:ValueError: Expected 2D array, got 1D array instead: array=[18 90].

Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

解答:http://www.lxweimin.com/p/60596270e94e

新的sklearn中所有數據都要是二維矩陣,哪怕他是單獨一行或一列,要使用reshape做轉換

a = np.array(a).reshape(1,-1)? #reshape重組 array轉化為數組

1. 導入knn模塊 from sklearn import neighbors

import warnings

warnings.filterwarnings('ignore')

#忽略發出的警告

建立knn模型 import neighbors.KNeighborsClassifier()

knn.fit(x,y)

得出預測值:knn.predict() 注意:這里需要sklearn為二維矩陣

2. 植物分類(算法模型中有很多數據庫,比如植物、房價等)

from sklearn import datasets

iris = datasets.load_iris() 花的屬性庫

knn=neighbors.KNeighborsClassifier()

knn.fit(x,y)

knn.predict()

3. 合并merge方法:

merge(left,right,how='inner',on,left_on,right_on)

how:inner交集,outer并集,left左連接,right右連接

on:要加入的索引或列,要在左和右中找到

left_on:左

科普:http://datahref.com/archives/169iris是鳶尾花數據集,包含150個樣本,對應數據集的每一行,每個樣本包含四個特征和樣本的類別

3.PCA主成分分析


舉例:1000個樣本有100(x1,x2...x100)個維度降到10(a1,a1...a10)個維度

? a1-a10這10個變量每個都是由100個變量組成的,關系為a1b1+a2b2+...+a10b10

? a1=e11x1+e12x2+...+e1100x100

? a1是新變量 x1是舊變量

? 這里的e11是100個原變量x組成變量a1的特征向量

? b1是新的a1的特征值

? 核心:這里的e11是100個原變量x組成變量a1的特征向量,降維前有幾維就有幾個特征向量

?核心: b1是新的a1的特征值,對應降到幾維


? 將b1..b10由大到小排序,并做累計求和,成為貢獻率達到85%后,前面幾個就是主成分

1. 加載主成分分析模塊PCA from sklearn.decomposition import PCA

2.降維n為:pca=PCA(n_components=1)

3.構建模型:pca.fit(原始數據)? pca.explained_variance輸出特征值b、pca.components_輸出特征向量e1、pca.n_components輸出成分個數

4.返回降維后的數據:x_pca=pca.transform(df)

5.如果特征值b較多,篩選主成分85%以上:

s=pca.explained_variance_

df = pd.DataFrame({'b':s,'b_sum':s.cumsum()/s.sum()})

4.聚類K-means

https://blog.csdn.net/kevinelstri/article/details/52622960

1. 基于現有樣本在距離上的劃分,需要先確定樣本大致劃分為幾個類(簇)

比如:現有四個點,定位到簇;再加入幾個點,根據位置劃分到簇周圍并從新計算簇的位置;重復步驟2,直到所有簇不再改變;

缺點:事先要決定劃為幾個簇

2.from sklearn.datasets.samples_generator import make_blobs:make_blobs聚類數據生成器

x,y_true = make_blobs(n_samples=300, #創建XX條數據

? ? ? ? ? ? ? ? ? ? centers =4, #生成4類數據,類別數

? ? ? ? ? ? ? ? ? ? cluster_std=0.5, #每個類別的方差,方差越小越聚集,方差越大越分散=[0.2,0.2,0.4,0.7]

? ? ? ? ? ? ? ? ? ? random_state=0, #隨機數種子

? ? ? ? ? ? ? ? ? ? n_features=2)#默認每個樣本特征數為2

#x生成數據值,y生成數據對應的類別標簽(0,1,2,3)

3.導入K-means模型:from sklearn.cluster import KMeans

4.構建模型: kmeans = KMeans(n_cluster=4)分為多少類/簇

5.kmeans.fit(x)? y_kmeans=kmeans.predict(x)生成每個數據聚類后的類別值0,1,2,3

6.cen = kmeans.cluster_centers獲取幾個不同簇的中心點

總結:#K-means聚類樣本數據需要知道本身有多少類(簇n_clusters)才能K-Means分析,便于以后回歸或分類

5.隨機算法:蒙特卡洛模擬

np.where(condition,xy,)當condition為true,返回x;否則返回y

1. π的計算-xy離中心點的距離是否下雨1,若小于就在園內,不小于在圓外:正方形面積4r方,圓面積πr平方,比值=4π;正方形隨機點的數量/圓隨機點的數量求出π

(1)np.random.uniform(min,max,n)最小值,最大值,隨機個數均勻分布

(2)判斷xy是否在正方形內還是圓內:計算xy的點和中心點(0,0)的距離是否小于1

d = np.sqrt((x-a)**2+(y-b)**2)

res = sum(np.where(d<r,1,0))

(3)#導入circle模塊 from matplotlib.patches import Circle

circle = Circle(xy=(a,b),radius=r,alpha=0.5,color='gray') #xy圓心 radius半徑

axes.add_patch(circle)

plt.grid(True,linestyle='--',linewidth='0.8')

2.積分問題:# 積分的計算:落到灰色領域多少個點 函數y=x的平方,所以只要值小于y=x的平方就可以

xi = np.linspace(0,1,100)

yi = xi**2

plt.plot(xi,yi,'--k')

plt.fill_between(xi,yi,0,color='gray',alpha=0.5,label='area') #填充圖表

plt.grid()

3.上廁所問題

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、實驗目的 學習使用 weka 中的常用分類器,完成數據分類任務。 二、實驗內容 了解 weka 中 explo...
    yigoh閱讀 8,629評論 5 4
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,504評論 0 13
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,392評論 0 2
  • 12月14日上午,青石水河小學“2018屆少先隊代表大會”如期舉行。在會上,代表們通過施政演講、才藝展示、我的貢獻...
    毛前進閱讀 740評論 0 11
  • 不經意間,感覺每天的感悟非常的少,文字也不是很豐富,昨天我忽然有了一個想法,你曾經看的書,看的電影,電視劇聽...
    好兵帥克Jimmy閱讀 445評論 0 5