柚子快報(bào)激活碼778899分享:數(shù)據(jù)可視化之廣電大數(shù)據(jù)
柚子快報(bào)激活碼778899分享:數(shù)據(jù)可視化之廣電大數(shù)據(jù)
完整代碼:(數(shù)據(jù)處理部分)
# 代碼6-1
import pandas as pd
data_raw = pd.read_csv('media_index.csv', encoding='gbk', header='infer')
payevents = pd.read_csv('mmconsume_payevents.csv', sep=',',
encoding='gbk', header='infer')
print(data_raw.shape, payevents.shape)
# 代碼6-2
media = pd.read_csv('media_index.csv', encoding='gbk', header='infer')
# 將“-高清”替換為空
media['station_name'] = media['station_name'].str.replace('-高清', '')
# 過濾特殊線路、政企用戶
media = media.loc[(media.owner_code != 2)&(media.owner_code != 9)&
(media.owner_code != 10), :]
print('查看過濾后的特殊線路的用戶:', media.owner_code.unique())
media = media.loc[(media.owner_name != 'EA級(jí)')&(media.owner_name != 'EB級(jí)')&
(media.owner_name != 'EC級(jí)')&(media.owner_name != 'ED級(jí)')&
(media.owner_name != 'EE級(jí)'), :]
print('查看過濾后的政企用戶:', media.owner_name.unique())
# 對(duì)開始時(shí)間進(jìn)行拆分
# 檢查數(shù)據(jù)類型
type(media.loc[0, 'origin_time'])
# 轉(zhuǎn)化為時(shí)間類型
media['end_time'] = pd.to_datetime(media['end_time'])
media['origin_time'] = pd.to_datetime(media['origin_time'])
# 提取秒
media['origin_second'] = media['origin_time'].dt.second
media['end_second'] = media['end_time'].dt.second
# 篩選數(shù)據(jù)
ind1 = (media['origin_second'] == 0) & (media['end_second'] == 0)
media1 = media.loc[~ind1, :]
# 基于開始時(shí)間和結(jié)束時(shí)間的記錄去重
media1.end_time = pd.to_datetime(media1.end_time)
media1.origin_time = pd.to_datetime(media1.origin_time)
media1 = media1.drop_duplicates(['origin_time', 'end_time'])
# 隔夜處理
# 去除開始時(shí)間,結(jié)束時(shí)間為空值的數(shù)據(jù)
media1 = media1.loc[media1.origin_time.dropna().index, :]
media1 = media1.loc[media1.end_time.dropna().index, :]
# 創(chuàng)建星期特征列
media1['星期'] = media1.origin_time.apply(lambda x: x.weekday()+1)
dic = {1:'星期一', 2:'星期二', 3:'星期三', 4:'星期四', 5:'星期五', 6:'星期六', 7:'星期日'}
for i in range(1, 8):
ind = media1.loc[media1['星期'] == i, :].index
media1.loc[ind, '星期'] = dic[i]
# 查看有多少觀看記錄是隔天的,隔天的進(jìn)行隔天處理
a = media1.origin_time.apply(lambda x :x.day)
b = media1.end_time.apply(lambda x :x.day)
sum(a != b)
media2 = media1.loc[a != b, :].copy() # 需要做隔天處理的數(shù)據(jù)
def geyechuli_xingqi(x):
dic = {'星期一':'星期二', '星期二':'星期三', '星期三':'星期四', '星期四':'星期五',
'星期五':'星期六', '星期六':'星期日', '星期日':'星期一'}
return x.apply(lambda y: dic[y.星期], axis=1)
media1.loc[a != b, 'end_time'] = media1.loc[a != b, 'end_time'].apply(lambda x:
pd.to_datetime('%d-%d-%d 23:59:59'%(x.year, x.month, x.day)))
media2.loc[:, 'origin_time'] = pd.to_datetime(media2.end_time.apply(lambda x:
'%d-%d-%d 00:00:01'%(x.year, x.month, x.day)))
media2.loc[:, '星期'] = geyechuli_xingqi(media2)
media3 = pd.concat([media1, media2])
media3['origin_time1'] = media3.origin_time.apply(lambda x:
x.second + x.minute * 60 + x.hour * 3600)
media3['end_time1'] = media3.end_time.apply(lambda x:
x.second + x.minute * 60 + x.hour * 3600)
media3['wat_time'] = media3.end_time1 - media3.origin_time1 # 構(gòu)建觀看總時(shí)長(zhǎng)特征
# 清洗時(shí)長(zhǎng)不符合的數(shù)據(jù)
# 剔除下次觀看的開始時(shí)間小于上一次觀看的結(jié)束時(shí)間的記錄
media3 = media3.sort_values(['phone_no', 'origin_time'])
media3 = media3.reset_index(drop=True)
a = [media3.loc[i+1, 'origin_time'] < media3.loc[i, 'end_time'] for i in range(len(media3)-1)]
a.append(False)
aa = pd.Series(a)
media3 = media3.loc[~aa, :]
# 去除小于4S的記錄
media3 = media3.loc[media3['wat_time'] > 4, :]
# 保存貼標(biāo)簽用
media3.to_csv('media3.csv', na_rep='NaN', header=True, index=False)
# 查看連續(xù)觀看同一頻道的時(shí)長(zhǎng)是否大于3h
# 發(fā)現(xiàn)這2000個(gè)用戶不存在連續(xù)觀看大于3h的情況
media3['date'] = media3.end_time.apply(lambda x :x.date())
media_group = media3['wat_time'].groupby([media3['phone_no'],
media3['date'],
media3['station_name']]).sum()
media_group = media_group.reset_index()
media_g = media_group.loc[media_group['wat_time'] >= 10800, ]
media_g['time_label'] = 1
o = pd.merge(media3, media_g, left_on=['phone_no', 'date', 'station_name'],
right_on=['phone_no', 'date', 'station_name'], how='left')
oo = o.loc[o['time_label'] == 1, :]
# 代碼6-3
payevents = pd.read_csv('mmconsume_payevents.csv', sep=',',
encoding='gbk', header='infer')
payevents.columns = ['phone_no', 'owner_name', 'event_time', 'payment_name',
'login_group_name', 'owner_code']
# 過濾特殊線路、政企用戶
payevents = payevents.loc[(payevents.owner_code != 2
)&(payevents.owner_code != 9
)&(payevents.owner_code != 10), :] # 去除特殊線路數(shù)據(jù)
print('查看過濾后的特殊線路的用戶:', payevents.owner_code.unique())
payevents = payevents.loc[(payevents.owner_name != 'EA級(jí)'
)&(payevents.owner_name != 'EB級(jí)'
)&(payevents.owner_name != 'EC級(jí)'
)&(payevents.owner_name != 'ED級(jí)'
)&(payevents.owner_name != 'EE級(jí)'), :]
print('查看過濾后的政企用戶:', payevents.owner_name.unique())
payevents.to_csv('payevents2.csv', na_rep='NaN', header=True, index=False)
了解項(xiàng)目背景
1、隨著科技的發(fā)展,現(xiàn)在人們觀看電視節(jié)目的方式越來越多,給人們帶了很多便利。人們不僅可以使用傳統(tǒng)的電視機(jī)觀看電視節(jié)目,而且可以通過網(wǎng)絡(luò)觀看電視節(jié)目,這樣使得運(yùn)營(yíng)商、用戶、網(wǎng)絡(luò)之間產(chǎn)生了一些交互關(guān)系。為了更改的為用戶提供服務(wù),并提高收益和收視率,需要對(duì)廣電數(shù)據(jù)進(jìn)行分析。
2、目前某廣播電視網(wǎng)絡(luò)運(yùn)營(yíng)集團(tuán)已建成完整覆蓋廣東省各區(qū)(縣級(jí)市)的有線傳輸與無線傳輸互為延伸、互為補(bǔ)充的廣電寬帶信息網(wǎng)絡(luò),實(shí)現(xiàn)了城區(qū)全程全網(wǎng)的雙向覆蓋,為廣大市民提供有線數(shù)字電視、互聯(lián)網(wǎng)接入服務(wù)、高清互動(dòng)電視、移動(dòng)數(shù)字電視、手機(jī)電視、信息內(nèi)容集成等多樣化、跨平臺(tái)的信息服務(wù)。
3、每個(gè)家庭收看電視節(jié)目都需要通過機(jī)頂盒進(jìn)行收視節(jié)目的接收和交互行為(如點(diǎn)播行為、回看行為)的發(fā)送,并將交互行為數(shù)據(jù)發(fā)送至每個(gè)區(qū)域的光機(jī)設(shè)備(進(jìn)行數(shù)據(jù)傳遞的中介),光機(jī)設(shè)備會(huì)匯集該區(qū)域的信息數(shù)據(jù),再發(fā)送至數(shù)據(jù)中心進(jìn)行整合、存儲(chǔ)。信息數(shù)據(jù)的收集過程如圖所示。
4、由于已建成的大數(shù)據(jù)平臺(tái)積累了大量用戶基礎(chǔ)信息和用戶觀看記錄信息等數(shù)據(jù),所以在此基礎(chǔ)上進(jìn)一步挖掘出數(shù)據(jù)價(jià)值,可以提升客戶體驗(yàn),并提出精準(zhǔn)的營(yíng)銷建議,采取有效應(yīng)對(duì)措施,實(shí)現(xiàn)增加用戶黏度,從而使用戶與企業(yè)之間建立穩(wěn)定交互關(guān)系,實(shí)現(xiàn)客戶鏈?zhǔn)椒磻?yīng)增值。
熟悉數(shù)據(jù)情況
1、在大數(shù)據(jù)平臺(tái)中存有用戶的基礎(chǔ)信息(安裝地址等)、訂單數(shù)據(jù)(產(chǎn)品訂購(gòu)、退訂信息)、工單數(shù)據(jù)(報(bào)裝、故障、投訴、咨詢等工單信息)、收費(fèi)數(shù)據(jù)(繳費(fèi)、托收等各渠道支付信息)、賬單數(shù)據(jù)(月租賬單收入數(shù)據(jù))、雙向互動(dòng)電視平臺(tái)收視行為數(shù)據(jù)(直播、點(diǎn)播、回看、廣告的收視數(shù)據(jù))、用戶上網(wǎng)設(shè)備的指標(biāo)狀態(tài)數(shù)據(jù)(上下行電平、信噪比、流量等),共7種數(shù)據(jù)。
2、由于每個(gè)用戶收視習(xí)慣、興趣愛好存在差異性,本次抽取了2000個(gè)樣本用戶在2018年5月12日至2018年6月12日的收視行為信息數(shù)據(jù)和收費(fèi)數(shù)據(jù),并對(duì)兩份數(shù)據(jù)表進(jìn)行脫敏處理。?
3、各數(shù)據(jù)表及特征說明如表所示。
熟悉項(xiàng)目流程
如何將豐富的電視產(chǎn)品與用戶個(gè)性化需求實(shí)現(xiàn)最優(yōu)匹配,是廣電行業(yè)急需解決的重要問題。用戶對(duì)電視產(chǎn)品的需求不同,在挑選搜尋想要的信息過程中,需要花費(fèi)大量的時(shí)間,這種情況的出現(xiàn)造成了用戶的不斷流失,對(duì)企業(yè)造成巨大的損失。廣電大數(shù)據(jù)可視化的主要步驟如下。
1、抽取2000個(gè)用戶在2018年5月12日至2018年6月12日的收視行為信息數(shù)據(jù)和收費(fèi)數(shù)據(jù)
2、對(duì)抽取的數(shù)據(jù)進(jìn)行數(shù)據(jù)清洗
3、對(duì)清洗后的數(shù)據(jù)進(jìn)行可視化分析,包括用戶分析、頻道分析、時(shí)長(zhǎng)分析、周時(shí)長(zhǎng)分析和用戶支付方式分析等
4、撰寫項(xiàng)目分析報(bào)告??
?讀取與處理廣播電視數(shù)據(jù)
讀取數(shù)據(jù)
1、在項(xiàng)目的原始數(shù)據(jù)中可能會(huì)出現(xiàn)部分噪聲數(shù)據(jù),如重復(fù)值、異常值、冗余數(shù)據(jù)等,將會(huì)對(duì)后續(xù)的可視化分析結(jié)果造成影響。因此,需要在Python中讀取廣播電視數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行清洗。
2、通過pandas庫(kù)中的read_csv()函數(shù)讀取用戶收視行為數(shù)據(jù)和收費(fèi)數(shù)據(jù)。結(jié)果如表所示。?
?
清洗數(shù)據(jù)
1、通過讀取數(shù)據(jù)的運(yùn)行結(jié)果可知,用戶收視行為數(shù)據(jù)和收費(fèi)數(shù)據(jù)存在的數(shù)據(jù)量相對(duì)較多,其中可能存在一定的缺失值、異常值等數(shù)據(jù),且不同的數(shù)據(jù)存在的問題可能會(huì)不一致。
2、因此需要根據(jù)不同數(shù)據(jù)中存在的不同情況,分別對(duì)行為信息數(shù)據(jù)和收費(fèi)數(shù)據(jù)進(jìn)行清洗處理 。
1、收視行為信息數(shù)據(jù)
1、在用戶的收視行為信息數(shù)據(jù)(media_index)中存在直播頻道名稱(station_name)中含有“-高清”字段,如“江蘇衛(wèi)視-高清”與“江蘇衛(wèi)視”等。由于本項(xiàng)目中暫不分開考慮是否為高清頻道的情況,所以需要將直播頻道名稱中“-高清”字段替換為空?!皬V州電視”與“廣州電視-高清”
?
2、從業(yè)務(wù)角度分析,該廣電運(yùn)營(yíng)商主要面向的對(duì)象是眾多的普通家庭,而收視行為信息數(shù)據(jù)中存在特殊線路和政企類的用戶,即用戶等級(jí)號(hào)(owner_code)為02、09、10的數(shù)據(jù)與用戶等級(jí)名稱(owner_name)為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)、EE級(jí)的數(shù)據(jù)。因?yàn)樘厥饩€路主要是起到演示、宣傳等作用,這部分?jǐn)?shù)據(jù)對(duì)于分析用戶行為意義不大,并且會(huì)影響分析結(jié)果的準(zhǔn)確性,所以需要將這部分?jǐn)?shù)據(jù)刪除。而政企類數(shù)據(jù)暫時(shí)不做分析,同樣也需要?jiǎng)h除。?
?
?3、在收視行為信息數(shù)據(jù)中存在有同一用戶開始觀看時(shí)間(origin_time)結(jié)束觀看時(shí)間(end_time)重復(fù)的記錄數(shù)據(jù),而且觀看的節(jié)目不同,如圖所示,這可能是由于數(shù)據(jù)收集設(shè)備導(dǎo)致的。經(jīng)過與廣電運(yùn)營(yíng)商的業(yè)務(wù)人員溝通之后,默認(rèn)保留第一條收視記錄,因此需要基于數(shù)據(jù)中開始觀看時(shí)間(origin_time)和結(jié)束時(shí)間(end_time)的記錄進(jìn)行去重。
?
?4、在收視行為信息數(shù)據(jù)中存在跨夜的記錄數(shù)據(jù),如開始觀看時(shí)間和結(jié)束觀看時(shí)間分別為05-12 23:45:00和05-13 00:31:00,如圖所示。
5、在對(duì)用戶收視行為信息數(shù)據(jù)進(jìn)行分析時(shí)發(fā)現(xiàn),存在用戶的觀看時(shí)間極短的現(xiàn)象,如圖所示?,這部分觀看時(shí)間過短可能是因?yàn)橛脩粼谟^看中換頻道。經(jīng)過與廣電運(yùn)營(yíng)商的業(yè)務(wù)人員溝通之后,選擇觀看時(shí)長(zhǎng)小于4秒作為時(shí)間極短的判斷閾值,將小于閾值的數(shù)據(jù)稱為異常行為數(shù)據(jù),統(tǒng)一進(jìn)行刪除處理。
?6、此外,還存在用戶較長(zhǎng)時(shí)間觀看同一頻道的現(xiàn)象,這部分觀看時(shí)間過長(zhǎng)可能是因?yàn)橛脩粼谑找曅袨榻Y(jié)束后,未能及時(shí)關(guān)閉機(jī)頂盒或其他原因造成。這類用戶在廣電運(yùn)營(yíng)大數(shù)據(jù)平臺(tái)中數(shù)據(jù)記錄中,未進(jìn)行收視互動(dòng)的情況下,節(jié)目開始觀看時(shí)間和結(jié)束觀看時(shí)間的單位秒為00的整點(diǎn)(秒)播放。經(jīng)過與廣電運(yùn)營(yíng)商的業(yè)務(wù)人員溝通之后,選擇將直播收視數(shù)據(jù)中開始觀看時(shí)間和結(jié)束觀看時(shí)間的單位秒為00的記錄刪除。
7、最后,發(fā)現(xiàn)數(shù)據(jù)有下次觀看的開始觀看時(shí)間小于上一次觀看的結(jié)束觀看時(shí)間的記錄,這種異常數(shù)據(jù)的產(chǎn)生是由于數(shù)據(jù)收集設(shè)備異常導(dǎo)致的,需要進(jìn)行刪除處理
8、綜合上述業(yè)務(wù)數(shù)據(jù)處理方法,清洗收視行為信息數(shù)據(jù)的具體步驟如下。
將直播頻道名稱(station_name)中“-高清”替換為空刪除特殊線路的用戶,用戶等級(jí)號(hào)(owner_code)為02、09、10的數(shù)據(jù)刪除政企用戶,用戶等級(jí)名稱(owner_name)為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)、EE級(jí)的數(shù)據(jù)基于數(shù)據(jù)中開始觀看時(shí)間(origin_time)和結(jié)束觀看時(shí)間(end_time)的記錄去重隔夜處理,將跨夜的收視數(shù)據(jù)分成兩天即兩條收視數(shù)據(jù)刪除觀看同一頻道累計(jì)連續(xù)觀看小于4秒的記錄刪除直播收視數(shù)據(jù)中開始觀看時(shí)間和結(jié)束時(shí)間的單位秒為00的收視數(shù)據(jù)刪除下次觀看記錄的開始觀看時(shí)間小于上一次觀看記錄的結(jié)束觀看時(shí)間的記錄
代碼:3分鐘左右
# 讀取數(shù)據(jù)
import pandas as pd
data_xin = pd.read_csv('media_index.csv', encoding='gbk', header='infer')
data_shou = pd.read_csv('mmconsume_payevents.csv', sep=',',encoding='gbk', header='infer')
#GBK編碼是中文編碼,UTF-8編碼是多字符集編碼,支持多國(guó)語言
#header:是否將原數(shù)據(jù)集中的第一行作為表頭,默認(rèn)是,并將第一行作為變量名稱:如果原始數(shù)據(jù)中沒有表頭,該參數(shù)需要設(shè)置成None
# header='infer'默認(rèn)以第一行作為標(biāo)題, header=None不要以第一行作為標(biāo)題
# sep分隔符。 csv文件的分隔符就是,可以默認(rèn)。
print(data_xin.shape,data_shou.shape)#shape:讀取矩陣或數(shù)組的長(zhǎng)度
# 信息數(shù)據(jù)
# 1、將“-高清”替換為空
data_xin['station_name'] = data_xin['station_name'].str.replace('-高清', '')
#一.replace():替換函數(shù)
#基本用法:對(duì)象.replace(rgExp,replaceText,max)
#其中,rgExp和replaceText是必須要有的,max是可選的參數(shù),可以不加。
#rgExp是指 String 對(duì)象或文字;replaceText是一個(gè)String 對(duì)象或字符串文字;max是一個(gè)數(shù)字。
# 對(duì)于一個(gè)對(duì)象,在對(duì)象的每個(gè)rgExp都替換成replaceText,從左到右最多max次。
# 2、過濾特殊線路、政企用戶
media = data_xin.loc[(data_xin.owner_code != 2)&(data_xin.owner_code != 9)&(data_xin.owner_code != 10), :]
print('查看過濾后的特殊線路的用戶:', media.owner_code.unique())
media = media.loc[(media.owner_name != 'EA級(jí)')&(media.owner_name != 'EB級(jí)')&
(media.owner_name != 'EC級(jí)')&(media.owner_name != 'ED級(jí)')&
(media.owner_name != 'EE級(jí)'), :]
print('查看過濾后的政企用戶:', media.owner_name.unique())
#data.loc[(data['A']==0)&(data['B']==2)] #提取data數(shù)據(jù)(多個(gè)篩選條件)
#data.loc[:,:]:提取所有數(shù)據(jù)
#unique():去除其中重復(fù)的元素,并按元素由大到小返回一個(gè)新的無元素重復(fù)的元組或者列表
#第三步的前提操作
# 對(duì)開始時(shí)間進(jìn)行拆分
# 檢查數(shù)據(jù)類型:origin_time:開始觀看時(shí)間
time = media.loc[0, 'origin_time']#取“origin_time”列中的第一個(gè)數(shù)
type(time)#type:類型
#loc就是location,而iloc就是integer location。顧名思義,后者參數(shù)只能是整數(shù)。
#.loc先行后列,中間用逗號(hào)(,)分割,例如取 a 和 A 對(duì)應(yīng)的數(shù)據(jù):df.loc['a','A']
#----------------------------------------------------------------
# 轉(zhuǎn)化為時(shí)間類型:Pandas日期數(shù)據(jù)處理函數(shù) to_datetime()
# 將時(shí)間格式的字符串轉(zhuǎn)換為標(biāo)準(zhǔn)的時(shí)間
media['end_time'] = pd.to_datetime(media['end_time'])
media['origin_time'] = pd.to_datetime(media['origin_time'])
#to_datetime函數(shù)可以用來批量處理日期數(shù)據(jù)轉(zhuǎn)換,可以將日期數(shù)據(jù)轉(zhuǎn)換成你需要的各種格式
#----------------------------------------------------------------
# 提取秒
#提取時(shí)間中的秒,將其賦給新列秒
#dt:日期時(shí)間數(shù)據(jù)
#python的日期抽?。篸t.hour、dt.minute、dt.second、dt.microsecond:獲取時(shí)、分、秒、微秒
media['origin_second'] = media['origin_time'].dt.second
media['end_second'] = media['end_time'].dt.second
# 篩選數(shù)據(jù)
#“~”符號(hào)在這里是取反的意思,表示對(duì) df[col].isin(list) 這句返回的值取反
a = (media['origin_second'] == 0) & (media['end_second'] == 0)
media1 = media.loc[~a, :]#所有的列
# 3、基于開始時(shí)間和結(jié)束時(shí)間的記錄去重
# to_datetime:將時(shí)間格式的字符串轉(zhuǎn)換為標(biāo)準(zhǔn)的時(shí)間
#drop_duplicates 是 pandas 庫(kù)中的一個(gè)函數(shù),用于刪除數(shù)據(jù)框中的重復(fù)行。
# 該函數(shù)默認(rèn)會(huì)對(duì)整個(gè)數(shù)據(jù)框進(jìn)行重復(fù)行的刪除,也可以通過指定特定的列來確定重復(fù)行。
media1.end_time = pd.to_datetime(media1.end_time)
media1.origin_time = pd.to_datetime(media1.origin_time)
media1 = media1.drop_duplicates(['origin_time', 'end_time'])
# 第四步的前提處理:隔夜處理
# 去除開始時(shí)間,結(jié)束時(shí)間為空值的數(shù)據(jù)
#Python處理數(shù)據(jù)中的空值(缺失值)時(shí)用到的dropna()函數(shù)
#index:索引
media1 = media1.loc[media1.origin_time.dropna().index, :]
media1 = media1.loc[media1.end_time.dropna().index, :]
# 創(chuàng)建星期特征列
#lambda函數(shù)也叫匿名函數(shù)
#apply():當(dāng)一個(gè)函數(shù)的參數(shù)存在于一個(gè)元組或者一個(gè)字典中時(shí),用來間接的調(diào)用這個(gè)函數(shù),并肩元組或者字典中的參數(shù)按照順序傳遞給參數(shù)
#datetime.weedak()方法的返回值為[0,6]之間的整數(shù),分別代表周一到周日
media1['星期'] = media1.origin_time.apply(lambda x: x.weekday()+1)
rq = {1:'星期一', 2:'星期二', 3:'星期三', 4:'星期四', 5:'星期五', 6:'星期六', 7:'星期日'}#字典
for i in range(1, 8):#表示從1到9循環(huán)遍歷,每次循環(huán)的變量名為i
# 篩選出數(shù)據(jù)框 media1 中星期為 i 的行,并返回這些行的索引。其中的 : 表示返回所有列的數(shù)據(jù)
xq = media1.loc[media1['星期'] == i, :].index
#這行代碼是在 Pandas 庫(kù)中的 DataFrame 對(duì)象 media1 的 xq 行的“星期”列中插入 rq 列表中第 i 個(gè)元素的值。
# 具體來說,它是在 DataFrame 的 xq 行的“星期”列中將值設(shè)置為 rq[i]
media1.loc[xq, '星期'] = rq[i]
# 4、查看有多少觀看記錄是隔天的,隔天的進(jìn)行隔天處理
#象 media1 中 origin_time 列的日期取出來,并轉(zhuǎn)換為 day(即日期中的天數(shù))的操作
b = media1.origin_time.apply(lambda x :x.day)
c = media1.end_time.apply(lambda x :x.day)
sum(b != c)
# copy()淺度復(fù)制:復(fù)制的數(shù)會(huì)隨著被復(fù)制數(shù)的嵌套序列的元素的改變而改變;功能:將一個(gè)列表復(fù)制給另一個(gè)列表
media2 = media1.loc[b != c, :].copy() # 需要做隔天處理的數(shù)據(jù)
def geyechuli(x):
dic = {'星期一':'星期二', '星期二':'星期三', '星期三':'星期四', '星期四':'星期五',
'星期五':'星期六', '星期六':'星期日', '星期日':'星期一'}
#axis=0 表示按照行的方向;axis=1 表示按照列的方向
return x.apply(lambda y: dic[y.星期], axis=1)
media1.loc[b != c, 'end_time'] = media1.loc[b != c, 'end_time'].apply(lambda x:
pd.to_datetime('%d-%d-%d 23:59:59'%(x.year, x.month, x.day)))
media2.loc[:, 'origin_time'] = pd.to_datetime(media2.end_time.apply(lambda x:
'%d-%d-%d 00:00:01'%(x.year, x.month, x.day)))
media2.loc[:, '星期'] = geyechuli(media2)
media3 = pd.concat([media1, media2])#concat:拼接
media3['origin_time1'] = media3.origin_time.apply(lambda x:
x.second + x.minute * 60 + x.hour * 3600)
media3['end_time1'] = media3.end_time.apply(lambda x:
x.second + x.minute * 60 + x.hour * 3600)
media3['wat_time'] = media3.end_time1 - media3.origin_time1 # 構(gòu)建觀看總時(shí)長(zhǎng)特征
# 清洗時(shí)長(zhǎng)不符合的數(shù)據(jù)
# 6、剔除下次觀看的開始時(shí)間小于上一次觀看的結(jié)束時(shí)間的記錄
#sort_values()將數(shù)據(jù)集依照某個(gè)字段中的數(shù)據(jù)進(jìn)行排序,該函數(shù)即可根據(jù)指定列數(shù)據(jù)也可根據(jù)指定行的數(shù)據(jù)排序。
#phone_no:用戶名
media3 = media3.sort_values(['phone_no', 'origin_time'])
#resert_index()函數(shù):drop: 重新設(shè)置索引后是否將原索引作為新的一列并入DataFrame,默認(rèn)為False
media3 = media3.reset_index(drop=True)
d = [media3.loc[i+1, 'origin_time'] < media3.loc[i, 'end_time'] for i in range(len(media3)-1)]
#df.append()可以將其他DataFrame附加到調(diào)用方的末尾,并返回一個(gè)新對(duì)象.它是最簡(jiǎn)單、最常用的數(shù)據(jù)合并方式
d.append(False)
e = pd.Series(d)#構(gòu)造一維數(shù)組
media3 = media3.loc[~e, :]#~:相反的值;d:下次觀看的開始時(shí)間小于上一次觀看的結(jié)束時(shí)間的記錄
# 5、去除小于4S的記錄:wat_time:總時(shí)長(zhǎng)
media3 = media3.loc[media3['wat_time'] > 4, :]
# 保存貼標(biāo)簽用
media3.to_csv('media3.csv', na_rep='NaN', header=True, index=False)
# 查看連續(xù)觀看同一頻道的時(shí)長(zhǎng)是否大于3h
# 發(fā)現(xiàn)這2000個(gè)用戶不存在連續(xù)觀看大于3h的情況
media3['date'] = media3.end_time.apply(lambda x :x.date())
media_group = media3['wat_time'].groupby([media3['phone_no'],
media3['date'],
media3['station_name']]).sum()
media_group = media_group.reset_index()
media_g = media_group.loc[media_group['wat_time'] >= 10800, ]#3h=10800s
media_g['time_label'] = 1
o = pd.merge(media3, media_g, left_on=['phone_no', 'date', 'station_name'],
right_on=['phone_no', 'date', 'station_name'], how='left')
oo = o.loc[o['time_label'] == 1, :]
結(jié)果
??
?2、收費(fèi)數(shù)據(jù)
對(duì)于收費(fèi)數(shù)據(jù)(mmconsume-payevents),只需刪除特殊線路和政企類的用戶即可,具體步驟如下。
刪除特殊線路的用戶,用戶等級(jí)號(hào)(owner_code)為02、09、10的數(shù)據(jù)刪除政企用戶,用戶等級(jí)名稱(owner_name)為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)、EE級(jí)的數(shù)據(jù)
代碼:
# 收費(fèi)數(shù)據(jù)
#GBK編碼是中文編碼,UTF-8編碼是多字符集編碼,支持多國(guó)語言
#header:是否將原數(shù)據(jù)集中的第一行作為表頭,默認(rèn)是,并將第一行作為變量名稱:如果原始數(shù)據(jù)中沒有表頭,該參數(shù)需要設(shè)置成None
# header='infer'默認(rèn)以第一行作為標(biāo)題, header=None不要以第一行作為標(biāo)題
# sep分隔符。 csv文件的分隔符就是,可以默認(rèn)。
payevents1 = pd.read_csv('mmconsume_payevents.csv', sep=',',encoding='gbk', header='infer')
#這行代碼的作用是將一個(gè) DataFrame 中的列名重新命名為指定的列名。
#具體來說,這個(gè) DataFrame 中包含了電話號(hào)碼、所有者姓名、事件時(shí)間、支付名稱、登錄組名稱和所有者代碼等信息,
#而這行代碼將這些列名依次改為了 phone_no、owner_name、event_time、payment_name、login_group_name 和 owner_code。
#這樣做的好處是使得數(shù)據(jù)更加易于理解和操作,可以方便地進(jìn)行數(shù)據(jù)分析和處理。
#t_aa63affcd82ddfe013a1984425829dd740d86fc4_10003630_0_1.phone_no:原列名
payevents1.columns = ['phone_no', 'owner_name', 'event_time', 'payment_name',
'login_group_name', 'owner_code']#相當(dāng)于重命名
# 過濾特殊線路、政企用戶
payevents2 = payevents1.loc[(payevents1.owner_code != 2
)&(payevents1.owner_code != 9
)&(payevents1.owner_code != 10), :] # 去除特殊線路數(shù)據(jù)
print('查看過濾后的特殊線路的用戶:', payevents2.owner_code.unique())
payevents3 = payevents2.loc[(payevents2.owner_name != 'EA級(jí)'
)&(payevents2.owner_name != 'EB級(jí)'
)&(payevents2.owner_name != 'EC級(jí)'
)&(payevents2.owner_name != 'ED級(jí)'
)&(payevents2.owner_name != 'EE級(jí)'), :]
print('查看過濾后的政企用戶:', payevents3.owner_name.unique())
payevents3.to_csv('payevents3.csv', na_rep='NaN', header=True, index=False)
?結(jié)果:
?
繪制可視化圖片?
matplotlib:繪制代碼
# 代碼6-4
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns
import re
plt.rcParams['font.sans-serif'] = ['SimHei'] # 設(shè)置字體為SimHei顯示中文
plt.rcParams['axes.unicode_minus'] = False # 設(shè)置正常顯示符號(hào)
media3 = pd.read_csv('media3.csv', header='infer')
# 用戶觀看總時(shí)長(zhǎng)
m = pd.DataFrame(media3['wat_time'].groupby([media3['phone_no']]).sum())
m = m.sort_values(['wat_time'])
m = m.reset_index()
m['wat_time'] = m['wat_time'] / 3600
m['id'] = m.index
ax = sns.barplot(x='id', y='wat_time', data=m)
ax.xaxis.set_major_locator(ticker.MultipleLocator(250))
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())
plt.xlabel('觀看用戶(排序后)')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('用戶觀看總時(shí)長(zhǎng)')
plt.show()
# 代碼6-5
# 所有收視頻道名稱的觀看時(shí)長(zhǎng)與觀看次數(shù)
media3.station_name.unique()
pindao = pd.DataFrame(media3['wat_time'].groupby([media3.station_name]).sum())
pindao = pindao.sort_values(['wat_time'])
pindao = pindao.reset_index()
pindao['wat_time'] = pindao['wat_time'] / 3600
pindao_n = media3['station_name'].value_counts()
pindao_n = pindao_n.reset_index()
pindao_n.columns = ['station_name', 'counts']
a = pd.merge(pindao, pindao_n, left_on='station_name', right_on ='station_name', how='left')
fig, ax1 = plt.subplots()
ax2 = ax1.twinx() # 構(gòu)建雙軸
sns.barplot(a.index, a.iloc[:, 1], ax=ax1)
sns.lineplot(a.index, a.iloc[:, 2], ax=ax2, color='r')
ax1.set_ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
ax2.set_ylabel('觀看次數(shù)')
ax1.set_xlabel('頻道號(hào)(排序后)')
plt.xticks([])
plt.title('所有收視頻道名稱的觀看時(shí)長(zhǎng)與觀看次數(shù)')
plt.show()
# 收視前15頻道名稱的觀看時(shí)長(zhǎng),由于pindao已排序,取后15條數(shù)據(jù)
sns.barplot(x='station_name', y='wat_time', data=pindao.tail(15))
plt.xticks(rotation=45)
plt.xlabel('頻道名稱')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('收視前15的頻道名稱')
plt.show()
# 代碼6-6
# 工作日與周末的觀看時(shí)長(zhǎng)比例
ind = [re.search('星期六|星期日', str(i)) != None for i in media3['星期']]
freeday = media3.loc[ind, :]
workday = media3.loc[[ind[i]==False for i in range(len(ind))], :]
m1 = pd.DataFrame(freeday['wat_time'].groupby([freeday['phone_no']]).sum())
m1 = m1.sort_values(['wat_time'])
m1 = m1.reset_index()
m1['wat_time'] = m1['wat_time'] / 3600
m2 = pd.DataFrame(workday['wat_time'].groupby([workday['phone_no']]).sum())
m2 = m2.sort_values(['wat_time'])
m2 = m2.reset_index()
m2['wat_time'] = m2['wat_time'] / 3600
w = sum(m2['wat_time']) / 5
f = sum(m1['wat_time']) / 2
plt.figure(figsize=(8, 8))
plt.subplot(211) # 參數(shù)為:行,列,第幾項(xiàng) subplot(numRows, numCols, plotNum)
colors = 'lightgreen','lightcoral'
plt.pie([w, f], labels = ['工作日', '周末'], colors=colors, shadow=True,
autopct='%1.1f%%', pctdistance=1.23)
plt.title('周末與工作日觀看時(shí)長(zhǎng)占比')
plt.subplot(223)
ax1 = sns.barplot(m1.index, m1.iloc[:, 1])
# 設(shè)置坐標(biāo)刻度
ax1.xaxis.set_major_locator(ticker.MultipleLocator(250))
ax1.xaxis.set_major_formatter(ticker.ScalarFormatter())
plt.xlabel('觀看用戶(排序后)')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('周末用戶觀看總時(shí)長(zhǎng)')
plt.subplot(224)
ax2 = sns.barplot(m2.index, m2.iloc[:, 1])
# 設(shè)置坐標(biāo)刻度
ax2.xaxis.set_major_locator(ticker.MultipleLocator(250))
ax2.xaxis.set_major_formatter(ticker.ScalarFormatter())
plt.xlabel('觀看用戶(排序后)')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('工作日用戶觀看總時(shí)長(zhǎng)')
plt.show()
# 代碼6-7
# 周觀看時(shí)長(zhǎng)分布
n = pd.DataFrame(media3['wat_time'].groupby([media3['星期']]).sum())
n = n.reset_index()
n = n.loc[[0, 2, 1, 5, 3, 4, 6], :]
n['wat_time'] = n['wat_time'] / 3600
plt.figure(figsize=(8, 4))
sns.lineplot(x='星期', y='wat_time', data=n)
plt.xlabel('星期')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('周觀看時(shí)長(zhǎng)分布')
plt.show()
# 付費(fèi)頻道與點(diǎn)播回看的周觀看時(shí)長(zhǎng)分布
media_res = media3.loc[media3['res_type'] == 1, :]
ffpd_ind = [re.search('付費(fèi)', str(i)) != None for i in media3.loc[:, 'station_name']]
media_ffpd = media3.loc[ffpd_ind, :]
z = pd.concat([media_res, media_ffpd], axis=0)
z = z['wat_time'].groupby(z['星期']).sum()
z = z.reset_index()
z = z.loc[[0, 2, 1, 5, 3, 4, 6], :]
z['wat_time'] = z['wat_time'] / 3600
plt.figure(figsize=(8, 4))
sns.lineplot(x='星期', y='wat_time', data=z)
plt.xlabel('星期')
plt.ylabel('觀看時(shí)長(zhǎng)(小時(shí))')
plt.title('付費(fèi)頻道與點(diǎn)播回看的周觀看時(shí)長(zhǎng)分布')
plt.show()
# 代碼6-8
# 設(shè)置Matplotlib正常顯示中文和負(fù)號(hào)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 讀取csv文件
pay = pd.read_csv('payevents2.csv')
sns.countplot(x='payment_name', data=pay)
plt.xticks(rotation=80)
plt.xlabel('支付方式')
plt.ylabel('總數(shù)')
plt.title('用戶支付方式總數(shù)對(duì)比')
plt.show()
繪制可視化圖形
1、根據(jù)讀取與處理廣播電視數(shù)據(jù)只能簡(jiǎn)單的對(duì)數(shù)據(jù)進(jìn)行了解,并不能明確的看出數(shù)據(jù)中蘊(yùn)含的信息
2、因此,需要對(duì)清洗后的數(shù)據(jù)進(jìn)行可視化分析,清晰的展示出廣播電視數(shù)據(jù)中用戶的觀看信息,為運(yùn)營(yíng)商決策提供一定的參考
繪制用戶分析圖
分布分析是用戶在特定指標(biāo)下的頻次、總額等的歸類展現(xiàn),它可以展現(xiàn)出單個(gè)用戶對(duì)產(chǎn)品(電視)的依賴程度,從而分析出客戶觀看電視的總時(shí)長(zhǎng)、所購(gòu)買不同類型的產(chǎn)品數(shù)量等情況,幫助運(yùn)營(yíng)人員了解用戶的當(dāng)前狀態(tài)。如觀看時(shí)長(zhǎng)(20小時(shí)以下、20小時(shí)~50小時(shí)、50小時(shí)以上等區(qū)間)等分布情況三網(wǎng)融合讓人們可以便捷的獲取新聞資訊,各種平臺(tái)終端更是觸手可及,同時(shí)工作節(jié)奏的加快,忙碌的人們是否還花時(shí)間訂購(gòu)收看廣電節(jié)目?因此需要探索用戶的觀看總時(shí)長(zhǎng)分布情況。計(jì)算所有用戶在一個(gè)月內(nèi)的觀看總時(shí)長(zhǎng)并且排序,從而對(duì)用戶觀看總時(shí)長(zhǎng)分布進(jìn)行可視化分布。
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Bar
media3 = pd.read_csv('media3.csv', header='infer')
#數(shù)據(jù)處理
media3_sum = media3['wat_time'].groupby([media3['phone_no']]).sum()
m = pd.DataFrame({'phone_no': media3_sum.index, 'wat_time': media3_sum.values})
m = m.sort_values(['wat_time'])
m['wat_time'] = m['wat_time'] / 3600
m['id'] = m.index
#繪圖
bar = (
Bar()
.add_xaxis(m['id'].tolist())
.add_yaxis('觀看時(shí)長(zhǎng)', m['wat_time'].tolist())
.set_global_opts(
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter='{value}'),
name='觀看時(shí)長(zhǎng)',
name_location='center',
name_gap=50
),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter='{value}小時(shí)'),
name='用戶數(shù)',
name_location='center',
name_gap=30
),
title_opts=opts.TitleOpts(title='用戶觀看總時(shí)長(zhǎng)'))
.set_series_opts(
label_opts=opts.LabelOpts(position='top', formatter='{c}小時(shí)',is_show=False)
)
)
bar.render("1.html")
?
?
繪制頻道分析圖
貢獻(xiàn)度分析又稱帕累托分析,它的原理是帕累托法則又稱20/80定律。同樣的投入放在不同的地方會(huì)產(chǎn)生不同的效益。例如,對(duì)一個(gè)公司而言,80%的利潤(rùn)常來自于20%最暢銷的產(chǎn)品,而其他80%的產(chǎn)品只產(chǎn)生了20%的利潤(rùn)。為更好的了解觀眾最熱衷哪些節(jié)目或哪些頻道最受歡迎,提高收視率,因此需要對(duì)所有收視頻道名稱的觀看時(shí)長(zhǎng)與觀看次數(shù)進(jìn)行貢獻(xiàn)度分析。
??
?
?
繪制時(shí)長(zhǎng)分析圖
對(duì)比分析是指將兩個(gè)相互聯(lián)系的指標(biāo)進(jìn)行比較,從數(shù)量上展示和說明研究對(duì)象規(guī)模的大小、水平的高低、速度的快慢和各種關(guān)系是否協(xié)調(diào),特別適用于指標(biāo)間的橫縱向比較、時(shí)間序列的比較分析。在對(duì)比分析中,選擇合適的對(duì)比標(biāo)準(zhǔn)是十分關(guān)鍵的步驟。當(dāng)選擇合適的對(duì)比標(biāo)準(zhǔn)時(shí),才能做出客觀的評(píng)價(jià);當(dāng)選擇不合適的對(duì)比標(biāo)準(zhǔn)時(shí),評(píng)價(jià)可能得出錯(cuò)誤的結(jié)論。對(duì)比分析主要有兩種形式:靜態(tài)對(duì)比和動(dòng)態(tài)對(duì)比。靜態(tài)對(duì)比,是指在同一時(shí)間條件下對(duì)不同總體指標(biāo)進(jìn)行比較,如不同部門、不同地區(qū)、不同國(guó)家的比較,也稱為“橫比”;動(dòng)態(tài)對(duì)比,是指在同一總體條件下對(duì)不同時(shí)期指標(biāo)數(shù)據(jù)的比較,也稱為“縱比”。將工作日(5天)與周末(2天)進(jìn)行劃分,使用餅圖展示所有用戶的觀看總時(shí)長(zhǎng)的占比分布(計(jì)算觀看總時(shí)長(zhǎng)時(shí)需要除以天數(shù)),并對(duì)所有用戶在工作日和周末的觀看總時(shí)長(zhǎng)的分布使用柱狀圖進(jìn)行對(duì)比。
?
?
繪制周時(shí)長(zhǎng)分析圖
為了使運(yùn)營(yíng)商清楚的了解在一周時(shí)間內(nèi)每天的觀看時(shí)長(zhǎng),從而有針對(duì)性的投放受歡迎的節(jié)目,增加用戶的使用黏度。需要分別繪制了頻道周觀看時(shí)長(zhǎng)分布圖以及付費(fèi)頻道與點(diǎn)播回看的周觀看時(shí)長(zhǎng)分布圖。?
?
繪制用戶支付方式分析圖
傳統(tǒng)廣播電視企業(yè)如果在互聯(lián)網(wǎng)時(shí)代脫穎而出,那么不僅要在電視節(jié)目以及電視節(jié)目投放安排上進(jìn)行分析,還要開發(fā)一些產(chǎn)品的周邊服務(wù),為用戶帶來全新的體驗(yàn)。通過繪制用戶支付方式分析圖,觀察用戶的支付方式情況,從而方便傳統(tǒng)廣播電視企業(yè)為用戶開展一些便民服務(wù),吸引更多的用戶使用,增加收益。?
項(xiàng)目分析報(bào)告?
通過對(duì)收視行為信息數(shù)據(jù)和收費(fèi)數(shù)據(jù)的進(jìn)行清洗和可視化分析,已經(jīng)初觀察出用戶的觀看時(shí)長(zhǎng)走勢(shì)分布、收視頻道的排名、工作日與周末收視觀看占比、點(diǎn)播回看的總體情況以及用戶付費(fèi)方式。了解更清晰的展示項(xiàng)目的結(jié)果,需要撰寫項(xiàng)目分析報(bào)告,幫助開發(fā)者掌握廣電大數(shù)據(jù)可視化的項(xiàng)目分析結(jié)果,給決策部門提供一個(gè)完整規(guī)范的方案,并幫助企業(yè)靈活調(diào)整經(jīng)營(yíng)決策。分析報(bào)告包括了背景與目的、分析思路、分析結(jié)果、總結(jié)與建議,其模板如第一章撰寫項(xiàng)目分析報(bào)告示例圖所示。由于前面已經(jīng)介紹過本項(xiàng)目的背景與目的,所以此處將不再重復(fù)介紹。
背景與目的
新零售智能銷售設(shè)備以線上經(jīng)營(yíng)的理念,
了解銷售的整體情況,為新零售智能銷售設(shè)備商家提供相關(guān)的建議。
分析思路
收集大數(shù)據(jù)平臺(tái)上的數(shù)據(jù)進(jìn)行讀取,清楚的熟悉數(shù)據(jù)的結(jié)構(gòu)根據(jù)項(xiàng)目的分析目的對(duì)收集到的數(shù)據(jù)進(jìn)行清洗,包括對(duì)收視行為信息數(shù)據(jù)、賬單與收費(fèi)數(shù)據(jù)、訂單數(shù)據(jù)和用戶狀態(tài)數(shù)據(jù)進(jìn)行清洗處理根據(jù)清洗后數(shù)據(jù)進(jìn)行可視化分析,包括用戶分析、頻道分析、時(shí)長(zhǎng)分析、周時(shí)長(zhǎng)分析和用戶支付方式分析
?
分析結(jié)果
由圖可知,大部分用戶的觀看總時(shí)長(zhǎng)主要集中在100小時(shí)~400小時(shí)之間。且隨著收視用戶的增多,電視節(jié)目的觀看時(shí)長(zhǎng)也在穩(wěn)步增長(zhǎng)。一個(gè)月平均每天觀看10小時(shí)左右,這說明用戶對(duì)廣電節(jié)目有一定的依賴性,同時(shí)也說明了廣電節(jié)目對(duì)用戶有一定的吸引力,但仍然有一定的增長(zhǎng)空間。
?
分析結(jié)果
由圖可知,隨著觀看各頻道次數(shù)增多,觀看時(shí)長(zhǎng)也在隨之增多,且后面近28%的頻道帶來了80%的觀看時(shí)長(zhǎng)貢獻(xiàn)度。出現(xiàn)這種情況的原因可能是也部分頻道具有地方特色,或播放的節(jié)目比較受歡迎。
?
由圖可知,排名前15的頻道名稱為翡翠臺(tái)、中央3臺(tái)、中央新聞、廣東體育、中央8臺(tái)、CCTV5+體育賽事、廣東珠江、廣東南方衛(wèi)視、江蘇衛(wèi)視、中央6臺(tái)、鳳凰中文、中央4臺(tái)、廣州電視、中央1臺(tái)、中央5臺(tái)。其中,廣東體育、廣東珠江、廣東南方衛(wèi)視、廣州電視都相對(duì)具有地方特色,而翡翠臺(tái)則是廣東話(粵語)廣播為主的綜合娛樂頻道,也相對(duì)符合廣東人民的喜好。同時(shí)這也從側(cè)面證明了所有收視頻道名稱的觀看時(shí)長(zhǎng)與觀看次數(shù)圖的分析結(jié)果。
?
由圖可知,周末的觀看時(shí)長(zhǎng)占觀看總時(shí)長(zhǎng)的52.5%,而工作日的觀看時(shí)長(zhǎng)的占比為47.5%;周末觀看的用戶時(shí)長(zhǎng)集中在20小時(shí)~100小時(shí)之間,工作日觀看的用戶時(shí)長(zhǎng)集中在50小時(shí)~250小時(shí)之間。雖然在比例圖中,周末與工作日的比例相差不大,但是在分布圖中工作日的觀看總時(shí)長(zhǎng)仍比周末的觀看總時(shí)長(zhǎng)多,并且兩者分布圖形狀相似。出現(xiàn)這種情況的原因可能是因?yàn)橹苣┯脩艨芍涞臅r(shí)間更多,有更多的時(shí)間可用于觀看電視節(jié)目。但是周末只有2天,工作日有5天,所以工作日的觀看總時(shí)長(zhǎng)會(huì)比周末的觀看總時(shí)長(zhǎng)多。
?
由以下兩圖可知,在一周中,周一、周六、周日的觀看時(shí)間較長(zhǎng),其中周日觀看時(shí)間最長(zhǎng)。這說明人們更喜歡在周末且傾向于付費(fèi)觀看,在周二到周五忙于工作,無暇顧及電視節(jié)目,可能在周末點(diǎn)播回看。?
由圖可知,大多數(shù)用戶選擇現(xiàn)金支付,其次是翼支付托收、人行托收,選擇網(wǎng)廳網(wǎng)銀、短信支付、支付寶、支票、建行龍支付、微信等方式的用戶極少。說明用戶還是受傳統(tǒng)思想影響,傾向于使用現(xiàn)金支付,但是現(xiàn)金攜帶不便,也帶來一定的安全隱患。同時(shí)加強(qiáng)宣傳,引導(dǎo)用戶選擇掌上支付,業(yè)務(wù)也加強(qiáng)集成,方便終端綁定,一鍵式便捷支付。
?
總結(jié)與建議
通過對(duì)廣電大數(shù)據(jù)可視化分析,提出以下總結(jié)與建議。
大部分用戶的觀看總時(shí)長(zhǎng)主要集中在100小時(shí)~300小時(shí)之間且隨著用戶觀看各頻道次數(shù)增多,觀看時(shí)長(zhǎng)也在隨之增多。因此,可以適當(dāng)?shù)母牟煌l道的節(jié)目單,添加頻道的吸引力,從而增多用戶觀看各頻道次數(shù)和時(shí)長(zhǎng)。用戶觀看時(shí)長(zhǎng)前15名的頻道分別為翡翠臺(tái)、中央3臺(tái)、中央新聞、廣東體育、中央8臺(tái)、CCTV5+體育賽事、廣東珠江、廣東南方衛(wèi)視、江蘇衛(wèi)視、中央6臺(tái)、鳳凰中文、中央4臺(tái)、廣州電視、中央1臺(tái)、中央5臺(tái)。針對(duì)這個(gè)現(xiàn)象,并且周末的觀看時(shí)長(zhǎng)略高于工作日。針對(duì)這個(gè)現(xiàn)象,經(jīng)營(yíng)者可以在用戶觀看時(shí)長(zhǎng)前15名的頻道中將用戶喜好的節(jié)目投放時(shí)間把控在周末進(jìn)行播放,從而提高用戶的觀看興趣,增加用戶黏度。從而增加收視率。大多數(shù)用戶選擇現(xiàn)金支付。針對(duì)這個(gè)現(xiàn)象,經(jīng)營(yíng)者可以加大線上繳費(fèi)服務(wù)推廣宣傳,吸引更多的用戶,付費(fèi)頻道可以在周日提供更多的節(jié)目吸引用戶消費(fèi),增加收益。
?
小結(jié)
?本章基于廣播電視數(shù)據(jù),包括用戶的收視行為信息數(shù)據(jù)和收費(fèi)數(shù)據(jù),介紹了數(shù)據(jù)清洗的方法。并從用戶分析、頻道分析、時(shí)長(zhǎng)分析、周時(shí)長(zhǎng)分析和用戶支付方式分析5個(gè)方面對(duì)廣播電視數(shù)據(jù)進(jìn)行可視化分析。從而根據(jù)可視化結(jié)果,撰寫項(xiàng)目分析報(bào)告。
?
?
?
柚子快報(bào)激活碼778899分享:數(shù)據(jù)可視化之廣電大數(shù)據(jù)
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。