發表文章

R語言 : as.Date() 中的小陷阱, time zone

圖片
 在HR資料處理中,其中一個關鍵便是出勤資料了。,通常完整的資料除了上班打卡時間 / 下班打卡時間以外,通常還需要一個欄位,將打卡的時間歸類於幾月幾號的工時, 例如: 2022/10/28 23:00上班 / 2022/10/29 09:00下班,而歸屬日期為10/28 但現實也不免為碰到不完整的資料無法進行判別,因此需要透過打卡時間或者班別來推斷日期,於是便於其中一個打卡時間萃取日期出來,然後應用as.Date()轉換就完成萃取。 但我們都沒想到的是,單純的使用as.Date( ) 卻會因為系統時差轉換而和我們心中的理想日期有所誤差。 as.Date("yyyy-mm-dd hh:mm:ss",tz = Sys.timezone()) 因此我們需要tz 函數來執行細節設定好讓我們確認時間能夠和預期相符。 在此直接列出使用範例: CHECK <- Time %>% mutate(as_date = as.Date(PUNCH_TIME), as_date_Taiwan = as.Date( PUNCH_TIME ,tz = "Asia/Taipei"), #台灣 as_date_Kolkata = as.Date( PUNCH_TIME ,tz = "Asia/Kolkata"), #印度 DIFF = ifelse((as_date!=as_date_Taiwan| as_date!=as_date_Kolkata| as_date_Taiwan!=as_date_Kolkata),1,0)) %>% filter(DIFF ==1) CHECK %<>% filter(as_date_Taiwan != as_date_Kolkata) CHECK_INDIA %<>% select( PUNCH_TIME , as_date,as_date_Taiwan,as_date_Kolkata) 印度時間早台灣2.5小時,因此投一筆資料會直接將日期轉換為2022-09-01而非我們預想...

Power BI 疑難雜症: hresult 0x80040e4e

圖片
   萬年沒更新,終於又抓到一點時間來分享,目前仍在HR單位底下擔任推動數位轉型的小小螺絲釘,開發看板給予高級主管進行決策參考,Power BI便是工作場域中,不可或缺的重要腳色了,網路上的大神比比皆是,無論是DAX語法應用或者Power Query的應用網路上有許許多多的資源在此也不賣弄大刀,但相對少數提到的Error是HRESULT 0x80040e4e, 這Error是工程師的惡夢,每每碰到總讓人措手不及,資料排程沒有任何更動卻又殺得你措手不及,像班上的惡霸,讓你一整天都無法心安理得開會、研究,但隨著筆者經驗累積,也慢慢有其應對之道了,還請看下去~ 如圖所示,BI工程師碰到這問題時常抱頭不知如何是好: 多數開發人員看到這種類型的result,又看到ODBC會以為是資料渠道出現問題,但事實上卻並非如此,但多方探究之後其實是因為欄位性質異動原因: 欄位文字格式變動: Encoding 變動(UTF-8~Big5) 欄位本身格式變動: 由日期變成Binary 二元 ,本次Error即是因為某張表的日期格式因為資料變為空集合,導致欄位變成binary 綜合前兩項變動,導致表間關聯出問題,請參考: https://www.youtube.com/watch?v=iVY1GkiYs-U&ab_channel=JessieWang 建議解決方向如下: 回想最近一次的更新做的更動有哪些? 是否新增某些資料集? 將新增的資料集刪除後再行更新會否成功? 如果前兩個順利了,就表示error導因於近期更新的資料集,再去擒賊頭確認資料源頭即可。 這次避免空集合的資料源頭被誤判,做了兩項處理: if {nrow(dataframe) == 0} {dataframe[1,1] < - “XXXX”} 空集合賦值 將Excel檔改為CSV檔,Power Query會預判Excel的資料格式,CSV則不會,故作此調整 以上,解決噩夢了嗎?哈哈

Word Vector & Word embedding 初探 - with n-Gram & GLOVE Model

圖片
       終於又有新題材可以分享了,每天在公司歷練(?),下班時常想著要爬起來自我學習,但現實總有點動力骨感,打開的不是筆電,是switch.....不過人生嘛...努力就是想到的時候再做,也是一種進步。 不胡說八道了,進入主題Word Embedding吧,繼上次分享詞頻分析之後,心中對於text mining真的是想著總有一天我還要在更加深入的學習,所以今天要努力分享嚕~ 1. 什麼是Word Embedding? 當你打開手機,輸入"一瓶",螢幕上自動跳出 "啤酒" "汽水" 等名詞;或者郭台銘之於鴻海就像張忠謀之於台積電。 諸如此類讓文字彼此之間有所連結跟類似的邏輯,就是Word Embedding的應用。 透過分析一份完整的語料 (Corpus) 建立詞向量(Word Vector) 進而推論出詞語之間的邏輯語關係,就是Word Embedding的功能。 2. 和詞頻分析不同之處? 詞頻分析主要透過斷詞進而找出詞頻,並抓出相似的文件或者分析出文件的主題。 而詞向量主要在語料中的字詞間找出特定的邏輯和關係。 3. 貝式機率 & 馬可夫練 貝式機率一直是推論關係很好的辦法, P(w1,w2,w3,w4......,wn) = P(w1) * P(w2|w1) * P(w3|w1,w2) * .........P(wn|w1,w2,w3......,wn-1)  P(w1,w2,w3,w4......,wn) <-- w1~wn 共同出現的機率 P(w1) <-- w1 出現之機率 P(w2|w1) <-- 給了w1後,w2出現的機率;P(w3|w1,w2) 給定w1,w2後,w3出現的機率 P(wn|w1,w2,w3......,wn-1) <-- 同理類推,給定w1~wn-1後,wn出現的機率。 如此一來便能推斷字詞之間的關係,但這時發現,如果字數太多,便會很耗費計算效能。 這時便可參考馬可夫鍊的假設,目前出現的詞,僅和前幾個出現的詞語有關係。 其實很好推論,馬可夫鍊也被應用於棒球投手的配球,假設一場球賽先發投手投了120球,我們要推論投手在最後10球的配球,並不會回溯到第一球或者回溯到他生涯的第一場先發,我們會根據他在前幾球的配球做後續推論,就是這樣的道理。 ...

Using R in power BI with html visuals

圖片
嗨嗨大家好, 又很久不見了, 最近的工作內容仍然以BI資料視覺呈現為主,透過R語言去連接本機的ODBC渠道,進而連接來自不同類型的SQL,從PosSQL / Oracle / MS SQL...等, 串接成功後,先以R語言進行資料梳理,tidyverse套件對於整理而言已經是很足夠應付的,甚至可以將不利於做分析的報表格式整理成Tidy格式。  今天最主要想介紹的是怎麼隨心所欲地將R語言的視覺效果隨心所欲地移植到Power BI。  1. 非互動視覺效果: 很簡易地,我們可以直接從紅框框處選擇安插R語言的編輯。 打開後,其實就是安插一個R語言環境在他的小視窗裡進行編輯,這時我們便可以選擇欄位做為要視覺化的對象。我們甚至可以在此進行csv讀檔或者任何新資料集皆能在此進行處理,如下圖,我使用了跟Power BI環境裡完全不同的資料集進行視覺化。 不過,想當然爾,在R語言是以圖片的方式呈現出來的,自然是不會有互動性,不過R本身已經有支援plotly, leaflet等具備互動是圖表的套件,但當我們想套用時,會發現這樣並沒有辦法用一樣的方式呈現。在這裡的語法只能針對圖片檔呈現。 所以要放棄leaflet 或 plotly 等精美的方式呈現嗎? 當然不要。 2. 互動視覺效果: 怎麼處理呢?  首先去下載 nodejs 吧~~ 再來打開cmder / powershell輸入 pbiviz new demoCarEvaluation -t rhtml 於是開始一系列的安裝, 成功後可以看到以下畫面: 我們在cmder 輸入 pbiviz可以看到以下畫面: 接下來去尋找您安裝的地點 接下來可以看到許多json檔案與script.R,我們需要進入這些檔案修改預設好的檔案: a) pbiviz.json : 更改 name / displayname / description / supportUrl(改成任何網址都行ex: www.google.com) / author (簡單填一下自己的簡介即可) b) dependencies.json : 選擇自己要安裝的package,預設為plotly,而我在此新增了leaflet,千萬要記得附上cran的連結唷! c) 針對Rcript調整,其實寫道這漫漫可以理解,這就是base on R語言的Power...

