
一.分析背景與目的
1.1背景與數(shù)據(jù)限制
本案例分析的對(duì)象為一款視聽(tīng)類app,模式類似愛(ài)奇藝、優(yōu)酷等應(yīng)用。核心內(nèi)容為少兒動(dòng)畫(huà)/動(dòng)漫、幼教類長(zhǎng)視頻內(nèi)容,核心使用對(duì)象為幼兒、兒童和青少年。
由于數(shù)據(jù)量龐大,本次使用的數(shù)據(jù)集將抽取中國(guó)某一省份的用戶進(jìn)行分析。由于該省份2020年寒假開(kāi)始時(shí)間為1月14日,故本數(shù)據(jù)集時(shí)間跨度為2020年1月1日-1月26日。
1.2核心業(yè)務(wù)描述
1.2.1業(yè)務(wù)總體描述
1)核心功能:案例app核心功能為用戶提供少兒動(dòng)畫(huà)類的長(zhǎng)視頻(小部分免費(fèi)、大部分收費(fèi)、收費(fèi)的節(jié)目均有試播功能)
2)主要商業(yè)模式:通過(guò)單點(diǎn)、包月、包季、包年等方式對(duì)用戶進(jìn)行收費(fèi)
次要商業(yè)模式:通過(guò)貼片廣告,實(shí)現(xiàn)流量變現(xiàn)(本次分析只針對(duì)主要商業(yè)模式討論)
3)核心轉(zhuǎn)化方式:
①產(chǎn)品內(nèi)容頁(yè)訂購(gòu)按鈕——>付費(fèi)頁(yè)
②內(nèi)容試播后自主跳轉(zhuǎn)——>付費(fèi)頁(yè)
③其他途徑進(jìn)入(營(yíng)銷活動(dòng)、產(chǎn)品首頁(yè)訂購(gòu)?fù)ǖ?——>付費(fèi)頁(yè)
4)常見(jiàn)行為軌跡邏輯:
打開(kāi)apk——>進(jìn)入產(chǎn)品首頁(yè)——>進(jìn)入內(nèi)容頁(yè)——>點(diǎn)播
1.2.2用戶側(cè)核心指標(biāo)
1)流量類:
應(yīng)用訪問(wèn)數(shù):pv,每日/每周apk打開(kāi)次數(shù)
日訪問(wèn)用戶數(shù):uv,每日訪問(wèn)用戶(去重后數(shù)量)
活躍用戶數(shù):dau,當(dāng)日在應(yīng)用中有超過(guò)5次行為的用戶
當(dāng)日訂購(gòu)用戶數(shù):buyer,當(dāng)日有付費(fèi)行為的用戶數(shù)
2)轉(zhuǎn)化類:
付費(fèi)轉(zhuǎn)化率:buyer/uv
3)比例類:
活躍用戶每日行為數(shù):活躍用戶日行為總數(shù)/dau
活躍用戶比例:dau/uv
4)用戶使用情況類:
用戶點(diǎn)播時(shí)長(zhǎng)
用戶點(diǎn)播次數(shù)
完播率
1.3 分析用戶行為的目的及意義
1.3.1用戶行為的定義
用戶在使用app時(shí)的行為主線為“付費(fèi)-點(diǎn)播”,故行為包含但不限于:在banner上的點(diǎn)擊行為、進(jìn)入內(nèi)容頁(yè)、播放節(jié)目、付費(fèi)、收藏節(jié)目、點(diǎn)贊等
1.3.2目的和意義
1)探究用戶在寒假后的使用行為變化,作為基準(zhǔn)指標(biāo),在寒假中對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行監(jiān)控,當(dāng)業(yè)務(wù)出現(xiàn)異常時(shí),及時(shí)歸因及處理;
2)下鉆分析,為運(yùn)營(yíng)工作調(diào)整業(yè)務(wù)方向,挖掘寒假業(yè)務(wù)增長(zhǎng)點(diǎn);
3)分析內(nèi)容最新發(fā)展變化,為運(yùn)營(yíng)內(nèi)容推薦提供參考點(diǎn)。
1.4主要分析思路
以自然周為單位,分別在寒假前和寒假中抽取一周的數(shù)據(jù),計(jì)算出各指標(biāo)用于對(duì)比用戶行為變化:
1.4.1 基本指標(biāo)
1)日訪問(wèn)uv,dau,buyer
2)日活躍用戶人均行為數(shù),活躍用戶占比,付費(fèi)用戶占比(付費(fèi)轉(zhuǎn)化率)
3)用戶周訪問(wèn)次數(shù)分布
1.4.2 用戶時(shí)間
1)每小時(shí)訪問(wèn)的用戶的周訪問(wèn)屬性分布
2)訪問(wèn)-付費(fèi)、訪問(wèn)-播放時(shí)間間隔分布
將寒假中的節(jié)目播放信息抽取,根據(jù)用戶和時(shí)間點(diǎn)交叉匹配,篩選出關(guān)聯(lián)度高的節(jié)目:
1.4.3 內(nèi)容消費(fèi)
1)節(jié)目播放頻率占比
2)TOP10節(jié)目播放關(guān)聯(lián)
3)節(jié)目類型播放關(guān)聯(lián)
二.?dāng)?shù)據(jù)集來(lái)源及理解
2.1各表數(shù)據(jù)特征及理解
數(shù)據(jù)時(shí)間范圍:2020-1-1至2020-1-26
文件類型:csv
文件數(shù)量:6
數(shù)據(jù)表名list:
1)用戶訪問(wèn)記錄
2)用戶產(chǎn)品內(nèi)打點(diǎn)記錄
3)用戶點(diǎn)播行為記錄
4)用戶訂購(gòu)行為記錄
5)用戶內(nèi)容頁(yè)進(jìn)入記錄
6)節(jié)目id與詳細(xì)信息對(duì)照表
2.2 詳細(xì)字段理解(根據(jù)分析需求,提取了表中的部分需要用到的字段,時(shí)間列均為timestamp格式,全部字段讀取后均為object類型)
1)用戶訪問(wèn)記錄
user_id:用戶ID
visit_time:用戶訪問(wèn)時(shí)間
2)用戶產(chǎn)品內(nèi)打點(diǎn)記錄
user_id:用戶ID
kid_seat:點(diǎn)擊位置
kid_log_time:點(diǎn)擊時(shí)間
3)用戶點(diǎn)播行為記錄
user_id:用戶ID
video_id:節(jié)目ID
time:播放時(shí)間點(diǎn)
4)用戶訂購(gòu)行為記錄
user_id:用戶ID
time:訂購(gòu)時(shí)間
5)用戶內(nèi)容頁(yè)進(jìn)入記錄
user_id:用戶ID
visit_time:用戶進(jìn)入內(nèi)容頁(yè)的時(shí)間
6)節(jié)目id與詳細(xì)信息對(duì)照表
video_id:節(jié)目ID
video_name:節(jié)目名稱
category_id:節(jié)目分類ID
category_name:節(jié)目分類名稱
總結(jié):主要的分析維度為用戶時(shí)間和用戶行為,各表以用戶ID和行為的發(fā)生時(shí)間點(diǎn)作關(guān)聯(lián)。
三.?dāng)?shù)據(jù)預(yù)處理
數(shù)據(jù)在提取過(guò)程中已經(jīng)進(jìn)行過(guò)清洗,所以在此不描述清洗過(guò)程。目前數(shù)據(jù)集尚未成為能直接分析的數(shù)據(jù)集,需要進(jìn)行列轉(zhuǎn)換及其他處理。根據(jù)1.4的分析思路,需要將原數(shù)據(jù)表進(jìn)行以下處理(以下內(nèi)容與1.4相對(duì)應(yīng)):
1.4.1 基本指標(biāo)
用戶訪問(wèn)記錄、用戶產(chǎn)品內(nèi)打點(diǎn)記錄、用戶訂購(gòu)行為記錄:將visit_time轉(zhuǎn)化為datetime格式,過(guò)濾出被分析日期,visit_time過(guò)濾出日期日期部分
1.4.2 用戶時(shí)間
用戶訪問(wèn)記錄:將visit_time轉(zhuǎn)化為datetime格式,過(guò)濾出被分析日期
1.4.3 內(nèi)容消費(fèi)
用戶點(diǎn)播行為記錄:將visit_time轉(zhuǎn)化為datetime格式,過(guò)濾出被分析日期,關(guān)聯(lián)節(jié)目id與詳細(xì)信息對(duì)照表,為每一條點(diǎn)播記錄添加video_name、category_id、category_name
四.?dāng)?shù)據(jù)分析
4.1關(guān)鍵指標(biāo)分析
4.1.1日均用戶指標(biāo)


