***創建函數時,如果有多個未知參數,可以用*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.上廁所問題