【Python数据分析课程设计】大数据分析—Pokemon 1996-2022年各世代宝可梦数据集分析

发布时间 2023-12-29 21:05:42作者: 22泉信陈霖

一、选题背景
宝可梦是一种受欢迎的媒体内容和游戏系列,由任天堂、Game Freak和Creatures等公司合作开发。它们是虚构的生物角色,具有各种不同的属性、技能和能力。自1996年首次推出以来,宝可梦已经成为全球范围内的文化现象。
宝可梦不仅仅是娱乐产品,它们也在社会中产生了广泛的影响:
    竞技游戏和电子竞技:宝可梦游戏系列已经成为一项受欢迎的电子竞技活动。许多玩家参加宝可梦比赛和锦标赛,展示他们的策略、团队构建和游戏技巧。宝可梦数据分析在这个领域可以帮助玩家更好地理解战斗机制、优化团队配置和制定战术策略。
    社交互动和交易:宝可梦游戏系列鼓励玩家之间的社交互动。通过交换宝可梦、进行对战和参加多人合作活动,玩家可以在游戏中建立联系。宝可梦数据分析可以用于确定宝可梦的稀有度、价值和需求,从而促进玩家之间的交易和合作。
    经济影响:宝可梦系列在全球范围内创造了一个庞大的产业链。除了游戏本身的销售,还有宝可梦相关的商品、动画、电影和周边产品等。宝可梦数据分析可以为企业和市场研究人员提供有关消费者喜好、购买趋势和市场需求的信息。
    教育和学术研究:宝可梦游戏系列也被用于教育和学术研究领域。它们可以作为引入计算机科学、数学和策略思维的工具。宝可梦数据分析可以帮助教育工作者和研究人员探索数据模式、推理能力和决策过程。
总之,宝可梦数据分析在社会中扮演着多个角色,从电子竞技到社交互动和市场研究,为各个领域的人们提供了有价值的洞察和应用。
二、大数据分析方案
数据来源于Kaggle数据集网站,数据集地址:https://www.kaggle.com/datasets/abcsds/pokemon/data
数据集介绍:名称:Pokemon.csv
为了更好地进行宝可梦数据分析,我们可以按照以下步骤进行:
    数据收集和清洗:从Kaggle数据集网站下载"Pokemon.csv"数据集。然后,我们需要对数据进行清洗,包括处理缺失值、重复值和异常值等。还可以根据需要进行特征选择、转换和编码。
    数据探索和可视化:通过统计指标、数据可视化和图表等方式,对数据进行探索性分析。我们可以查看各个属性的分布情况、相关性以及宝可梦的特征和属性之间的关系。例如,我们可以绘制柱状图、散点图和箱线图等来展示宝可梦的属性值分布和变化趋势。。
    结果解释和应用:最后,我们需要解释模型的结果和分析结果。通过解释模型的预测能力和特征重要性,我们可以提供有关宝可梦的洞察和建议。这些洞察可以应用于宝可梦游戏的优化、市场营销策略和用户体验改进等方面。
综上所述,通过大数据分析方案,我们可以深入了解宝可梦的属性、特征和能力,为游戏开发者、玩家和市场研究人员提供有价值的信息和决策支持。
三、数据集介绍
    "Name": "宝可梦名称",
    "Type 1": "属性1",
    "Type 2": "属性2",
    "Total": "总计",
    "HP": "生命值",
    "Attack": "攻击力",
    "Defense": "防御力",
    "Sp. Atk": "特殊攻击力",
    "Sp. Def": "特殊防御力",
    "Speed": "速度",
    "Generation": "世代(游戏版本)",
    "Legendary": "传奇状态(是否为传奇宝可梦,传奇宝可梦在比赛中禁止使用)"

四、代码以及功能介绍:
第一步:清洗数据:将数据中的英文转换为中文,提高可读性,删除重复行、缺失值

 1 # 数据清洗
 2 pokemon_data = pokemon_data.drop_duplicates()
 3 # 删除重复行
 4 pokemon_data = pokemon_data.dropna() 
 5 # 删除缺失值
 6 
 7 # 将列名由英文转换为中文
 8 column_mapping = {
 9     "Name": "宝可梦名称",
10     "Type 1": "种类1",
11     "Type 2": "种类2",
12     "Total": "总计",
13     "HP": "生命值",
14     "Attack": "攻击力",
15     "Defense": "防御力",
16     "Sp. Atk": "特殊攻击",
17     "Sp. Def": "特殊防御",
18     "Speed": "速度",
19     "Generation": "世代",
20     "Legendary": "传奇状态"
21 }
22 
23 # 将输出的字段名由英文转换为中文
24 pokemon_data.rename(columns=column_mapping, inplace=True)

