- 企業經營數據分析:思路、方法、應用與工具
- 趙興峰
- 5062字
- 2024-01-05 17:56:54
1.4 數據結構和數據結構化
1.4.1 什么是數據結構
數據結構是我們存儲、組織數據的方式,是數據內部的構成方法。數據結構是指數據元素之間存在著一種或多種關系,這種關系會因為數據主體、數據源頭、數據處理方式、數據存儲方式、數據組成要素之間的關系而形成數據之間的關系。數據結構包括三類,即數據的邏輯結構、數據的存儲結構和數據的運算結構。
下面用一個實際案例來介紹什么是數據結構。一家公司的人力資源經理要收集員工的基本信息,于是他設計了一個員工信息登記表,如下表所示。
員工信息登記表

續表

為了便于存儲和查找,人力資源經理設計了一個Excel數據表格來存放這些員工的基本信息。在分析這個數據表存在的問題之前,下面先介紹三個概念。
數據主體——就是被記錄數據的事物,包括動態的事和靜態的物。員工基本信息數據的主體是員工;工資表的數據主體是“發工資”這個行為或者動作,屬于“事”的范疇。
數據表——記錄一系列數據的集合。例如員工信息表記錄著公司所有員工或部分員工的個人信息數據。
一條數據——就是該數據集中某個員工的所有信息,一個員工對應一條數據,多個員工對應多條數據。
字段——每條數據中對數據主體的屬性描述,例如員工基本信息數據中的“姓名”是一個字段,“性別”是另外一個字段。
該公司的人力資源經理在制作Excel表格時發現這個數據表涉及的數據存在以下三個問題。
問題1:學歷,有些人的學歷不止一項,從小學、初中、高中、大學、碩士到博士有一系列不同的記錄,而這里卻無法有效地填寫;于是他把學歷部分做了擴充,設計了以下的表格形式。
學歷表格

人力資源經理認為留出7條記錄的空間應該足夠覆蓋員工從小學到博士后的所有學歷狀況,即學歷1(小學)、學歷2(初中)、學歷3(高中)、學歷4(大學)、學歷5(碩士)、學歷6(博士)、學歷7(博士后)。
然而在實際記錄數據時,他又發現了兩個問題。第一個問題是他碰到了一個“學霸”級的人物,本科修了兩個專業,碩士修了兩個專業,還讀了一個在職MBA,此時數據表的記錄空間不夠用,如果單獨為他加上一列,則對數據存儲空間的影響還是很大的,而且數據表太寬也不利于閱讀。
第二個問題是在記錄數據時,有的人是從最高學歷開始記錄的,即大學記錄在學歷1中;有的人是從最低學歷開始記錄的,即小學記錄在學歷1中;有的人因為先上了??疲肿x了本科,導致大學學歷的記錄位置不能統一。
問題2:學歷的問題還好說,最多留出10條記錄空間就能勉強解決這些難題,但工作經歷就不同了。有的人換工作比較頻繁,而有的人第一份工作就是現在的工作,沒有其他的工作經歷。而且崗位調動信息也有類似的問題,無法確定要留幾條記錄空間給崗位調動信息。
問題3:填寫完員工的年齡后,到第二年每個人都需要加一歲,但是當年新記錄的員工不能加1,這如何實現?司齡也有同樣的問題。
最終人力資源經理制成的Excel數據表格非常不規范,這個表格存在的設計問題就是數據結構的問題,優化數據結構能夠提高數據管理的效率,如果數據結構不合理,則未來會需要大量的時間進行數據處理、數據清洗,甚至對公司的信息系統資源也會造成浪費。優秀的數據結構設計人員(也叫數據庫架構師)能夠對公司的所有數據系統進行統籌架構,從而形成優化的數據庫體系。
1.4.2 如何設計好的數據結構
數據結構是數據的組織形式,在組織數據之前,需要對數據進行分類。在對“員工”這個資源主體進行信息記錄時,首先需要把數據分成靜態數據和動態數據,因為靜態數據是相對固定不變的,或者說變化不太頻繁,而且變化之后,往往采用覆蓋的方式;而動態數據則是持續增加的,并且增加時往往采用疊加的方式,并不覆蓋原來的數據。我們可以把員工信息表中的數據分為靜態數據和動態數據,如下表所示。

原則上,一個好的數據結構,要么是描述靜態信息的,要么是記錄動態信息的,然后通過數據表之間的關聯形成一個完整的相互關聯的數據庫。所以,我們可以將上例中的員工信息表進行拆分,將靜態數據放在一張表中,形成員工的靜態信息表;而對于員工的動態信息,可以將每個動態信息都設計成一個單獨的表,然后用員工編號關聯起來,如下圖所示。

