数据挖掘-灰色关联分析方法|关联分析实战

本文描述了作者在数据挖掘课程中使用Kaggle的YouTube统计数据进行关联分析的过程,包括数据预处理(如删除缺失值、归一化),以及应用灰色关联分析来探索哪些频道属性与订阅者数量高度相关。
摘要由CSDN通过智能技术生成

在学校学习数据挖掘课程,老师布置的大作业,自己选择了数据集进行分析,写下来做一个分享和记录,如有问题,请指正!

一、数据集选择

在kaggle选择了一个2023年全球YouTube统计数据,链接如下:

Global YouTube Statistics 2023 (kaggle.com)icon-default.png?t=N7T8https://www.kaggle.com/datasets/nelgiriyewithana/global-youtube-statistics-2023

二、关于数据集

数据集包含了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结果:

结束!

最后声明一下:部分代码来源于网络,但是都是自己整合的,如有问题,请联系我。欢迎指正!

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值