第二步:

数据分析:进行初步数据分析,以表格形式显示,并为之后绘制数据图做初期筹备

 1 # 计算平均种族值
 2 pokemon_data["平均种族值"] = pokemon_data[["攻击力",
 3                                       "防御力", "特殊攻击",
 4                                       "特殊防御",
 5                                       "速度"]].mean(axis=1)
 6 
 7 # 统计种类1的数量
 8 type_counts_1 = pokemon_data["种类1"].value_counts()
 9 
10 # 统计种类2的数量
11 type_counts_2 = pokemon_data["种类2"].value_counts()
12 
13 # 合并两个统计结果
14 type_counts = type_counts_1.add(type_counts_2, fill_value=0).astype(int)
15 
16 # 输出宝可梦属性表格
17 poke_attributes = pokemon_data[["宝可梦名称",
18                                 "攻击力", "防御力",
19                                 "特殊攻击", "特殊防御",
20                                 "速度", 
21                                 "平均种族值"]]
22 print(poke_attributes.to_string(index=False))
23 
24 # 统计宝可梦种类数量
25 type_counts = pokemon_data["种类1"].value_counts()
26 print("宝可梦种类数量:")
27 print(type_counts)
28 
29 # 计算平均生命值
30 average_hp = pokemon_data["生命值"].mean()
31 print("平均生命值:", average_hp)
32 
33 # 计算最高攻击力和最低防御力
34 max_attack = pokemon_data["攻击力"].max()
35 min_defense = pokemon_data["防御力"].min()
36 print("最高攻击力:", max_attack)
37 print("最低防御力:", min_defense)
38 
39 # 按类型分组,计算每组的平均生命值
40 grouped_by_type = pokemon_data.groupby("种类1")["生命值"].mean()
41 print("按类型分组的平均生命值:")
42 print(grouped_by_type)
43 
44 # 找出攻击力最高的宝可梦
45 most_attacking_pokemon = pokemon_data[pokemon_data["攻击力"] == pokemon_data["攻击力"].max()]
46 print("攻击力最高的宝可梦:")
47 print(most_attacking_pokemon)
48 
49 # 找出防御力最低的宝可梦
50 least_defensive_pokemon = pokemon_data[pokemon_data["防御力"] == pokemon_data["防御力"].min()]
51 print("防御力最低的宝可梦:")
52 print(least_defensive_pokemon)

 

 运行截图:

 

数据分析:首先,我们计算了所有宝可梦的平均种族值。通过取攻击力、防御力、特殊攻击、特殊防御和速度这五个属性的平均值,得到了宝可梦的平均种族值。该值可以用来比较不同宝可梦之间的整体实力差距。

接下来,我们统计了宝可梦的属性种类和每种属性的宝可梦数量。其中,“种类1”列是宝可梦的主属性,每种属性的宝可梦数量可以帮助我们了解各种属性的相对流行程度。

然后,我们输出了宝可梦的属性表格,包括宝可梦的名称、攻击力、防御力、特殊攻击、特殊防御、速度和平均种族值等属性信息。这些属性数据可以用于进一步的分析和比较。

接着,我们统计了不同宝可梦属性的数量,并输出了各种属性的宝可梦数量情况。这可以帮助我们了解不同属性之间的相对分布情况。

接下来,我们计算了所有宝可梦的平均生命值。该值表示宝可梦在战斗中能够承受的伤害量。通过计算平均值,可以了解整个宝可梦数据集中宝可梦的平均生命值。

然后,我们找出了所有宝可梦中的最高攻击力和最低防御力的数值,并进行了输出。这些数据可以用于比较不同宝可梦之间的攻击能力和防御能力。

接着,我们对宝可梦按照属性进行了分组,并计算了每种属性的宝可梦生命值的平均值。这可以帮助我们了解不同属性之间生命值的差异。

然后,我们找出了攻击力最高的宝可梦和防御力最低的宝可梦,并输出了其详细信息。这些数据可以用于比较不同宝可梦之间的攻击和防御能力。