dplyr 1.0.0 介紹應用 & 新工作感想

不知不覺這裡也是很久沒更新了呢......  筆者經歷了幾次職涯轉換,現在任職於科技業裡的人資單位,並加入其數位轉型小組擔任資料分析師, 努力一陣子,也終於過了試用期。 不過工作內容並非以AI演算法做預測,很多時候我必須使用程式語言進行資料的讀取甚至是整理充滿文字與代碼的資料, 因此會用上不少text-mining / data tidying的技巧,讀取資料則是簡單地設計ODBC的讀取匝道來連接各系統的資料庫,有時完成一個BI Dashboard會牽上N個資料庫與資料集, 我覺得自己就像遊戲王裡的決鬥者一樣,蒐集著黑暗大法師的四肢,拼起來後做出最好的呈現.... 之後或許會分享一下自己在工作上的點點滴滴,不過這篇文章主要介紹一下我在工作上常用的Tidy技巧,後續的文章可能也不會像以前一樣找主題套用演算法寫預測的方式進行,而是以實用的技術為主了。 dplyr 1.0.0 為筆者認為其撰寫的方式更加直覺也更加方便,以下還請看我為娓娓道來, 1.選擇行: (1) 跟SQL很像地,只需要用select(),可以選擇打出行名或者打上第n行,或者過運算子(&, | , !)等來進行篩選。 (2) everything() : 全部      last_col(n) : 倒數第n列 (3) 透過column name選擇,也能搭配regex作運用       starts_with(): 以某開頭的列名       ends_with(): 以某結尾的列名       contains(): 包含某字符串的列名       matches(): 匹配正則表達式的列名       num_range(): 匹配數值範圍的列名,如num_range("x", 1:3) 匹配x1, x2, x3 (4) where()       where(): 應用函數到所有列,選擇返回結果為TRUE 的列 #選擇column iris %>% select(Sepal.Length, Sepal.Width) # 或者 select( 1 , 2 ...

