【Python数据分析课程设计】关于艾尔登法环武器的数据分析

发布时间 2023-12-30 14:57:23作者: 翁倩彬
一、选题背景

艾尔登法环由FromSoftware与乔治-R-R-马丁(George R.R. Martin)合作开发,以正统黑暗奇幻世界为舞台的动作RPG游戏,走进辽阔的场景与地下迷宫探索未知,挑战困难重重的险境。

这款游戏带来了一个广阔的开放世界,其中包含各种奇幻生物和战斗。在游戏中,玩家将能够使用各种武器来与敌人战斗。

如今数据分析在游戏领域已经变得越来越重要,它能够提供对游戏内部系统和机制的深入理解。针对艾尔登法环中的武器进行数据分析,可以为玩家和游戏开发者提供有价值的信息和洞见。

通过收集和分析艾尔登法环中各种武器的属性数据,可以探讨不同武器的特点、优势和劣势。例如,属性伤害、耐力消耗、重量等属性的比较分析,有助于玩家了解不同武器的适用场景和策略选择。

二、大数据分析设计方案
1、本数据集的数据内容与数据特征分析
数据集中主要包括武器名称、武器类型、武器的属性伤害、使用武器的耐力消耗、武器的属性加成等。
2、数据分析的课程设计方案概述
对Kaggle网站上下载到的的数据进行清洗和整理,确保数据的准确性和一致性。这包括去除重复数据、处理缺失值和异常值,以及对数据进行格式化和标准化。
对武器的各项属性进行分析。可以计算各个武器的平均属性值、伤害分布情况,并进行可视化展示。这有助于了解不同武器类型的特点和优劣势,以及玩家在游戏中的选择偏好。

通过图表、表格和可视化方式呈现分析结果,以便更直观地展示数据的洞见和趋势。

找出常见属性中伤害最高和最低的武器,有助于玩家对武器的选择。

三、数据分析步骤
1、数据源
数据集来自于kaggle网站:https://www.kaggle.com/datasets/l3llff/-elden-ring-weapons
2、数据清洗
#导入库
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 读取CSV文件
df = pd.read_csv("C:/Users/24138/Documents/jupyter/kaggle/Elden Ring\elden_ring_weapon.csv")

# 查看数据集的前几行
display(df.head())

 

#获取数据集的行数和列数
num1 = df.shape[0]  # 行数
num2 = df.shape[1]  # 列数

# 输出结果
print("行数:", num1)
print("列数:", num2)

 

 