通过以上统计和分析,我们可以更全面地了解宝可梦的属性信息、种类分布情况以及各项能力指标的统计特征,为进一步的数据分析和决策提供了基础。

2.

1 # 绘制宝可梦种类数量的柱状图
2 plt.figure(figsize=(10, 6))
3 sns.barplot(x=type_counts.index,
4             y=type_counts.values)
5 plt.title("宝可梦种类数量")
6 plt.xlabel("种类")
7 plt.ylabel("数量")
8 plt.show()

 数据分析:通过之前统计属性种类的数据,绘制柱状图显示每种属性宝可梦所拥有的数量(因数据源只到2022,与现在有些许出入)

3.

 1 # 绘制攻击力最高的宝可梦和防御力最低的宝可梦的散点图
 2 plt.figure(figsize=(10, 6))
 3 #创建散点图
 4 plt.scatter(most_attacking_pokemon["攻击力"],
 5             most_attacking_pokemon["防御力"])
 6 plt.scatter(least_defensive_pokemon["攻击力"],
 7             least_defensive_pokemon["防御力"])
 8 #添加标题
 9 plt.title("攻击力与防御力关系")
10 #x轴
11 plt.xlabel("攻击力")
12 #y轴
13 plt.ylabel("防御力")
14 plt.legend(["攻击力最高", "防御力最低"])
15 plt.show()

 数据分析:宝可梦的六维属性总和都在一个区间范围内被称为种族值,如果单独一只宝可梦的过高,达到100以上,那么说明这只宝可梦的其他数值将会被压缩,比如攻击力最高的宝可梦防御力却在所有宝可梦中排行倒数。

4.

 1 # 绘制不同类型宝可梦的平均攻击力和平均防御力
 2 average_stats_by_type = pokemon_data.groupby("种类1")[["攻击力", "防御力"]].mean()#进行分组
 3 #设定大小为(106 4 plt.figure(figsize=(10, 6))
 5 #柱状图
 6 average_stats_by_type.plot(kind="bar")
 7 plt.title("不同类型宝可梦种族值的平均攻击力和平均防御力")
 8 plt.xlabel("种类")
 9 plt.ylabel("数值")
10 plt.show()
11 
12 # 绘制宝可梦的速度分布箱线图
13 plt.figure(figsize=(10, 6))
14 sns.boxplot(x="种类1", y="速度",
15             data=pokemon_data)
16 plt.title("宝可梦的速度种族值分布")
17 plt.xlabel("种类")
18 plt.ylabel("速度")
19 plt.xticks(rotation=90)
20 plt.show()
21 
22 # 绘制宝可梦的特攻与特防关系散点图
23 plt.figure(figsize=(10, 6))
24 plt.scatter(pokemon_data["特殊攻击"], 
25             pokemon_data["特殊防御"])
26 plt.title("宝可梦的特工特防种族值分布")
27 plt.xlabel("特攻")
28 plt.ylabel("特防")
29 plt.show()
30 
31 # 绘制宝可梦生命值的直方图
32 plt.figure(figsize=(10, 6))
33 sns.histplot(pokemon_data["生命值"],
34              bins=20)
35 plt.title("宝可梦生命种族值分布")
36 plt.xlabel("生命值")
37 plt.ylabel("数量")
38 plt.show()
39 
40 # 绘制宝可梦生命值和攻击力的关系散点图
41 plt.figure(figsize=(10, 6))
42 plt.scatter(pokemon_data["种类1"],
43             pokemon_data["防御力"])
44 plt.title("克制属性的不同倍率")
45 plt.xlabel("属性")
46 plt.ylabel("倍数")
47 plt.show()
48 
49 # 绘制不同类型宝可梦的平均速度柱状图
50 average_speed_by_type = pokemon_data.groupby("种类1")["速度"].mean()
51 plt.figure(figsize=(10, 6))
52 sns.barplot(x=average_speed_by_type.index, y=average_speed_by_type.values)
53 plt.title("不同属性宝可梦的平均速度")
54 plt.xlabel("种类")
55 plt.ylabel("速度")
56 plt.xticks(rotation=90)
57 plt.show()

 

 

 

 

 