Corona Virus- Data Viz

圖片
(Credit to WHO) 病毒資料集: 冠狀病毒 or 新冠性病毒 or 新冠肺炎 AKA 武漢肺炎現在正在猖狂的流行,基本上全球都淪陷了,在這段期間大家要小心啊...... 資料來源: https://www.kaggle.com/sudalairajkumar/novel-corona-virus-2019-dataset 資料集是來自WHO( CHO ),而 John Hopkins University 也將其應用於製作更清楚的dashboard 以利大家參考。 視覺化的表現後,可以讓病毒在全球的蹤跡一覽無遺,也能理解病毒擴散的歷史, 當然也是本篇文章的主題啦,針對武漢肺炎的視覺化練習,Start! Data exploration library( tidyverse ) library( highcharter ) library( lubridate ) library(GridExtra) 可樂娜資料集裡有編號 / 日期/ 行政區 / 國家/ 確診(binary)/ 死亡(binary) / 康復(binary) corona <- read_csv( "covid_19_data.csv" ) head(corona) ## # A tibble: 6 x 8 ## SNo ObservationDate `Province/State` `Country/Region` `Last Update` ## <dbl> <chr> <chr> <chr> <chr> ## 1 1 01/22/2020 Anhui Mainland China 1/22/2020 17~ ## 2 2 01/22/2020 Beijing Mainland China 1/22/2020 17~ ## 3 3 01/22/2020 Chongqing Mainland China 1/22/2020 17~ ## 4 ...

Data Viz- gghighlight

圖片
     本篇主要介紹 gghighlight 的功能,他厲害的地方在於能夠直接在ggplot的語法裡針對資料作類似 filter() 的處理,如果需要了解不同變數的表現或分布,可以跳過處理資料的部分直接作處理。 d <- purrr::map_dfr( letters, ~ data.frame( idx = 1 : 400 , value = cumsum(runif( 400 , - 1 , 1 )), type = ., flag = sample(c( TRUE , FALSE ), size = 400 , replace = TRUE ), stringsAsFactors = FALSE ) ) head(d) ## idx value type flag ## 1 1 0.2778376 a TRUE ## 2 2 0.0184870 a TRUE ## 3 3 -0.7318389 a TRUE ## 4 4 -0.2737461 a FALSE ## 5 5 0.5060394 a FALSE ## 6 6 0.3209906 a TRUE 直接先看ggplot: #in ggplot & use tidyverse ggplot(d) + geom_line(aes(idx, value, colour = type)) 把最大值>20的type分出來 d_filtered <- d %>% group_by(type) %>% filter(max(value) > 20 ) %>% ungroup() ggplot(d_filtered) + geom_line(aes(idx, value, colour = type)) 有gghighlight可以直接在作圖語法處理: ggplot(d_filtered) + geom_line(aes(idx, value, colour = type)) + gghighlight(max(value) ...