4.1.2日均用戶比例指表


4.1.3活躍用戶周訪問(wèn)次數(shù)分布

4.1.4分析小結(jié)
1)寒假前日均uv 2.4w,dau 1.7W,日新增付費(fèi)用戶320個(gè),日活躍用戶人均行為數(shù)13.74,活躍用戶占比71%,付費(fèi)轉(zhuǎn)化率1.33%;
2)寒假中日均uv 2.9W,dau 2W,日新增付費(fèi)用戶446個(gè),日活躍用戶人均行為數(shù)13.35,活躍用戶占比68%,付費(fèi)轉(zhuǎn)化率1.56%;
3)非寒假用戶訪問(wèn)主要集中在周末,工作日流量持平,到了周末流量較工作日上升70%,寒假用戶訪問(wèn)在一周中分布較為均勻,寒假中的活躍用戶數(shù)訪問(wèn)較總訪問(wèn)用戶數(shù)穩(wěn)定;
4)非寒假時(shí)期的活躍占比和活躍用戶人均行為數(shù)相比寒假時(shí)期更高且更穩(wěn)定,總體分布為方差較小的正態(tài)分布;
5)非寒假轉(zhuǎn)化率標(biāo)準(zhǔn)差為0.32%,寒假轉(zhuǎn)化率標(biāo)準(zhǔn)差為0.25%,寒假付費(fèi)轉(zhuǎn)化率更高且更穩(wěn)定;
6)周訪問(wèn)次數(shù)總體符合泊松分布,非寒假期94%的用戶周訪問(wèn)次數(shù)在5次以內(nèi),非寒假期96%的用戶周訪問(wèn)次數(shù)在5次以內(nèi),非寒假時(shí)周訪問(wèn)5次以上的用戶多于寒假時(shí)期;
4.2用戶行為時(shí)間分析
4.2.1每小時(shí)訪問(wèn)的用戶的周訪問(wèn)屬性
(縱坐標(biāo)為24小時(shí),橫坐標(biāo)為用戶的周訪問(wèn)次數(shù),氣泡大小為用戶人數(shù))