数据分析:对宝可梦的六维数值根据不同属性进行了平均值的计算,不同属性的宝可梦适用效果也不同,如火,雷的攻击、特攻一般比较高、龙属性均衡、大地、一般属性的防御力普遍较高等等,在比赛中通常需要根据对手所显露出来的队伍前三只的属性来确定自己队伍的攻击手、辅助手和联防手。

5.

 1 #根据宝可梦的类型绘制分布不同属性的饼状图
 2 grouped =pokemon_data.groupby(['种类1']).sum()
 3 plt.pie(grouped['世代'], labels=grouped.index, autopct='%1.1f%%', startangle=90)
 4 plt.axis('equal') # 让饼图保持圆形
 5 plt.title('宝可梦类型分布')
 6 plt.show()
 7 
 8 attribute_counts = pokemon_data["种类1"].value_counts()
 9 
10 # 计算宝可梦速度属性的使用率
11 speed_counts = pokemon_data['速度'].value_counts().sort_index()
12 total_pokemon = speed_counts.sum()
13 speed_usage_rate = (speed_counts / total_pokemon) * 100
14 
15 # 绘制柱状图
16 plt.figure(figsize=(10, 6))
17 speed_bar = plt.bar(speed_usage_rate.index, speed_usage_rate.values)
18 plt.xlabel('速度')
19 plt.ylabel('使用率 (%)')
20 plt.title('宝可梦不同梯队在排位中的使用率')
21 plt.show()

 

 

 

 数据分析:用饼图更加直观的展现宝可梦不同属性的数量、速度在比赛中是较为重要的属性,谁的速度高谁就掌握出手权,因为戏法空间这个技能的存在(速度低的先出手)对于速度的考虑需要慎重并朝中间靠拢。

 

6.

 1 1 根据属性分组,找出最低速度
 2  2 speed_grouped = pokemon_data.groupby('种类1')['速度'].min()
 3  3 
 4  4 # 根据速度排序
 5  5 speed_sorted = speed_grouped.sort_values()
 6  6 
 7  7 # 绘制柱状图
 8  8 plt.figure(figsize=(10, 6))
 9  9 plt.bar(speed_sorted.index, speed_sorted.values)
10 10 plt.title('宝可梦种类1最低速度排行')
11 11 plt.xlabel('种类1')
12 12 plt.ylabel('最低速度')
13 13 plt.xticks(rotation=90)
14 14 plt.show()
15 # 使用热力图绘制宝可梦的攻击力和防御力关系
16 plt.figure(figsize=(10, 8))
17 sns.heatmap(average_stats, annot=True, cmap="YlGnBu")
18 plt.title("宝可梦攻击力与防御力可知关系热力图")
19 plt.xlabel("指标")
20 plt.ylabel("种类1")
21 plt.show()

 

 

 数据分析:可以看出,虫属性速度值较低,所以在游戏中,虫属性适合戏法空间(速度低先出手)的宝可梦较多、按照普通克制属性为1.5倍率计算,双重克制为3倍率计算,哪怕防御力达到120,也抵挡不住双重克制80攻击力打出的240血(根据上面分析宝可梦生命值平均在180左右)

 

7.

 1 # 绘制宝可梦的攻击力直方图
 2 plt.figure(figsize=(10, 6))
 3  # 设置区间范围
 4 bins = range(0, 200, 20) 
 5  # 绘制直方图
 6 plt.hist(pokemon_data["攻击力"], bins, histtype="bar", rwidth=0.8, color='#0ff0ff') 
 7  # 设置 x 轴标签
 8 plt.xlabel('攻击力') 
 9  # 设置 y 轴标签
10 plt.ylabel('数量') 
11 # 设置标题
12 plt.title('宝可梦攻击力区间计算直方图')  
13 plt.show()

 数据分析:以直方图的形式标出不同攻击力区间内的宝可梦数量。

8.

 1 # 选出种类1或种类2属性为火或水的宝可梦
 2 fire_water_pokemon = pokemon_data[(pokemon_data["种类1"].isin(["Fire", "Water"])) | (pokemon_data["种类2"].isin(["Fire", "Water"]))]
 3 
 4 # 提取火属性和水属性宝可梦的攻击力和防御力数据
 5 fire_attack = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Fire") | (fire_water_pokemon["种类2"] == "Fire")]["攻击力"]
 6 fire_defense = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Fire") | (fire_water_pokemon["种类2"] == "Fire")]["防御力"]
 7 water_attack = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Water") | (fire_water_pokemon["种类2"] == "Water")]["攻击力"]
 8 water_defense = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Water") | (fire_water_pokemon["种类2"] == "Water")]["防御力"]
 9 
