<style> .red { color: red; } .green { color: #7CFC00; } .pic_need { color: #F08E81; } .pic_data { color: #64BBE2; } .pic_model { color: #1699D3; } .pic_output { color: #FF3333; } </style> :mortar_board: 資料分析專案教學 === 這是一篇關於資料分析入門的介紹文。 請注意,此篇文章,將以專案開發的角度去介紹資料分析這件事情,或許跟你以往看到的資料分析課程會不太相同。 :open_book: 目錄 === [TOC] --- :computer: 什麼是AI === ### 你們眼中的 AI 可能是長這樣: ![](https://i.imgur.com/0T5U9mY.jpg) --- ### 維基中的AI這樣寫: 人工智慧(**英語:artificial intelligence,縮寫為AI**)亦稱智械、機器智慧,指由人製造出來的機器所表現出來的智慧。通常人工智慧是指透過普通電腦程式來呈現人類智慧的技術。該詞也指出研究這樣的智慧系統是否能夠實現,以及如何實現。同時,透過醫學、神經科學、機器人學及統計學等的進步,常態預測則認為人類的很多職業也逐漸被其取代。 人工智慧於一般教材中的定義領域是「智慧主體(intelligent agent)的研究與設計」,智慧主體指一個可以觀察周遭環境並作出行動以達致目標的系統。約翰·麥卡錫於1955年的定義是「製造智慧機器的科學與工程」。安德烈亞斯·卡普蘭(Andreas Kaplan)和麥可·海恩萊因(Michael Haenlein)將人工智慧定義為「系統正確解釋外部資料,從這些資料中學習,並利用這些知識透過靈活適應實現特定目標和任務的能力」。 人工智慧的研究是高度技術性和專業的,各分支領域都是深入且各不相通的,因而涉及範圍極廣。人工智慧的研究可以分為幾個技術問題。其分支領域主要集中在解決具體問題,其中之一是,如何使用各種不同的工具完成特定的應用程式。 AI的核心問題包括建構能夠跟人類似甚至超卓的推理、知識、規劃、學習、交流、感知、移物、使用工具和操控機械的能力等。<span class="red">人工智慧目前仍然是該領域的長遠目標。目前弱人工智慧已經有初步成果,甚至在一些影像辨識、語言分析、棋類遊戲等等單方面的能力達到了超越人類的水平,而且人工智慧的通用性代表著,能解決上述的問題的是一樣的AI程式</span>,無須重新開發演算法就可以直接使用現有的AI完成任務,與人類的處理能力相同,但達到具備思考能力的統合強人工智慧還需要時間研究,比較流行的方法包括統計方法,計算智慧和傳統意義的AI。目前有大量的工具應用了人工智慧,其中包括搜尋和數學最佳化、邏輯推演。而基於仿生學、認知心理學,以及基於概率論和經濟學的演算法等等也在逐步探索當中。 --- ### 實際上的 AI 可能是這樣: ![](https://i.imgur.com/pUguA93.png) ### 所以,我不是來跟你介紹AI的。 我不是來跟你介紹AI的。很重要,再說一遍。 --- :checkered_flag: 課程目標 === 希望聽完大家都可以像竺鼠車車一樣不怕困難,或者,想找個右邊的人槍斃你。 ![](https://i.imgur.com/s1hzRDu.jpg) - [ ] **你將了解:** - [ ] AI 不是你所想像的那樣 - [ ] 了解資料分析大致上的流程 - [ ] 確認需求 - [ ] 知道所謂的分析是打算做甚麼 - [ ] 知道如何正確定義你的需求 - [ ] 資料獲取/清理 - [ ] 依"後續方法"整理資料 - [ ] 知道表示資料(向量化)的方法 - [ ] 描述性統計 - [ ] Mean/ Max/ Min/ Count - [ ] Distribution - [ ] Corelation coefficient - [ ] PCA - [ ] 建模分析 - [ ] Machine learning - [ ] Supervise/ Unsupervise / Semisupervise learning - [ ] classfication/ regression - [ ] training/ validation data - [ ] some model - [ ] loss function - [ ] goodness of model - [ ] 結果報告 --- :chart_with_downwards_trend: 資料分析 === ### 分析流程圖 ![](https://i.imgur.com/l7Nff5h.jpg) 1. 看完這張圖,你覺得最重要的部分是什麼? * 沒意外的話你們肯定覺得 <span class="green">**綠色線有關的部分**</span> 比較重要 * 但我會說,其實也沒有一定,單純依你在專案中的角色而定。 * 如果你是一個 **資料分析工程師** ,我會覺得<span class="green">**綠色線**</span>會是你需要在意的。 * 但如果你是要負責跟 **客戶溝通的人** ,我會覺得<span class="red">**紅色線**</span>可能就比較重要了。 2. 看完這張圖,你覺得最花時間的部分是甚麼? * 其實也沒有一定,單純依你在專案中的角色而定。 * 但無論角色為何,總的來說我會希望大家有個共識 **資料清理** 是最重要,且最花時間的部分。 ```mermaid gantt title 你以為的專案流程時間圖 axisFormat %m-%d section 專案 需求確認 : a1 , 2017-01-01, 10d 資料清洗 : a2 , after a1 , 10d 統計/建模 : a3 , after a2 , 60d 結果報告 : a4 , after a3 , 10d ``` ```mermaid gantt title 實際上可能的專案流程 axisFormat %m-%d section 專案 需求確認 : a1 , 2017-01-01, 80d 資料清洗 : a2 , 2017-01-16, 60d 統計/建模 : a3 , 2017-02-11, 40d 結果報告 : a4 , after a1 , 10d ``` 請注意,上面這些流程圖,都不包含軟體系統的開發與設計時間。但這不是這篇文章的重點。 --- ### 確認需求 ![](https://i.imgur.com/2AWERgJ.png =600x400) 說實在,對於領域外的人來說,他們可能根本不知道自己的需求是甚麼。 你說,人家沒有需求,你要怎麼確認? 那這就是你的專業了。 * 對客戶來說,其實我們只要能幫助**他能賺錢**,就好了。 * 對你來說,想完成這件事你可能要知道: 1. <span class="pic_need">客戶的背景情況</span> 2. <span class="pic_need">你可以解決客戶甚麼問題</span> 3. <span class="pic_data">客戶有甚麼資料</span> 4. <span class="pic_data">資料裡面包含甚麼</span> 5. <span class="pic_data">資料品質如何</span> 6. <span class="pic_model">你有甚麼方法可以做</span> 7. <span class="pic_model">能夠實現嗎</span> 8. <span class="pic_output">可以移交給客戶嗎</span> 9. <span class="pic_output">你會賺錢嗎?</span> 你問我說,上面哪個比較重要,我肯定會回,<span class="pic_output">你會賺錢嗎?</span> 但這顯然不是你想聽的答案。 如果你有認真看的話,你會發現每上述每點的顏色其實是跟流程圖的顏色一一對應的。 大致上可以簡單分成,<span class="pic_need">需求層</span>,<span class="pic_data">資料層</span>,<span class="pic_model">分析層</span>,<span class="pic_output">輸出層</span>。 因此,再回答一次問題,我會回你說,看你在專案中的角色是甚麼? 但總歸來說,對我一個工程師的角度來說,沒有 <span class="pic_model">**分析(方法)**</span> ,就沒有所謂的後續。因此,在知道整體架構之餘,我希望你們能夠對<span class="pic_model"> **方法** </span>有一定程度上的認識。 看完這節,你可能會覺得我好像甚麼都沒說,實際上你感覺沒錯。 畢竟,以務實的角度來講,在不知道有甚麼方法的情況下,你想幫人確認需求其實也是挺困難的。 --- ### 資料獲取/清理 此部分分為兩部分,獲取以及清理。 * 資料獲取 * 這部分其實好像沒什麼好說的,就是跟客戶拿資料,在學校上課的話就是教授會準備好資料給你。 * 網路上其實很多公開資料,在此列下: * **實價登入** https://lvr.land.moi.gov.tw/homePage.action * **政府開放資料** https://data.gov.tw/ * **Kaggle** https://www.kaggle.com/ * 實際上你可能很常會遇到你需要外部資料的時候,但並不是所有資料都會像上面那些網站一樣整理好給你,因此你需要會寫 **爬蟲** 幫助你從網路上收集資料。 * 資料清理 * 儲存 * 在整理前你要先知道怎麼儲存,講到儲存就會講到資料格式跟怎麼取用,以下列出你比較常見到的。 1. Excel (雖然很難用,但這應該是你們最熟悉的) 2. CSV 3. JSON 4. DataBase 5. txt 6. jpg / png / mp4 * 以資料類型來說,大概可以分成三種: 1. 數值表格 (也就是你們常用,只有數字的excel) 2. 文字 3. 影像 * 實際上在儲存的時候,會有些編碼細節,但遇到你就會知道了。 * 清理 * 每種資料類型都有不同清理的方式,在這以你們最熟悉的數值表格當作例子,你可能會遇到幾種數值類型: 1. 連續型數值 (身高、體重、長度、年紀) 2. 類別 (性別、職業類型、使用者類別) 3. 離散型數值 ( 問卷上的 反對 無 贊成 ) * 你的資料可能會遇到下列問題: 1. 缺值 (怎麼補? / 乾脆丟掉?) 2. 數值不統一 ( 性別類型別人寫"男性"他硬要只寫"男") 3. 標準化 (這有點抽象,簡單來說就是單位不同) *https://aifreeblog.herokuapp.com/posts/54/data_science_203/ 4. 類別數值如何表示 ( encoding / one-hot encoding) * 接著就是向量化,但這看你使用的方法而定你要怎麼向量化它(實際上以上面的例子,把類別資料編碼完就完成向量化了) --- ### 描述性統計 這邊就單純的在計算資料的性質了,以下是我拿到資料我會做的一些統計。 * 總共有多少筆資料(Count) * 每個欄位的數值最大最小為多少?(MAX / MIN) * 資料的分布大概是如何呢? (Distribution) * 這其實就是一種資料視覺化 * 在此會牽扯到你要怎麼畫你的分布圖 (我們習慣看的圖都是二維的,超過三維就沒人看得懂了) * 每個欄位有關係/類似的趨勢嗎? (相關係數 / Corelation coefficient) * 資料維度那麼大,我能不能找出更小的維度但最能代表資料的向量呢?(PCA) * https://leemeng.tw/essence-of-principal-component-analysis.html * 其實還有很多,但我統計不太行,你們可以的。 * 計算這些事情,並非沒有意義的,很常的時候對資料的觀察會很大的一部份影響你後續方法的實現與成敗與否 --- ### 建模分析 此部分的圖片大多引用自,李弘毅教授的課堂投影片。http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2019/Lecture/introduction%20(v8).pdf 好,終於開始講建模了,首先問一個問題,**機器學習**,到底在學甚麼? 終其而論我們就是希望寫一個程式,並給程式一些訓練資料(一堆圖片)之後,讓他學到這照片中的東西是甚麼。 ![](https://i.imgur.com/Mh2AG0H.png) 在講白話一點,就是我們想要找到一個Function。這個Function在吃完我們給的輸入之後,可以得到我們想要的輸出。 ![](https://i.imgur.com/1QOFo8X.png) 以影像識別當作例子,大致上的架構如下 1. 首先我們會定義一組 function set(model) 2. 並將訓練資料(圖片)餵給它們。 3. 測量每個function output的好壞,並從中挑選出最好的function f^*^。 4. 將 f^*^ 用作之後的預測 ![](https://i.imgur.com/T8HBVC9.png) --- #### Regression / Classfication / Generation 依照模型output的類型,大致上可以分成幾種任務: * Regression ![](https://i.imgur.com/YRyijbk.jpg) * Classfication * Binary Classification ![](https://i.imgur.com/kTREnYB.png) * Multi-class Classification ![](https://i.imgur.com/UfVriWP.png) * Generation * output為有結構但很複雜的東西,並給model自由發揮(創意 * 文字 * 圖片 * 語音 --- #### Supervise/ Unsupervise / Semisupervise 依照模型training data的類型,大致上可以分成幾種訓練方法: * Supervise * 資料有標籤 * Unsupervise * 資料沒標籤 * Semisupervise * 資料有些有標籤,有些沒標籤。 --- #### Learning flowchart 模型訓練大致上的流程如下,其中跟模型參數有關的是<span class="green">綠色線</span>,人判斷模型的好壞是<span class="pic_need">橘色線</span>。 ![](https://i.imgur.com/s7IynHj.jpg) --- #### Some model 好,終與可以講 model 本人了,但在此我沒有叫介紹它們,因為比起我講,網路上的資源好太多了。 以下列出幾個入門且常見的模型,並附上我覺得很棒的教學(如果有的話): * Naive Bayes classfication * https://leemeng.tw/intuitive-understandind-of-bayes-rules-and-learn-from-experience.html * Decision tree * Linear regression * Logistic regression * Nearest Neighbors * K-means * PCA * https://leemeng.tw/essence-of-principal-component-analysis.html * LDA * SVM * Adaboost * Deep learning * 台大李弘毅教授,所開課程 https://speech.ee.ntu.edu.tw/~tlkagk/courses.html --- #### loss function: loss 是一個用來評量 模型output 的好壞的指標,透過loss function我們會計算如何影響並更新model,以下列出幾個常見的loss function: * mean square error(MSE) * Cross entropy loss * Cosine similarity loss --- #### goodness of model: 這邊主要是講我們人如何判斷模型的好壞。 你可能會覺得,這個東西,跟 loss function 差在哪。今天如果你 判斷模型的好壞的算法 跟 loss fuction 一樣的話。那它們兩就是一樣的東西。 但實際上我們人在判斷模型好壞方法可能跟 loss function不一樣, 因此這我想向你們介紹一個在分類問題很常見,且很重要的量測標準: F1 score ![](https://i.imgur.com/CzhA2uF.jpg =480x400) * TP: 預測為 Positive 並且對了(樣本為正類且預測為正類) * TN: 預測為 Negative 並且對了(樣本為負類且預測為負類) * FP: 預測為 Positive 但錯了(樣本為負類但預測為正類) * FN: 預測為 Negative 但錯了(樣本為正類但預測為負類) $$ percision = {TP \over TP + FP} $$ $$ recall = {TP \over TP + FN} $$ $$ F1 = {2 \cdot percision \cdot recall \over percision + recall} $$ --- ### 結果報告 做到這邊,感覺就是各位最會的部分了,這應該不需要我來教你。 但我想說的是,這部分其實可能是最重要的,在絕大多數的時候,長官可能根本不介意你使用的是甚麼方法,或者準度如何,又或者為何失敗。 這時候,用人家懂的語言,告訴他為甚麼 可行/不行,是非常重要的。 --- :black_medium_square: 結尾 === 恭喜各位看完了這篇筆記,你可能看完之後發現,你還是甚麼都不會,你可能也會發現,我一行程式都沒有教你。 資料分析這整件事是個sence,在開始實作專案之前,你要知道或者有個大概想法你接下來下一步是甚麼,程式語言於此只是方便你實現上述所有事情的一個橋樑。若沒有個概念,直接下去硬做,不是得到錯誤的結論,就是不知道要怎麼改進自己的結果。這就不會是你想遇到的。 但當然啦,會寫程式還是很重要的。 如果還有下一堂,要開始寫程式了。