# 修改列名为中文
df.columns = ['武器名称', '武器类型', '物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '耐力消耗', '力量加成', '敏捷加成', '智力加成', '信仰加成', '感应加成', '特殊效果伤害', '物理防御', '魔法防御', '火防御', '雷防御', '圣防御', '增益', '防御强度', '重量', '升级材料']

 

# 检查每列的缺失值数量
print(df.isnull().sum())

# 查找包含缺失值的列
缺失列 = df.columns[df.isnull().any()]
print(缺失列)

 
# 将"-"替换为0,然后将所有值转换为浮点数类型

# 在'物理伤害'列中将"-"替换为0
df['物理伤害'] = df['物理伤害'].replace('-', 0)
# 将'Phy'列从对象类型转换为浮点数类型
df['物理伤害'] = df['物理伤害'].astype(float)
# 转换后检查数据类型

# 在'魔法伤害'列中将"-"替换为0
df['魔法伤害'] = df['魔法伤害'].replace('-', 0)
# 将'Mag'列从对象类型转换为浮点数类型
df['魔法伤害'] = df['魔法伤害'].astype(float)
# 转换后检查数据类型

# 在'圣伤害'列中将"-"替换为0
df['圣伤害'] = df['圣伤害'].replace('-', 0)
# 将'Hol'列从对象类型转换为浮点数类型
df['圣伤害'] = df['圣伤害'].astype(float)
# 转换后检查数据类型
print(df.dtypes)

 

3.大数据分析过程及采用的算法
#计算武器类型的唯一值数量
x = df['武器类型'].nunique()

# 输出一共有多少种武器类型
print('武器类型的数量:',x)

 

#统计每种武器出现的次数
weapon_counts = df['武器类型'].value_counts()
# 输出每个武器类型的出现次数
print(weapon_counts)

4.数据可视化

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Microsoft YaHei'# 设置字体为宋体
plt.figure(figsize=(10, 10))  # 设置图形大小
weapon_counts.plot(kind='barh')  # 创建水平条形图
plt.xlabel('武器类型')  # 设置 x 轴标签
plt.ylabel('数量')  # 设置 y 轴标签
plt.title(' 最常见的武器类型 ', size=22, weight="bold")  # 设置图标题
plt.xticks(rotation=90)  # 旋转 x 轴标签以提高可读性
plt.show()  # 显示图形

 可以看出,剑是最受欢迎的武器种类,包括直剑和大剑。对于法师或以魔法为基础的玩家来说,辉石魔杖在游戏中也很常见。最稀有的武器是球形武器和爪形武器。

 

#计算每种武器的平均重量并降序排序
average_weight = df.groupby('武器类型')['重量'].mean().sort_values(ascending=False)
# 绘图
plt.figure(figsize=(10, 6))  # 设置图形大小
sns.barplot(x=average_weight.index, y=average_weight.values, palette='Blues_r')
plt.xlabel('武器类型')  # 设置x轴标签
plt.ylabel('平均重量')  # 设置y轴标签
plt.title('每种武器类型的平均重量')  # 设置图标题
plt.xticks(rotation=45, ha='right')  # 旋转和对齐x轴标签,以便更好地阅读
plt.gca().spines['top'].set_visible(False)  # 移除顶部边框
plt.gca().spines['right'].set_visible(False)  # 移除右侧边框
plt.tight_layout()  # 调整边距和间距
plt.show()  # 显示图形

可以看出巨剑和巨型武器在平均重量上拉开其他武器一大截,而神圣印记则在平均重量中低于其他武器

 

# 计算每种武器类型的平均伤害
average_physical_damage = df.groupby('武器类型')['物理伤害'].mean()
average_magic_damage = df.groupby('武器类型')['魔法伤害'].mean()
average_holy_damage = df.groupby('武器类型')['圣伤害'].mean()

# 连接平均伤害数据框
average_damage = pd.concat([average_physical_damage, average_magic_damage, average_holy_damage], axis=1)

# 输出平均伤害数据框
average_damage

import matplotlib.pyplot as plt

# 绘制条形图
average_damage.plot(kind='bar', figsize=(15,5), width=0.8)

# 设置x轴标签
plt.xlabel('武器类型')

# 设置y轴标签
plt.ylabel('平均伤害')

# 设置图表标题
plt.title('每种武器类型的平均伤害')

# 设置x轴标签旋转角度为90度
plt.xticks(rotation=90)

# 添加图例
plt.legend(['物理伤害', '魔法伤害', '圣伤害'])

# 显示图表
plt.show()

 可以看出不是所有武器都能提供所有类型的伤害,有些武器只有物理伤害,或物理和圣伤害的组合,或物理和魔法伤害的组合,或三种属性的组合。考虑到这些类型的伤害,是因为它们是可以对敌人造成的最常见的伤害类型。

 

import pandas as pd

# 计算每种武器类型的平均伤害
average_damage = df[['武器类型', '物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '特殊效果伤害']].groupby('武器类型')[['物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '特殊效果伤害']].mean(numeric_only=True)

# 找到平均伤害最高的武器类型
weapon_highest_avg_damage = average_damage.mean(axis=1).idxmax()

# 找到平均伤害最低的武器类型
weapon_lowest_avg_damage = average_damage.mean(axis=1).idxmin()

# 输出结果
print("平均伤害最高的武器类型:", weapon_highest_avg_damage)
print("平均伤害最低的武器类型:", weapon_lowest_avg_damage)

 

# 统计平均伤害最高的武器数量
highest_count = len(df[df['武器类型'] == weapon_highest_avg_damage])

# 统计平均伤害最低的武器数量
lowest_count = len(df[df['武器类型'] == weapon_lowest_avg_damage])

# 输出结果
print("平均伤害最高的武器数量:", highest_count)
print("平均伤害最低的武器数量:", lowest_count)

 可以看待虽然Ballista的平均伤害最高,但也许只是因为它数量稀少,只有伤害高的没有伤害低的来拉下平均值

物理伤害分布

# 创建一个图形和坐标轴对象
fig, ax = plt.subplots(figsize=(15, 5))

# 使用Seaborn绘制直方图
sns.histplot(data=df, x='物理伤害')

# 设置y轴标签
plt.ylabel("数量", size=12)

# 设置x轴标签
plt.xlabel("物理伤害", size=12)

# 设置图表标题
plt.title("物理伤害分布", size=14)

# 设置y轴刻度标签的字体大小
plt.yticks(size=13)

# 设置刻度大小
plt.tick_params(size=13)

# 显示图形
plt.show()

 可以看到物理伤害分布数量的顶点是在三百前后,有两个武器与其他武器不同跟其他武器拉开了比较大的差距

魔法伤害分布

import matplotlib.pyplot as plt
import seaborn as sns

# 创建一个图形和坐标轴对象
fig, ax = plt.subplots(figsize=(15, 5))

# 使用Seaborn绘制直方图
sns.histplot(data=df, x='魔法伤害')

# 设置y轴标签
plt.ylabel("数量", size=12)

# 设置x轴标签
plt.xlabel("魔法伤害", size=12)

# 设置图表标题
plt.title("魔法伤害分布", size=14)

# 设置y轴刻度标签的字体大小
plt.yticks(size=13)

# 设置刻度大小
plt.tick_params(size=13)

# 显示图形
plt.show()

 可以看到大部分的武器的魔法伤害都比较低

圣伤害分布

import matplotlib.pyplot as plt
import seaborn as sns

# 创建一个图形和坐标轴对象
fig, ax = plt.subplots(figsize=(15, 5))

# 使用Seaborn绘制直方图
sns.histplot(data=df, x='圣伤害')

# 设置y轴标签
plt.ylabel("数量", size=12)

# 设置x轴标签
plt.xlabel("圣伤害", size=12)

# 设置图表标题
plt.title("圣伤害分布", size=14)

# 设置y轴刻度标签的字体大小
plt.yticks(size=13)

# 设置刻度大小
plt.tick_params(size=13)

# 显示图形
plt.show()

 

可以看到圣伤害的分布与魔法伤害的分布有些类似,大部分武器的圣伤害也比较低

# 武器重量和物理伤害的比较
# 按照物理伤害降序排序数据
sorted_data = df.sort_values(by='物理伤害', ascending=False)

# 绘图
plt.figure(figsize=(10, 5))  # 设置图形大小
plt.scatter(df['重量'], df['物理伤害'])  # 创建散点图
plt.xlabel('重量')  # 设置x轴标签
plt.ylabel('物理伤害')  # 设置y轴标签
plt.title('武器重量和物理伤害的比较')  # 设置图表标题
plt.grid(True)  # 添加网格线
plt.show()  # 显示图形

 随着武器的重量增加,我们可以看到它提供更多物理伤害的趋势。有两个异常值,虽然不是最重的武器,但都能提供最大的伤害。

# 找到物理伤害最高的武器
max_damage_row = df.loc[df['物理伤害'].idxmax()]

# 找到物理伤害最低的武器
min_damage_row = df.loc[df['物理伤害'].idxmin()]

print("物理伤害最高的武器:")
print(max_damage_row["武器名称"])

print("物理伤害最低的武器:")
print(min_damage_row["武器名称"])

 我们找到了物理伤害最高的武器和物理伤害最低的武器,有助于玩家在需要物理伤害类型的武器选择时的需要

# 按照魔法伤害降序排序数据
sorted_data = df.sort_values(by='魔法伤害', ascending=False)

# 绘图
plt.figure(figsize=(10, 5))  # 设置图形大小
plt.scatter(df['重量'], df['魔法伤害'])  # 创建散点图
plt.xlabel('重量')  # 设置x轴标签
plt.ylabel('魔法伤害')  # 设置y轴标签
plt.title('武器重量和魔法伤害的比较')  # 设置图表标题
plt.grid(True)  # 添加网格线
plt.show()  # 显示图形

 可以看到相较于物理伤害与重量的对比,许多武器在较低的重量下也能造成较高的魔法伤害,也有一把武器在不是最高的重量情况下造成最高的魔法伤害

# 找到魔法伤害最高的武器
max_magical_row = df.loc[df['魔法伤害'].idxmax()]

# 找到除了0以外的武器中魔法伤害最低的武器
min_magical_row_min = df.loc[df['魔法伤害'] > 0, '魔法伤害'].idxmin()
min_magical_min = df.loc[min_magical_row_min]

# 输出结果
print("魔法伤害最高的武器:")
print(max_magical_row["武器名称"])

print("除了0以外的魔法伤害最低的武器:")
print(min_magical_row["武器名称"])

因为有许多武器的魔法伤害都为0所以这里先排除了那些魔法伤害为0的武器,在有魔法伤害的武器中找到魔法伤害最低的武器

 

# 按照圣伤害降序排序数据
sorted_data = df.sort_values(by='圣伤害', ascending=False)

# 绘图
plt.figure(figsize=(10, 5))  # 设置图形大小
plt.scatter(df['重量'], df['圣伤害'])  # 创建散点图
plt.xlabel('重量')  # 设置x轴标签
plt.ylabel('圣伤害')  # 设置y轴标签
plt.title('武器重量和圣伤害的比较')  # 设置图表标题
plt.grid(True)  # 添加网格线
plt.show()  # 显示图形

 可以看到武器重量和圣伤害似乎也没有什么比较固定的趋势,甚至有一把武器重量为0圣伤害缺不低,下面对这把武器进行查找

# 筛选圣伤害中重量为0的数据
zero = df[df['重量'] == 0]

# 在筛选结果中找到圣伤害最高的武器
max_holy_damage = zero.loc[zero['圣伤害'].idxmax()]

# 输出结果
print("重量为0圣伤害最高的武器是:")
print(max_holy_damage["武器名称"])

可以得最轻的圣伤害最高的武器是Cipher Pata,当玩家的重量较重无法携带重量武器又需要圣伤害武器时可以选择它

# 找到圣伤害最高的武器
max_holy_row = df.loc[df['圣伤害'].idxmax()]

# 找到圣伤害最低的武器
min_holy_row = df.loc[df['圣伤害'].idxmin()]

print("圣伤害最高的武器:")
print(max_holy_row["武器名称"])

print("圣伤害最低的武器:")
print(min_holy_row["武器名称"])

 但是当自身重量较轻则可以考虑选择圣伤害更高的Gargoyle's Black Halberd

# 统计每种武器的升级材料出现次数
weapon_counts = df['升级材料'].value_counts()

# 绘图
plt.figure(figsize=(5, 5))  # 设置图像大小
weapon_counts.plot(kind='bar', width=0.5)  # 创建条形图
plt.xlabel('材料类型')  # 设置x轴标签
plt.ylabel('数量')  # 设置y轴标签
plt.title(' 升级要求 ')  # 设置图标题
plt.xticks(rotation=0)  # 旋转x轴标签以提高可读性
plt.show()  # 显示图像

 统计武器升级的材料要求,可以帮助玩家在交界之地探索时候明白自己更需要什么材料,从而去探索发现

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt

# 创建一个空列表用于存储升级材料
upgrade_materials_phy = []

# 计算物理伤害的平均值
phy_damage_mean = df['物理伤害'].mean()

# 遍历数据集中的每一行
for _, row in df.iterrows():
    name = row['武器类型']
    phy_damage = row['物理伤害']

    # 如果物理伤害大于平均值,则将升级材料添加到列表中
    if phy_damage > phy_damage_mean:
        upgrade_material = row['升级材料']
        upgrade_materials.append(upgrade_material)

# 使用Counter计算升级材料出现的次数
material_counts = Counter(upgrade_materials)

# 获取升级材料和对应的出现次数
materials = material_counts.keys()
counts = material_counts.values()

# 绘制条形图
plt.figure(figsize=(5, 5))
plt.bar(materials, counts)
plt.xlabel('升级材料')
plt.ylabel('出现次数')
plt.title('升级材料统计')

plt.show()

 可以看到物理伤害较高的武器它们的升级材料大部分是Smithing Stones,小部分是Somber Smithing Stones


import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt

# 创建一个空列表用于存储升级材料
upgrade_materials_mag = []

# 计算魔法伤害的平均值
mag_damage_mean = df['魔法伤害'].mean()

# 遍历数据集中的每一行
for _, row in df.iterrows():
    name = row['武器类型']
    mag_damage = row['魔法伤害']

    # 如果魔法伤害大于平均值,则将升级材料添加到列表中
    if mag_damage > mag_damage_mean:
        upgrade_material = row['升级材料']
        upgrade_materials.append(upgrade_material)

# 使用Counter计算升级材料出现的次数
material_counts = Counter(upgrade_materials)

# 获取升级材料和对应的出现次数
materials = material_counts.keys()
counts = material_counts.values()

# 绘制条形图
plt.figure(figsize=(5, 5))
plt.bar(materials, counts)
plt.xlabel('升级材料')
plt.ylabel('出现次数')
plt.title('升级材料统计')

plt.xticks(rotation=0)  # 不旋转x轴标签
plt.tight_layout()  # 调整布局以适配图形
plt.show()

魔法伤害的材料统计与物理伤害截然不同,魔法伤害大于均值的武器大多数的升级材料都为Somber Smithing Stones,如果玩家在游玩中倾向选择魔法伤害高的武器那么要更着重收集Somber Smithing Stones

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt

# 创建一个空列表用于存储升级材料
upgrade_materials_hol = []

# 计算圣伤害的平均值
hol_damage_mean = df['圣伤害'].mean()

# 遍历数据集中的每一行
for _, row in df.iterrows():
    name = row['武器类型']
    hol_damage = row['圣伤害']

    # 如果圣伤害大于平均值,则将升级材料添加到列表中
    if hol_damage > hol_damage_mean:
        upgrade_material = row['升级材料']
        upgrade_materials.append(upgrade_material)

# 使用Counter计算升级材料出现的次数
material_counts = Counter(upgrade_materials)

# 获取升级材料和对应的出现次数
materials = material_counts.keys()
counts = material_counts.values()

# 绘制条形图
plt.figure(figsize=(5, 5))
plt.bar(materials, counts)
plt.xlabel('升级材料')
plt.ylabel('出现次数')
plt.title('升级材料统计')

plt.xticks(rotation=0)  # 不旋转x轴标签
plt.tight_layout()  # 调整布局以适配图形
plt.show()

 圣伤害较高的武器的升级材料与魔法伤害类似,大部分也都是Somber Smithing Stones,如果玩家比较喜欢圣伤害的武器,那也要着重收集Somber Smithing Stones

5.完整程序源代码
  1 #导入库
  2 import numpy as np
  3 import pandas as pd
  4 import seaborn as sns
  5 import matplotlib.pyplot as plt
  6 
  7 # 读取CSV文件
  8 df = pd.read_csv("C:/Users/24138/Documents/jupyter/kaggle/Elden Ring\elden_ring_weapon.csv")
  9 # 查看数据集的前几行
 10 display(df.head())
 11 #获取数据集的行数和列数
 12 num1 = df.shape[0]  # 行数
 13 num2 = df.shape[1]  # 列数
 14 
 15 # 输出结果
 16 print("行数:", num1)
 17 print("列数:", num2)
 18 # 输出列标签
 19 print(df.columns)
 20 # 修改列名为中文
 21 df.columns = ['武器名称', '武器类型', '物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '耐力消耗', '力量加成', '敏捷加成', '智力加成', '信仰加成', '感应加成', '特殊效果伤害', '物理防御', '魔法防御', '火防御', '雷防御', '圣防御', '增益', '防御强度', '重量', '升级材料']
 22 
 23 # 显示修改后的列名
 24 print(df.columns)
 25 # 输出修改后的数据集的前几行
 26 display(df.head())
 27 # 检查每列的缺失值数量
 28 print(df.isnull().sum())
 29 
 30 # 查找包含缺失值的列
 31 缺失列 = df.columns[df.isnull().any()]
 32 print(缺失列)
 33 #计算武器类型的唯一值数量
 34 x = df['武器类型'].nunique()
 35 
 36 # 输出一共有多少种武器类型
 37 print('武器类型的数量:',x)
 38 #统计每种武器出现的次数
 39 weapon_counts = df['武器类型'].value_counts()
 40 # 输出每个武器类型的出现次数
 41 print(weapon_counts)
 42 import matplotlib.pyplot as plt
 43 
 44 #最常见的武器类型图
 45 plt.rcParams['font.family'] = 'Microsoft YaHei'# 设置字体为宋体
 46 plt.figure(figsize=(10, 10))  # 设置图形大小
 47 weapon_counts.plot(kind='barh')  # 创建水平条形图
 48 plt.xlabel('武器类型')  # 设置 x 轴标签
 49 plt.ylabel('数量')  # 设置 y 轴标签
 50 plt.title(' 最常见的武器类型 ', size=22, weight="bold")  # 设置图标题
 51 plt.xticks(rotation=90)  # 旋转 x 轴标签以提高可读性
 52 plt.show()  # 显示图形
 53 #计算每种武器的平均重量并降序排序
 54 average_weight = df.groupby('武器类型')['重量'].mean().sort_values(ascending=False)
 55 # 每种武器平均重量
 56 plt.figure(figsize=(10, 6))  # 设置图形大小
 57 sns.barplot(x=average_weight.index, y=average_weight.values, palette='Blues_r')
 58 plt.xlabel('武器类型')  # 设置x轴标签
 59 plt.ylabel('平均重量')  # 设置y轴标签
 60 plt.title('每种武器类型的平均重量')  # 设置图标题
 61 plt.xticks(rotation=45, ha='right')  # 旋转和对齐x轴标签,以便更好地阅读
 62 plt.gca().spines['top'].set_visible(False)  # 移除顶部边框
 63 plt.gca().spines['right'].set_visible(False)  # 移除右侧边框
 64 plt.tight_layout()  # 调整边距和间距
 65 plt.show()  # 显示图形
 66 # 将"-"替换为0,然后将所有值转换为浮点数类型
 67 # 在'物理伤害'列中将"-"替换为0
 68 df['物理伤害'] = df['物理伤害'].replace('-', 0)
 69 # 将'物理伤害'列从对象类型转换为浮点数类型
 70 df['物理伤害'] = df['物理伤害'].astype(float)
 71 # 在'魔法伤害'列中将"-"替换为0
 72 df['魔法伤害'] = df['魔法伤害'].replace('-', 0)
 73 # 将'魔法伤害'列从对象类型转换为浮点数类型
 74 df['魔法伤害'] = df['魔法伤害'].astype(float)
 75 # 在'圣伤害'列中将"-"替换为0
 76 df['圣伤害'] = df['圣伤害'].replace('-', 0)
 77 # 将'圣伤害'列从对象类型转换为浮点数类型
 78 df['圣伤害'] = df['圣伤害'].astype(float)
 79 print(df.dtypes)
 80 # 计算每种武器类型的平均伤害
 81 average_physical_damage = df.groupby('武器类型')['物理伤害'].mean()
 82 average_magic_damage = df.groupby('武器类型')['魔法伤害'].mean()
 83 average_holy_damage = df.groupby('武器类型')['圣伤害'].mean()
 84 
 85 # 连接平均伤害数据框
 86 average_damage = pd.concat([average_physical_damage, average_magic_damage, average_holy_damage], axis=1)
 87 # 输出平均伤害数据框
 88 average_damage
 89 # 绘制条形图
 90 average_damage.plot(kind='bar', figsize=(15,5), width=0.8)
 91 # 设置x轴标签
 92 plt.xlabel('武器类型')
 93 # 设置y轴标签
 94 plt.ylabel('平均伤害')
 95 # 设置图表标题
 96 plt.title('每种武器类型的平均伤害')
 97 # 设置x轴标签旋转角度为90度
 98 plt.xticks(rotation=90)
 99 # 添加图例
100 plt.legend(['物理伤害', '魔法伤害', '圣伤害'])
101 # 显示图表
102 plt.show()
103 # 计算每种武器类型的平均伤害
104 average_damage = df[['武器类型', '物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '特殊效果伤害']].groupby('武器类型')[['物理伤害', '魔法伤害', '火伤害', '雷伤害', '圣伤害', '致命一击', '特殊效果伤害']].mean(numeric_only=True)
105 # 找到平均伤害最高的武器类型
106 weapon_highest_avg_damage = average_damage.mean(axis=1).idxmax()
107 # 找到平均伤害最低的武器类型
108 weapon_lowest_avg_damage = average_damage.mean(axis=1).idxmin()
109 # 输出结果
110 print("平均伤害最高的武器类型:", weapon_highest_avg_damage)
111 print("平均伤害最低的武器类型:", weapon_lowest_avg_damage)
112 # 物理伤害分布图
113 # 创建一个图形和坐标轴对象
114 fig, ax = plt.subplots(figsize=(15, 5))
115 # 使用Seaborn绘制直方图
116 sns.histplot(data=df, x='物理伤害')
117 # 设置y轴标签
118 plt.ylabel("数量", size=12)
119 # 设置x轴标签
120 plt.xlabel("物理伤害", size=12)
121 # 设置图表标题
122 plt.title("物理伤害分布", size=14)
123 # 设置y轴刻度标签的字体大小
124 plt.yticks(size=13)
125 # 设置刻度大小
126 plt.tick_params(size=13)
127 # 显示图形
128 plt.show()
129 # 魔法伤害分布图
130 # 创建一个图形和坐标轴对象
131 fig, ax = plt.subplots(figsize=(15, 5))
132 # 使用Seaborn绘制直方图
133 sns.histplot(data=df, x='魔法伤害')
134 # 设置y轴标签
135 plt.ylabel("数量", size=12)
136 # 设置x轴标签
137 plt.xlabel("魔法伤害", size=12)
138 # 设置图表标题
139 plt.title("魔法伤害分布", size=14)
140 # 设置y轴刻度标签的字体大小
141 plt.yticks(size=13)
142 # 设置刻度大小
143 plt.tick_params(size=13)
144 # 显示图形
145 plt.show()
146 # 圣伤害分布图
147 # 创建一个图形和坐标轴对象
148 fig, ax = plt.subplots(figsize=(15, 5))
149 # 使用Seaborn绘制直方图
150 sns.histplot(data=df, x='圣伤害')
151 # 设置y轴标签
152 plt.ylabel("数量", size=12)
153 # 设置x轴标签
154 plt.xlabel("圣伤害", size=12)
155 # 设置图表标题
156 plt.title("圣伤害分布", size=14)
157 # 设置y轴刻度标签的字体大小
158 plt.yticks(size=13)
159 # 设置刻度大小
160 plt.tick_params(size=13)
161 # 显示图形
162 plt.show()
163 # 武器重量和物理伤害的比较
164 # 按照物理伤害降序排序数据
165 sorted_data = df.sort_values(by='物理伤害', ascending=False)
166 
167 # 绘图
168 plt.figure(figsize=(10, 5))  # 设置图形大小
169 plt.scatter(df['重量'], df['物理伤害'])  # 创建散点图
170 plt.xlabel('重量')  # 设置x轴标签
171 plt.ylabel('物理伤害')  # 设置y轴标签
172 plt.title('武器重量和物理伤害的比较')  # 设置图表标题
173 plt.grid(True)  # 添加网格线
174 plt.show()  # 显示图形
175 # 找到物理伤害最高的武器
176 max_damage_row = df.loc[df['物理伤害'].idxmax()]
177 
178 # 找到物理伤害最低的武器
179 min_damage_row = df.loc[df['物理伤害'].idxmin()]
180 # 按照魔法伤害降序排序数据
181 sorted_data = df.sort_values(by='魔法伤害', ascending=False)
182 
183 # 绘图
184 plt.figure(figsize=(10, 5))  # 设置图形大小
185 plt.scatter(df['重量'], df['魔法伤害'])  # 创建散点图
186 plt.xlabel('重量')  # 设置x轴标签
187 plt.ylabel('魔法伤害')  # 设置y轴标签
188 plt.title('武器重量和魔法伤害的比较')  # 设置图表标题
189 plt.grid(True)  # 添加网格线
190 plt.show()  # 显示图形
191 # 找到魔法伤害最高的武器
192 max_magical_row = df.loc[df['魔法伤害'].idxmax()]
193 
194 # 找到除了0以外的武器中魔法伤害最低的武器
195 min_magical_row_min = df.loc[df['魔法伤害'] > 0, '魔法伤害'].idxmin()
196 min_magical_min = df.loc[min_magical_row_min]
197 
198 # 输出结果
199 print("魔法伤害最高的武器:")
200 print(max_magical_row["武器名称"])
201 print("除了0以外的魔法伤害最低的武器:")
202 print(min_magical_row["武器名称"])
203 # 按照圣伤害降序排序数据
204 sorted_data = df.sort_values(by='圣伤害', ascending=False)
205 # 绘图
206 plt.figure(figsize=(10, 5))  # 设置图形大小
207 plt.scatter(df['重量'], df['圣伤害'])  # 创建散点图
208 plt.xlabel('重量')  # 设置x轴标签
209 plt.ylabel('圣伤害')  # 设置y轴标签
210 plt.title('武器重量和圣伤害的比较')  # 设置图表标题
211 plt.grid(True)  # 添加网格线
212 plt.show()  # 显示图形
213 # 筛选圣伤害中重量为0的数据
214 zero = df[df['重量'] == 0]
215 # 在筛选结果中找到圣伤害最高的武器
216 max_holy_damage = zero.loc[zero['圣伤害'].idxmax()]
217 # 输出结果
218 print("重量为0圣伤害最高的武器是:")
219 print(max_holy_damage["武器名称"])
220 # 找到圣伤害最高的武器
221 max_holy_row = df.loc[df['圣伤害'].idxmax()]
222 # 找到圣伤害最低的武器
223 min_holy_row = df.loc[df['圣伤害'].idxmin()]
224 print("圣伤害最高的武器:")
225 print(max_holy_row["武器名称"])
226 print("圣伤害最低的武器:")
227 print(min_holy_row["武器名称"])
228 # 统计每种武器的升级材料出现次数
229 weapon_counts = df['升级材料'].value_counts()
230 # 绘图
231 plt.figure(figsize=(5, 5))  # 设置图像大小
232 weapon_counts.plot(kind='bar', width=0.5)  # 创建条形图
233 plt.xlabel('材料类型')  # 设置x轴标签
234 plt.ylabel('数量')  # 设置y轴标签
235 plt.title(' 升级要求 ')  # 设置图标题
236 plt.xticks(rotation=0)  # 旋转x轴标签以提高可读性
237 plt.show()  # 显示图像
238 import pandas as pd
239 from collections import Counter
240 import matplotlib.pyplot as plt
241 
242 # 创建一个空列表用于存储升级材料
243 upgrade_materials = []
244 # 计算物理伤害的平均值
245 phy_damage_mean = df['物理伤害'].mean()
246 # 遍历数据集中的每一行
247 for _, row in df.iterrows():
248     name = row['武器类型']
249     phy_damage = row['物理伤害']
250 
251     # 如果物理伤害大于平均值,则将升级材料添加到列表中
252     if phy_damage > phy_damage_mean:
253         upgrade_material = row['升级材料']
254         upgrade_materials.append(upgrade_material)
255 # 使用Counter计算升级材料出现的次数
256 material_counts = Counter(upgrade_materials)
257 # 获取升级材料和对应的出现次数
258 materials = material_counts.keys()
259 counts = material_counts.values()
260 # 绘制条形图
261 plt.figure(figsize=(5, 5))
262 plt.bar(materials, counts)
263 plt.xlabel('升级材料')
264 plt.ylabel('出现次数')
265 plt.title('升级材料统计')
266 plt.xticks(rotation=0)  # 不旋转x轴标签
267 plt.tight_layout()  # 调整布局以适配图形
268 plt.show()
269 
270 # 魔法伤害超过均值的武器升级材料统计
271 # 创建一个空列表用于存储升级材料
272 upgrade_materials_mag = []
273 
274 # 计算魔法伤害的平均值
275 mag_damage_mean = df['魔法伤害'].mean()
276 
277 # 遍历数据集中的每一行
278 for _, row in df.iterrows():
279     name = row['武器类型']
280     mag_damage = row['魔法伤害']
281 
282     # 如果魔法伤害大于平均值,则将升级材料添加到列表中
283     if mag_damage > mag_damage_mean:
284         upgrade_material = row['升级材料']
285         upgrade_materials.append(upgrade_material)
286 
287 # 使用Counter计算升级材料出现的次数
288 material_counts = Counter(upgrade_materials)
289 
290 # 获取升级材料和对应的出现次数
291 materials = material_counts.keys()
292 counts = material_counts.values()
293 
294 # 绘制条形图
295 plt.figure(figsize=(5, 5))
296 plt.bar(materials, counts)
297 plt.xlabel('升级材料')
298 plt.ylabel('出现次数')
299 plt.title('升级材料统计')
300 
301 plt.xticks(rotation=0)  # 不旋转x轴标签
302 plt.tight_layout()  # 调整布局以适配图形
303 plt.show()
304 
305 # 圣伤害超过均值的武器升级材料统计
306 # 创建一个空列表用于存储升级材料
307 upgrade_materials_hol = []
308 
309 # 计算圣伤害的平均值
310 hol_damage_mean = df['圣伤害'].mean()
311 
312 # 遍历数据集中的每一行
313 for _, row in df.iterrows():
314     name = row['武器类型']
315     hol_damage = row['圣伤害']
316 
317     # 如果圣伤害大于平均值,则将升级材料添加到列表中
318     if hol_damage > hol_damage_mean:
319         upgrade_material = row['升级材料']
320         upgrade_materials.append(upgrade_material)
321 
322 # 使用Counter计算升级材料出现的次数
323 material_counts = Counter(upgrade_materials)
324 
325 # 获取升级材料和对应的出现次数
326 materials = material_counts.keys()
327 counts = material_counts.values()
328 
329 # 绘制条形图
330 plt.figure(figsize=(5, 5))
331 plt.bar(materials, counts)
332 plt.xlabel('升级材料')
333 plt.ylabel('出现次数')
334 plt.title('升级材料统计')
335 
336 plt.xticks(rotation=0)  # 不旋转x轴标签
337 plt.tight_layout()  # 调整布局以适配图形
338 plt.show()
四、总结

经过对艾尔登法环(Elden Ring)武器数据的分析,以下是对结果的总结:

  1. 物理伤害统计:分析了武器的物理伤害属性。可以根据平均值来比较武器的物理伤害强弱。有些武器的物理伤害超过了平均值,可能是一些较强的武器。

  2. 魔法伤害统计:分析了武器的魔法伤害属性。通过计算魔法伤害的平均值,可以判断哪些武器在魔法领域更加强大。同样,超过平均值的魔法伤害可能意味着这些武器在魔法战斗中更具优势。

  3. 圣伤害统计:分析了武器的圣伤害属性。根据圣伤害的平均值,可以了解到哪些武器对抗邪恶生物或具有圣属性的敌人更有效。超过平均值的圣伤害可能意味着这些武器在对抗邪恶生物时更具优势。

  4. 升级材料统计:根据不同属性的伤害超过均值的武器,统计了使用的升级材料出现的次数。这可以让玩家了解哪些升级材料在强化不同类型的武器时更常见,从而更好地计划其升级路径。

这些分析结果可以帮助玩家在游戏中选择适合自己的武器,了解不同武器之间的属性差异,并根据需求来制定升级策略。然而,需要注意的是,分析结果仅供参考,实际游戏中还需要考虑其他因素如技能、使用风格等来做出最佳选择。