10 # 绘制散点图
11 plt.figure(figsize=(10, 6))
12 plt.scatter(fire_attack, fire_defense, c='r', marker='o', label='火属性')
13 plt.scatter(water_attack, water_defense, c='b', marker='s', label='水属性')
14 
15 # 添加标题和轴标签
16 plt.title("火属性和水属性宝可梦的攻击力与防御力对比")
17 plt.xlabel("攻击力")
18 plt.ylabel("防御力")
19 
20 # 显示图例
21 plt.legend()
22 
23 # 显示图像
24 plt.show()

 

 

 数据分析:水属性和火属性宝可梦侧重不同,如火属性宝可梦更侧重于攻击力,水属性宝可梦防御力稍高些(中间交叉更多原因是因为同一只宝可梦的进化后的种族值比进化前高)

 

 

五、全部代码

  1 import pandas as pd
  2 import matplotlib.pyplot as plt
  3 import seaborn as sns
  4 import plotly.graph_objects as go
  5 from matplotlib import font_manager
  6 from matplotlib import pyplot as plt
  7 
  8 
  9 
 10 # 查看系统当前字体
 11 fontnamelist = font_manager.get_font_names()
 12 
 13 # 解决图标中文乱码问题
 14 plt.rcParams['font.sans-serif'] = ['kaiti']
 15 
 16 # 读取CSV文件
 17 pokemon_data = pd.read_csv('Pokemon.csv')
 18 
 19 # 数据清洗
 20 pokemon_data = pokemon_data.drop_duplicates()
 21 # 删除重复行
 22 pokemon_data = pokemon_data.dropna() 
 23 # 删除缺失值
 24 
 25 # 将列名由英文转换为中文
 26 column_mapping = {
 27     "Name": "宝可梦名称",
 28     "Type 1": "种类1",
 29     "Type 2": "种类2",
 30     "Total": "总计",
 31     "HP": "生命值",
 32     "Attack": "攻击力",
 33     "Defense": "防御力",
 34     "Sp. Atk": "特殊攻击",
 35     "Sp. Def": "特殊防御",
 36     "Speed": "速度",
 37     "Generation": "世代",
 38     "Legendary": "传奇状态"
 39 }
 40 
 41 # 将输出的字段名由英文转换为中文
 42 pokemon_data.rename(columns=column_mapping, inplace=True)
 43 
 44 # 计算平均种族值
 45 pokemon_data["平均种族值"] = pokemon_data[["攻击力",
 46                                       "防御力", "特殊攻击",
 47                                       "特殊防御",
 48                                       "速度"]].mean(axis=1)
 49 
 50 # 统计种类1的数量
 51 type_counts_1 = pokemon_data["种类1"].value_counts()
 52 
 53 # 统计种类2的数量
 54 type_counts_2 = pokemon_data["种类2"].value_counts()
 55 
 56 # 合并两个统计结果
 57 type_counts = type_counts_1.add(type_counts_2, fill_value=0).astype(int)
 58 
 59 # 输出宝可梦属性表格
 60 poke_attributes = pokemon_data[["宝可梦名称",
 61                                 "攻击力", "防御力",
 62                                 "特殊攻击", "特殊防御",
 63                                 "速度", 
 64                                 "平均种族值"]]
 65 print(poke_attributes.to_string(index=False))
 66 
 67 # 统计宝可梦种类数量
 68 type_counts = pokemon_data["种类1"].value_counts()
 69 print("宝可梦种类数量:")
 70 print(type_counts)
 71 
 72 # 计算平均生命值
 73 average_hp = pokemon_data["生命值"].mean()
 74 print("平均生命值:", average_hp)
 75 
 76 # 计算最高攻击力和最低防御力
 77 max_attack = pokemon_data["攻击力"].max()
 78 min_defense = pokemon_data["防御力"].min()
 79 print("最高攻击力:", max_attack)
 80 print("最低防御力:", min_defense)
 81 
 82 # 按类型分组,计算每组的平均生命值
 83 grouped_by_type = pokemon_data.groupby("种类1")["生命值"].mean()
 84 print("按类型分组的平均生命值:")
 85 print(grouped_by_type)
 86 
 87 # 找出攻击力最高的宝可梦
 88 most_attacking_pokemon = pokemon_data[pokemon_data["攻击力"] == pokemon_data["攻击力"].max()]
 89 print("攻击力最高的宝可梦:")
 90 print(most_attacking_pokemon)
 91 
 92 # 找出防御力最低的宝可梦
 93 least_defensive_pokemon = pokemon_data[pokemon_data["防御力"] == pokemon_data["防御力"].min()]
 94 print("防御力最低的宝可梦:")
 95 print(least_defensive_pokemon)
 96 
 97 # 绘制宝可梦种类数量的柱状图
 98 plt.figure(figsize=(10, 6))
 99 sns.barplot(x=type_counts.index,
100             y=type_counts.values)
101 plt.title("宝可梦种类数量")
102 plt.xlabel("种类")
103 plt.ylabel("数量")
104 plt.show()
105 
106 # 绘制攻击力最高的宝可梦和防御力最低的宝可梦的散点图
107 plt.figure(figsize=(10, 6))
108 #创建散点图
109 plt.scatter(most_attacking_pokemon["攻击力"],
110             most_attacking_pokemon["防御力"])
111 plt.scatter(least_defensive_pokemon["攻击力"],
112             least_defensive_pokemon["防御力"])
113 #添加标题
114 plt.title("攻击力与防御力关系")
115 #x轴
116 plt.xlabel("攻击力")
117 #y轴
118 plt.ylabel("防御力")
119 plt.legend(["攻击力最高", "防御力最低"])
120 plt.show()
121 
122 # 绘制不同类型宝可梦的平均攻击力和平均防御力
123 average_stats_by_type = pokemon_data.groupby("种类1")[["攻击力", "防御力"]].mean()#进行分组
124 #设定大小为(106125 plt.figure(figsize=(10, 6))
126 #柱状图
127 average_stats_by_type.plot(kind="bar")
128 plt.title("不同类型宝可梦种族值的平均攻击力和平均防御力")
129 plt.xlabel("种类")
130 plt.ylabel("数值")
131 plt.show()
132 
133 # 绘制宝可梦的速度分布箱线图
134 plt.figure(figsize=(10, 6))
135 sns.boxplot(x="种类1", y="速度",
136             data=pokemon_data)
137 plt.title("宝可梦的速度种族值分布")
138 plt.xlabel("种类")
139 plt.ylabel("速度")
140 plt.xticks(rotation=90)
141 plt.show()
142 
143 # 绘制宝可梦的特攻与特防关系散点图
144 plt.figure(figsize=(10, 6))
145 plt.scatter(pokemon_data["特殊攻击"], 
146             pokemon_data["特殊防御"])
147 plt.title("宝可梦的特攻特防种族值分布")
148 plt.xlabel("特攻")
149 plt.ylabel("特防")
150 plt.show()
151 
152 # 绘制宝可梦生命值的直方图
153 plt.figure(figsize=(10, 6))
154 sns.histplot(pokemon_data["生命值"],
155              bins=20)
156 plt.title("宝可梦生命种族值分布")
157 plt.xlabel("生命值")
158 plt.ylabel("数量")
159 plt.show()
160 
161 # 绘制宝可梦生命值和攻击力的关系散点图
162 plt.figure(figsize=(10, 6))
163 plt.scatter(pokemon_data["种类1"],
164             pokemon_data["防御力"])
165 plt.title("克制属性的不同倍率")
166 plt.xlabel("属性")
167 plt.ylabel("倍数")
168 plt.show()
169 
170 # 绘制不同类型宝可梦的平均速度柱状图
171 average_speed_by_type = pokemon_data.groupby("种类1")["速度"].mean()
172 plt.figure(figsize=(10, 6))
173 sns.barplot(x=average_speed_by_type.index, y=average_speed_by_type.values)
174 plt.title("不同属性宝可梦的平均速度")
175 plt.xlabel("种类")
176 plt.ylabel("速度")
177 plt.xticks(rotation=90)
178 plt.show()
179 
180 # 绘制宝可梦的特攻分布箱线图
181 plt.figure(figsize=(10, 6))
182 sns.boxplot(x=pokemon_data["传奇状态"], 
183             y=pokemon_data["特殊攻击"])
184 plt.title("T1宝可梦的特攻分布")
185 plt.xlabel("传奇状态")
186 plt.ylabel("特攻")
187 plt.show()
188 
189 # 绘制不同类型宝可梦的平均总属性值条形图
190 pokemon_data["Total"] = pokemon_data["生命值"] + pokemon_data["攻击力"] + pokemon_data["防御力"] + \
191                         pokemon_data["特殊攻击"] + pokemon_data["特殊防御"] + pokemon_data["速度"]
192 average_total_by_type = pokemon_data.groupby("种类1")["Total"].mean()
193 plt.figure(figsize=(10, 6))
194 sns.barplot(x=average_total_by_type.index,
195             y=average_total_by_type.values)
196 plt.title("不同梯队宝可梦的平均总属性值")
197 plt.xlabel("属性")
198 plt.ylabel("总属性值")
199 plt.xticks(rotation=90)
200 plt.show()
201 
202 plt.figure(figsize=(8, 8))
203 plt.pie(attribute_counts, labels=attribute_counts.index, autopct='%1.1f%%', startangle=90)
204 plt.title("宝可梦属性占比饼图")
205 plt.axis('equal')  # 设置饼图为圆形
206 plt.show()
207 
208 # 绘制宝可梦生命值和攻击力的关系散点图
209 plt.figure(figsize=(10, 6))
210 plt.scatter(pokemon_data["种类1"],
211             pokemon_data["攻击力"])
212 plt.title("属性与攻击力关系")
213 plt.xlabel("属性")
214 plt.ylabel("攻击力")
215 plt.show()
216 
217 # 绘制不同类型宝可梦的平均速度柱状图
218 average_speed_by_type = pokemon_data.groupby("种类1")["速度"].mean()
219 plt.figure(figsize=(10, 6))
220 sns.barplot(x=average_speed_by_type.index,
221             y=average_speed_by_type.values)
222 plt.title("不同梯队宝可梦的平均速度")
223 plt.xlabel("种类")
224 plt.ylabel("速度")
225 plt.xticks(rotation=90)
226 plt.show()
227 
228 # 计算每种宝可梦的平均攻击力和防御力
229 average_stats = pokemon_data.groupby("种类1")[["攻击力", "防御力"]].mean()
230 
231 # 使用热力图绘制宝可梦的攻击力和防御力关系
232 plt.figure(figsize=(10, 8))
233 sns.heatmap(average_stats, annot=True, cmap="YlGnBu")
234 plt.title("宝可梦攻击力与防御力可知关系热力图")
235 plt.xlabel("指标")
236 plt.ylabel("种类1")
237 plt.show()
238 
239 #根据宝可梦的类型绘制分布不同属性的饼状图
240 grouped =pokemon_data.groupby(['种类1']).sum()
241 plt.pie(grouped['世代'], labels=grouped.index, autopct='%1.1f%%', startangle=90)
242 plt.axis('equal') # 让饼图保持圆形
243 plt.title('宝可梦类型分布')
244 plt.show()
245 
246 attribute_counts = pokemon_data["种类1"].value_counts()
247 
248 # 计算宝可梦速度属性的使用率
249 speed_counts = pokemon_data['速度'].value_counts().sort_index()
250 total_pokemon = speed_counts.sum()
251 speed_usage_rate = (speed_counts / total_pokemon) * 100
252 
253 # 绘制柱状图
254 plt.figure(figsize=(10, 6))
255 speed_bar = plt.bar(speed_usage_rate.index, speed_usage_rate.values)
256 plt.xlabel('速度')
257 plt.ylabel('使用率 (%)')
258 plt.title('宝可梦不同速度区间在排位中的使用率')
259 plt.show()
260 
261 #根据属性分组,找出最低速度
262 speed_grouped = pokemon_data.groupby('种类1')['速度'].min()
263 
264 # 根据速度排序
265 speed_sorted = speed_grouped.sort_values()
266 
267 # 绘制柱状图
268 plt.figure(figsize=(10, 6))
269 plt.bar(speed_sorted.index, speed_sorted.values)
270 plt.title('宝可梦属性最低速度排行')
271 plt.xlabel('属性')
272 plt.ylabel('最低速度')
273 plt.xticks(rotation=90)
274 plt.show()
275 
276 # 根据属性分组,计算平均速度
277 speed_grouped = pokemon_data.groupby('种类1')['速度'].mean()
278 
279 # 根据速度排序
280 speed_sorted = speed_grouped.sort_values()
281 #绘制各属性的速度分布
282 plt.figure(figsize=(10, 6))
283 plt.bar(speed_sorted.index, speed_sorted.values)
284 plt.title('宝可梦属性速度排行')
285 plt.xlabel('种类1')
286 plt.ylabel('平均速度')
287 plt.xticks(rotation=90)
288 plt.show()
289 
290 # 绘制宝可梦的攻击力直方图
291 plt.figure(figsize=(10, 6))
292  # 设置区间范围
293 bins = range(0, 200, 20) 
294  # 绘制直方图
295 plt.hist(pokemon_data["攻击力"], bins, histtype="bar", rwidth=0.8, color='#0ff0ff') 
296  # 设置 x 轴标签
297 plt.xlabel('攻击力') 
298  # 设置 y 轴标签
299 plt.ylabel('数量') 
300 # 设置标题
301 plt.title('宝可梦攻击力区间计算直方图')  
302 plt.show()
303 
304 # 选出种类1或种类2属性为火或水的宝可梦
305 fire_water_pokemon = pokemon_data[(pokemon_data["种类1"].isin(["Fire", "Water"])) | (pokemon_data["种类2"].isin(["Fire", "Water"]))]
306 
307 # 提取火属性和水属性宝可梦的攻击力和防御力数据
308 fire_attack = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Fire") | (fire_water_pokemon["种类2"] == "Fire")]["攻击力"]
309 fire_defense = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Fire") | (fire_water_pokemon["种类2"] == "Fire")]["防御力"]
310 water_attack = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Water") | (fire_water_pokemon["种类2"] == "Water")]["攻击力"]
311 water_defense = fire_water_pokemon[(fire_water_pokemon["种类1"] == "Water") | (fire_water_pokemon["种类2"] == "Water")]["防御力"]
312 
313 # 绘制散点图
314 plt.figure(figsize=(10, 6))
315 plt.scatter(fire_attack, fire_defense, c='r', marker='o', label='火属性')
316 plt.scatter(water_attack, water_defense, c='b', marker='s', label='水属性')
317 
318 # 添加标题和轴标签
319 plt.title("火属性和水属性宝可梦的攻击力与防御力对比")
320 plt.xlabel("攻击力")
321 plt.ylabel("防御力")
322 
323 # 显示图例
324 plt.legend()
325 
326 # 显示图像
327 plt.show()