4.2.2訪問(wèn)-付費(fèi)、訪問(wèn)-播放時(shí)間分布(上圖為非寒假,下圖為寒假)


4.2.3小結(jié)
1)從時(shí)間分布上看,非寒假時(shí)期的16:00-20:00是訪問(wèn)高峰期,符合兒童/青少年日常上線作息,寒假時(shí)期無(wú)明顯高峰期;周訪問(wèn)次數(shù)越高的用戶,訪問(wèn)時(shí)間越往8:00-20:00集中;
2)有付費(fèi)意愿的用戶中有75%會(huì)在訪問(wèn)產(chǎn)品7.5分鐘以內(nèi)付費(fèi),用戶訪問(wèn)產(chǎn)品1分鐘或6分鐘時(shí)為付費(fèi)高峰期;有觀看意愿的用戶中有75%會(huì)在訪問(wèn)產(chǎn)品1分鐘內(nèi)播放節(jié)目;進(jìn)入寒假后用戶訪問(wèn)-付費(fèi)時(shí)間明顯縮短,用戶更集中在第1個(gè)付費(fèi)高峰期,第2個(gè)付費(fèi)高峰期提前且更為平緩;播放方面寒假更多用戶時(shí)間縮短,但總體和非寒假時(shí)期持平。
4.3內(nèi)容消費(fèi)分析
4.3.1 節(jié)目播放頻率占比(頭腰部?jī)?nèi)容)
熱門(mén)點(diǎn)播節(jié)目(字體較大的)均為優(yōu)愛(ài)騰少兒點(diǎn)播榜頭部?jī)?nèi)容,其中奧特曼品牌久遠(yuǎn),創(chuàng)新迭代速率高,熱度高;總體上看,頭部?jī)?nèi)容日韓美占大頭,腰部?jī)?nèi)容中國(guó)產(chǎn)動(dòng)畫(huà)占大頭。