其中最高學歷信息可以從員工學歷記錄表中查詢得到,員工所屬子公司和部門信息可以通過員工崗位異動表查詢得到。這種數據結構關系被稱作運算結構關系。員工的年齡和生日,員工的司齡和入職日期都是運算關系。
在上例中,員工所屬子公司、所屬部門、所在崗位這三者存在包含的關系,公司的組織架構決定了三者之間的邏輯關系,即層級樹形結構關系。邏輯結構關系還有很多,例如兩個數據之間可能存在集合關系、線性關系、樹形結構關系、層級結構關系、圖形結構關系等。
物理結構關系比較容易理解,即因為數據的采集、存儲、傳輸和處理所產生的關系。
數據結構是非常重要的概念,因為數據結構是數據的組織方式,而數據組織方式不同,存儲和處理數據的效率也會不同。
1.4.3 結構化數據和非結構化數據
1.結構化數據
結構化數據主要指在數據存儲和數據處理過程中結構設計比較合理的數據。
例如MySQL開源數據庫、Oracle數據庫、DB2、Sybase、Access、SQL Server等都是結構化的數據庫。結構化數據庫要求數據的結構都是由行和列組成的,每一列都表述了數據所描述對象的要素、屬性和行動,而每一行都代表一個數據庫所描述的對象。例如員工基本信息數據庫。為了簡化說明,我們選取5個信息點(字段)來講解結構化數據。一個員工可以用姓名、員工編號、性別、出生日期、血型這5個信息點(字段)來描述,如下表所示。

每一列表示對象的一個屬性或者變量,用來區分對象之間的差異;每一行表示一個對象,不同行表示不同的對象。在上表中有一類對象:員工;對每個員工的描述有5個字段:姓名、員工編號、性別、出生日期和血型;表中共有兩個對象:張三和李四,他們在不同的屬性上有不同的值。
該表即為結構化數據,隨著員工人數的增多,表的結構不會改變,但數據可以不斷累加。員工只要入職填寫了個人信息表,這些信息就會被登記到公司的員工基本信息數據庫中。結構化數據庫基本上就是由行和列組成的數據集,分別表示同類的不同對象的屬性差異。
目前大多數數據庫都是結構化數據,自從SQL(Structured Query Language)被發明以來,表狀的結構化數據已經成為信息技術記錄數據的標準,從而衍生了大量的數據處理軟件,最常用的就是開源軟件MySQL,當然還有商業化比較重的DB2、Oracle SQL、SQL Server等。
2.非結構化數據
由固定的行和列組成的數據表一般被稱為二維(行+列)結構數據表,它是結構化數據。如果行和列的數量不固定,即不能由固定的行和列組成二維結構數據表來表示和存儲的數據,則被統稱為非結構化數據。常見的非結構化數據包括所有格式的辦公文檔,文本,圖片,標準通用標記語言下的子集XML、HTML,各類報表,圖像和音頻/視頻信息等。
用HTML格式的文本來介紹非結構化數據會更加直觀。HTML(Hyper Text Mark Language),超級文本標記語言,它是瀏覽器解讀網頁內容,對網頁內容進行顯示的一種標記方法。每個標記語言都有的標記范式,例如超鏈接用<a> </a>來標記,鏈接地址用href=“”來標記,段落用<p> </p>來標記……通用的標準化標示語言,可以讓所有的瀏覽器都用同樣的方式來展示網頁的內容。一個HTML文檔中可以有數量不等的各種標記,并且其所在的位置序列也會不同,沒有固定的“字段”之說,當然,我們可以把一個<a></a>看作一個字段,但這個字段可以重復,并且還可以出現在不同的地方。
部分非結構化的數據可以通過多表關聯的方法進行結構化改造。例如微博數據可以通過一定的形式進行結構化處理,從而能夠使用結構化查詢語言即SQL來進行處理。1.4.4 如何將非結構化數據結構化處理
如果數據是非結構化的,或者用結構化方法難以處理,就需要通過多表關聯的方式進行結構化處理。
在處理非結構化數據的過程中,最核心的方法就是對數據進行分類,即按照數據的行為(或者屬性主體)將數據分為靜態數據和動態數據,然后分別進行結構化處理。對于靜態數據,要采用單獨的表格來記錄事物的屬性和要素。然后將動態數據也建立成單獨的表格并與靜態數據進行關聯,從而構成了動靜結合的數據表集。
在前面介紹的員工基本信息表中,就是把靜態數據和動態數據分別制成表,然后通過表之間的關聯形成數據表集,從而將非結構化的數據進行結構化的處理。
將非結構化數據結構化處理的方法就是:通過多表關聯,讓靜態數據也單獨成表,讓動態數據單獨成表并能夠動態更新數據條目,簡稱“靜動分離,動靜結合”。
客戶的動態數據對企業更有價值,因為靜態數據記錄了客戶的基本信息,而針對該客戶的動態數據才能讓我們對客戶有更加深刻的理解。當我們通過各種方式收集了客戶的靜態數據后,如果沒有動態數據,例如交易數據,就不能形成完整的客戶畫像。
“靜動分離,動靜結合”的數據處理方式在對非結構化數據進行結構化處理方面發揮著巨大的作用,它讓數據處理更加有效。而將數據結構化處理后,計算機進行增加、刪除、修改、查詢等各種運算時效率都會得到大幅度提升。
1.4.5 什么是單維數據表
單維數據表是結構化數據表的一種形式,而且是最簡單的形式。其要求相同屬性的字段統一且固定,所有的字段都在描述相同的數據主體。換句話說:單維數據表是結構化數據表,但結構化數據表不見得一定是單維數據表。
下面這張表格由行和列組成,每列都是獨立的。這個數據可以構成結構化數據,但不是單維數據表。

