12.4 数据分析
在接下来的内容中,将分析数据集的中信息,了解动漫信息和对应的用户评分信息,为实现后面的推荐系统打下基础。
12.4.1 基础数据探索方法
在数据分析的初期,我们需要采取一些基础的探索方法,以了解数据的整体情况、结构和特点。这包括:
- 查看前几行数据以了解数据的格式和结构。
- 统计数据集的基本信息,包括数据类型、非空值数量等。
- 描述性统计信息,帮助我们了解数值列的分布情况。
(1)打印输出动漫数据集的形状(shape)和前几行的内容,并通过样式设置使输出结果更具可读性。
# 输出动漫数据集的形状
print(f"Shape of The Anime Dataset: {anime.shape}")
# 输出动漫数据集前几行的内容,通过样式设置使输出更具可读性
print("\nGlimpse of The Dataset:")
anime.head().style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
对上述代码的具体说明如下所示:
- anime.shape:输出数据集的形状,即行数和列数。
- anime.head():获取数据集的前几行。
- style.set_properties(...):通过样式设置,将输出的背景颜色、文字颜色和边框进行调整。
这样的输出方式使得查看数据集的形状和前几行内容更加清晰,背景颜色、文字颜色的设定进一步增强了可读性。运行这段代码,将看到一个带有样式的表格,展示了动漫数据集的形状和前几行内容,如图12-1所示。
图12-1 数据集的形状和前几行内容
(2)打印输出有关动漫数据集的信息,anime.info() 提供了有关数据集的详细信息,包括每列的非空值数量、数据类型等。
# 输出有关动漫数据集的信息
print("Informations About Anime Dataset :\n")
print(anime.info())
运行这段代码后将得到有关动漫数据集的详细信息,如每列的数据类型、非空值数量等,这对于初步了解数据的结构和特性非常有用。
Informations About Anime Dataset :
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12294 entries, 0 to 12293
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 anime_id 12294 non-null int64
1 name 12294 non-null object
2 genre 12232 non-null object
3 type 12269 non-null object
4 episodes 12294 non-null object
5 rating 12064 non-null float64
6 members 12294 non-null int64
dtypes: float64(1), int64(2), object(4)
memory usage: 672.5+ KB
None
(3)打印输出评分数据集的形状和前几行的内容,并通过样式设置使输出更具可读性。
# 输出评分数据集的形状
print(f"Shape of The Rating Dataset: {rating.shape}")
# 输出评分数据集前几行的内容,通过样式设置使输出更具可读性
print("\nGlimpse of The Dataset:")
rating.head().style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
对上述代码的具体说明如下所示:
- rating.shape:输出数据集的形状,即行数和列数。
- rating.head():获取数据集的前几行。
- style.set_properties(...):通过样式设置,将输出的背景颜色、文字颜色和边框进行调整。
运行这段代码后将看到一个带有样式的表格,展示了评分数据集的形状和前几行内容,如图12-2所示。这样的输出方式使得查看数据集形状和前几行内容更加清晰。
图12-2 评分数据集的形状和前几行内容
(4)打印输出有关评分数据集的信息,rating.info()提供了有关数据集的详细信息,包括每列的非空值数量、数据类型等。
# 输出有关评分数据集的信息
print("Informations About Rating Dataset :\n")
print(rating.info())
通过运行这段代码,将得到有关评分数据集的详细信息,如每列的数据类型、非空值数量等。这对于初步了解数据的结构和特性非常有用。请注意,info()方法输出的信息会包含每列的非空值数量,以及数据类型,这有助于进一步数据的理解和处理。
Informations About Rating Dataset :
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7813737 entries, 0 to 7813736
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 user_id int64
1 anime_id int64
2 rating int64
dtypes: int64(3)
memory usage: 178.8 MB
None
12.4.2 数据集摘要
在数据分析或项目报告中,数据集摘要通常是对整个数据集的简要总结,包括数据集的形状、列的含义、数据类型、缺失值情况等基本信息。这个部分有助于读者快速了解数据集的概况,为后续的分析和解释提供背景。
(1)生成动漫数据集的统计摘要,并通过样式设置使输出更具可读性。
# 生成动漫数据集的统计摘要,使用 .T 进行转置
summary_anime = anime.describe().T
# 设置样式,通过样式设置使输出更具可读性
styled_summary_anime = summary_anime.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
# 输出摘要
print("Summary of The Anime Dataset:")
styled_summary_anime
对上述代码的具体说明如下所示:
- anime.describe():生成动漫数据集的统计摘要,包括均值、标准差、最小值、25%,50%,75% 分位数等统计信息。
- .T:进行转置,以便更好地查看摘要信息。
- style.set_properties(...):通过样式设置,将输出的背景颜色、文字颜色和边框进行调整。
运行这段代码后将看到一个带有样式的表格,显示了动漫数据集的统计摘要信息,如图12-3所示。
图12-3 动漫数据集的统计摘要信息
(2)使用 describe(include=object) 来生成关于动漫数据集中包含对象类型(字符串等)的列的统计摘要,并通过样式设置使输出更具可读性。
anime.describe(include=object).T.style.set_properties(**{"background-color": "#2a9d8f","color":"white","border": "1.5px solid black"})
执行后输出显示动漫数据集中包含对象类型(字符串等)的列的统计摘要信息,如图12-4所示。
图12-4 动漫数据集中包含对象类型的列的统计摘要信息
(3)生成动漫数据集中的缺失值情况,并通过样式设置使输出更具可读性。
# 生成动漫数据集中的缺失值情况,使用 isna() 和 sum()
null_values_anime = anime.isna().sum().to_frame().T
# 设置样式,通过样式设置使输出更具可读性
styled_null_values_anime = null_values_anime.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
# 输出缺失值情况
print("Null Values of Anime Dataset:")
styled_null_values_anime
运行这段代码后将看到一个带有样式的表格,显示了动漫数据集中每列的缺失值数量。
(4)删除动漫数据集中的缺失值,并生成删除后的数据集中的缺失值情况。
# 删除动漫数据集中的缺失值,使用 dropna() 方法
anime.dropna(axis=0, inplace=True)
# 生成删除后的动漫数据集中的缺失值情况,使用 isna() 和 sum()
null_values_after_drop_anime = anime.isna().sum().to_frame().T
# 设置样式,通过样式设置使输出更具可读性
styled_null_values_after_drop_anime = null_values_after_drop_anime.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
# 输出删除后的缺失值情况
print("After Dropping, Null Values of Anime Dataset:")
styled_null_values_after_drop_anime
对上述代码的具体说明如下所示:
- anime.dropna(axis=0, inplace=True) :用于删除数据集中包含缺失值的行。
- anime.isna().sum().to_frame().T:生成删除后的数据集中的缺失值情况。
- style.set_properties(...):通过样式设置,将输出的背景颜色、文字颜色和边框进行调整。
运行这段代码后将看到一个带有样式的表格,显示了删除缺失值后的动漫数据集中每列的缺失值数量。如图12-5所示。
图12-5 删除缺失值后的动漫数据集中每列的缺失值数量
(5)检测并计算动漫数据集中的重复条目数量,具体实现代码如下所示。
# 使用 duplicated() 方法检测重复条目,并使用 shape[0] 获取重复条目的数量
dup_anime = anime[anime.duplicated()].shape[0]
# 输出重复条目的数量和总条目数
print(f"There are {dup_anime} duplicate entries among {anime.shape[0]} entries in the anime dataset.")
其中,anime[anime.duplicated()]用于选择包含重复值的行,shape[0] 用于获取重复行的数量。最后的 print 语句输出包含重复值的行的数量以及总行数。运行这段代码后将得到一条消息,提示在动漫数据集中有多少重复的条目。如果 dup_anime 的值为零,说明数据集中没有重复的条目。
There are 0 duplicate entries among 12017 entries in anime dataset.
(6)生成关于评分数据集的统计摘要,并通过样式设置使输出更具可读性。
# 生成评分数据集的统计摘要,使用 .T 进行转置
summary_rating = rating.describe().T
# 设置样式,通过样式设置使输出更具可读性
styled_summary_rating = summary_rating.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
# 输出摘要
print("Summary of The Rating Dataset:")
styled_summary_rating
对上述代码的具体说明如下所示:
- rating.describe():生成评分数据集的统计摘要,包括均值、标准差、最小值、25%,50%,75% 分位数等统计信息。
- .T:进行转置,以便更好地查看摘要信息。
- style.set_properties(...):通过样式设置,将输出的背景颜色、文字颜色和边框进行调整。
运行这段代码后将看到一个带有样式的表格,显示了评分数据集的统计摘要信息。如图12-6所示。
图12-6 评分数据集的统计摘要信息
(7)生成评分数据集中的缺失值情况,并通过样式设置使输出更具可读性。
# 生成评分数据集中的缺失值情况,使用 isna() 和 sum()
null_values_rating = rating.isna().sum().to_frame().T
# 设置样式,通过样式设置使输出更具可读性
styled_null_values_rating = null_values_rating.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px solid black"})
# 输出缺失值情况
print("Null Values of Rating Dataset:")
styled_null_values_rating
运行这段代码后将看到一个带有样式的表格,显示了评分数据集中每列的缺失值数量。如图12-7所示。
图12-7 评分数据集中每列的缺失值数量
(8)检测并计算评分数据集中的重复条目数量,并在删除重复条目后输出数据集中的新条目数量。
# 使用 duplicated() 方法检测重复条目,并使用 shape[0] 获取重复条目的数量
dup_rating = rating[rating.duplicated()].shape[0]
# 输出重复条目的数量和总条目数
print(f"There are {dup_rating} duplicate entries among {rating.shape[0]} entries in the rating dataset.")
# 使用 drop_duplicates() 方法删除重复条目,keep='first' 表示保留第一个出现的重复条目
rating.drop_duplicates(keep='first', inplace=True)
# 输出删除重复条目后的新条目数量
print(f"\nAfter removing duplicate entries, there are {rating.shape[0]} entries in this dataset.")
对上述代码的具体说明如下所示:
- rating[rating.duplicated()]:用于选择包含重复值的行。
- shape[0] :用于获取重复行的数量。
- print 语句:输出包含重复值的行的数量和总行数。
- rating.drop_duplicates(keep='first', inplace=True) :用于删除数据集中的重复行,保留第一次出现的重复行。
- print 语句:输出删除重复行后的新条目数量。
运行这段代码后将得到两条消息,一条指示数据集中有多少重复的条目,另一条指示删除重复条目后的新条目数量。执行后会输出:
There are 1 duplicate entries among 7813737 entries in rating dataset.
After removing duplicate entries there are 7813736 entries in this dataset.