如何用R語言和Python實現(xiàn)因子變量與分類重編碼

本篇文章為大家展示了如何用R語言和Python實現(xiàn)因子變量與分類重編碼,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

雞西ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

今天介紹數(shù)據(jù)類型中因子變量的運用在R語言和Python中的實現(xiàn)。

因子變量是數(shù)據(jù)結(jié)構(gòu)中用于描述分類事物的一類重要變量。其在現(xiàn)實生活中對應(yīng)著大量具有實際意義的分類事物。

比如年齡段、性別、職位、愛好,星座等。

之所以給其單獨列出一個篇幅進行講解,除了其在數(shù)據(jù)結(jié)構(gòu)中的特殊地位之外,在數(shù)據(jù)可視化和數(shù)據(jù)分析與建模過程中,因子變量往往也承擔(dān)中描述某一事物重要維度特征的作用,其意義非同尋常,無論是在數(shù)據(jù)處理過程中還是后期的分析與建模,都不容忽視。

通常意義上,按照其所描述的維度實際意義,因子變量一般又可細(xì)分為無序因子(類別之間沒有特定順序,水平相等)和有序因子(類別中間存在某種約定俗成的順序,如年齡段、職稱、學(xué)歷、體重等)。

在統(tǒng)計學(xué)中對變量進行了如下四類劃分:定類變量、定序變量、定距變量、定比變量。而其中的定類和定比變量就對應(yīng)著我們今天將要講解的因子變量(無序因子和有序因子變量)。

因子變量從信息含量上來看,其要比單純的定性變量(文本變量)所包含的描述信息多一些,但是又比數(shù)值型變量(定距變量和定比變量)所表述的信息含量少一些。

因而原則上來講,數(shù)值型變量可以轉(zhuǎn)換為因子變量,因子變量可以轉(zhuǎn)換為文本型變量,但是以上順序卻是不可逆的(信息含量多的變量可以放棄信息量,轉(zhuǎn)換為信息含量較少的變量類型,但是信息含量較少的變量卻無法增加信息含量)。

在R語言中,通常使用factor直接生成因子變量,我們僅需一個向量(原則上可以是文本型、也可以是數(shù)字型,但是通常從實際意義上來說,被轉(zhuǎn)換的應(yīng)該是一個含有多類別的類別型文本變量)。

factor(x, levels,labels=levels,ordered=)

以上參數(shù)中,x即是我們將要轉(zhuǎn)換的變量,levels是將要設(shè)定的因子水平(可選參數(shù),省略則自動以向量中的不重復(fù)對象為因子水平),labels作為因子標(biāo)簽(可選參數(shù),與前述因子水平對應(yīng),若設(shè)置,則打印時顯示的是對應(yīng)因子標(biāo)簽,省略則同因子水平一樣,使用向量中不重復(fù)值【即類別】作為標(biāo)簽),ordered是邏輯參數(shù),設(shè)定是否對因子水平排序。

vector<-rep(LETTERS[1:5],6);print(vector);plyr::count(vector)

