iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
1
AI & Data

AI無法一步登天,讓我們先從專有名詞定義開始。系列 第 23

SQL迴圈實作 -3.關聯分析的處理工廠1

  • 分享至 

  • xImage
  •  

以下開始,我們要透過SQL,把購物籃分析的統計值給寫出來。
先說明的是,達到目標的寫法不只一種,有時候為了解說方便,
我會以比較長但脈絡更清楚的語法製作。

原始資料

各位可先下載原始資料,完整動手做過一遍,肯定更能加深印象。
原始資料是一份Excel檔案(.xlsx),包括消費者姓名(name)、消費的商品類別(category),總共兩個欄位,6002筆資料,如下圖檔範例:
https://ithelp.ithome.com.tw/upload/images/20181022/20111566fD5wKp9o83.png

目標產出

17種類別,若以2類別為一個組合,我們最多會有136種組合,我們希望得到如Excel檔案(.xlsx)的結果。

如下圖檔範例:
https://ithelp.ithome.com.tw/upload/images/20181022/201115666yxlGK2gkx.png

處理程序

我們總共會經過5道處理程序:

  1. ithelp_asso_source:原始資料共6002筆。

  2. ithelp_asso_t1_category:針對類別(category),做出【類別流水號(category_no)】,找出每個類別【被幾個人選過(cnt)】、把【總共有幾個消費者(total)】列出來。有17種類別,故資料有17筆。

  3. ithelp_asso_t2_source_no:把category_no(迴圈最重要的變數) join 回原始資料。和原始資料一樣共6002筆。

「小馬,你前面在慣用寫法那篇不是說,如果資料是可以從原始資料做的,建議在原始資料做OP就好。類別流水號(category_no)看起來可以透過原始資料做啊,為什麼這邊要先建成t1,然後t2才join回去?」

原因是,關鍵是,癥結在於,t1,並不只是為了做出【流水號(category_no)】,還為了另外兩個數字,【總共有幾個消費者(total)】、每個類別【被幾個人選過(cnt)】,在之後可以被應用。當我建t1的目的不單純只是為了在原始資料增加欄位時,就有道理先建成t1,而非直接寫OP在原始資料內。

  1. ithelp_asso_t3_setof:作迴圈的前置步驟,我慣稱setof。假設迴圈要重複跑136次,這個步驟就是先跑其中1次,跑哪1次都可以,因為這步驟的目的不是為了跑出這1次的結果,而是為了整張表的欄位格式,等下可以讓迴圈直接參照這張表的欄位格式設定,就不用再一個一個欄位去設定每個欄位要存什麼格式。
    換句話說,因為跑完1次和跑完136次的欄位格式反正都會一樣,所以我們直接先很快的跑過1次,讓這個欄位格式等下可以讓【真的要跑出結果的時候】直接去使用。當然,這個步驟也必須設計好所有想要產出的欄位,下一步迴圈也才能將這些欄位設計進去。資料筆數1筆。

  2. ithelp_asso_t4_loopfunction:迴圈主檔,參照前一步驟的欄位格式,當作此主檔的欄位格式。這個步驟還無法跑出結果,而只是設計好【迴圈方程】,要跑出什麼結果,要看你丟了什麼指定變數給這個【迴圈方程】。沒有所謂資料筆數,需視丟了什麼變數給它。

  3. ithelp_asso_t5_goal:運用迴圈方程,指定變數後會有基礎資料,接著運算所有統計值,得出全部統計值的結果。在後續的詳細說明裡,會試著把17這個指定變數丟進去,因為我們在步驟1已經發現有17種商品類別,讓迴圈方程跑17*17=289次,讓我們看看會有什麼結果。

上述五道程序,就是內迴圈的標準步驟:

  1. 建立【迴圈變數】與該變數的【重要數據】(用到原始資料)
  2. 將【迴圈變數加回原始資料】內(用到原始資料和1)
  3. 設計好將要產出資料的【所有欄位】(用到2和1)
  4. 設計好【迴圈方程】(用到3)
  5. 丟入指定變數執行【迴圈方程】(用到4)並計算關聯統計值(用到1)


明後天,會把五個步驟的SQL給放上來,預計是2篇很精彩(粗重)的工作內容。




上一篇:
SQL迴圈實作 -2.二種迴圈
下一篇:
SQL迴圈實作 -4.關聯分析的處理工廠2


上一篇
SQL迴圈實作 -2.二種迴圈
下一篇
SQL迴圈實作 -4.關聯分析的處理工廠2
系列文
AI無法一步登天,讓我們先從專有名詞定義開始。31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言