维度爆炸?Python实现数据压缩竟如此简单!
前言
在之前的文章中,我們已經(jīng)詳細介紹了主成分分析的原理,并用Python基于主成分分析的客戶信貸評級進行實戰(zhàn)。
在那篇文章中我們指出的主成分分析常見的三個應(yīng)用場景中,其中有一個是「數(shù)據(jù)描述」,以描述產(chǎn)品情況為例,比如著名的波士頓矩陣,子公司業(yè)務(wù)發(fā)展?fàn)顩r,區(qū)域投資潛力等,需要將多變量壓縮到少數(shù)幾個主成分進行描述,壓縮到兩個主成分是最理想的,這樣便可在一張圖內(nèi)表現(xiàn)出來。
但這類分析一般做主成分分析是不充分的,能夠做到因子分析更好。但因子分析的知識點非常龐雜,所以本文將跳過原理,直接通過案例再次「實戰(zhàn)PCA分析」,用于主成分分析到因子分析的一個過渡,目標(biāo)有兩個:
能夠通過主成分分析結(jié)果來估計生成的主成分所表示的含義
借以引出因子分析的優(yōu)勢和學(xué)習(xí)的必要性是本文的目標(biāo)。
需求說明
上司希望從事數(shù)據(jù)分析崗位的你僅用兩個短句就概括出以下數(shù)據(jù)集所反映出的經(jīng)濟現(xiàn)象用幾個長句都不一定能夠很好的描述數(shù)據(jù)集的價值,更何況高度凝練的兩個短句,短短九個指標(biāo)就已經(jīng)十分讓人頭疼了,如果表格再寬一些呢,比如有二三十個變量?
Python實戰(zhàn)
本節(jié)我們將使用Python對上面的數(shù)據(jù)進行分析
數(shù)據(jù)探索
import?pandas?as?pd import?numpy?as?np import?matplotlib.pyplot?as?plt plt.style.use('seaborn-whitegrid')plt.rc('font',?**{'family':?'Microsoft?YaHei,?SimHei'})?#?設(shè)置中文字體的支持 plt.rcParams['axes.unicode_minus']?=?False #?解決保存圖像是負號'-'顯示為方塊的問題 sns.set(font='SimHei')??#?解決Seaborn中文顯示問題df?=?pd.read_csv('城市經(jīng)濟.csv') df在做主成分分析前,都應(yīng)該進行變量間相關(guān)性的探索,畢竟如果變量是獨立的,則不可壓縮。
plt.figure(figsize=(8,?6)) sns.heatmap(data=df.corr(),?annot=True)?#?annot=True:?顯示數(shù)字發(fā)現(xiàn)變量間的相關(guān)性較高,有變量壓縮的必要性
PCA建模
數(shù)據(jù)標(biāo)準(zhǔn)化
使用中心標(biāo)準(zhǔn)化,即將變量都轉(zhuǎn)化成z分數(shù)的形式,避免量綱問題對壓縮造成影響
from?sklearn.preprocessing?import?scale data?=?df.drop(columns='area')?#?丟棄無用的類別變量 data?=?scale(data)初步建模
需要說明的是第一次的n_components參數(shù)最好設(shè)置得大一些(保留的主成份),觀察explained_variance_ratio_取值變化,即每個主成分能夠解釋原始數(shù)據(jù)變異的百分比
from?sklearn.decomposition?import?PCA pca?=?PCA(n_components=9)?#?直接與變量個數(shù)相同的主成分 pca.fit(data)結(jié)果分析
累積解釋變異程度
#?累積解釋變異程度 plt.plot(np.cumsum(pca.explained_variance_ratio_),?linewidth=3) plt.xlabel('成份數(shù)') plt.ylabel('累積解釋方差');?plt.grid(True)可以看出,當(dāng)取主成分數(shù)為2時,累積解釋方差就已經(jīng)達到0.97有多(0.85 就已經(jīng)足夠),說明我們只需要取兩個主成分即可
重新建模
綜上可知兩個主成分就已經(jīng)足夠了
pca?=?PCA(n_components=2)?#?直接與變量個數(shù)相同的主成分 pca.fit(data)pca.explained_variance_ratio_new_data?=?pca.fit_transform(data)?#??fit_transform?表示將生成降維后的數(shù)據(jù) #?查看規(guī)模差別 print("原始數(shù)據(jù)集規(guī)模:???",?data.shape) print("降維后的數(shù)據(jù)集規(guī)模:",?new_data.shape)可以看到9個變量壓縮成兩個主成分!
主成分中各變量的權(quán)重分析
先看兩個主成分與 9 個變量的系數(shù)關(guān)系
results?=?pd.DataFrame(pca.components_).T results.columns?=?['pca_1',?'pca_2'] results.index?=?df.drop(columns='area').columns results可以明顯看出:
主成分1幾乎不受data的第二個自變量人均GDP的影響,0.034,其他自變量對其影響程度都差不多。
主成分2受data的第二個自變量人均GDP影響最大,達到了0.94
結(jié)果描述
通過上面的PCA建模,我們把9個自變量壓縮成了2 主成分,每個主成分受哪些變量的影響也有了了解。雖然得到的主成分都沒有什么意義,但我們是否可以通過變量們對主成分的影響程度來為生成的兩個主成分命名呢?
第一個主成分在表達經(jīng)濟總量的指標(biāo)上的權(quán)重相當(dāng),可考慮命名為經(jīng)濟總量水平;而第二個主成分只在人均GDP上權(quán)重很高,可暫時考慮命名為人均水平
注意:這里的給主成分命名(包括后續(xù)有關(guān)因子分析的推文)都是對降維后的數(shù)據(jù)進行的,而不是生成的主成分,這樣才有比較和描述的價值。每個自變量在生成的主成分上的權(quán)重只是給這個主成分的命名提供參考,真正的命名操作是對壓縮后的數(shù)據(jù)進行。
new_data?=?pca.fit_transform(data)?#??fit_transform?表示將生成降維后的數(shù)據(jù) results?=?df.join(pd.DataFrame(new_data,??#?new_data?是降維后的數(shù)據(jù)columns=['經(jīng)濟總量水平',?'人均水平']))?#?與原來的數(shù)據(jù)拼接 results繪制波士頓矩陣,這里的散點圖的點標(biāo)注代碼是前人的優(yōu)秀輪子,直接拿來用即可。
plt.figure(figsize=(10,?8)) #?基礎(chǔ)散點圖 x,?y?=?results['經(jīng)濟總量水平'],?results['人均水平'] label?=?results['area'] plt.scatter(x,?y) plt.xlabel('經(jīng)濟總量水平');?plt.ylabel('人均水平')#?對散點圖中的每一個點進行文字標(biāo)注##?固定代碼,無需深究,拿來即用##?給點標(biāo)注是需要將?x?和?y?以及標(biāo)簽如上段代碼那樣單獨拆開 for?a,b,l?in?zip(x,y,label):plt.text(a,?b+0.1,?'%s.'?%?l,?ha='center',?va='bottom',?fontsize=14)#?添加兩條豎線 plt.vlines(x=results['經(jīng)濟總量水平'].mean(),?ymin=-1.5,?ymax=3,?colors='red') plt.hlines(y=results['人均水平'].mean(),?xmin=-4,?xmax=6,?colors='red')最終從上圖可以看出:
廣西,河北,福建三地的人均水平和經(jīng)濟總量水平都偏低
上海的人均經(jīng)濟水平很高,但經(jīng)濟總量水平缺只是略優(yōu)于均值
廣東的人均經(jīng)濟水平稍次于均值,但經(jīng)濟總量水平很高
......
小結(jié)
本文再次講解了基于主成分分析的樣本特征描述,并使用Python示范了完整的流程。其中,也對由多個自變量生成的主成分的命名描述操作中需要注意的點作了比較詳細的說明。其實PCA并不能非常好的滿足維度分析的需求,能夠做到「因子分析」最好,它是主成分方法的拓展,作為維度分析的手段,因子分析也是構(gòu)造合理的聚類模型和穩(wěn)健的分類模型的必然步驟。所以我們因子分析案例再見~
今天的文章就到這里,如果你喜歡本系列請點亮在看給作者一點鼓勵~
Python商業(yè)數(shù)據(jù)挖掘自動化系列代碼及數(shù)據(jù)已經(jīng)上傳GitHub,如有需要可以自行下載:「https://github.com/liuhuanshuo/zaoqi-Python/tree/master/商業(yè)數(shù)據(jù)分析實戰(zhàn)」
?OK
由于微信平臺算法改版,公號內(nèi)容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標(biāo)我們和給我們多點點【在看】。星標(biāo)具體步驟為:
總結(jié)
以上是生活随笔為你收集整理的维度爆炸?Python实现数据压缩竟如此简单!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度网盘迎来劲敌!非会员下载速度10MB
- 下一篇: 整理一周的Python全品类资料包含10