4.4.2 TOP10節(jié)目播放關(guān)聯(lián)
分析同一個(gè)用戶一天中,有多少節(jié)目能同一段時(shí)間中播放;由此可以大致分析出節(jié)目之間的關(guān)聯(lián)性。

4.4.3 節(jié)目類型播放關(guān)聯(lián)

提取點(diǎn)播行為數(shù)據(jù)集中各節(jié)目類型在一段時(shí)間中同時(shí)出現(xiàn)的次數(shù),次數(shù)越大(顏色越淺),兩種節(jié)目類型關(guān)聯(lián)性越高。
4.4.4分析小結(jié):
1)播放節(jié)目中,TOP10節(jié)目的播放次數(shù)占TOP150節(jié)目的總點(diǎn)播次數(shù)的77%;
2)關(guān)聯(lián)性最強(qiáng)的節(jié)目組合TOP10的中只有1部節(jié)目不屬于播放TOP10節(jié)目,說(shuō)明播放TOP10節(jié)目的一部分節(jié)目播放次數(shù)可能是由另外一部分節(jié)目所帶起;
3)由4.4.3圖可看出 ①益智-搞笑 ②搞笑-機(jī)戰(zhàn) ③益智-機(jī)戰(zhàn),三者之間關(guān)聯(lián)性最強(qiáng),機(jī)戰(zhàn)與大部分節(jié)目類型的關(guān)聯(lián)度均不低,因此機(jī)戰(zhàn)類節(jié)目與我們的用戶群體普遍需求最為貼合。
五.總結(jié)
5.1分析總結(jié)
1)寒假對(duì)產(chǎn)品的uv,dau,付費(fèi)轉(zhuǎn)化率均有提高,但用戶活躍率略有降低,寒假只是為產(chǎn)品增加了非剛需用戶/非優(yōu)質(zhì)用戶的量,并沒(méi)有提升存量用戶對(duì)產(chǎn)品的使用粘性,反而進(jìn)入寒假后優(yōu)質(zhì)用戶對(duì)產(chǎn)品的粘性略有降低,推測(cè)為進(jìn)入寒假后受競(jìng)品開(kāi)展運(yùn)營(yíng)手段及非本領(lǐng)域產(chǎn)品搶占用戶更多的使用時(shí)間;
2)時(shí)間方面,寒假對(duì)用戶使用時(shí)間影響較大,周高峰期由周末平攤到一周;使用高峰期由16:00-20:00平攤到全天;
3)寒假提升的增量用戶大多的周訪問(wèn)次數(shù)集中在1-2次,后續(xù)需要繼續(xù)分析這批用戶的7日以上回訪率;
4)有付費(fèi)意愿的用戶中有75%會(huì)在訪問(wèn)產(chǎn)品7.5分鐘以內(nèi)付費(fèi),用戶訪問(wèn)產(chǎn)品1分鐘(由產(chǎn)品首頁(yè)的付費(fèi)通道或內(nèi)容介紹頁(yè)直接付費(fèi))或6分鐘(內(nèi)容試播結(jié)束自動(dòng)跳轉(zhuǎn)付費(fèi))時(shí)為付費(fèi)高峰期,寒假中用戶更集中在第一個(gè)高峰期付費(fèi);有觀看意愿的用戶中有75%會(huì)在訪問(wèn)產(chǎn)品1分鐘內(nèi)容播放節(jié)目,訪問(wèn)-播放方面寒假中更多用戶時(shí)間縮短了;
5)節(jié)目播放行為中,優(yōu)愛(ài)騰少兒點(diǎn)播榜頭部?jī)?nèi)容/日韓美動(dòng)畫(huà)內(nèi)容占距頭部位置,且頭部?jī)?nèi)容的點(diǎn)播次數(shù)占據(jù)TOP150節(jié)目的總點(diǎn)播次數(shù)的77%;
6)點(diǎn)播次數(shù)TOP10的一部分節(jié)目的點(diǎn)播次數(shù)高有一部分的因素是由TOP10榜中的其他節(jié)目帶起來(lái)的;節(jié)目類型方面機(jī)戰(zhàn)類節(jié)目與用戶群體的需求最為貼合,益智、搞笑、機(jī)戰(zhàn)類節(jié)目之間的關(guān)聯(lián)度最高。
5.2業(yè)務(wù)增長(zhǎng)建議
5.2.1提升用戶粘性
1)存量用戶活性有下降趨勢(shì),需針對(duì)這部分用戶開(kāi)展?fàn)I銷活動(dòng)或其他運(yùn)營(yíng)手段促活;
2)后續(xù)需密切關(guān)注寒假帶來(lái)增量用戶回訪率,并針對(duì)這部分用戶以提高周訪問(wèn)次數(shù)為目的開(kāi)展運(yùn)營(yíng)手段,爭(zhēng)取從1、2次提升到3、4次;
3)用戶訪問(wèn)時(shí)間從集中變分散,一天多次訪問(wèn)的可能性比寒假前提升,建議對(duì)全用戶做出能促進(jìn)一天多次訪問(wèn)的運(yùn)營(yíng)手段;
4)對(duì)于1分鐘內(nèi)未有播放行為的用戶,可彈窗主動(dòng)推送點(diǎn)播次數(shù)高的節(jié)目給用戶,促動(dòng)用戶點(diǎn)播;
5)對(duì)于關(guān)聯(lián)性高的大類節(jié)目,可優(yōu)先向相關(guān)用戶展示;
6)可用連帶能力強(qiáng)的播放TOP10節(jié)目以熱帶類型關(guān)聯(lián)性強(qiáng)冷門(mén)節(jié)目,促進(jìn)腰尾部節(jié)目的消費(fèi)。
5.2.2促進(jìn)用戶交易
1)基于用戶訪問(wèn)-付費(fèi)時(shí)長(zhǎng),6分鐘左右的時(shí)間點(diǎn)實(shí)施一定的付費(fèi)優(yōu)惠信息/提醒等運(yùn)營(yíng)措施,促進(jìn)用戶交易;
2)由于用戶更集中于第一個(gè)付費(fèi)高峰期付費(fèi),可以產(chǎn)品首頁(yè)的付費(fèi)通道或內(nèi)容介紹頁(yè)為選點(diǎn)展開(kāi)營(yíng)銷活動(dòng),提升購(gòu)買轉(zhuǎn)化率。
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來(lái)正常顯示負(fù)號(hào)
#將方法封裝,輸入開(kāi)始和結(jié)束日期即可運(yùn)行方法
def analyse(start_time,end_time):
#數(shù)據(jù)清洗以及預(yù)處理
#1.1 date-user_id-url
#讀取用戶訪問(wèn)記錄,過(guò)濾出相應(yīng)日期的數(shù)據(jù),將時(shí)間戳轉(zhuǎn)化為日期格式,輸出為csv
data11=pd.read_csv(r'D:\用戶清洗后訪問(wèn)記錄.csv')
data11=data11.assign(time=pd.to_datetime(data11['visit_time']))
data11=data11[(data11.time>start_time)&(data11.time<end_time)]
data11=data11.assign(date=data11.time.map(lambda x:x.strftime('%Y-%m-%d')))
data11=data11[['date','user_id','url']]
data11.to_csv(r'D:\1-1_'+start_time+'_'+end_time+'.csv',index=False)
#1.2 date-user_id-kid_seat
#讀取用戶行為記錄,過(guò)濾出相應(yīng)日期的數(shù)據(jù),將時(shí)間戳轉(zhuǎn)化為日期格式,輸出為csv
data12=pd.read_csv(r'D:\清洗后用戶打點(diǎn).csv')
data12=data12.assign(time=pd.to_datetime(data12['kid_log_time']))
data12=data12[(data12.time>start_time)&(data12.time<end_time)]
data12=data12.assign(date=data12.time.map(lambda x:x.strftime('%Y-%m-%d')))
data12=data12[['date','user_id','kid_seat']]
data12.to_csv(r'D:\1-2_'+start_time+'_'+end_time+'.csv',index=False)
#1.3 date-user_id
#讀取用戶訂購(gòu)記錄,過(guò)濾出相應(yīng)的數(shù)據(jù),將時(shí)間戳轉(zhuǎn)化為日期,輸出為csv
data13=pd.read_csv(r'D:\用戶訂購(gòu)表.csv')
data13=data13.assign(time=pd.to_datetime(data13['time']))
data13=data13[(data13.time>start_time)&(data13.time<end_time)]
data13=data13.assign(date=data13.time.map(lambda x:x.strftime('%Y-%m-%d')))
data13=data13[['date','user_id']]
data13.to_csv(r'D:\1-3_'+start_time+'_'+end_time+'.csv',index=False)
#3 time-user_id-url
#讀取用戶訪問(wèn)表,過(guò)濾出相應(yīng)日期的數(shù)據(jù)
data3=pd.read_csv('D:\用戶清洗后訪問(wèn)記錄.csv')
data3=data3.assign(time=pd.to_datetime(data3['visit_time']))
data3=data3[(data3.time>start_time)&(data3.time<end_time)]
data3=data3[['time','user_id','url']]
data3.to_csv(r'D:\3_'+start_time+'_'+end_time+'.csv',index=False)
#數(shù)據(jù)分析
#1 用戶基本指標(biāo)
#1.1.分析寒假前一周每日的UV、DAU、訂購(gòu)用戶數(shù)
#1.1.1 UV
df111=pd.read_csv(r'D:\1-1_'+start_time+'_'+end_time+'.csv')
#為1.3做準(zhǔn)備
df13=df111
df111=df111.groupby('date')['user_id'].nunique()
df111.name='uv'
df111=df111.reset_index()
#1.1.2 DAU
df112=pd.read_csv(r'D:\1-2_'+start_time+'_'+end_time+'.csv')
df112=df112.groupby(['date','user_id']).size()
df112=df112[df112>2]
#為1.2.1做準(zhǔn)備
df121=df112
df112=df112.groupby(level=0).size()
df112.name='dau'
df112=df112.reset_index()
#1.1.3 訂購(gòu)用戶數(shù)
df113=pd.read_csv(r'D:\1-3_'+start_time+'_'+end_time+'.csv')
df113=df113.groupby('date').size()
df113.name='buyer'
df113=df113.reset_index()
#1.1 組合3張數(shù)量表
df11=pd.merge(pd.merge(df111,df112,on='date'),df113,on='date')
df11.to_excel('D:\\'+start_time+'_'+end_time+'_11.xlsx')
#1.2.算出活躍用戶人均行為數(shù)、活躍用戶占比、訂購(gòu)用戶占比
#1.2.1 活躍用戶人均行為數(shù)
#從1.1.2處獲取活躍用戶及當(dāng)日行為數(shù)
df121=df121.groupby(level=0).sum()
df121.name='pv'
df12=pd.merge(df11,df121,left_on='date',right_index=True)
df12=df12.assign(pv=df12.pv/df12.dau)
#1.2.2 活躍用戶占比
df12=df12.assign(active_mix=df12.dau/df12.uv)
#1.2.3 訂購(gòu)用戶占比
df12=df12.assign(buy_mix=df12.buyer/df12.uv)
#1.2 去掉無(wú)用列
df12=df12[['date','pv','active_mix','buy_mix']]
df12.to_excel('D:\\'+start_time+'_'+end_time+'_12.xlsx')
#1.3 用戶周訪問(wèn)次數(shù)分布
#數(shù)據(jù)從1.1.1那里獲取
df13=df13.groupby('user_id').size().value_counts()
df13.to_excel('D:\\'+start_time+'_'+end_time+'_13.xlsx')
#3 用戶時(shí)間
#3.1.每小時(shí)訪問(wèn)的用戶屬性(周訪問(wèn)次數(shù)屬性)
#計(jì)算出每條訪問(wèn)記錄的小時(shí)
df31=pd.read_csv(r'D:\3_'+start_time+'_'+end_time+'.csv')
df31=df31.assign(time=pd.to_datetime(df31.time))
df31=df31.assign(hour=df31.time.dt.hour)
#計(jì)算出每個(gè)用戶的周次數(shù)
week_freq=pd.read_csv(r'D:\1-1_'+start_time+'_'+end_time+'.csv').groupby('user_id').size()
week_freq.name='freq'
#為每條訪問(wèn)記錄中的用戶添加周次數(shù)
df31=pd.merge(df31,week_freq,left_on='user_id',right_index=True,how='left')
#計(jì)算出小時(shí)-周訪問(wèn)次數(shù)-用戶數(shù)
df31=df31.groupby(['hour','freq']).size()
df31.name='count'
df31=df31.reset_index()
df31=df31[df31['freq']<15]
df31.sort_values(by=['hour','freq'],inplace=True)
df31.to_excel('D:\\'+start_time+'_'+end_time+'_31.xlsx')
#3.2.計(jì)算用戶訪問(wèn)-訂購(gòu)之間的時(shí)間間隔
#提取每個(gè)訂購(gòu)記錄的天數(shù)和每個(gè)訪問(wèn)記錄的天數(shù)
buyday_32=pd.read_csv(r'D:\用戶訂購(gòu)表.csv')
buyday_32=buyday_32.assign(user_id=buyday_32['user_id'].map(lambda x:str(int(x))))
buyday_32=buyday_32.assign(time=pd.to_datetime(buyday_32['time']))
buyday_32=buyday_32[(buyday_32.time>start_time)&(buyday_32.time<end_time)]
buyday_32=buyday_32.assign(day=buyday_32.time.dt.day)
buyday_32.rename(columns={'time':'buy_time'},inplace=True)
visitday_32=pd.read_csv(r'D:\3_'+start_time+'_'+end_time+'.csv')
visitday_32=visitday_32.assign(time=pd.to_datetime(visitday_32.time))
visitday_32=visitday_32.assign(day=visitday_32.time.dt.day)
#將有訪問(wèn)記錄的用戶的每天第1條訪問(wèn)記錄抽出
visitday_32=visitday_32.sort_values(by=['user_id','time'])
visitday_32.drop_duplicates(['user_id','day'],keep='first',inplace=True)
visitday_32.rename(columns={'time':'visit_time'},inplace=True)
#連接訂購(gòu)表和訪問(wèn)表
df32=pd.merge(buyday_32,visitday_32,on=['user_id','day'])
#計(jì)算訪問(wèn)-訂購(gòu)時(shí)間差
df32=df32.assign(delta=(df32.buy_time-df32.visit_time).map(lambda x:x.seconds/60))
df32=df32[df32['delta']>0]
#3.3.計(jì)算用戶訪問(wèn)-觀看之間的時(shí)間間隔
#提取每個(gè)有點(diǎn)播行為的用戶每天的第1次進(jìn)入播控頁(yè)的時(shí)間
playday_33=pd.read_csv(r'D:\清洗后用戶打點(diǎn).csv')
playday_33=playday_33.assign(time=pd.to_datetime(playday_33['kid_log_time']))
playday_33=playday_33[(playday_33.time>start_time)&(playday_33.time<end_time)]
playday_33=playday_33[playday_33['kid_seat']=='進(jìn)入播控頁(yè)']
playday_33=playday_33.assign(day=playday_33.time.dt.day)
playday_33.rename(columns={'time':'play_time'},inplace=True)
#將有播放記錄的用戶的每天第1條播放記錄抽出
playday_33=playday_33.sort_values(by=['user_id','play_time'])
playday_33.drop_duplicates(['user_id','day'],keep='first',inplace=True)
#連接播放表和訪問(wèn)表
df33=pd.merge(playday_33,visitday_32,on=['user_id','day'])
#計(jì)算訪問(wèn)-播放時(shí)間差
df33=df33.assign(delta=(df33.play_time-df33.visit_time).map(lambda x:x.seconds/60))
df33=df33[df33['delta']>0]
# 3.將3.2和3.3拼接成1個(gè)數(shù)據(jù)集
df32=df32.assign(item='buy')
df33=df33.assign(item='play')
df3=pd.concat([df32[['item','delta']],df33[['item','delta']]])
df3=df3[df3['delta']<15]
sns.violinplot(x='item',y='delta',data=df3)
plt.savefig('C:\\Users\\liminghao\\Desktop\\'+start_time+'_'+end_time+'_3.png',dpi=400)
analyse('2020-1-6','2020-1-13')
analyse('2020-1-20','2020-1-27')
#4 內(nèi)容消費(fèi)
#數(shù)據(jù)清洗
#4.1 time-user_id-video_id
#讀取用戶點(diǎn)播表,過(guò)濾出0,1,5列,過(guò)濾出1-6到1-12的數(shù)據(jù),關(guān)聯(lián)添加video名稱
data41=pd.read_csv(r'D:\點(diǎn)播表.csv',header=None)
data41=data41[[0,1,5]]
data41=data41.rename(columns={0:'user_id',1:'video_id',5:'time'})
data41=data41.assign(time=pd.to_datetime(data41.time))
data41=data41[(data41.time>'2020-1-14')&(data41.time<'2020-1-25')]
video_name=pd.read_excel(r'C:\節(jié)目id.xlsx','product_table')
video_name=video_name[['劇頭標(biāo)識(shí)','標(biāo)題']]
data41=pd.merge(data41,video_name,left_on='video_id',right_on='劇頭標(biāo)識(shí)',how='left')
data41=data41[['user_id','video_id','標(biāo)題','time']]
data41=data41.rename(columns={'標(biāo)題':'title'})
data41.to_csv(r'D:\4-1.csv',index=False)
#4.2 date-user_id-video_id-title
#讀取用戶點(diǎn)播表,將時(shí)間戳轉(zhuǎn)化成日期,去重
data42=pd.read_csv(r'D:\4-1.csv')
data42=data42.assign(time=pd.to_datetime(data42.time))
data42=data42.assign(date=data42.time.map(lambda x:x.strftime('%Y-%m-%d')))
data42=data42[['date','user_id','video_id','title']]
data42.drop_duplicates(inplace=True)
data42.to_csv(r'D:\4-2.csv',index=False)
#4.3 date-user_id-category_id-c_title
#讀取用戶點(diǎn)播小類表,讀取劇集信息表,2表關(guān)聯(lián),為點(diǎn)播小類表添加大類id和名稱
data42=pd.read_csv(r'D:\4-2.csv')
category=pd.read_excel(r'C:\節(jié)目大類.xlsx','短帶長(zhǎng)信息')
category=category[['片名','題材','category_id']]
data43=pd.merge(data42,category,left_on='title',right_on='片名',how='inner')
data43=data43.rename(columns={'題材':'c_title'})[['date','user_id','category_id','c_title']]
data43.to_csv(r'D:\4-3.csv',index=False)
數(shù)據(jù)分析
#4.1.節(jié)目播放頻率
df41=pd.read_csv(r'D:\4-1.csv')
df41=df41['title'].value_counts()
#4.2.節(jié)目播放相關(guān)性
df42=pd.read_csv(r'D:\4-2.csv')
df42=pd.merge(df42,df42,on=['user_id','date'],how='inner')
df42=df42[df42.video_id_x<df42.video_id_y]
df42=df42.groupby(['title_x','title_y']).size().sort_values(ascending=False)
df42.name='count'
df42=df42.reset_index()
df42.to_excel('D:\\'+'2020-1-14'+'_'+'2020-1-25'+'_42.xlsx')
#4.3.大類播放相關(guān)性
df43=pd.read_csv(r'D:\4-3.csv')
df43=pd.merge(df43,df43,on=['user_id','date'],how='inner')
df43=df43[df43.category_id_x<df43.category_id_y]
df43=df43.groupby(['c_title_x','c_title_y']).size().sort_values(ascending=False)
df43.name='count'
df43=df43.reset_index()