2020年4月13日 星期一

[GAME] NBA 2K20 有趣的 MyGM 球隊經營 @ Xbox One

NBA2K20-MyGM01

因疫情的關係,也開始接觸遊戲,買了好一陣子,這週末才點進去 MyGM 的內容,一看真不得了,把球員跟球團經營的薪資都有曝光 XD 真是不錯!其中球團內的常見職務都有給予一些徽章,例如做好就給好徽章,做不好就給壞徽章。

NBA2K20-MyGM02

其中財務長真的好有感:
好的財務長,透過人脈關係,可以減少 10% 行銷費用
壞的財務長,缺乏人脈關係,增加經營成長 10%
壞的總經理特助,愛跟媒體洩露交易資訊
非常有趣!其實擺在公司內的高管經營也都是很合情合理的,如何不內耗,真是一門學問啊。

想起五六年前踏入創業圈的高中學長,分享當年完成A輪後,就趕緊搭建明星團隊,用錢找高手、名人,以此增加企業經營效率跟估值!可惜的,時也運也命也,有些時機錯過了就沒了。

註:結果我還是沒玩多少 NBA 2K20 XDD 都在玩 FIFA 20 ...

2020年4月12日 星期日

[Linux] Dropbox 缺少的 shared libraries @ Ubuntu 18.04 / dropbox-lnx.x86_64-94.4.384

最近更新 Ubuntu 18.04 的環境,順便重抓 Dropbox 來更新。

https://www.dropbox.com/zh_TW/install-linux
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

一執行發現缺了不少 shared libraries ?很怪,印象中以前沒這樣過,順手筆記一下裝了哪些:

$ sudo apt install libxfixes3 libxdamage1 libglapi-mesa libxcb-glx0 libxcb-dri2-0 libxcb-dri3-0 libxcb-present0 libxcb-sync1 libxshmfence1 libxxf86vm1

2020年4月8日 星期三

楓林網 8maple.ru 數據分析

好久沒看到版權事件了 Orz 今天網路界的不小的新聞就是楓林網被抓了,從新聞節錄下來的數據:
  • 兩位台大碩工程師,年收2000萬
  • MAU 3000萬
  • 廣告月收入 200萬
  • 機器月支出 30萬
從 Alexa.com 得知的數據:台灣網站排名掉到 145 左右

01

02

03

新聞上提到有成立廣告行銷公司,假設純靠 Google Adsense 的話,推敲如下:
MAU = 3000萬
廣告收入 台幣 200萬
每天需賺 7萬台幣 => 2333 美金 
若 eCPM 為以下數值
- 0.03 美金 => 廣告曝光 7776萬次
- 0.06 美金 => 廣告曝光 3888萬次
- 0.09 美金 => 廣告曝光 2590萬次
- 0.12 美金 => 廣告曝光 1970萬次 
再假設 DAU 是 MAU 的 1/10, 1/6, 1/2 的話
- 300萬
- 500萬
- 1000萬 
那用戶一天需看 3次 ~ 20 次廣告 
若用戶中午看一次,或是晚上在逛一次,或是一進站可以看到 2-3 則廣告,那單一用戶一天看個 6-10 個廣告也不會太誇張。以此數字來推論 DAU 應當落在 300萬-1000萬之間都還算合理。
單純靠 Google Adsense 其實也不會差太多。說不定改用插頁廣告,還有機會 eCPM 衝到 2-3 美金呢 XD

聊聊題外話,恰好昨晚逛 Alexa Top 100 網站找點子,意外看到一間美妝網站的流量從 50 闖進 30 名,應該是半年不到的時間。這個案例很令人感到驚奇,一間資本額不高的行銷公司(破百但沒千萬),在低卡可以看到一些聘人產文章的八卦故事,竟然能如此成長快速。

問幾位周邊未滿30的女同事都說沒在逛,但已經很容易在 FB 的廣告上被打中。最後跟強者大大細聊後,推論應當是...被高人收購了,以及目前的市場活動熱絡著:


果真是時也運也命也啊,只能處處把握機會!美妝聯盟一到位,美妝網站們就可以一起接收廣告流量啦。

只是同事打趣的說,最近口罩盛行,美妝上半年可能很辛苦。

註:盜版內容極有可能無法獲得 google adsense 廣告來源

2020年4月4日 星期六

再看一次「心之谷」/ 「側耳傾聽」



最近宮崎駿搬上了 NETFLIX ,就順手滑了一下 XD 明明昨晚在看「地獄」(瘟疫+WHO),今晚卻在看宮崎駿心之谷。

一開始只是想回顧片中經典的合唱曲,看著看著也把後半段也都追完了。令人回想起初中生活,當時引響最深的就是心之谷的這首歌。述說著自己當年的青澀與茫無目標的生活,想做什麼,卻什麼也沒頭緒。

此時此刻,時間貢獻給工作、家庭,近幾年提不起勁的,隨手的 side project 也了無新意,很適合回顧這動畫,想想、動動身,別再遲疑了。

2020年3月28日 星期六

[Python] 數據分析筆記 - 透過 pandas, scikit-learn 和 xgboost 分析 Kaggle airbnb-recruiting-new-user-bookings 案例

