ã â»ãã®èšäºã¯ LIFULL Advent Calender ã®20æ¥ç®ã§ã ãããã«ã¡ã¯! LIFULLã§ããŒã¿ã¢ããªã¹ããããŠãã竹柀( @Akira Takezawa )ã§ã. ãä»åã¯, LIFULLã® ããŒã¿ã¢ããªã¹ãããŒã ã®åãçµã¿ã玹ä»ããŸã. ãæ¬èšäºã¯ããŒã¿åæã«èå³ãããæ¹ã察象ã«, ãããŒã±ãã£ã³ã°ã®å®åã§çãããæç³»ååæããããŒãã«å·çããŸãã. ããŸã, ãªããã®èšäºãæžããããç°¡åã«èª¬æããŸã. ãè¿å¹Ž, æ©æ¢°åŠç¿ããã£ãŒãã©ãŒãã³ã°ã®å°é ãçé ã«è¿å¹ŽããŒã¿åæã®ææ³ã¯ççºçã«å¢ãç¶ããŠããŸã. ãäžæ¹ã§å®éã®ããžãã¹ã®çŸå Žã§èŠããŠããã®ã¯, ãæŽŸæããæ°ããã®ã¿ã«æããã, å€ä»æ±è¥¿å€ããã䟡å€ãæäŸãç¶ããŠããåæææ³ããéèŠã§ã¯ãªããããšããããäžã€ã®åŽé¢ã§ã. ãå
·äœçã«ã¯çžé¢ã»ååž°åæãæ€å®ãªã©ãããã§ãã, åæã«ã æç³»ååæ ããããžãã¹ã®äžçã§æŽ»çšæ©äŒãå€ã, ãã¯ãã«ãªåšåãçºæ®ãããšç§ã¯èããŠããŸã. ãããã§ä»åã¯, TVCMã®èšŽæ±ãã¯ãªãšã€ãã£ãã®è©äŸ¡ãããéã«, æç³»åã¢ãã«ã掻çšããããšã§è©äŸ¡åºæºãšãªãKPIãäœæããäºäŸã«ã€ããŠç޹ä»ããŸã. ããªãäžç€ã§ã¯, Pythonã«ããSARIMAXã¢ãã«ã®å®è£
ãèšèŒããŠããŸã. ãç®æ¬¡ã â ããŒã±ãã£ã³ã°ã«ãããæç³»ååæã®æŽ»çšæ©äŒ ç®ç: TVCMã§ãŠãŒã¶ãŒã®ãµã€ã蚪åã»å©çšãå®çŸããã 課é¡: 蚎æ±å
容ãšã¯ãªãšã€ãã£ãã®è©äŸ¡ã«ãããããã«ãã㯠解決ç: åºçš¿äºå®ã®GRPéãšKPIã®é¢ä¿ãã¢ããªã³ã°ãã â¡Python/statsmodelsã«ããSARIMAXã®æŽ»çšäºäŸ ã¯ããã«: SARIMAXã¢ãã«ãšã¯? ããŒã¿æºå: WAUãšéå»ã®CMé
ä¿¡GRPããŒã¿ ã¢ãã«éžæ: æç³»åããŒã¿ã«ããã確çéçš ãã©ã¡ãŒã¿æšå®: AICãšGrid Searchã«ããæšå® äºæž¬: 仿ã®GRPã§äºæ³ãããKPIã®æåŸ
å€ãç®åº â¢çŸåšLIFULLã§ã¯ããŒã¿ã¢ããªã¹ããç©æ¥µæ¡çšäž ããŒã¿ã¢ããªã¹ãã®åœ¹å²: èªåãã¡ã®ååšæçŸ©ã«ã€ã㊠LIFULLãæ±ããããŒã¿ã®é
å: éãšå€æ§æ§ã®èгç¹ãã ãããã«: ããŒã¿ã¢ããªã¹ã(ç¹ã«ãããŒãžã£ãŒ)ãåéäž â ããŒã±ãã£ã³ã°ã«ãããæç³»ååæã®æŽ»çšæ©äŒ åŒçšå
: åé³¥ããã¿6æ¬ïŒïŒã¹ããŒããã¥ãŒã¹ã®æ°ã³ã³ãã³ããã¯ãŒãã³ãã£ã³ãã«ãã玹ä»ããæ°TVCMã2018幎3æ31æ¥ïŒåïŒããå
šåœãªã³ãšã¢äžïŒïŒ ç®ç: TVCMã§ãŠãŒã¶ãŒã®ãµã€ã蚪åã»å©çšãå®çŸããã ãçªç¶ã§ããèªè
ã®çãã, èªåã奜ããªCMã¯ãããŸãã? ããã¡ãã®ç»åã¯åŒç€Ÿã§ãåºåãåºçš¿ãããŠé ããŠãã SmartNews ããã® CM ã«ããã§ãã, ãTVç»é¢ã®å³åŽ30%ããµãŒãã¹ã®UIïŒã¹ããç»é¢ïŒãå ããããšããæ¬æ°ãªã¯ãªãšã€ãã£ããšãªã£ãŠããŸã. ãå人çã«ã¯ããªãåæ°ã®ããææŠã ãšèããŠãã, ãŠãŒã¶ãŒã«ãšã£ãŠã®ãããããããããæ¥µéãŸã§çªãè©°ãã, äœãæã®ãã ããã匷ãæããã®ã§ããã奜ãã§ã. ãã¹ããã®ç»å Žä»¥æ¥, ãŸããŸãçæŽ»ãåºåã§æº¢ããçŸä»£ã§, åã«TVCMãèŠãŠããã£ãã ãã§èªç¥ãç²åŸã§ããæä»£ã¯çµãããŸãã. ãç¹ã« LIFULL HOME'S ã®ãããªæ
å ±ãµãŒãã¹ã®äžçã§ã¯, åžå Žãåãããããã¯ãèªç¥ã®ç²åŸã ãã§ãªã, ã¢ã¯ã·ã§ã³åèµ·ãçã£ãCMãžå€§ããã·ãããã§ã³ãžããŠããããšãäžèšã®äŸã®ããã«ç¢ºèªã§ããŸã. ãåœç¶LIFULLã§ããªãã©ã€ã³ã®åºåã«ãã£ãŠ, å®éã«ãªã³ã©ã€ã³äžã®ãµãŒãã¹ã䜿ã£ãŠããããã, ãããã¯ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠé ãããã«é¢å¿ãå¯ããŠããŸã. ãä»åã¯Webãµã€ããã¢ããªãµãŒãã¹ã«ãããŠ, ãŠãŒã¶ãŒã®ããªã³ã©ã€ã³äžã§ã®ã¢ã¯ã·ã§ã³ããŸã§ãçã£ãTVCM掻çšãæ³å®ããŠè©±ãé²ããŸã. ãªããã®éã®KPIãšããŠã¯, CMåºçš¿æéäžã® DAU ã æåæ€çŽ¢ ãªã©ãèããããã§ããã. ãäœè«ã§ãã, TVCMã¯ããŒã±ã¿ãŒã«ãšã£ãŠ, 幎éã§æåžã«ç«ãŠãåæ°ãå°ãªãå²ã«ã³ã¹ãã¯åºæ¬ååäœãšé«é¡ãªãã, æåããŠã倱æããŠãäºæ¥ã«å¯Ÿããã€ã³ãã¯ãã倧ãã, é£æåºŠãæãé«ãä»äºã®1ã€ã§ã. ãã ãããã, 1å1åã®èšŽæ±å
容ãã¯ãªãšã€ãã£ãã«å¯ŸããŠ, æ£ããè©äŸ¡ææšãèšå®ã, ãã®çµæã軞ã«çްããªãã£ãŒãããã¯ãäžããŠããå¿
èŠããããŸã. ã â»æ³šæç¹ãšããŠ, ãããŸã§TVCMã®ç®çãããµãŒãã¹ã®å©çšãã«èšå®ããæã®ã¿, ãã©ãã£ãã¯ã®å¢æžçã®ææšã§ã¯ãªãšã€ãã£ããè©äŸ¡ãã¹ãã§ã. èªç¥ãªã©ç®ç次第ã§è©äŸ¡ã®ä»æ¹ã¯å€ããã®ã§, ãã®æ¹æ³ãåžžã«æ£è§£ãšããèš³ã§ã¯ãããŸãã. 課é¡: 蚎æ±å
容ãšã¯ãªãšã€ãã£ãã®è©äŸ¡ã«ãããããã«ãã㯠ãããã§ã¯ã¯ãªãšã€ãã£ããè©äŸ¡ããäžã§ã®é£æãäŸç€ºããããã«, å®éã«ãã£ãããã«ããã¯ã3ã€ç޹ä»ããŸã. TVCMã«ã¯ GRP ãæŸæ æé垯ãªã©KPIã«å€åãäžãåŸã倿°ãè€æ°ãã, 蚎æ±ãªã©ç¹å®ã®å€æ°ã«ãã圱é¿ãå®éåããŠåãåºãããšãé£ãã 宿§æ
å ±ã§ãã蚎æ±å
容ãã¯ãªãšã€ãã£ãã¯, å®éåããŠKPIãšã®é¢ä¿ãã¢ããªã³ã°ããããšãé£ãã KPIã®å€ã, å£ç¯å¹æããã¬ã³ãã®åœ±é¿ãåããŠããããšãèæ
®ããªããã°ãªããªã ã â»GRPã¯ãå»¶ã¹èŠèŽçããšåŒã°ã, CMã®ç·è¡šç€ºåæ°ã衚ã尺床ãšèããŠãã ãã ãå°ãå
·äœçã«, é ã远ã£ãŠèª¬æããŠãããŸã. ããŸã1. ã«é¢ããŠ. TVCMã¯éåžž, 倧ãã以äžã®5ã€ã®èŠçŽ (倿°)ã倿Žã»èª¿æŽããŠæ¯åã®åºçš¿ãè¡ããŸã. 蚎æ±å
容 (Who&What) ã¯ãªãšã€ãã£ã (How)â»èµ·çšã¿ã¬ã³ãã鳿¥œetc... æŸæ GRPéâåºçš¿éé¡ (How much) æŸæ æé垯 (When) æŸæ éœéåºç (Where) ãäžèšã®èŠçŽ ã«ãããŠ, ã©ã®èŠçŽ ã®å€æŽãKPIã«å¯ŸããŠã©ãã ã圱é¿ãäžããããåã
ã«å®éåããŠæãåºãããšãå°é£ãªããšã¯æ³åãã€ãã§ããã. ãæ¬¡ã«2. ã«é¢ããŠ. ãããã蚎æ±å
容ãã¯ãªãšã€ãã£ã(èµ·çšã¿ã¬ã³ããæ§æ)ã¯å®æ§çãªæ
å ±ãã€, 倿°å(ãããŒå€æ°ãªã©)ãé£ããéšé¡ã«ããããã, çµ±èšã¢ããªã³ã°ãéåžžã«é£ãããªããŸã. çµæ, KPIã«å¯Ÿããã¯ãªãšã€ãã£ãã®å¹æãçŽæ¥å®éåããããšãã§ããŸããã§ãã. ãæåŸã«3.ã«é¢ããŠ. 詳ããã¯åŸè¿°ããŸãã, æç³»åã¢ãã«ãéžæããã¡ãªãããã®ãã®ã«é¢ãã話ãšãªããŸã. ãŸã㯠å£ç¯å¹æ ã«ã€ããŠ. ãäžè¬çã«ã©ã®åæã»ãµãŒãã¹ã«ãããŠãç¹å¿æã鿣æããããšæããŸã. åŒç€Ÿã§ã¯TVCMã®åºçš¿ææãšç¹å¿æãéãªã, KPIã®ãªããã®ãã¡ã©ããŸã§ãCMã®åœ±é¿ãªã®ãã®å€æãé£ãããšãã課é¡ããããŸãã. ãäŸãã°, LIFULL HOME'Sã«ãããŠè³è²žç©ä»¶ã®æ€çŽ¢ã¯, 1æãã3æã®åŒã£è¶ãã·ãŒãºã³ãç¹å¿æã«ãããã¢ã¯ã»ã¹æ°ãæ¥å¢ããŸã. åœç¶, 1,000GRPã®TVCMãæ¥å
ã®3æã«åºçš¿ããæãš, å€ã®8æã«åãéãåºçš¿ããæã«KPIãåãåŸãå€ã¯å
šãç°ãªããŸã. ããã£ãŠ, åçŽã«ç·åœ¢ååž°ã䜿ã£ãŠæ¯åã®GRPãšKPIã®é¢ä¿æ§ãã¢ãã«åããããšããŠãäžæããããŸãã. ããŸã, ãã¬ã³ã ãšã¯ç«¯çã«èšããšé·æçãªåŸåãKPIã®ããŒã¹ã©ã€ã³ã®å€åãæããŸã. äŸãã°, ã¹ããã®æ®åçãæ¥å¢ãã5幎éã«ãããŠã¯, åºæ¬çã«ã¯å€ãã®WebãµãŒãã¹ã®ãŠãŒã¶ãŒæ°ãå³è©äžããã«å¢å ããŠãã£ãã¯ãã§ã. ããããããã¯ãèŠå ã«ããç·©ãããªæ°å€ã®å€åãèæ
®ããäºã§, ããæ£ç¢ºãªå¹ææ€èšŒãã§ããŸã. ããã£ãããšã§ãã以äžãWebã®ãã©ãã£ãã¯ææšãè©äŸ¡åºæºãšããŠ, CMã®ã¯ãªãšã€ãã£ãã蚎æ±ã广æ€èšŒããéã«åºãŠããåé¡ç¹ã§ãã. 解決ç: åºçš¿äºå®ã®GRPéãšKPIã®é¢ä¿ãã¢ããªã³ã°ãã ãããã§ã¯åè¿°ã®ããã«ããã¯ãèžãŸã, ä»åæã
ãæ¡çšãã广æ€èšŒã®æ¹æ³ã«ã€ããŠæžããŸã. ããŸãæ€èšŒæé ã®å
šäœåãšããŠã¯, 以äžã®3ã¹ããããšãªããŸã. CMã®å€æ°ãšããŠã¯ãGRPãã®ã¿ã説æå€æ°ã«å ãã, ãã¬ã³ãã»å£ç¯èª¿æŽä»ãæç³»åã¢ãã« ãçšããŠæªæ¥ã®KPIãåé±ã§åãåŸãåºæºå€ãäºæž¬ãã ããå®éã®KPIã®çµæãåºæºå€ã倧ããäžåã£ãå Žå, 説æå€æ°ã«å ããªãã£ãã蚎æ±ãããã¯ãªãšã€ãã£ãããæ£ã®åœ±é¿ãäžãããšä»®å®ããŠè©äŸ¡ãã æåŸã«, ä»å詊ããCMã®å€æŽç¹( 蚎æ±ãèµ·çšã¿ã¬ã³ãã®å€æŽãªã© )ãš, éå»ã®ã¯ãªãšã€ãã£ãã®ãå·®åããåå³ã, 次åã®ç¶ç¶äºé
ã»æ¹åäºé
ãæ±ºå®ãã ãèŠã¯, å®éã®èŠ³æž¬å€ããã蚎æ±å
容ãšã¯ãªãšã€ãã£ã"以å€ã®èŠçŽ "ãã«ãã广ãå·®ãåŒãããšã§, 蚎æ±ãšã¯ãªãšã€ãã£ãã®å¹æãå®éåããŠæãåºãããšããçºæ³ã§ã. ããã ãå¯ãã®éã, çŸæç¹ã§åŠ¥åããç¹ãããã€ããããŸã. ãäŸãã°, ã蚎æ±å
容ãããã¯ãªãšã€ãã£ããã«ãã广(æŸæ æéåž¯ãæŸéãšãªã¢ã®å€æŽãå«ã)ã¯, éå»ã®åºçš¿ã®çµæãå¹³åããŠèæ
®ãããšããããäžå®ã«ãªããšããŠå²ãåã, 誀差ã«åžåããããã®ãšããŠæ±ã£ãŠããŸã. ãããã, å®éã«KPIãšãªãææšãéå»ã«åã£ãå€ã¯, ãããã®åœ±é¿ãå°ãªãããåããçµæçãŸããŠããã¯ãã§ã. ããŸãæ¬æ¥ã§ããã°, CMåºçš¿æéã«åæã«åºçš¿ããé»è»å
ã®äº€éåºåãYoutubeåç»ãªã©ã®åœ±é¿ãèæ
®ããã¹ãã§ãã, ä»åã¯ãããã®åºçš¿éé¡çã説æå€æ°ãšããŠã¢ãã«ã«å ããŠããªãç¹ã«ãããŠãäžå®å
šããæ®ããŸã. ãäžæ¹ã§, äžã®äžã®çŸè±¡ãåçŽåããŠã¢ããªã³ã°ããéã¯, åžžã«åŠ¥åãã€ããã®ã§ã. ã§ãã®ã§ä»åã¯äžåºŠã¢ãã«ãæ§ç¯ã, ã©ãã ã粟床ãåºããèŠãŠã¿ãããšãã倿ã«èžã¿åããŸãã. ãããããå
ã¯, æç³»åã¢ãã«ã§ããSARIMAXã®ã¢ããªã³ã°ã«ç§»ã, Pythonã§ã®å®è£
æ¹æ³ãšå
±ã«ç°¡æœã«ã¢ãã«ã®èª¬æãããŸã. â¡Python/statsmodelsã«ããSARIMAXã®æŽ»çšäºäŸ åŒçšå
: Forecasting with Python and Tableau ã â»ãã®èšäºã§ã¯, åã
ã®çµ±èšçšèªã®èª¬æãæ°åŒã«ã€ããŠã¯å²æããŸã. ãŸãæã
çµ±èšçãªå³å¯ãã«æ¬ ããèšèŒããããšæãã, ãã®éã¯ç©æ¥µçã«ä¿®æ£ãããã®ã§ãã²ã³ã¡ã³ãããé¡ãããŸã. ã¯ããã«: SARIMAXã¢ãã«ãšã¯? ãä»åã¯ã¿ã€ãã«éã, KPIã®äºæž¬å€ãäœãããã®æç³»åã¢ãã«ãšã㊠SARIMAXã¢ãã« (å£ç¯èª¿æŽæžã¿ARIMA + å€ç倿°) ãæ¡çšããŸãã. ãSARIMAXã¢ãã«ãçŽæçã«çè§£ãããã, ãŸã㯠SARIMAX = S+ARIMA+X ãšåè§£ããŠèª¬æããŸã. ããŸã S+ARIMA ã®éšåã§ãã, 代衚çãªæç³»åã¢ãã«ã§ãã ARIMAã¢ãã« (èªå·±ååž°ååç§»åå¹³å) ã«å£ç¯æ§ãªã©ã®åšææåãåãå
¥ãããã®ã SARIMA ã¢ãã«ãšèšããŸã. ãããŠæ®ãã® +X ã«ã€ããŠã¯, ååž°åæã®ããã« å€éšå€æ° ãã¢ãã«ã«çµã¿èŸŒããããšã衚ããŠããŸã. ä»åã§ãããšTVCMã®åºçš¿GRPã, X ãšããŠã¢ãã«ã«åã蟌ã¿ãŸã. ãSARIMAXã¢ãã«ãæ¡çšããããšã§, åç« ã§ãããç¹å¿æãªã©ã®ãå£ç¯åœ±é¿ããããã¬ã³ã圱é¿ããå å³ããããšãã£ãèŠä»¶ãæºããããšã«ç¹ãããŸã. ãŸãåºåè²»ãªã©ã®å€éšå€æ°ãè€æ°è¿œå ã§ãããã, å€ãã®ããŒã±ãã£ã³ã°ãã£ã³ããŒã³ã«ãããäºæž¬ãå¹ææž¬å®ãšãçžæ§ãè¯ãããã§ã. ãPythonã§ã¯, statsmodels ãšããã©ã€ãã©ãªããSARIMAXã¯ã©ã¹ãåŒã³åºãããšã§, æ°è¡ã®ã³ãŒãã§ã¢ããªã³ã°ã§ããŸã. ããŒã¿æºå: WAUãšéå»ã®CMé
ä¿¡GRPããŒã¿ ãä»åã¯TVCMã§äŒžã°ãããææš(KPI)ã, ãµã€ãã«èšªåãã鱿¬¡ã®ãŠããŒã¯ãŠãŒã¶ãŒæ°ã衚ã WAU (Weekly Active User)ãšä»®å®ããŠé²ããŸã. ãå®éã®ãµãŒãã¹ããŒã¿ãå
¬éããããšã¯ã§ããªããã, ä»å㯠Google Trend ã䜿çšããŸã. å
·äœçã«ã¯çŽè¿5幎åã®èªç€ŸãµãŒãã¹ã«é¢ããè€æ°ã¯ãŒãã®æ€çŽ¢æ°ãããŠã³ããŒãã, ãã®åèšå€ã«é©åœãªæ°ããããããšã§æ¬äŒŒçãªWAUããŒã¿ãçæããŸãã. ããŸã, 説æå€æ°ã«å ããGRPã®ããŒã¿ã«ã¯, åºå代çåºã®ã¬ããŒããå
ã«èªç€Ÿã®éå»ã®TVCMåºçš¿å®çžŸãçšããŸã. ããªãå®è£
ã«ããã£ãŠã¯, Jupyter Notebookã䜿ããŸã. ããã§ã¯æ©éå¿
èŠãªããŒã¿ãæºåããŠãããŸã. ããŸãã¯â WAUããŒã¿ãããŒãããŸã. å
ããŒã¿ã®åäœã¯Dailyã§ãã, pandas.DataFrame.resample ã§ ç°¡åã«é±åäœã«ãŸãšãã ããšãã§ããŸã. # å¿
èŠãªã©ã€ãã©ãªãäºåã«ã€ã³ã¹ããŒã«ããŠãã ãã import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm # Google Trendã®ããŒã¿ããä»®æ³WAUã®ããŒã¿ãçæ wau = pd.read_csv( "wau_5years.csv" ) wau.DATE = pd.to_datetime(wau.DATE) wau.set_index( "DATE" , inplace= True ) wau = wau.resample( "W" ).sum() wau.head( 7 ) ãæ¬¡ã«èª¬æå€æ°ã«äœ¿ãâ¡GRPããŒã¿ãããŒãã, åããé±åäœã«ãŸãšããŸã. ãã¡ãã¯åœç¶å
¬éããããšãã§ããªããã, ããŒã¿ãé ããŠããŸã. # èªç€Ÿã®GRPãåºååºçš¿éé¡ããŒã¿ãçšæãã grp = pd.read_excel( "grp.xlsx" ) grp.DATE = pd.to_datetime(grp.DATE) grp.set_index( "DATE" , inplace= True ) grp = grp.resample( "W" ).sum() grp.head( 7 ) ããã®é, ã¢ãã«ã«å
¥ããããŒã¿ã®æ¥ä»ã®éå§ç¹ãç²åºŠ(æ¥æ¬¡, ææ¬¡)ãæããªããšåŸã§ãšã©ãŒãåºãã®ã§ã泚æã. ã¢ããªã³ã°ã«å¿
èŠãªããŒã¿ã®æºåãã§ããã®ã§, äžåºŠWAUã®åç³»åãå¯èŠåããŠã¿ãŸã. # ãã©ãã£ãã¯æ°ãå¯èŠå plt.rcParams[ 'figure.figsize' ] = 12 , 8 wau.plot(linewidth= 4 , color= "steelblue" ) ããã®æç¹ã§, çµå¹Žã§ããããŒã¿ãåãåŸãå€ã®ããŒã¹ã©ã€ã³(ãã¬ã³ã)ãäžæããŠããããšã, ç¹å®ã®æã®ã¿æ°å€ãé«ããªããã¿ãŒã³(åšææ§)ã確èªã§ããŸã. 次ç¯ã§è©³ããèŠãŠãããŸã. ã¢ãã«éžæ: æç³»åããŒã¿ã«ããã確çéçš ãããã§ã¯, ç°¡åã«WAUããŒã¿ãåŸã çæéçš ã確èªããŠãããŸã. ãåæãšããŠ, çµ±èšã¢ãã«ãæ§ç¯ãããšã¯ã€ãŸã, ã 芳å¯å¯Ÿè±¡ãšãªãããŒã¿ã, å®ã¯ç®ã«èŠããªãå
éšæ§é ããã¿ãŒã³ã«åŸã£ãŠçŸããŠãã ããšä»®å®ããããšã§ãã, ãã®ããæ°åŒã«ãã£ãŠå®åŒåããããšãã§ããŸã. ãããã§ä»åã¯, å芳枬ç¹ã«ãããWAUã®ããŒã¿ã以äžã®ãã㪠確çéçš ã«åŸã仮説ãæã¡ãŸã.ã ã WAU = çæã®èªå·±çžé¢ + é·æã®ãã¬ã³ã + å£ç¯å¹æ + CMã®GRP + 誀差 ããªããã®ä»®èª¬ã¯, ããããSARIMAXã¢ãã«ãæ³å®ããŠãã確çéçšã«ããããŸã. ãæ¬¡ã§ã¯ã¢ããªã³ã°ã«å
¥ãåã«, æç³»åããŒã¿ç¹æã® EDA ã«ãã£ãŠäžèšã®ä»®èª¬ã®åŠ¥åœæ§ãæ€èšŒããŠãããŸã. 1. èªå·±çžé¢ãšå£ç¯å¹æã®ç¢ºèª ãäžæ©ç®ãšããŠ, èªå·±çžé¢ ã®æç¡ã確èªããŠãããŸã. ãæç³»åã¢ããã«ã§ã¯, çŸåšã®èŠ³æž¬å€ãšéå»ã®å€ã®éã«, ãªãããã®æéçãªé¢ä¿æ§ãååšããããšãåæãšããŠããŸã. ããã£ãŠãèªå·±çžé¢ããªã( ãã¯ã€ããã€ãº )ã, ã€ãŸã100%ã©ã³ãã ã«çæãããããŒã¿ã, ããããæç³»åã¢ãã«ãšããŠæ±ãå¿
èŠããããŸãã. ããã®ãããŸã, WAUããŒã¿ãèªåã®éå»ã®å€ãšçžé¢é¢ä¿ããããã©ãã, ãŸãåæã«åšææ§ãæã€ãã©ããã調ã¹ãŸã. # èªå·±çžé¢ä¿æ°ãšåèªå·±çžé¢ä¿æ°ã®ã³ã¬ãã°ã©ã ãåºå fig,ax = plt.subplots( 2 , 1 ,figsize=( 12 , 8 )) fig = sm.graphics.tsa.plot_acf(wau, lags= 100 , ax=ax[ 0 ], color= "darkgoldenrod" ) fig = sm.graphics.tsa.plot_pacf(wau, lags= 100 , ax=ax[ 1 ], color= "darkgoldenrod" ) plt.show() ã â»äžèšã¯ã³ã¬ãã°ã©ã ãšãã, 暪軞ãã©ã°æ°, 瞊軞ãèªå·±çžé¢ä¿æ°(ãŸãã¯åèªå·±çžé¢ä¿æ°)ããšããŸã. ã ã³ã¬ãã°ã©ã ãã, ã©ã°ã倧ãããªãã«é£ããŠæ£ã®èªå·±çžé¢ãç·©ããã«æžè¡°ããŠããããšãåãããŸã. ãŸããããã«ã§ãã, 52鱿¯ã®åšææ§ã確èªã§ããŸã. 2. å®åžžæ§ãšåäœæ ¹ã®ç¢ºèª ãæ¬¡ã«, å®åžžæ§(stationarity)ãš ARIMA ã¢ãã«ã®åæãšãªãåäœæ ¹(ããã³ååéçš)ã®æç¡ã«ã€ããŠç¢ºèªããŠãããŸã. ããŸãå®åžžæ§ãšã¯, æéãçµéããŠãããŒã¿ãçæãã確çååžãå€åããªãæ§è³ªã®ããšã§ã. åºæ¬çã«å€ãã®æç³»åã¢ãã«ã¯, ããŒã¿ãå®åžžæ§ãæã€ããšãåæãšããŠããŸã. ãå®åžžæ§ãæã€æç³»åããŒã¿ã å®åžžéçš , æããªããã®ã éå®åžžéçš ãšåŒã³ãŸã. ããã ã, åç³»åãéå®åžžéçšãªããŒã¿ã«å¯ŸããŠã, äŸå€çã«æç³»åã¢ãã«ãé©å¿ã§ããå ŽåããããŸã. ããã¯ååŸã®èŠ³æž¬ç¹ã®å€ã§å·®åããšã£ãé差系åãå®åžžæ§ãæã€ããŒã¿ã®å Žåã§ã. åäœæ ¹éçšãååéçšãããã«åœãããŸã. ãããå
·äœçã«ã¯, åäœæ ¹(åäœæ ¹éçš)ã¯1次ã®å·®åããšã£ãé差系åãå®åžžéçšã«åŸãæç³»åããŒã¿ã, ååéçšã¯ä»»æã®d次é差系åãå®åžžéçšãšãªããã®ãæããŸã. ãARIMAã¢ãã«ã¯, ä»åã®ããã«ãã¬ã³ããæã€ããŒã¿ã«å¯ŸããŠé©å¿ããããšãã§ããŸã. ARIMAã¢ãã«ã§ã¯, å
éšã§ãã¬ã³ãããŒã¿ã®å·®åãåãããšã§, å®åžžéçšã«å€æããŠããŸã. ãããã§ã¯è©Šãã«, WAUããŒã¿ã®1次é差系åãèŠãŠã¿ãŸããã. # wauã®1次差åç³»å plt.rcParams[ 'figure.figsize' ] = 12 , 8 wau.diff().plot(linewidth= 4 , color= "mediumseagreen" ) ãå
ã»ã©ããã¯å®åžžéçšã«è¿ãç³»åãšãªããŸããã, ãŸã ããã€ãã¹ãã€ã¯ããŠãã芳枬ç¹ã確èªã§ããŸã. ä»åã¯ãã®ã¹ãã€ã¯éšåããå£ç¯èŠå ããšãå€éšèŠå (CMã®GRP)ãã®åœ±é¿ã«ããåããšããŠèª¬æã§ããªãããšãã仮説ã, SARIMAXã¢ãã«ãæ¡çšããèæ¯ãšãªããŸã. ã念ã®ãã, åäœæ ¹ã®æç¡ã調ã¹ãŠã¿ãŸã. åäœæ ¹ã®ç¢ºèªã«ã¯, ADFæ€å® (Augmented Dickey-Fuller test)ãçšããããŸã. ä»åã¯, æææ°Žæº 5%ãšããŠæ€å®ããŸã. # åç³»åã«å¯ŸããADFæ€å® results = sm.tsa.stattools.adfuller(wau[ "WAU" ]) print ( 'ADF Statistic: %f' % results[ 0 ]) print ( 'P-Value: %f' % results[ 1 ]) ADF Statistic: -2.467521 P-Value: 0.123578 ã På€>0.05 ãšãªããŸãã. åäœæ ¹éçšã§ãããšããåž°ç¡ä»®èª¬ãæ£åŽã§ããªãã£ããã, WAUã®åç³»åãåäœæ ¹ãæã€å¯èœæ§ããããšããŠæ¬¡ã«é²ã¿ãŸã. 3. ãã¬ã³ã(ãšå£ç¯æå)ã®æœåº ãæ¬æ¥ã§ããã°, å£ç¯æåã¯äžèšã®ã³ã¬ãã°ã©ã ã«ãã£ãŠç¢ºèªã§ããŸãã, statsmodels ã«ã¯ããŒã¿ãããã¬ã³ãæåãšå£ç¯æåãå¥ã
ã«æœåºããããšãã§ããã¡ãœãããååšããã®ã§ç޹ä»ããŸã. # ãã¬ã³ãæåãšå£ç¯æå, æ®å·®ãæœåºãã fig, axes = plt.subplots( 4 , 1 , sharex= True ) decomposition = sm.tsa.seasonal_decompose(wau, model = 'additive' ) decomposition.observed.plot(ax=axes[ 0 ], legend= False , color= 'r' ) axes[ 0 ].set_ylabel( 'Observed' ) decomposition.trend.plot(ax=axes[ 1 ], legend= False , color= 'g' ) axes[ 1 ].set_ylabel( 'Trend' ) decomposition.seasonal.plot(ax=axes[ 2 ], legend= False ) axes[ 2 ].set_ylabel( 'Seasonal' ) decomposition.resid.plot(ax=axes[ 3 ], legend= False , color= 'k' ) axes[ 3 ].set_ylabel( 'Residual' ) ããã¬ã³ãæåã衚ã Trend ãã, é·æã§ã®ã¢ãããã¬ã³ãã確èªã§ããŸã. ãŸãå£ç¯æåã衚ã Seasonal ããã¯, 1~3æã«æ°åã倧ããè·³ãããšãã£ãåšææ§ã確èªã§ããŸã. ã以äžã§WAUããŒã¿ã«SARIMAXã¢ãã«ãé©å¿ããäžã§, "ãããã"ã®åŠ¥åœæ§ã確èªã§ããŸãã. 次ã¯, SARIMAXã¢ãã«ãæã€ãã©ã¡ãŒã¿ã®æšå®ã»éžæãããŠãããŸã. ãã©ã¡ãŒã¿æšå®: AICãšGrid Searchã«ããæšå® ãç®ç倿°ãšãªãããŒã¿ãåŸã確çéçšãä»®å®ã§ããã, ã¢ãã«ãæã€ãã©ã¡ãŒã¿ã決ãŸãã°ã¢ãã«ã®æ§ç¯ãå®äºããŸã. ã詳现㯠ãã¡ãã®èšäº ã«ãããããããŸãšãŸã£ãŠããŸãã, SARIMAXã¢ãã«ã®ãã©ã¡ãŒã¿ã¯å
šéšã§7ã€(p, d, q, P, D, Q, s)ãããŸã. ä»åsã«é¢ããŠã¯, ããŒã¿ã®èŠ³æž¬ç¹ãé±åäœã§ãããã, s=52(1幎éãçŽ52é±)ãšããåšæãæã€ãšæ±ºãæã¡ã, ãã以å€ã®6ã€ãæšå®ããŠãããŸã. ãä»åã¯æå°€æšå®ãå
éšã§çšãã AIC (èµ€æ± æ
å ±éèŠæº)ãš Grid Search (ç·åœããææ³)ãçšããŠãã©ã¡ãŒã¿æšå®ãè¡ããŸãïŒ ããŸãã¯, åè£ãšãªããã©ã¡ãŒã¿ã®çµã¿åãããå
šãŠListã«æ ŒçŽããŸã. ãªããã®éããŒã¿ã®é·ã(è¡æ°)ã«ãã£ãŠãã©ã¡ãŒã¿ã®å€ã«äžéãããã®ã§æ°ãã€ããŠäžãã. # èãããããã©ã¡ãŒã¿ã®çµã¿åãããå
šãŠäœæ max_p = 2 max_d = 1 max_q = 1 max_sp = 1 max_sd = 1 max_sq = 1 params = [] for p in range ( 0 , max_p + 1 ): for d in range ( 0 , max_d + 1 ): for q in range ( 0 , max_q + 1 ): for sp in range ( 0 , max_sp + 1 ): for sd in range ( 0 , max_sd + 1 ): for sq in range ( 0 , max_sq + 1 ): params.append([p,d,q,sp,sd,sq]) params[: 3 ] Output: [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 2]] .. ãæ¬¡ã«, ããããã®ãã©ã¡ãŒã¿ã®çµã¿åããã«å¯ŸããAICã®å€ãç®åºããŠã¿ãŸã. åºæ¬çã«ã¯AICãæå°ã®ã¢ãã«ãéžæããã°, å€ãã®å Žåè¯ãã¢ãã«ãéžæã§ãããšãããŠããŸã. ããªã, statsmodels.tsa.statespace.SARIMAX ã§ã¯, exog ã®äžã«å£ç¯æ§ããã¬ã³ã以å€ã«å«ãããå€éšå€æ°(ä»åã¯GRP)ã説æå€æ°ãšããŠè¿œå ããããšãã§ããŸã. ããŸã, ãã®ã©ã€ãã©ãªã¯èšç®ã«æéããããããšãå€ããã, çµã¿åããæ°ãå€ããã©ã¡ãŒã¿æšå®ã®éã«ã¯, 䞊ååŠçãç°¡åã«å®è¡åºæ¥ã Joblib ãšããã©ã€ãã©ãªã®äœµçšããå§ãããŸã. # æçµçã«äºæž¬ãããã®ã¯ç¹å¿æã§ãã1~3æã®WAUã®ãã, ãã¹ãæéãç¹å¿æã«åããã wau_s = wau.head( 225 ) grp_s = grp.head( 225 ) # ãã¹ããããã, åŠç¿çšãšãã¹ãçšããŒã¿ã®åå² y_train, y_test = wau_s.head( 210 ), wau_s.tail( 15 ) X_train, X_test = grp_s.head( 210 ), grp_s.tail( 15 ) # AICèšç®çšã®ã¡ãœãããäœæ def aic_calculater (param): aic = sm.tsa.statespace.SARIMAX( endog=y_train, exog=X_train, trend= "n" , freq= 'W' , order=(param[ 0 ], param[ 1 ], param[ 2 ]), seasonal_order=(param[ 3 ], param[ 4 ], param[ 5 ], 52 ), enforce_invertibility = False , enforce_stationarity = False ).fit().aic return aic # 䞊åèšç®: n_jobs=-1ãšãããšCPUã³ã¢æ°ã®æ°ã ã䞊ååããã import joblib aic_list = joblib.Parallel(n_jobs=- 1 , verbose= 10 )([joblib.delayed(aic_calculater)(param) for param in params]) # AICãå°ãããªãé ã«ã®ãã©ã¡ãŒã¿ã®çµã¿åããã䞊ã¹å€ã aic_df = pd.DataFrame({ "params" : params, "aic" : aic_list}) aic_df.sort_values( "aic" , inplace= True ) aic_df.head( 10 ) ãAICãå°ããé ã«, ãã©ã¡ãŒã¿(p, d, q, P, D, Q)ã®çµã¿åãããåºåãããŸãã. ãã©ã¡ãŒã¿æšå®ã®çµæ, (0, 1, 1, 1, 1, 1)ã®çµã¿åããã䜿çšããããšã«ããŸã. ããŸã念ã®ããã¢ãã«ã®ç²ŸåºŠã確èªããããã«, ãã¹ãæéã®GRPããŒã¿ã説æå€æ°ã«æãããã¢ãã«ãåºåããäºæž¬å€ãš, ãã¹ãçšã«åå²ããŠããã宿ž¬å€ã®èª€å·®ãæ¯èŒããŠã¿ãŸã. ãä»åã¯, 誀差ã®è©äŸ¡ææšãšããŠæç³»åããŒã¿ã®èª€å·®è©äŸ¡ã«ããçšãããã MAPE ã䜿çšããŸã. # AICãæå°ã®ãã©ã¡ãŒã¿ãåœãŠã¯ãã model = sm.tsa.statespace.SARIMAX( endog=y_train, exog=X_train, trend= "n" , freq= 'W' , order=( 0 , 1 , 1 ), seasonal_order=( 1 , 1 , 1 , 52 ), enforce_invertibility = False , enforce_stationarity = False ) results = model.fit() # ãã¹ãæéã®äºæž¬å€ãåºåãã y_pred = results.get_prediction( start = pd.to_datetime( "2018-12-30" ), end = pd.to_datetime( "2019-04-07" ), exog = X_test, dynamic= False ) # ç¹æšå®ã§ã®äºæž¬å€ãšåºéæšå®ã§ã®äºæž¬å€ãåãåºã pred_mean = y_pred.predicted_mean pred_ci = y_pred.conf_int(alpha = .05 ) # MAPEãèšç®ããèªäœé¢æ°ãå®çŸ© def mape (true, pred): act = list (true) preds = list (pred) total = 0 for i in range ( len (act)): ape = np.abs((act[i] - preds[i])/act[i]) total += ape mape = (total / len (act)) * 100 return mape # MAPEãç®åº print (mape(y_test, pred_mean)) Output: 6.019151544589458 ãå¯èŠåããããšã§, äºæž¬å€ãšå®æ°å€ã®èª€å·®ã®æ§åãå®éã«ç¢ºèªããŠã¿ãŸã. # äºæž¬å€ãšå®æž¬å€ã®æãç·ã°ã©ãã®æç» y_test.plot(label= 'observed' , linewidth= 4 ) pred_mean.plot(label= 'forecast' , alpha= .7 , color = "r" , linewidth= 4 ) # åºéäºæž¬ã®æãç·ã°ã©ããæç» plt.fill_between(pred_ci.index, pred_ci.iloc[:, 0 ], pred_ci.iloc[:, 1 ], color= 'r' , alpha= .2 ) ã粟床ãã©ãã ãæ±ãããæ¬¡ç¬¬ã§ãã, ããã»ã©æªããªãäºæž¬å€ã®åããšå€æããŸãã. ãæåŸã«ãã©ã¡ãŒã¿ã確å®ããåŸ, æ®å·®ãæ£èŠååžããŠããããšãèªå·±çžé¢ã®æç¡ã確èªããŠããå¿
èŠããããŸã. ããã¢ãã«ã劥åœã§ããã°, æ®å·®(説æããããªãéšå)ã¯ãã¯ã€ããã€ãºã«ãªãããã§ã. # æ®å·®ã確èªãã plot = results.plot_diagnostics() ãå·Šäžããé ã«, æšæºåãããæ®å·®ã®ç³»å, æ®å·®ã®ãã¹ãã°ã©ã , æ®å·®ã®æ£èŠQ-Qãããã, æ®å·®ã®ã³ã¬ãã°ã©ã ãšãªããŸã. ã©ããããããåé¡ãªãããã§ãã. ãMAPEã«ãã誀差è©äŸ¡ã®éšåãå°ãçç¥ãŸããã, ããã§ã¢ãã«ã®æ§ç¯(確çéçšãšãã©ã¡ãŒã¿ã®éžæ)ãå®äºããŸãã. äºæž¬: 仿ã®GRPã§äºæ³ãããKPIã®æåŸ
å€ãç®åº ããããã, 2020幎ã®åŒã£è¶ããã€ã·ãŒãºã³ã«åèšââGRPã®TVCMã®åºçš¿ããå Žå, WAUãåãããå€ãç®åºããŠã¿ãŸã. ãæçµçã«ã¯CMæŸæ æéäžã«åé±ã§å®éã«èŠ³æž¬ãããWAUã®å€ã, ç®åºãããäºæž¬å€ãã¯ããã«äžåã£ãå Žå, ä»åã®èšŽæ±å
容ãŸãã¯ã¯ãªãšã€ãã£ããWAUã®ãªããã«å¯äžãã(éå»ãšã®æ¯èŒã«ãããŠ)ãšä»®å®ããŠè©äŸ¡ããŸã. ãéã«èª€å·®çšåºŠã®ãªãããããªãã£ãå Žåã¯, ã蚎æ±ã匱ãã£ãã®ã§ã¯ãªãããçã®ä»®èª¬ãç«ãŠ, 次åã®åºçš¿ã«åããŠæ¹åç¹ãæ¢ãäœæ¥ã«å
¥ããŸã. ãããã§ã¯, æªæ¥ã®WAUãäºæž¬å€ãç®åºããã«ããã, ãŸãã¯æªæ¥ã®GRPããŒã¿ãæºåããŸã. # åºçš¿äºå®ã®GRPããŒã¿ãããŒããã future_grp = pd.read_csv( "future_grp.csv" ) future_grp.DATE = pd.to_datetime(future_grp.DATE) future_grp.set_index( "DATE" , inplace= True ) future_grp = future_grp.resample( "W" ).sum() future_grp.head( 15 ) ãå
ã»ã©MAPEãæå°ã ã£ããã©ã¡ãŒã¿ã®çµã¿åãã(0, 1, 1, 1, 1, 1, 52)ãã¢ãã«ã«åœãŠã¯ã, äºæž¬å€ãç®åºããŠãããŸã. # æå
ã«ããçŽè¿ãŸã§ã®ããŒã¿ãå
šãŠã¢ãã«ãž model = sm.tsa.statespace.SARIMAX( endog=wau, exog=grp, trend= "n" , freq= 'W' , order=( 0 , 1 , 1 ), seasonal_order=( 1 , 1 , 1 , 52 ), enforce_invertibility = False , enforce_stationarity = False ) results = model.fit() # æªæ¥ã®äºæž¬å€ãç®åº forecast = results.get_forecast(steps= len (future_grp), exog=future_grp) # äºæž¬å€ãå¯èŠå lower = forecast.conf_int()[ "lower WAU" ] upper = forecast.conf_int()[ "upper WAU" ] plt.plot(wau, label= 'original' , linewidth= 4 , color= "steelblue" ) plt.plot(forecast.predicted_mean, label= 'SARIMAX' , c= "orangered" , linewidth= 4 ) plt.fill_between( forecast.conf_int().index, lower, upper, color= 'mistyrose' ) plt.xlabel( 'DATE' ) plt.ylabel( 'WAU' ) plt.legend() plt.show() ãæ¿ãèµ€ç·ãç¹æšå®ã«ããäºæž¬å€ã§ãã, éããããŸã§å®éã«èŠ³æž¬ãããå€ã§ã. ããã§è©äŸ¡ã®åºæºå€ãšãªãäºæž¬å€ãåºåããããšãã§ããŸãã. ãæåŸã«ãã®é±æ¬¡ã®äºæž¬å€ãcsvãexcelãã¡ã€ã«ãšããŠåºåããã, 广æ€èšŒã«åããæºåã¯å®äºã§ã. # äºæž¬ããè©äŸ¡åºæºå€ããã¡ã€ã«ã«èœãšã answer = pd.DataFrame(forecast.predicted_mean) answer.columns = [ "NQ" ] answer.round().to_csv( "æªæ¥ã®WAUäºæž¬å€.csv" ) answer.round() ãå®éã®TVCMæŸæ æéã¯ãã®äºæž¬å€ãåºæºãšããŠ, Weeklyã§KPIã®ååãã¢ãã¿ãªã³ã°ããŠããã°è¯ããšæããŸã. ã以äžã§SARIMAXã¢ãã«ã®å®è£
ã®èª¬æãçµãããŸã, ãç²ãæ§ã§ãã. â¢çŸåšLIFULLã§ã¯ããŒã¿ã¢ããªã¹ããç©æ¥µæ¡çšäž åŒçšå
: http://recruit.lifull.com/interview/ ããŒã¿ã¢ããªã¹ãã®åœ¹å²: èªåãã¡ã®ååšæçŸ©ã«ã€ã㊠ãä»å, ãã®èšäºãéããŠçºä¿¡ãããã£ãããšããã1ã€ãããŸã. ããã¯ãããŒã¿ã¢ããªã¹ããã®äŸ¡å€ã«ã€ããŠã®èå¯ã§ã. ãæè¿ã¯æ¹ããŠ, ããŒã±ã¿ãŒãããŒã¿ãµã€ãšã³ãã£ã¹ããããäžã§, ããŒã¿ã¢ããªã¹ãã®ååšæçŸ©ãèããããããŸã. ç§ãã¡ã¯æ¬åœã«å¿
èŠãªã®ã? ãçµè«ããèšããš, æã
ã«ã¯ ãããžãã¹èª²é¡ããšãæ£ããåæææ³ãã®ãããã³ã° ãæ
ã圹å²ããããšèããŠããŸã. ä»ã®è·çš®ãšã®æ¯èŒã§è¡šçŸãããš, ããŒã¿ã¢ããªã¹ãã¯ããŒã±ã¿ãŒãšããŒã¿ãµã€ãšã³ãã£ã¹ãã®ã¡ããã©äžéã«ç«ã€ãããªååšã ãšã€ã¡ãŒãžããŠããŸã. ãå
·äœçã«ã¯, ããŒã±ã¿ãŒ(ãŸãã¯å¶æ¥äŒç»)ã¯ãããã¯ãã®ããŒã±ãã£ã³ã°èª²é¡ãæ·±ãçè§£ããŠããŸã. åããããŒã¿ãµã€ãšã³ãã£ã¹ããçµ±èšãæ©æ¢°åŠç¿ã®ææ³ã«ç¥èŠãæ·±ã, ãŸããœãŒã¹ã³ãŒãã®å®è£
ãéããŠã¢ãã«ãã¢ã«ãŽãªãºã ã«åçŸæ§ãæãããã¹ãã«ãåããŠããŸã. ããã çŸç¶, å€ãã®ããžãã¹çŸå Žã§ã¯ãã®èª²é¡ãšè§£æ±ºææ³ã®è·é¢ãé ã, ããŒã¿åæãæ¬æ¥ã®ã€ã³ãã¯ããæ®ããªããšãããžã¬ã³ããããã®ã§ã¯ãšèå¯ããŸã. ãããããããŒã±ã¿ãŒãå¶æ¥äŒç»ã®ã¡ã³ããŒãèªåãã¡ãæ±ããããã«ããã¯ãåæã«ãã£ãŠããè¯ã解決ã§ããããšèªäœãèªèããŠããªããã°, 決ããŠããŒã¿ãµã€ãšã³ãã£ã¹ãã«å£°ããããããšã¯ãããŸãã. ãã ææ³ãããã ãè€éåã»å€æ§åããçŸåšã§ã¯, ææ³ã®ç¶²çŸ
ã»çè§£ãç°¡åãªããšã§ã¯ãããŸãã. ãããããèæ¯ããç¹ã«äºæ¥äŒç€Ÿã§ã¯ä», ããžãã¹èª²é¡ãå
ãã€ããŠèªãããŒã«ãæŸãã«è¡ããã¢ããªãã£ã¯ã¹ãã¬ã€ã€ãŒã«ãããçšåºŠéèŠãããã®ã§ã¯ãªãããšèããŠããŸã. ãèŠã¯ãããŸã®äºæ¥ã«ã¯ãã£ãšãããã課é¡ããããã. ãã®ææ³äœ¿ãã°ãã£ãšè¯ã解決ãã§ãããã ããäžç·ã«ãããŸããã?ã ãšåæè
åŽããææ¡ããŠããããšã§å
æããã課é¡ããããšèããŠããŸã. ãå®é, LIFULLã®ããŒã¿ã¢ããªã¹ãããŒã ã«ã¯ããŒã±ã¿ãŒãã»ãŒã«ã¹ã®çµéšãããã¡ã³ããŒãæå±ããŠããŸã. äºæ¥ã«ã€ã³ãã¯ããæ®ãããã«ãã¡ã€ã³ç¥èãããžãã¹èª²é¡ã®çè§£ãéèŠèŠããŠãã, ãããã£ãå
èŠãšããéšåã倧åã«ããŠããŸã. ããŸãæµ·å€ã«ç®ãåãããšNetflixãAirbnbã¯, ããŒã¿åæçµç¹ãè·çš®ãç®çããŒã¹ã§ããªã现ååãããŠããŸã. å人çã«ã¯Airbnbã®Data ScienceããŒã ã®ãªãŒããŒã®å¥³æ§ãæžãã One Data Science Job Doesnât Fit All ãšããèšäºãå°è±¡çã§ãã. ã â»ããŒã¿ãµã€ãšã³ãã£ã¹ãã«ã€ããŠå°ãè£è¶³ãããš, ML/DL ãªã©ã®åŸã
ã«çµæãåºããŠããå
端æè¡ã§ãã, 解決ã§ããªã課é¡ãåäžã§ããçç£æ§ã®äœçœãããžãã¹çŸå Žã«ã¯å€å€§ã«ãããšæããŸã. éã«é£æåºŠãããã»ã©é«ããªãã¿ã¹ã¯ã«åœŒãã®ãªãœãŒã¹ãåœãŠãŠããŸãã®ã, ãã£ãããªã(ãªãŒããŒã¹ããã¯ãšããæèã§)æ°ããããã, ããããæå³ã§ãåæè·ã¯ãã£ãšçްååãããŠè¯ããšèããŠããŸã. LIFULLãæ±ããããŒã¿ã®é
å: éãšå€æ§æ§ã®èгç¹ãã ãããã§ã¯LIFULLãææããããŒã¿ã®é
åã«ã€ããŠç޹ä»ããŸã. èªåã¯ãŸã å
¥ç€ŸããŠå幎ã§ãã, ããŒã¿ã¢ããªã¹ããšããŠæ¥ã
åãäžã§ãæµãŸããŠãããªããšæ¹ããŠæããæ©äŒãå€ããããŸã. ããŸãããŒã¿ã®éã«é¢ããŠ. äºæ¥èŠæš¡ã§ã¯æå€§ã®ãµãŒãã¹LIFULL HOME'Sã¯, MAU/DAUãšãã£ããã©ãã£ãã¯éãåœå
ææ°ã®èŠæš¡ããããŸã. ããŸã質ã«é¢ããŠã, ãŠãŒã¶ãŒããŒã¿(to C)ã ãã§ãªã, äžåç£äŒç€Ÿæ§ãªã©ã®ã¯ã©ã€ã¢ã³ãããŒã¿(to B), æ¥æ¬å
šåœã®äœåäžä»¶èŠæš¡ã®ç©ä»¶ãã«ããŒããèšå€§ãªã³ã³ãã³ãããŒã¿ãDBã«ååšããŸã. ãå人çã«ã¯, ããŸBtoBã»SaaSäŒæ¥ãäžå¿ã«ã»ãŒã«ã¹ã»ã¢ããªãã£ã¯ã¹ãçãäžãã£ãŠããããã«, LIFULLã§ãto Bé åã®ããŒã¿æŽ»çšã«æºãããããšãé
åçã«æããŠããŸã. ãŸã, äžåç£æ€çŽ¢é åã«ãããã¬ã³ã¡ã³ããŒã·ã§ã³(äžåç£ç©ä»¶ã®ããŒãœãã©ã€ãº)ã¯ãŸã äžçã§ãå®æç³»ããªããã, éåžžã«ããããã®ããããŒãã§ã. ãããŒã¿ä»¥å€ã«ã, åææ¥åã«å¿
èŠãªããŒã«ã倧å€å
å®ããŠãã, æ®æ®µã®æ¥åã§ã¯ä»¥äžã䜿çšããŠããŸã. ããŒã¿æœåº: Bigquery ããŒã¿å å·¥â¢ååŠç: Python/R ããŒã¿å¯èŠå: Tableau ã³ãŒã/ã¯ãšãªç®¡ç: Gitlab/Github ãã¬ããž/ãã±ãã管ç: Confluence/JIRA ãããŒã¿åºç€ã®æŽåã«é¢ããŠã¯2幎以äžåããéåžžã«åãå
¥ããŠãã, ããŒã¿ãšã³ãžãã¢ã®å
茩æ¹ã®ãããã§, çŸåšã¯BigqueryãéããŠç€Ÿå
ã®ã»ãšãã©ã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸã. ãäŒç€ŸãšããŠããäžçäžã®ã©ã€ãããŒã¿ããŒã¹ïŒãœãªã¥ãŒã·ã§ã³ã»ã«ã³ãããŒããã¹ããŒã¬ã³ãšããŠæ²ããŠãã, ããŒã¿æŽ»çšã®éèŠæ§ã«å¯Ÿããã³ã³ã»ã³ãµã¹ãå
šäœã§å
±æãããŠããã®ãã¢ããªã¹ãã«ãšã£ãŠã¯éåžžã«åããããç°å¢ã§ã. ãããã«: ããŒã¿ã¢ããªã¹ã(ç¹ã«ãããŒãžã£ãŒ)ãåéäž ãã¿ã€ãã«éã, çŸåšLIFULLã§ã¯åŒ·åãªããŒã¿åæã¡ã³ããŒãæ°ãã«åéããŠããŸã. (ãããŒãžã£ãŒããžã·ã§ã³ãæ
ããæ¹ã¯ç¹ã«) hrmos.co ãLIFULLã§ã¯ããŒã¿ã¢ããªã¹ãã¯æ¯èŒçæ°ããè·çš®ã§, çŸåšã¯ç€Ÿå
ã«èªåãã¡ã®äŸ¡å€ãäŒããŠãããã§ãŒãºã«ããŸã. æ°èšããŒã ã ãããã, çµç¹ã¥ãããšæåã¥ããã«ãã£ã¬ã³ãžã§ããããšã¯, éåžžã«é
åçãªããšã ãšèããŠããŸã. ã仿ããæ±ºãããæ¯ããããMissionã«æ²ã, æ¥ã
奮éäžã§ã. æã
ã¯, ããŒã¿åæã®äŸ¡å€ã¯ãæææ±ºå®ãã®è³ªãåäžããããšã§ãããšå®çŸ©ã, ã©ãã ãã¹ããŒã¯ãã«ããŒãå·»ã蟌ã¿, äºæ¥ã«ã€ã³ãã¯ããäžããããããæèããŠæŽ»åããŠããŸã. ããã¡ãã®èšäºãèªã¿, åŒç€Ÿã®ããŒã¿åæçµç¹ã®æŽ»åã«èå³ãæã£ãŠããã ããæ¹ã¯, ããžã·ã§ã³åããæ°è»œã« ãé£çµ¡ ãã ãã. ã ç§ (takezawaakira@lifull.com)ãžã®å人ã¡ãã»ãŒãžã§ãæ§ããŸããã®ã§, ãŸãã¯ã«ãžã¥ã¢ã«ã«ä»ã®ã¡ã³ããŒãå«ããŠã©ã³ãã«ã§ãè¡ããã°ãšæããŸã. ãé·ããªããŸããã, ãäžèªããããšãããããŸãã!! è¬èŸ ãä»åå®éã®æ¥åã§ã®ã¢ããªã³ã°ãšæ¬èšäºã®å·çã«ããã, åŒç€Ÿã®ããŒã¿ãµã€ãšã³ãã£ã¹ãçŠå¯è£åº·ããããã¯å€ãã®å©èšãè³ããŸãã. åãæè¬ãç³ãäžããŸã.