课程目标
基于pandas对抖音播放数据做数据分析
数据准备
点此去下载
课程内容
- 导包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
- 查看信息
data.info()
- 数据清洗-检查是否有缺失值
data.isnull().sum()
- 数据清洗-检查是否有重复值
data.duplicated().sum()
- 没有,进行列名修改
col_name_dict = {
"Unnamed: 0": "ID",
"uid": "用户id",
"user_city": "用户城市",
"item_id": "作品id",
"author_id": "作者id",
"item_city": "作品城市",
"channel": "观看到该作品的的来源",
"finish": "是否浏览完作品",
"like": "是否点赞",
"music_id": "音乐id",
"duration_time":"作品时长(秒)",
"real_time":"作品发布时间",
"H":"当前小时",
"date":"当前日期"
}
data = data.rename(columns=col_name_dict)
- 转化时间格式
data["作品发布时间"] = pd.to_datetime(data["作品发布时间"])
data["当前日期"] = pd.to_datetime(data["当前日期"])
- 再次查看信息
data.info()
分析每日播放量,用户量,作者数,作品数变化情况
- 先通过日期分组
df_group = data.groupby(by="当前日期")
- 得到数据
df_id = df_group["ID"].count() # 每日播放量
df_uid = df_group["用户id"].nunique() # 每日用户量
df_author = df_group["作者id"].nunique() # 每日作者数
df_item = df_group["作品id"].nunique() # 每日作品数
- 开始绘图
x = df_id.index # 获取x轴数据,为所有日期
plt.figure(figsize=(22,16),dpi=100) # 创建一个新的图形,设置图形的大小为22x16英寸,分辨率为100dpi
ax1 = plt.subplot(411) # 创建第一个子图,411表示图形将被分为4行1列,这是第一个子图
plt.plot(x,df_id.values) # 在当前子图上绘制x和df_id.values之间的关系
plt.ylabel("日播放量") # 设置当前子图的y轴标签为“日播放量”
plt.title("统计日播放量,日用户量,日作者量,日作品量") # 设置整个图形的标题
plt.subplot(412,sharex=ax1) # 创建第二个子图,412表示这是第二行的第一个子图,sharex=ax1表示x轴与ax1共享
plt.plot(x,df_uid.values) # 在当前子图上绘制x和df_uid.values之间的关系
plt.ylabel("日用户量") # 设置当前子图的y轴标签为“日用户量”
plt.subplot(413,sharex=ax1) # 创建第三个子图,413表示这是第三行的第一个子图,同样x轴与ax1共享
plt.plot(x,df_author.values) # 在当前子图上绘制x和df_author.values之间的关系
plt.ylabel("日作者量") # 设置当前子图的y轴标签为“日作者量”
plt.subplot(414,sharex=ax1) # 创建第四个子图,414表示这是第四行的第一个子图,x轴与ax1共享
plt.plot(x,df_item.values) # 在当前子图上绘制x和df_item.values之间的关系
plt.ylabel("日作品量") # 设置当前子图的y轴标签为“日作品量”
plt.savefig("统计日播放量,日用户量,日作者量,日作品量.png") # 将整个图形保存为名为“统计日播放量,日用户量,日作者量,日作品量.png”的文件
分析作者id 前50 对平台的贡献
# 获取前50个作者id
author_50 = data["作者id"].value_counts().iloc[:50]
cols_auther = author_50.index
item_count = data.groupby("作者id")["作品id"].nunique()[cols_auther] # top50 作者作品数量
authou_star_mean = data.groupby("作者id")["是否点赞"].mean()[cols_auther] # 前50作者点赞平均值
author_player = data["作者id"].value_counts().sort_values(ascending=False)[cols_auther] / len(data["ID"]) # 前50作者播放率(每个作者所有作品的播放量占平台总播放量的比率)
x = [str(i) for i in list(author_50.index)] # x 轴数据离散化
fig, ax1 = plt.subplots(figsize=(25, 8)) # 创建一个新的图形和一个子图,设置图形的大小为25x8英寸
ax1.bar(x, item_count.values, color="blue") # 在ax1子图上绘制条形图,x为x轴数据,item_count.values为y轴数据,颜色设置为蓝色
ax1.set_xlabel("作者id") # 设置ax1子图的x轴标签为“作者id”
ax1.set_ylabel("作品数量", color="blue") # 设置ax1子图的y轴标签为“作品数量”,并设置标签颜色为蓝色
ax2 = ax1.twinx() # 创建一个与ax1共享x轴的新轴ax2
ax2.plot(x, authou_star_mean.values, color="red") # 在ax2上绘制线图,x为x轴数据,authou_star_mean.values为y轴数据,颜色设置为红色
ax2.set_ylabel("平均点赞数", color="red") # 设置ax2的y轴标签为“平均点赞数”,并设置标签颜色为红色
ax2.tick_params("y", colors="red") # 设置ax2的y轴刻度线颜色为红色
ax3 = ax2.twinx() # 创建一个与ax2共享x轴的新轴ax3
ax3.plot(x, author_player.values, color="green") # 在ax3上绘制线图,x为x轴数据,author_player.values为y轴数据,颜色设置为绿色
ax3.set_ylabel("播放率", color="green") # 设置ax3的y轴标签为“播放率”,并设置标签颜色为绿色
ax3.tick_params("y", colors="green") # 设置ax3的y轴刻度线颜色为绿色