六、总结

宝可梦的属性分布:通过分析宝可梦的属性分布情况,我们可以了解到各个属性的数量和比例。这有助于玩家在游戏中了解不同属性的宝可梦的种类和特点,从而更好地选择自己喜欢的宝可梦。

宝可梦的能力评估:通过分析宝可梦的各项能力指标,比如攻击力、防御力、速度等,我们可以评估宝可梦的实力和战斗能力。这对于玩家在游戏中选择合适的宝可梦进行战斗和训练非常有帮助。

克制关系的平衡性:宝可梦游戏中的克制关系是为了保持游戏的平衡性而存在的。虽然某些宝可梦对特定属性的宝可梦具有克制优势,但其他宝可梦可能对其具有克制反击的能力。这种平衡性使得玩家需要根据具体情况来选择合适的宝可梦和战术,以应对不同的对手和挑战。

元素属性的相互克制:在宝可梦游戏中,元素属性之间存在相互克制的关系。例如,水属性的宝可梦对火属性的宝可梦具有优势,而火属性的宝可梦对草属性的宝可梦具有优势。这种克制关系在战斗中起到了重要的作用,玩家可以根据宝可梦的属性来选择合适的战术和策略。

具体克制倍率的差异:除了元素属性之间的克制关系外,不同宝可梦之间的具体克制倍率也存在差异。有些宝可梦的技能对某个属性的宝可梦具有更高的克制倍率,使其在战斗中更具优势。这需要玩家仔细研究宝可梦之间的克制关系,并选择合适的技能进行战斗。

这些结论可以为宝可梦游戏的玩家、开发者和营销人员提供有价值的指导和决策支持。进一步的数据分析和研究将有助于我们深入了解宝可梦的世界,并为玩家提供更好的游戏体验