Bootstrap

day14-抖音用户数据分析

1.数据概述

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#解决matplotlib库中的字体设置和Unicode minus问题
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
data=pd.read_csv('./data/douyin_dataset.csv')
data

在这里插入图片描述

  • 字段含义
    • 第一列是未定义的字段, 是顺序的, 但是不连续, 可能是过处理以后的数据集
    • uid:用户id
    • user_city:用户所在城市
    • item_id:作品id
    • author_id:作者id
    • item_city:作品城市
    • channel:观看到该作品的来源
    • finish:是否浏览完作品
    • like:是否对作品点赞
    • music_id:音乐id
    • duration_time:作品时长 (秒)
    • real_time:作品发布时间
    • H:当前小时
    • date:当前日期

2.数据清洗

data.info()

在这里插入图片描述

2.1缺失值

#判断缺失值并按照行列统计
data.isnull().sum()

在这里插入图片描述

2.2重复数据

#判断是否有重复数据
data.duplicated().sum()

无重复数据

2.3修改列名

colNameDict = {
    'Unnamed: 0': 'ID',
    'uid': '用户id',
    'user_city': '用户所在城市',
    'item_id': '作品id',
    'author_id': '作者id',
    'item_city': '作品城市',
    'channel': '观看到该作品的来源',
    'finish': '是否浏览完作品',
    'like': '是否对作品点赞',
    'music_id': '音乐id',
    'duration_time': '作品时长 s',
    'real_time': '作品发布时间',
    'H': '当前小时',
    'date': '当前日期'
}

data = data.rename(columns=colNameDict)
data

在这里插入图片描述

2.4数据的对象转化

data['作品发布时间']=pd.to_datetime(data['作品发布时间'])
data['当前日期']=pd.to_datetime(data['当前日期'])
data
data.info()

在这里插入图片描述

3.数据分析与可视化

3.1统计日播放量,日用户量,日作者量和日作品量

df_group=data.groupby(by='当前日期')
"""日播放量"""
df_id=df_group['ID'].count()
df_id

"""日用户量"""
df_uid=df_group['用户id'].nunique()  # 返回不同值的数据个数
df_uid

"""日作者量"""
df_author=df_group['作者id'].nunique()  # 返回不同值的数据个数
df_author

"""日作品量"""
df_item=df_group['作品id'].nunique()   # 返回不同值的数据个数
df_item

#unique() 方法返回的是该列中的所有唯一值组成的列表,而 nunique() 方法返回的是每个分类组中的唯一值数量。

3.2绘图

plt.figure(figsize=(20,12),dpi=100)
x=df_id.index  # 时间作为x轴

ax1=plt.subplot(411)  # 4-> 一共绘图4张,11-> 第一列第一张
plt.plot(x,df_id.values)
plt.ylabel('日播放量')
plt.title('统计日播放量,日用户量,日作者量,日作品量')

# sharex=ax1 共享ax1的X轴
plt.subplot(412, sharex=ax1)   # 一共要绘制4个图, 12 --> 第一列第二张
plt.plot(x, df_uid.values)
plt.ylabel('日用户量')


# sharex=ax1 共享ax1的X轴
plt.subplot(413, sharex=ax1)   # 一共要绘制4个图, 13 --> 第一列第三张
plt.plot(x, df_author.values)
plt.ylabel('日作者量')

# sharex=ax1 共享ax1的X轴
plt.subplot(414, sharex=ax1)   # 一共要绘制4个图, 14 --> 第一列第四张
plt.plot(x, df_item.values)
plt.ylabel('日作品量')

plt.savefig('./data/抖音日数据统计图2.png')

在这里插入图片描述

#显示作品id每个值出现的次数
data['作品id'].value_counts()

在这里插入图片描述

3.3分析top50作者对平台的影响

author_50 = data['作者id'].value_counts().iloc[:50]
author_50

# 取出作品播放前50作者的id
cols_outhor = author_50.index
cols_outhor

# 统计每个top50作者的作品数量
# 用"作者id"分组, 取每个分组的"作品id", nunique取不重复的数据个数, 根据行索引取值
item_count = data.groupby('作者id')['作品id'].nunique()[cols_outhor]
item_count

# 取播放量排名前50作者的点赞平均数
authou_star_mean = data.groupby('作者id')['是否对作品点赞'].mean()[cols_outhor]
authou_star_mean