myfactor<-(factor(vector,levels=c("E","D","C","B","A"),labels=c("EEE","DDD","CCC","BBB","AAA"),ordered=TRUE)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

通常來說,factor函數(shù)中,levels一般不用設(shè)置,函數(shù)會自動判斷向量內(nèi)有幾個水平,但是倘若要生成有序因子的話,默認(rèn)會根據(jù)字母順序排列,如果自然順序與目標(biāo)有序因子順序不一致,則一定要指定levels,labels則視具體需求而定,如果本身就是文本類別的話,一般無需設(shè)定標(biāo)簽。

如果是問卷類數(shù)據(jù),而且編碼為數(shù)值,則一定要通過labels標(biāo)簽的設(shè)定來還原每一個編碼的真實意義。

factor(vector,labels=c("AAA","BBB","CCC","DDD","EEE"),ordered=TRUE)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

因子變量與文本變量數(shù)值變量之間的互轉(zhuǎn)則通過as.character()或者as.numeric()函數(shù)來實現(xiàn)。

library(dplyr)

as.character(as.factor(1:10))%>%str()

as.numeric(as.factor(1:10))%>%str()

R語言中的因子變量重編碼

如果你有一個度量指標(biāo),需要將其轉(zhuǎn)換為分段的因子變量,則可以通過cut函數(shù)來實現(xiàn)這種轉(zhuǎn)換。

scale<-runif(100,0,100)

cut(x,breaks,labels=NULL,include.lowest=FALSE,right=TRUE,ordered=)

cut函數(shù)參數(shù)如上,接受一個數(shù)值型向量,breaks接受一個數(shù)值向量(標(biāo)識分割點)或者單個數(shù)值(分割 數(shù)目)。

right是邏輯參數(shù),設(shè)定分割帶是左開右閉或者左閉右開。(默認(rèn)左開右閉)。

include.lowest則根據(jù)right的設(shè)定,決定是否應(yīng)該包含端點值(如果right為TRUE,左開右閉區(qū)間,則包含最小值,如果right為FALSE,左閉右開區(qū)間則包含最大值),默認(rèn)為FALSE。

ordered則設(shè)定是否對因子水平進行排序。

(factor1<-cut(scale,breaks=c(0,20,40,60,80,100),labels=c("0~20","20~40","40~60","60~80","80~100"),include.lowest=TRUE,ordered=TRUE))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

另一種分割場景是使用分位數(shù)函數(shù)進行分割,

qa <- quantile(scale, c(0,0.2,0.4,0.6,0.8,1.0))

(cut(scale,breaks=qa,labels=c("0%~20%","20%~40%","40%~60%","60%~80%","80%~100%"),include.lowest=TRUE,ordered=TRUE))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

以上分割方法在是較為常用的因子變量轉(zhuǎn)換方法,當(dāng)然你可以使用if函數(shù)進行類似分割,但是相比較來講,使用cut函數(shù)進行分割要高效很多。

Python


在Python中,Pandas庫包含了處理因子變量的一整套完整語法函數(shù)。

import pandas as pd

import numpy as np

import string

在pandas中的官方在線文檔中,給出了pandas因子變量的詳細(xì)論述,并在適當(dāng)位置與R語言進行了對比描述。

http://pandas.pydata.org/pandas-docs/stable/categorical.html#working-with-categories

當(dāng)利用pandas生成序列時,可以在序列函數(shù)內(nèi)的dtype參數(shù)設(shè)定因子變量類型。

s = pd.Series(["A","B","C","D","E"], dtype="category")

生成數(shù)據(jù)框時,也可以直接生成因子變量。

df = pd.DataFrame({"A":["a","b","c","a"]})

df["B"] = df["A"].astype('category')

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

除了直接在生成序列或者數(shù)據(jù)框時生成因子變量之外,也可以通過一個特殊的函數(shù)pd.Categorical來完成在序列和數(shù)據(jù)框中創(chuàng)建因子變量。

s = pd.Series(pd.Categorical(["a","b","c","a"], categories=["a","b","c"],ordered=False))

df = pd.DataFrame({"A":["a","b","c","a"]})

df["B"] =pd.Series(pd.Categorical(["a","b","c","a"], categories=["a","b","c"],ordered=False))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

因子順序的添加可以通過設(shè)定序列或者數(shù)框框列的.astype來進行詳細(xì)的操作。

s = pd.Series(["a","b","c","a"])

s_cat = s.astype("category", categories=["a","b","c"], ordered=True)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

無論是序列中還是數(shù)據(jù)框中的因子變量生成之后,都可以通過以下屬性查看其具體的類型、因子類別、以及是否含有順序。

s_cat.dtypes

s_cat.cat.categories

s_cat.cat.ordered

一種比較迂回的方法是,先生成普通序列,然后通過設(shè)定序列類型完成因子變量的轉(zhuǎn)化。而想要舍棄因子變量,還原成普通的文本序列,則同樣只需再其astype中進行格式設(shè)定。

s = pd.Series(["a","b","c","a"])

s2 = s.astype('category',categories=["a","b","c"],ordered=True)

s2.astype(str)

最后講一下,如何在數(shù)據(jù)框中分割數(shù)值型變量為因子變量,pandas的數(shù)據(jù)框也有與R語言同名的函數(shù)——cut。

df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})

labels = [ "{0} - {1}".format(i, i + 9) for i in range(0,100,10) ]

df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)

pd.cut(x, bins, right=, labels=,include_lowest=False)  

#df.value代表待風(fēng)格的變量,第二項是bins可以是一個列表(作為分割點),也可以是一個整數(shù)(作為分割帶箱數(shù)),right控制帶寬是左開右閉還是左閉右開,labels設(shè)定輸出顯示標(biāo)簽,include_lowest=控制是否包含邊界點(以上參數(shù)可以類比R語言中的cut函數(shù))。

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

最后做一個小總結(jié):

關(guān)于因子變量在R語言和Python中涉及到的操作函數(shù);

R語言:

創(chuàng)建因子變量:

factor

轉(zhuǎn)換因子變量:

as.factor

as.numeric(as.character)

分割因子變量:

cut函數(shù)

Python:

創(chuàng)建因子變量:

pd.Categorical(categories=,ordered=)

pd.Series(dtype="category")

轉(zhuǎn)換因子變量:

df.astype('category',categories,ordered)

分割因子變量:

df.cut(df.value,breaks=,right=,labels)

上述內(nèi)容就是如何用R語言和Python實現(xiàn)因子變量與分類重編碼,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:如何用R語言和Python實現(xiàn)因子變量與分類重編碼
網(wǎng)站網(wǎng)址:http://bm7419.com/article44/psdeee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站網(wǎng)站維護網(wǎng)頁設(shè)計公司、網(wǎng)站制作商城網(wǎng)站、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)