您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何用R語言和Python實現(xiàn)因子變量與分類重編碼,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
今天介紹數(shù)據類型中因子變量的運用在R語言和Python中的實現(xiàn)。
因子變量是數(shù)據結構中用于描述分類事物的一類重要變量。其在現(xiàn)實生活中對應著大量具有實際意義的分類事物。
比如年齡段、性別、職位、愛好,星座等。
之所以給其單獨列出一個篇幅進行講解,除了其在數(shù)據結構中的特殊地位之外,在數(shù)據可視化和數(shù)據分析與建模過程中,因子變量往往也承擔中描述某一事物重要維度特征的作用,其意義非同尋常,無論是在數(shù)據處理過程中還是后期的分析與建模,都不容忽視。
通常意義上,按照其所描述的維度實際意義,因子變量一般又可細分為無序因子(類別之間沒有特定順序,水平相等)和有序因子(類別中間存在某種約定俗成的順序,如年齡段、職稱、學歷、體重等)。
在統(tǒng)計學中對變量進行了如下四類劃分:定類變量、定序變量、定距變量、定比變量。而其中的定類和定比變量就對應著我們今天將要講解的因子變量(無序因子和有序因子變量)。
因子變量從信息含量上來看,其要比單純的定性變量(文本變量)所包含的描述信息多一些,但是又比數(shù)值型變量(定距變量和定比變量)所表述的信息含量少一些。
因而原則上來講,數(shù)值型變量可以轉換為因子變量,因子變量可以轉換為文本型變量,但是以上順序卻是不可逆的(信息含量多的變量可以放棄信息量,轉換為信息含量較少的變量類型,但是信息含量較少的變量卻無法增加信息含量)。
在R語言中,通常使用factor直接生成因子變量,我們僅需一個向量(原則上可以是文本型、也可以是數(shù)字型,但是通常從實際意義上來說,被轉換的應該是一個含有多類別的類別型文本變量)。
factor(x, levels,labels=levels,ordered=)
以上參數(shù)中,x即是我們將要轉換的變量,levels是將要設定的因子水平(可選參數(shù),省略則自動以向量中的不重復對象為因子水平),labels作為因子標簽(可選參數(shù),與前述因子水平對應,若設置,則打印時顯示的是對應因子標簽,省略則同因子水平一樣,使用向量中不重復值【即類別】作為標簽),ordered是邏輯參數(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)
通常來說,factor函數(shù)中,levels一般不用設置,函數(shù)會自動判斷向量內有幾個水平,但是倘若要生成有序因子的話,默認會根據字母順序排列,如果自然順序與目標有序因子順序不一致,則一定要指定levels,labels則視具體需求而定,如果本身就是文本類別的話,一般無需設定標簽。
如果是問卷類數(shù)據,而且編碼為數(shù)值,則一定要通過labels標簽的設定來還原每一個編碼的真實意義。
factor(vector,labels=c("AAA","BBB","CCC","DDD","EEE"),ordered=TRUE)
因子變量與文本變量數(shù)值變量之間的互轉則通過as.character()或者as.numeric()函數(shù)來實現(xiàn)。
library(dplyr)
as.character(as.factor(1:10))%>%str()
as.numeric(as.factor(1:10))%>%str()
R語言中的因子變量重編碼
如果你有一個度量指標,需要將其轉換為分段的因子變量,則可以通過cut函數(shù)來實現(xiàn)這種轉換。
scale<-runif(100,0,100)
cut(x,breaks,labels=NULL,include.lowest=FALSE,right=TRUE,ordered=)
cut函數(shù)參數(shù)如上,接受一個數(shù)值型向量,breaks接受一個數(shù)值向量(標識分割點)或者單個數(shù)值(分割 數(shù)目)。
right是邏輯參數(shù),設定分割帶是左開右閉或者左閉右開。(默認左開右閉)。
include.lowest則根據right的設定,決定是否應該包含端點值(如果right為TRUE,左開右閉區(qū)間,則包含最小值,如果right為FALSE,左閉右開區(qū)間則包含最大值),默認為FALSE。
ordered則設定是否對因子水平進行排序。
(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))
另一種分割場景是使用分位數(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))
以上分割方法在是較為常用的因子變量轉換方法,當然你可以使用if函數(shù)進行類似分割,但是相比較來講,使用cut函數(shù)進行分割要高效很多。
Python
在Python中,Pandas庫包含了處理因子變量的一整套完整語法函數(shù)。
import pandas as pd
import numpy as np
import string
在pandas中的官方在線文檔中,給出了pandas因子變量的詳細論述,并在適當位置與R語言進行了對比描述。
http://pandas.pydata.org/pandas-docs/stable/categorical.html#working-with-categories
當利用pandas生成序列時,可以在序列函數(shù)內的dtype參數(shù)設定因子變量類型。
s = pd.Series(["A","B","C","D","E"], dtype="category")
生成數(shù)據框時,也可以直接生成因子變量。
df = pd.DataFrame({"A":["a","b","c","a"]})
df["B"] = df["A"].astype('category')
除了直接在生成序列或者數(shù)據框時生成因子變量之外,也可以通過一個特殊的函數(shù)pd.Categorical來完成在序列和數(shù)據框中創(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))
因子順序的添加可以通過設定序列或者數(shù)框框列的.astype來進行詳細的操作。
s = pd.Series(["a","b","c","a"])
s_cat = s.astype("category", categories=["a","b","c"], ordered=True)
無論是序列中還是數(shù)據框中的因子變量生成之后,都可以通過以下屬性查看其具體的類型、因子類別、以及是否含有順序。
s_cat.dtypes
s_cat.cat.categories
s_cat.cat.ordered
一種比較迂回的方法是,先生成普通序列,然后通過設定序列類型完成因子變量的轉化。而想要舍棄因子變量,還原成普通的文本序列,則同樣只需再其astype中進行格式設定。
s = pd.Series(["a","b","c","a"])
s2 = s.astype('category',categories=["a","b","c"],ordered=True)
s2.astype(str)
最后講一下,如何在數(shù)據框中分割數(shù)值型變量為因子變量,pandas的數(shù)據框也有與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代表待風格的變量,第二項是bins可以是一個列表(作為分割點),也可以是一個整數(shù)(作為分割帶箱數(shù)),right控制帶寬是左開右閉還是左閉右開,labels設定輸出顯示標簽,include_lowest=控制是否包含邊界點(以上參數(shù)可以類比R語言中的cut函數(shù))。
最后做一個小總結:
關于因子變量在R語言和Python中涉及到的操作函數(shù);
R語言:
創(chuàng)建因子變量:
factor
轉換因子變量:
as.factor
as.numeric(as.character)
分割因子變量:
cut函數(shù)
Python:
創(chuàng)建因子變量:
pd.Categorical(categories=,ordered=)
pd.Series(dtype="category")
轉換因子變量:
df.astype('category',categories,ordered)
分割因子變量:
df.cut(df.value,breaks=,right=,labels)
上述內容就是如何用R語言和Python實現(xiàn)因子變量與分類重編碼,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。