# 统计top50作者的播放率
author_player = data['作者id'].value_counts().sort_values(ascending=False)[cols_outhor] / len(data['ID'])
author_player
"""绘图"""
x = [str(i) for i in list(author_50.index)]

# 绘制播放量排名前50作者的作品数量
fig, ax1 = plt.subplots(figsize=(18, 8))
color = 'blue'
ax1.bar(x, item_count.values, color=color)
ax1.set_xlabel('作者id')
ax1.set_ylabel('作品数量', color=color)
ax1.tick_params(axis='y', labelcolor=color)  # 设置Y轴颜色


# 绘制播放量排名前50作者的点赞平均数
ax2 = ax1.twinx()  #  共享X轴
color = 'red'
ax2.plot(x, authou_star_mean.values, color=color)
ax2.set_ylabel('作品点赞平均数', color=color)
ax2.tick_params(axis='y', labelcolor=color)  # 设置Y轴颜色

# 绘制播放量排名前50作者的播放率
ax3 = ax2.twinx()  #  共享X轴
color = 'green'
ax3.plot(x, author_player.values, color=color)
ax3.set_ylabel('作品播放率', color=color)
ax3.tick_params(axis='y', labelcolor=color)  # 设置Y轴颜色

在这里插入图片描述

3.4作品来源分析

"""作品来源统计"""
channel = data['观看到该作品的来源'].value_counts()
channel

在这里插入图片描述

plt.pie(
    x=channel.values,
    labels=[f'{char}渠道' for char in channel.index],
    autopct='%.2f%%'
)

在这里插入图片描述

# 取播放量排名前10的音乐id
music_10 = data['音乐id'].value_counts().head(10)
music_10

x = [str(char) for char in music_10.index]
plt.bar(x, music_10.values)

# 数量排名前十的背景音乐ID分别是:22、220、25、68、110、33、468、57、43、238

在这里插入图片描述

str(music_10.index)
music_10.values

在这里插入图片描述

3.5作品时长分析

# 不同时长作品的播放量
data_time = data.groupby('作品时长 s')['用户id'].count()

# 不同作品时长的作品量
data_time_item = data.groupby('作品时长 s')['作品id'].nunique()
data_time_item

在这里插入图片描述

"""绘图"""
fig, ax1 = plt.subplots(figsize=(18, 8))
color = 'red'
ax1.set_title('作品不同时长和播放量与作品分布情况')
ax1.set_xlabel('时长/s')
ax1.set_ylabel('播放量', color=color)
ax1.plot(data_time.index, data_time.values, color=color)

ax2 = ax1.twinx()  #  共享X轴
color = 'blue'
ax2.set_ylabel('作品量', color=color)
ax2.plot(data_time_item.index, data_time_item.values, color=color)
ax2.set_xlim(0, 50)  # 限制x轴长度

在这里插入图片描述

3.3作品发布时间分析

# 统计不同作品发布时间的播放量
data_time = data.groupby('当前小时')['ID'].count()
data_time

# 不同作品发布时间的作品量
data_time_item = data.groupby('当前小时')['作品id'].nunique()
data_time_item

在这里插入图片描述

"""绘图"""
fig, ax1 = plt.subplots(figsize=(18, 8))
color = 'red'
ax1.set_title('作品不同发布时间(24H)的播放量与作品数量的分布情况')
ax1.set_xlabel('发布时间(H)')
ax1.set_ylabel('播放量', color=color)
ax1.plot(data_time.index, data_time.values, color=color)

ax2 = ax1.twinx()  #  共享X轴
color = 'blue'
ax2.set_ylabel('作品量', color=color)
ax2.plot(data_time_item.index, data_time_item.values, color=color)

在这里插入图片描述

4.总结

4.1平台

  • 增加推广活动: 吸引新用户, 维持老用户
  • 增加作者激励机制: 刺激作者发布作品
  • 可以考虑拓展流量渠道: 吸引新用户加入

4.2作者

  • 渠道: 0
  • 背景音乐: 数量排名前十的背景音乐ID分别是:22、220、25、68、110、33、468、57、43、238
  • 作品时长: 最好在7-12S左右, 不要超过22左右
  • 作品发布时间: 19-0-5, 在这个时间段内发布作品流量池会比较大
  • 积极参加平台活动
;