記得 2017 年也曾註冊 Kaggle 帳號,在上面挑個題目試試手氣,當時也有選中 Airbnb 來研究,可惜當年沒堅持下去,太多有趣的事了 XD 今年春天就來複習一下。

當初我是先從史丹佛 Andrew Ng 的課程看的,但大概只看個幾集就沒繼續,再過一陣子後就是台大教授林軒田的機器學習基石,我印象中有看完,因為我還在遲疑要不要接著看另一個進階課程,那時過境遷,沒再用都忘光了!
這些課程看著看著就不小心恍神了,接著自己僅用著一些原理去土砲...殊不知 Pandas 跟 scikit-learn 套件有多好用,當時只粗略用 Pandas 當 csv parser ,剩下的資料轉換、陣列計算還自己刻 numpy 架構去運算。所幸,終於有個更適合我這種懶人的微課程,那就是 Kaggle 的 Faster Data Science Education
我大概只需要從第三章 Intermediate Machine Learning 走完一遍就得到我想要的東西了。接著想找個戰場試試手氣,就又回想起 Kaggle 的 airbnb-recruiting-new-user-bookings 數據
接著用 airbnb-recruiting-new-user-bookings 關鍵字問個 google ,會發現到現在也有非常多人拿他當例子來分析,經典果真歷久不衰!大概不用破百行,就可以組出 airbnb 數據分析達八成的水準:

匯入函式庫:

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier

import numpy as np
import pandas as pd

import datetime


匯入 csv 檔案:

train_users = pd.read_csv('input/train_users_2.csv')

將 age 內容調整,包含去除輸入錯誤(太大或大小者),例如明顯輸入的是西元年,就順便幫轉一下:

data_checker = train_users.select_dtypes(include=['number']).copy()
data_checker = data_checker[ (data_checker.age > 1000) & (data_checker.age < 2010) ]
data_checker['age'] = 2015 - data_checker['age'] # 推論當年的資料,用 2015 年來相減對方不小心輸錯的出生年來得到年紀

for idx,row in data_checker.iterrows():
        train_users.at[idx,'age'] = row['age']

data_checker = train_users.select_dtypes(include=['number']).copy()
data_checker = data_checker[ (data_checker.age >= 2010) | (data_checker.age >= 100) | (data_checker.age < 13) ]
data_checker['age'] = np.nan
for idx,row in data_checker.iterrows():
        train_users.at[idx,'age'] = row['age']


處理時間欄位,轉成 datetime 型態,並轉成 weekday:

data_checker = train_users.loc[:, 'timestamp_first_active'].copy()
data_checker = pd.to_datetime( (data_checker // 1000000), format='%Y%m%d')
train_users['timestamp_first_active'] = data_checker

str_to_datetime_fields = ['date_account_created', 'date_first_booking']

for field in str_to_datetime_fields:
        train_users[field] = pd.to_datetime(train_users[field])

# to weekday

train_users['first_active_weekday'] = train_users['timestamp_first_active'].dt.dayofweek
for field in str_to_datetime_fields:
        train_users[field+'_weekday'] = train_users[field].dt.dayofweek

# remove datetime fields

train_users.drop(str_to_datetime_fields, axis=1, inplace=True)
train_users.drop(['timestamp_first_active'], axis=1, inplace=True)


處理 label 資料,主要轉成 one-hot encoding,並且去除一些數值,統一轉成 NaN:

categorical_features = [
        'affiliate_channel',
        'affiliate_provider',
        #'country_destination',
        'first_affiliate_tracked',
        'first_browser',
        'first_device_type',
        'gender',
        'language',
        'signup_app',
        'signup_method'
]
for categorical_feature in categorical_features:
        train_users[categorical_feature].replace('-unknown-', np.nan, inplace=True)
        train_users[categorical_feature].replace('NaN', np.nan, inplace=True)
        train_users[categorical_feature] = train_users[categorical_feature].astype('category')

# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html
# Convert categorical variable into dummy/indicator variables.
train_users = pd.get_dummies(train_users, columns=categorical_features)


開始順練模型,建議先透過 sample 跑小量

# X = train_users.copy()
X = train_users.sample(n=3000,random_state=0).copy()
y = X['country_destination'].copy()
X = X.drop(['country_destination'], axis=1)

X_train, X_valid, y_train, y_valid = train_test_split(X, y)


print("Start to train...")

job_start = datetime.datetime.now()

my_model = XGBClassifier()
my_model.fit(X_train, y_train)

print("training done, time cost: ", (datetime.datetime.now() - job_start))

job_start = datetime.datetime.now()

predictions = my_model.predict(X_valid)
print("predict done, time cost: ", (datetime.datetime.now() - job_start))

print("score:", accuracy_score(predictions, y_valid))


運行結果:

Start to train...
training done, time cost:  0:00:14.270242
predict done, time cost:  0:00:00.056500
score: 0.8466666666666667


沒想到只需做一些處理,運算玩就有八成準確率了!以上還沒使用 sessions 資料。完整程式碼請參考:github.com/changyy/study-kaggle-airbnb-recruiting-new-user-bookings