在学校学习数据挖掘课程,老师布置的大作业,自己选择了数据集进行分析,写下来做一个分享和记录,如有问题,请指正!
一、数据集选择
在kaggle选择了一个2023年全球YouTube统计数据,链接如下:
二、关于数据集
数据集包含了YouTube订阅者最多的部分频道的相关信息,一共995条数据、28个属性。各个属性名称及介绍如下:
rank:基于订阅者数量的YouTube频道排名
Youtuber:YouTube频道的名称
subscribers:频道订阅者数量
video views:频道上所有视频的总观看次数
category:频道的类别
Title:YouTube频道的标题
uploads:频道上上传的视频总数
Country:YouTube频道的来源国家/地区
Abbreviation:国家缩写
channel_type:YouTube频道的类型(例如个人频道、品牌频道)
video_views_rank:基于总视频观看量的频道排名
country_rank:根据频道所在国家/地区的订阅者数量的频道排名
channel_type_rank:基于渠道类型(个人或品牌)对频道进行排名
video_views_for_the_last_30_days:过去 30 天的总视频播放量
lowest_monthly_earnings: 频道估计的最低月收入
highest_monthly_earnings: 频道估计的最高月收入
lowest_yearly_earnings: 频道最低估计年收入
highest_yearly_earnings: 频道最高估计年收入
subscribers_for_last_30_days:过去 30 天内获得的新订阅者数量
created_year:YouTube频道创建的年份
created_month:创建YouTube频道的月份
created_date:YouTube频道创建的确切日期
Gross tertiary education enrollment (%):全国接受高等教育的人口比例
Population:国家总人口
Unemployment rate:全国失业率
Urban_population:居住在城市地区的人口百分比
Latitude:国家位置的纬度坐标
Longitude:国家位置的经度坐标
需要解决的关联分析问题就是:哪些属性对订阅者数量有较高关联性。由于数据集给的属性较多,并且部分属性有关联,所以我们选择部分属性进行关联分析即可。接下来针对这一问题对数据进行预处理。
1.导入需要使用的库和包并加载数据集
import numpy as np
import pandas as pd
from numpy import *
import matplotlib.pyplot as plt
import matplotlib
from matplotlib import colors as mcolors
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
# 加载数据集
data_init = pd.read_csv('Global YouTube Statistics.csv', encoding='ISO-8859-1')
2.查看缺失值
# 查看缺失值
def mis_value(data):
print("处理前的数据中含缺失值的数量")
print(data.isnull().sum())
结果:
处理前的数据中含缺失值的数量
rank 0
Youtuber 0
subscribers 0
video views 0
category 46
Title 0
uploads 0
Country 122
Abbreviation 122
channel_type 30
video_views_rank 1
country_rank 116
channel_type_rank 33
video_views_for_the_last_30_days 56
lowest_monthly_earnings 0
highest_monthly_earnings 0
lowest_yearly_earnings 0
highest_yearly_earnings 0
subscribers_for_last_30_days 337
created_year 5
created_month 5
created_date 5
Gross tertiary education enrollment (%) 123
Population 123
Unemployment rate 123
Urban_population 123
Latitude 123
Longitude 123
dtype: int64
rank 0
Youtuber 0
subscribers 0
video views 0
category 39
Title 0
uploads 0
Country 0
Abbreviation 0
channel_type 7
video_views_rank 1
country_rank 1
channel_type_rank 9
video_views_for_the_last_30_days 22
lowest_monthly_earnings 0
highest_monthly_earnings 0
lowest_yearly_earnings 0
highest_yearly_earnings 0
subscribers_for_last_30_days 276
created_year 3
created_month 3
created_date 3
Gross tertiary education enrollment (%) 1
Population 1
Unemployment rate 1
Urban_population 1
Latitude 1
Longitude 1
dtype: int64
可以看到部分属性有缺失值,针对这些缺失值选择直接删除。
二、灰色关联分析算法
由于数据集有用的数值数据较多,所以选择灰色关联分析算法进行关联分析。
1.直接从数据集文件中读取需要的属性,删除所有含缺失值的行,保存在新的文件中。
selected_data = data1[['video views', 'video_views_for_the_last_30_days'
,'uploads', 'subscribers_for_last_30_days'
,'Population','Latitude','Urban_population','created_year'
, 'highest_yearly_earnings']]
wine = selected_data.dropna(axis=0, how="any") # 缺失值删除
print(wine.head(5))
print(wine.isnull().sum())
wine.to_csv('wine.csv')
2.重新读取数据,需要对数值数据进行归一化处理,以消除不同特征之间的差异。
wine = pd.read_csv('wine.csv')
# 归一化
def dimensionlessProcessing(df):
newDataFrame = pd.DataFrame(index=df.index)
columns = df.columns.tolist()
for c in columns:
d = df[c]
MAX = d.max()
MIN = d.min()
MEAN = d.mean()
newDataFrame[c] = ((d - MEAN) / (MAX - MIN)).tolist()
return newDataFrame
3.计算单个特征与标准特征的灰色关联值。
def GRA_ONE(gray, m=0):
# 读取为df格式
gray = dimensionlessProcessing(gray)
# 标准化
std = gray.iloc[:, m] # 为标准要素
gray.drop(str(m),axis=1,inplace=True)
ce = gray.iloc[:, 0:] # 为比较要素
shape_n, shape_m = ce.shape[0], ce.shape[1] # 计算行列
# 与标准要素比较,相减
a = zeros([shape_m, shape_n])
for i in range(shape_m):
for j in range(shape_n):
a[i, j] = abs(ce.iloc[j, i] - std[j])
# 取出矩阵中最大值与最小值
c, d = amax(a), amin(a)
# 计算值
result = zeros([shape_m, shape_n])
for i in range(shape_m):
for j in range(shape_n):
result[i, j] = (d + 0.5 * c) / (a[i, j] + 0.5 * c)
# 求均值,得到灰色关联值,并返回
result_list = [mean(result[i, :]) for i in range(shape_m)]
result_list.insert(m,1)
return pd.DataFrame(result_list)
4.循环计算整个数据集的灰色关联值矩阵。
def GRA(DataFrame):
df = DataFrame.copy()
list_columns = [
str(s) for s in range(len(df.columns)) if s not in [None]
]
df_local = pd.DataFrame(columns=list_columns)
df.columns=list_columns
for i in range(len(df.columns)):
df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]
return df_local
5.灰色关联矩阵结果可视化。
# 灰色关联结果矩阵可视化
import seaborn as sns
def ShowGRAHeatMap(DataFrame):
colormap = plt.cm.RdBu
ylabels = DataFrame.columns.values.tolist()
f, ax = plt.subplots(figsize=(14, 14))
ax.set_title('GRA HeatMap')
# 设置展示一半,如果不需要注释掉mask即可
mask = np.zeros_like(DataFrame)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
sns.heatmap(DataFrame,
cmap="YlGnBu",
annot=True,
mask=mask,
)
plt.show()
data_wine_gra = GRA(wine)
# 假设你的 DataFrame 名为 data_wine_gra
data_types = data_wine_gra.dtypes
# 检查数据类型并转换为浮点数(或整数)
for col in data_types[data_types == 'object'].index:
data_wine_gra[col] = pd.to_numeric(data_wine_gra[col], errors='coerce')
# 绘制
ShowGRAHeatMap(data_wine_gra)
三、关联分析结果可视化展示
注释掉mask结果:
结束!
最后声明一下:部分代码来源于网络,但是都是自己整合的,如有问题,请联系我。欢迎指正!