通過“靜動分離,動靜結合”方式組成的數據集基本都是結構化數據。而單維數據表強調的是每個數據條目描述的都是一個主體,要么是資源的描述數據,即靜態數據,要么是資源的動作和行為,即動態數據,在同一個數據表中不存在兩個不同的主體。例如員工基本信息表與工資表,如果獨立看這兩個數據表,那么它們就是單維數據表,一個表以員工作為主體進行數據采集,而另外一個表以“發工資”這個活動作為主體。將兩個數據表合并在一起,仍然構成了結構化數據表,但是數據的描述主體不同,導致數據不夠集約,形成了冗余,例如一個員工要發12次工資,在合并表中,員工的個人信息就會重復12次。
單維數據表首先必須得是結構化數據表,同時強調數據描述主體的一致性。通過這兩個標準來衡量一個數據表是否是單維數據表就比較容易了。下面舉例說明。
下表中的數據是結構化數據,可以導入SQL數據庫并可以進行查詢,但它不是單維數據表,這個表雖然由行和列組成,但是其每個字段都在描述不同的數據主體。這個表是單維數據表的匯總計算表。
員工獎金匯總表

將上表轉換為單維數據表后其形式如下表所示。
單維數據表

將結構化數據表轉化為單維數據表的技巧在于如何審視數據主體,主體越明確,數據越精準。
單維數據表結構對以后的數據統計匯總工作來說非常重要。
1.4.6 為什么要求動態數據都要按照單維數據表的形式組織
單維數據表的組織形式便于數據分析、數據表之間進行關聯以及未來的數據建模,能夠大幅度節省數據清洗的時間,以及數據存儲的空間,也避免了數據更新時導致的數據不一致。
例如人力資源部門有3個數據表,第一個是員工基本信息表,為靜態數據表;第二個是員工工資表,為動態數據表;第三個是員工崗位異動表,為動態數據表。其結構如下表所示。

在動態數據表中除用于索引和追溯的編碼類靜態數據外,還包含其他的靜態數據,如果要對靜態數據表進行調整,則動態數據表中的靜態數據也要相應地進行調整,如果不能實現自動調整,則必然會產生數據不一致的現象。
例如,一個員工通過自學提高了自己的學歷,人力資源部門對其個人的基本信息表進行了更新,最高學歷發生了變化,而在員工工資表中也需要進行相應的調整,如果調整不及時,那么這兩個表就產生了數據不一致的現象。動態數據表中的靜態數據越多,需要更新的數據就會越多。
采用單維數據表結構的好處在于,除編碼數據用于索引外,不包含其他額外的信息,當我們知道了員工編號,可以通過其他的單維數據表去查詢相關的信息,通過自動關聯形成當期數據,保證了數據的一致性。
單維數據表的一個基本原則是通過多表關聯的方式分別記錄不同的信息,將靜態數據和動態數據分別存儲,相互之間通過唯一的編碼進行關聯。上面的3個數據表之間通過各個ID編碼進行關聯。其中標記“*”號的數據都是重復的數據。
通過以上單維數據表結構的建表原則,我們可以引申出另外一條基本的原則:一條需要錄入的數據信息只能出現在一張表上(除編碼索引外)。例如,在上面的3個表中,有了員工編號ID自然可以通過員工的基本信息表索引到員工的姓名、性別、年齡、出生日期、入職日期等信息;如果每張表上都有員工姓名這個字段,而當員工改了名字后,就需要在很多表上進行手工修改,如果采用索引的方式,則只需要在員工基本信息表中進行修改,而其他表中的數據就會自動更新了。