大数据分析期末报告
作者:夜阑
二○二三年五月
在这篇论文中,我们分析并建立了过山车的排名/评分模型,最终给出了一份排名/评分的列表。通过与其他网站的排名进行比较,发现我们的排名算法具有很高的社会认可度。 首先,我们处理了数据,包括清理数据、基于多元回归方法补充缺失数据、分析主成分并确定主要因素。通过分析,得出了主成分和主成分对目标的贡献,具体如下:
然后,我们为过山车构建了一个排名/评级模型。利用附录中的数据,我
们构建了不同判断因素下300 个过山车的排名,前 20 名如下(综合排名):
排名 | Name | P1 | P2 | P3 | R |
1 | Formula Rossa | 3.48 | -0.01 | 0.13 | 1.90 |
2 | Steel Dragon 2000 | 2.51 | 1.12 | 0.34 | 1.71 |
3 | Kingda Ka | 3.22 | -0.35 | 0.22 | 1.69 |
4 | Fury 325 | 2.55 | 0.65 | 0.34 | 1.61 |
5 | Top Thrill Dragster | 3.01 | -0.36 | 0.21 | 1.57 |
6 | Leviathan | 2.41 | 0.60 | 0.32 | 1.52 |
7 | Millennium Force | 2.44 | 0.54 | 0.32 | 1.52 |
8 | Red Force | 2.81 | -0.19 | 0.22 | 1.51 |
9 | Intimidator 305 | 2.38 | 0.44 | 0.32 | 1.46 |
10 | Fujiyama | 2.01 | 0.93 | 0.29 | 1.39 |
11 | Coaster Through the Clouds | 2.09 | 0.73 | 0.28 | 1.38 |
12 | Do-Dodonpa | 2.51 | -0.16 | 0.20 | 1.36 |
13 | Titan | 2.09 | 0.64 | 0.26 | 1.35 |
14 | Hyperion | 2.23 | 0.20 | 0.29 | 1.32 |
15 | Superman: Escape from Krypton | 2.59 | -0.55 | 0.27 | 1.31 |
16 | Silver Star | 1.95 | 0.77 | 0.26 | 1.30 |
17 | Shambhala | 2.04 | 0.56 | 0.27 | 1.30 |
18 | Tower of Terror II | 2.45 | -0.46 | 0.21 | 1.25 |
19 | Intimidator | 1.86 | 0.68 | 0.29 | 1.24 |
20 | Goliath | 1.96 | 0.56 | 0.17 | 1.24 |
最后,通过与其他网站的排名进行比较,我们发现前10名中平均有一半可以达到重合,这表明我们的排名算法具有较高的社会认可度。
关键词:过山车排名/评级 数据分析 多元回归
目录
2.2 缺失的数据分析和数据处理............................................................................. 6
在建立评级/排名模型时,做出了以下假设:
(i)假设不考虑过山车的地理位置和周围环境;
(ii)不考虑过山车外观和内部设计的影响;
(iii)不考虑过山车的施工时间
在我们的论文中会用到很多变量,本文只对可能影响的一些可量化变量进行分析处理。以下是它们代表的含义以及简写符号的总结:
变量名 | 变量含义 | 变量名 | 变量含义 |
H | Height (feet) | Du | Duration (sec) |
L | Length (feet) | G | G. Force |
N | Number of Inversions | V | Vertical Angle (degree) |
Dr | Drop (feet) | S | Speed (mph) |
通过分析标题中给出的集合变量对应的数据,发现“ Six Flags Over Georgia”公园的“Goliath”过山车高度(Height (feet))数据中带有单位(ft)
但其他过山车的高度数据均无有单位。我们还发现,在表格当中,其持续时间Duration (min:sec)时间变量不是以数值形式给出的而是以时间的形式给出的,这种时间格式不利于我们进行进一步的数据处理。我们对这个问题的数据清理方法如下:
第一步是移除“Georgia”的“Goliath”的高度单位数据。
第二步,将持续时间变量对应的数据转换为数值形式。我遭到了一些困难:首先我试图直接用Excel将数据转换为秒数,做辅助列首先将Duration (min:sec)列转为文本(例:=TEXT(Q2,“[s]”)),发现原格式表示的分钟:秒格式被Excel判定为时:分钟:秒格式,故所得文本数字比实际数字大60倍,且缺失值直接被填充为0,不利于我们的数据处理。于是再作一列将其格式转换为正确数值并将原本缺失转换后被填充为0的值重新处理为空值,再作一列(例:=IF(VALUE(R2)>0,VALUE(R2)/60," ")),得到期望数值,将该列命名为:持续时间(秒)。但是这个格式十分诡异,处理完毕的数据在后续数据处理出现缺失值数量不对的情况,怀疑处理过程中写入一些奇怪的东西,故弃置重头再来。虽然最后用python解决了,但是很诡异的是代码跑第一次未成功替换,将更改过的文件替换为第二次代码的源文件再次实验,成功。代码如下:
# 夜阑专用捏
# 开发时间:2023/5/24 20:41}
import pandas as pd
df = pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018副本.xlsx')# 读取Excel文件
def time_to_seconds(time_val): # 定义转换函数
if pd.isnull(time_val):
return time_val
if isinstance(time_val, str):
time_val = time_val.strip() # 去除空格
if time_val:
parts = time_val.split(':')
minutes = int(parts[0])
seconds = int(parts[1])
return minutes * 60 + seconds
else:
return None
elif isinstance(time_val, pd.Timestamp):
return time_val.minute * 60 + time_val.second
else:
return time_val# 将Duration (min:sec)列的数据转换为秒数并替换原数据
df['Duration (min:sec)'] = df['Duration (min:sec)'].apply(time_to_seconds)# 保存修改后的数据到新的Excel文件df.to_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx', index=False)
# 夜阑专用捏# 开发时间:2023/5/25 13:41}import pandas as pdimport matplotlib.pyplot as pltdata_Coaster=pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx')#读取文件# 计算每列的缺失值比例missing_percentages = data_Coaster.isnull().mean() * 100# 打印包含空值的列print(missing_percentages)# 绘制缺失值比例条形图plt.figure(figsize=(10, 6))missing_percentages.plot(kind='bar')plt.xlabel('Columns')plt.ylabel('Missing Values Percentage')plt.title('Missing Values Analysis')ax = missing_percentages.plot(kind='bar')for i, v in enumerate(missing_percentages): ax.text(i, v + 1, f'{v:.2f}%', ha='center')ax.text(0.02, 0.95, 'lyz', transform=ax.transAxes, ha='left', va='top')#lyz是我名字缩写plt.show()
通过python处理数据,分析其缺失值,代码如下:
图 2-1
分析表中数据,对其缺失值进行筛选画图(见 图 2-1),综合原表,发现数据可以分为三种类型:第一种,缺失大量数据;第二种,缺失少量数据。第三种,不缺失数据。我们分别用Q1、Q2、Q3来表示,有:
Q1 | Dr、G、V、Du |
Q2 | H、S、L |
Q3 | N |
- 对于{Q2}组中{H、S、L}三个缺失值较少(少于5%)的数据,将缺失值用序列平均值替换。其均值情况如下:
统计 | ||||
Height (feet) | Speed (mph) | Length (feet) | ||
个案数 | 有效 | 298 | 296 | 295 |
缺失 | 2 | 4 | 5 | |
平均值 | 135.300 | 59.677 | 3149.939 | |
中位数 | 116.500 | 55.900 | 3024.800 | |
众数 | 109.3a | 50.0 | 935.0a | |
a. 存在多个众数。显示了最小的值。 |
并将新生成的数据替换到原数据当中。
- 对于{Q1}组中{Dr、G、V、Du},试跟随老师的思想,使用多元回归方法构建模型,并对其可能值进行预测分析填充。
(a)Dr:
对于Dr,我们将其与已补全变量{H、S、L、N}进行分析,通过图2-2我们可以发现其与H、S的相关性较强,而对于L的相关性则不太明显。故我们对Dr、H、S、L、N之间的关系进行假设:
Dr =c1 + a11H + a12S + a13L + a14N
通过在python中进行多元回归拟合,(代码附文后由于重复多次故不在此处赘述)得到回归系数如下:
c1 = -134.024488,a11 = 0.012559,a12 = 4.654991a13 = -0.002976,
a14= -0.492044,模型相关系数为0.969111966194913。再将模型反代入原数据中并将Dr列缺失值补全(便捷起见此处直接使用的Excel公式,做辅助列计算,例如: =IF(VALUE(N2)>0,N2,-134.024488+0.012559*R2+4.654991*S2-0.002976*T2-0.492044*L2)) 最后将计算结果保存为数值并替换到原数据中并保存。
(b)G:
对于变量G,同样的,我们对其与其与已补全变量{H、S、L、N}进行分析有图2-3,可发现其对于L、N相关性较明显而对于L相关性不明显。故我们再次对G、H、S、L、N之间的关系做出第二个假设:
G =c2 + a21H + a22S + a23L + a24N
图2-2
图2-3
同样地,在python中进行多元回归拟合建模,发现回归系数如下:
c2 = 1.982453、a21= -0.004487、a22= 0.046926、a23= -0.000156、a24= 0.069489。 模型相关系数为0.750742699280788
同样操作,将预测值填入原Excel中并保存。
对于变量V,同样分析,有图2-4,对V、H、S、L、N之间的关系做出第三个假设:
V =c3 + a31H + a32S + a33L + a34N
图2-4
图2-5
同样地,在python中进行多元回归拟合建模,发现回归系数如下:
C3= 56.415870、a31= 0.016160、a32=0.437333、a33= -0.004619、a34= 1.057322。
同样操作,将预测值填入原Excel中并保存。
(d)Du
对于变量Du,同样分析,有图2-5,对Du、H、S、L、N之间的关系做出第四个假设:
Du=c4 + a41H + a42S + a43L + a44N
同样地,在python中进行多元回归拟合建模,发现回归系数如下:
C4= 100.479551、a41= 0.074510、a42=-0.960607、a43= 0.022762、a44= -0.247633。
同样操作,将预测值填入原Excel(C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx)中并保存。至此,我们的数据处理完毕。
通过对原始数据的分析与补全,我们现在有了完整的数据(参见
文档COMAP_RollerCoasterData_2018_updated)。我们将利用这些数据来分析影响过山车排名和评级的主要因素以及主要影响因素。在此过程中,我使用了spss软件将完整数据进行分析。
首先做出碎石图。碎石图展示了各成分特征根“陡坡势能”的变化过程,落差幅度越大,则其对应成分越重要,解释能力越强。一般而言。碎石图是前几个特征根陡坡落差幅度较大,越往后越平缓。在本文中,前三个陡坡落差幅度较大,因此构建三个主成分是合适的。
图3-1
结果如下:
总方差解释 | ||||||
成分 | 初始特征值 | 提取载荷平方和 | ||||
总计 | 方差百分比 | 累积 % | 总计 | 方差百分比 | 累积 % | |
1 | 3.440 | 42.999 | 42.999 | 3.440 | 42.999 | 42.999 |
2 | 2.060 | 25.751 | 68.751 | 2.060 | 25.751 | 68.751 |
3 | 1.074 | 13.420 | 82.171 | 1.074 | 13.420 | 82.171 |
4 | .574 | 7.171 | 89.342 | |||
5 | .443 | 5.542 | 94.885 | |||
6 | .263 | 3.289 | 98.174 | |||
7 | .131 | 1.636 | 99.810 | |||
8 | .015 | .190 | 100.000 | |||
提取方法:主成分分析法。 |
成分矩阵a | |||
成分 | |||
1 | 2 | 3 | |
Number of Inversions | -.229 | -.171 | .901 |
Drop (feet) | .976 | -.015 | .019 |
Duration (min:sec) | .124 | .825 | .128 |
G Force | .559 | -.482 | -.321 |
Vertical Angle (degrees) | .427 | -.680 | .323 |
Heightfeet | .876 | .081 | .143 |
Speedmph | .977 | -.001 | .031 |
Lengthfeet | .451 | .806 | .127 |
提取方法:主成分分析法。 | |||
提取了 3 个成分。 |
通过3.1,我们抽象出三个由原数据各因子线性组合变换后的主因子。通过对三个主成分因子的分析发现,第一个因子P1主要与“Drop (feet)落差”“Height(feet)高度”、“Speed(mph)速度、“G Force重力”有关,而这些变量的增加会增加过山车的刺激体验,因此将第一个因子定义为“刺激”指数。
第二个因子P2主要与“Length(feet)长度”、“Duration (min:sec)持续时间”有关,而这两个因子主要与过山车在一个周期内的时间长度有关,因此将该因子定义为“时间”指数。
第三个因子P3主要与“Number of Inversions反转次数”、“Vertical Angle (degrees)垂直角度”,这两个变量与参与者的眩晕程度有关,因此我们将其定义为“眩晕”指数。
三个主成分与8 个变量之间的关系如下:
图3-2
根据方案结果,三个指标(刺激指数、时间指数和眩晕指数)对主要目标(排名/评级指数)的贡献如下:刺激指数:54%;时间指数:26%;眩晕指数:20%。
在第三章中,我们建立了三个影响过山车排名/评级的指标,并计算了它们
对排名/评级指标的贡献。在这一章中,我们将建立排名/评级的数学模型,
然后通过第二章给出的数据和多元回归得到的数据来解决这个问题,最后展示
我们的排名。
由于排名/评级系统包含三个指标(刺激指数、时间指数和眩晕指数),我们建立如下的多目标优化模型:
其中 是P()的加权系数,是第 j 个过山车的第 i 个排名指数, R 是排名/评分指数。
对于在刺激、时间和眩晕方面有不同需求的用户就可以根据自己的实际需要,来选择不同的参数,然后计算出相应的排名/评级指数R,这样就可以对不同的过山车排名进行比较。
根据数据(COMAP_RollerCoasterData_2018_updated.xlsx),首先对所有数据使用最小-最大归一化模型进行标准化处理,然后根据主成分分析步骤中计算更多各变量与主成分之间线性关系再计算三个指标的p值,然后将其输入到多目标优化模型中计算相应的排名指数。此处使用python的 sklearn库中的MinMaxScaler类来进行归一化处理,并将数据输出保存为3.MinMaxScaler.xlsx。(代码附后文)。并在此根据这个表,计算出对应的三个p值:
Number of Inversions | -0.229 | -0.171 | 0.901 |
Drop (feet) | 0.976 | -0.015 | 0.019 |
Duration (min:sec) | 0.124 | 0.825 | 0.128 |
G Force | 0.559 | -0.482 | -0.321 |
Vertical Angle (degrees) | 0.427 | -0.680 | 0.323 |
Height(feet) | 0.876 | 0.081 | 0.143 |
Speed(mph) | 0.977 | -0.001 | 0.031 |
Length( feet) | 0.451 | 0.806 | 0.127 |
表4-1主成分因子表
由于事先已将数据用最小-最大归一化模型处理输出为3.MinMaxScaler.xlsx,故p值计算简便起见直接在Excel中利用函数直接输入表中对应系数与处理后数据相乘加和即可。方便起见,在首列将源文件中对应过山车名称。
按照我们的排名系统,综合排名前二十的过山车如下(表4-2),其中,P1、P2、P3系数分别为0.56、0.24、0.2。
排名 | Name | P1 | P2 | P3 | R |
1 | Formula Rossa | 3.48 | -0.01 | 0.13 | 1.90 |
2 | Steel Dragon 2000 | 2.51 | 1.12 | 0.34 | 1.71 |
3 | Kingda Ka | 3.22 | -0.35 | 0.22 | 1.69 |
4 | Fury 325 | 2.55 | 0.65 | 0.34 | 1.61 |
5 | Top Thrill Dragster | 3.01 | -0.36 | 0.21 | 1.57 |
6 | Leviathan | 2.41 | 0.60 | 0.32 | 1.52 |
7 | Millennium Force | 2.44 | 0.54 | 0.32 | 1.52 |
8 | Red Force | 2.81 | -0.19 | 0.22 | 1.51 |
9 | Intimidator 305 | 2.38 | 0.44 | 0.32 | 1.46 |
10 | Fujiyama | 2.01 | 0.93 | 0.29 | 1.39 |
11 | Coaster Through the Clouds | 2.09 | 0.73 | 0.28 | 1.38 |
12 | Do-Dodonpa | 2.51 | -0.16 | 0.20 | 1.36 |
13 | Titan | 2.09 | 0.64 | 0.26 | 1.35 |
14 | Hyperion | 2.23 | 0.20 | 0.29 | 1.32 |
15 | Superman: Escape from Krypton | 2.59 | -0.55 | 0.27 | 1.31 |
16 | Silver Star | 1.95 | 0.77 | 0.26 | 1.30 |
17 | Shambhala | 2.04 | 0.56 | 0.27 | 1.30 |
18 | Tower of Terror II | 2.45 | -0.46 | 0.21 | 1.25 |
19 | Intimidator | 1.86 | 0.68 | 0.29 | 1.24 |
20 | Goliath | 1.96 | 0.56 | 0.17 | 1.24 |
表4-2 综合排名前二十过山车
根据不同玩家的游玩偏好,我们也可以做出不同的排序。如果更多地从指数p1刺激指数的角度来考虑,根据我们的排名系统则有下表(表4-3)其中,P1、P2、P3系数分别为1、0、0。
排名 | Name | P1 | P2 | P3 | R |
1 | Formula Rossa | 3.48 | -0.01 | 0.13 | 1.90 |
2 | Kingda Ka | 3.22 | -0.35 | 0.22 | 1.69 |
3 | Top Thrill Dragster | 3.01 | -0.36 | 0.21 | 1.57 |
4 | Red Force | 2.81 | -0.19 | 0.22 | 1.51 |
5 | Superman: Escape from Krypton | 2.59 | -0.55 | 0.27 | 1.31 |
6 | Fury 325 | 2.55 | 0.65 | 0.34 | 1.61 |
7 | Do-Dodonpa | 2.51 | -0.16 | 0.20 | 1.36 |
8 | Steel Dragon 2000 | 2.51 | 1.12 | 0.34 | 1.71 |
9 | Tower of Terror II | 2.45 | -0.46 | 0.21 | 1.25 |
10 | Millennium Force | 2.44 | 0.54 | 0.32 | 1.52 |
表4-3 按刺激指数排名前十的过山车
如果更多地从指数p2时间指数的角度来考虑,根据我们的排名系统则有下表(表4-4)其中,P1、P2、P3系数分别为0、1、0
排名 | Name | P1 | P2 | P3 | R |
1 | Ultimate | 1.03 | 1.27 | 0.22 | 0.93 |
2 | Beast | 1.35 | 1.25 | 0.18 | 1.09 |
3 | Steel Dragon 2000 | 2.51 | 1.12 | 0.34 | 1.71 |
4 | Big Thunder Mountain | 0.72 | 0.95 | 0.19 | 0.68 |
5 | Fujiyama | 2.01 | 0.93 | 0.29 | 1.39 |
6 | Journey to Atlantis | 0.85 | 0.92 | 0.23 | 0.74 |
7 | Gao | 1.32 | 0.89 | 0.22 | 0.99 |
8 | Dragon Mountain | 1.06 | 0.89 | 0.55 | 0.91 |
9 | Temple of the Night Hawk | 0.38 | 0.88 | 0.17 | 0.47 |
10 | Incredicoaster | 1.12 | 0.80 | 0.26 | 0.86 |
表4-4 按时间指数排名前十的过山车
如果更多地从指数p2时间指数的角度来考虑,根据我们的排名系统则有下表(表4-5)其中,P1、P2、P3系数分别为0、0、1
排名 | Name | P1 | P2 | P3 | R |
1 | Smiler | 0.79 | 0.33 | 0.92 | 0.70 |
2 | Altair | 0.83 | 0.07 | 0.87 | 0.64 |
3 | Crazy Coaster | 0.83 | 0.07 | 0.87 | 0.64 |
4 | Velikolukskiy Myasokombinat-2 | 0.83 | 0.07 | 0.87 | 0.64 |
5 | 10 Inversion Roller Coaster | 0.61 | 0.04 | 0.86 | 0.51 |
6 | Colossus | 0.61 | 0.04 | 0.86 | 0.51 |
7 | Takabisha | 1.40 | -0.29 | 0.85 | 0.85 |
8 | Dragon Khan | 1.24 | 0.17 | 0.75 | 0.86 |
9 | Flight of the Phoenix | 0.78 | 0.10 | 0.72 | 0.59 |
10 | Viper | 1.44 | 0.24 | 0.71 | 0.98 |
表4-5 按眩晕指数排名前十的过山车
在这个环节,我们将对我们的实验模型结果对比现实数据对我们的模型进行进一步分析与改进。由于一些数据缺失和模型选择等方面的细微偏差以及一些其余可能影响的不可量化因素,并且所收集数据时间离现在间隔较长,我们的结果可能会与现实有所不同。
首先我们选取了https://www.douban.com/note/502230354/网站上综合排名前十的过山车对我们的模型进行对比:
Ranking given by the website | Ranking given by our model | ||
排名 | Name | 排名 | Name |
1th | Kingda Ka | 1 | Formula Rossa |
2th | Steel Dragon 2000 | 2 | Steel Dragon 2000 |
3th | Millennium Force | 3 | Kingda Ka |
4th | Top Thrill Dragster | 4 | Fury 325 |
5th | Do-Dodonpa | 5 | Top Thrill Dragster |
6th | Thunder Dolphin | 6 | Leviathan |
7th | Goliath | 7 | Millennium Force |
8th | Red Force | 8 | Red Force |
9th | Titan | 9 | Intimidator 305 |
10th | Smiler | 10 | Fujiyama |
表5-1
模型中有四个相同而六个不同,说明我们的模型社会认可度尚可.
接下来再选取
Ranking given by the website | Ranking given by our model | ||
排名 | Name | 排名 | Name |
1th | Top Thrill Dragster | 1 | Formula Rossa |
2th | Do-Dodonpa | 2 | Kingda Ka |
3th | Steel Dragon 2000 | 3 | Top Thrill Dragster |
4th | Formula Rossa | 4 | Red Force |
5th | Tower of Terror II | 5 | Superman: Escape from Krypton |
6th | Thunder Dolphin | 6 | Fury 325 |
7th | Smiler | 7 | Do-Dodonpa |
8th | Millennium Force | 8 | Steel Dragon 2000 |
9th | Takabisha | 9 | Tower of Terror II |
10th | Kingda Ka | 10 | Millennium Force |
表5-2
在本文中,我们使用了序列平均值替换、多元多项式回归的方法来确定缺失数据。然而,首先来说序列平均值并不一定能准确地描述数据,并且这些变量与并不一定具有良好的多项式关系。如何更好地、全方面因素地补全缺失数据是我们需要改进的一个点。
其次,我们的模型并没有将一些非量化因素考虑进去,例如过山车所处地理位置、环境、风格等。如何让更多的因素更准确地构造我们的模型,这是一个值得我们去深思改进的一个问题。
在我们的论文中,我们对过山车的排名/评级进行了分析和建模。我们开发了一个排名算法,最终给出了过山车的排名/评级列表。通过与其他网站的排名进行比较,我们发现我们的排名算法受到了较高的社会认可。此外,我们还设计了一个用户友好型的应用程序,利用我们的算法帮助用户找到他们想要乘坐的过山车。我们通过分析过山车的8个可量化参数(高度、速度、长度、倒转次数、落差、持续时间、G.力和垂直角度),采用多元回归方法,将这些参数综合为过山车排名的三个主要因素:刺激指数、时间指数和眩晕指数。根据个人偏好,用户可以选择一个或多个指标来得到相应的排名。
图6-1
全球最佳过山车排名算法发布!尽享刺激之旅!— 我们团队开发了一套突破性的过山车排名算法,为过山车爱好者带来令人振奋的消息!通过与其他网站的排名对比,我们的算法备受社会认可。它采用多元回归方法,分析了过山车的八个关键参数,并将其转化为刺激指数、时间指数和眩晕指数三个主要因素。
我们还推出了一款用户友好的应用程序,帮助您轻松找到心仪的过山车。根据个人偏好,我们的算法提供定制的排名,让您尽享完美刺激之旅!
我们团队致力于过山车行业的创新和卓越。通过我们的研究成果和应用程序,让全球过山车爱好者享受绝妙刺激体验!
参考:
- 9050-paper
- Liang Xiaoyun, Zhu Daping. 1994. The method and principle of sampling investigation. Shanghai: East China normal University Press.
- Schafer,J.,and J. Graham. 2002. “Missing Data: Our View of the State of the Art.” Psychological Methods 7:147-177
- Wilkinson, L. 2005. The Grammar of Graphics. New York: Springer-Verlag.
- 快速搞定学术论文中的三线表 - 知乎 (zhihu.com)
- 12种降维方法终极指南(含Python代码) - 知乎 (zhihu.com)
- https://www.rcdb.com.
- https://www.ultimaterollercoaster.com/.
- https://coasterpedia.net/.
- https://www.douban.com/note/502230354/
附录:
部分操作代码。时间可能经过代码优化而稍显错乱,另外所有操作并不都在python中进行,当方便时我也用spss和Excel。并且:若想试运行代码是否正确,请更改根目录为对应地址,安装对应库,并酌情把我注释掉的代码放出来。因为跑了很多遍所以有时影响运行速度和生成效果的代码我暂时将其注释了。
# 夜阑专用捏# 开发时间:2023/5/26 20:41}import pandas as pddf = pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018副本.xlsx')# 读取Excel文件def time_to_seconds(time_val): # 定义转换函数 if pd.isnull(time_val): return time_val if isinstance(time_val, str): time_val = time_val.strip() # 去除空格 if time_val: parts = time_val.split(':') minutes = int(parts[0]) seconds = int(parts[1]) return minutes * 60 + seconds else: return None elif isinstance(time_val, pd.Timestamp): return time_val.minute * 60 + time_val.second else: return time_val# 将Duration (min:sec)列的数据转换为秒数并替换原数据df['Duration (min:sec)'] = df['Duration (min:sec)'].apply(time_to_seconds)# 保存修改后的数据到新的Excel文件df.to_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx', index=False)
# 夜阑专用捏# 开发时间:2023/5/25 13:41}import pandas as pdimport matplotlib.pyplot as pltdata_Coaster=pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx')#读取文件# 计算每列的缺失值比例missing_percentages = data_Coaster.isnull().mean() * 100# 打印包含空值的列print(missing_percentages)# 绘制缺失值比例条形图plt.figure(figsize=(10, 6))missing_percentages.plot(kind='bar')plt.xlabel('Columns')plt.ylabel('Missing Values Percentage')plt.title('Missing Values Analysis')ax = missing_percentages.plot(kind='bar')for i, v in enumerate(missing_percentages): ax.text(i, v + 1, f'{v:.2f}%', ha='center')ax.text(0.02, 0.95, 'lyz', transform=ax.transAxes, ha='left', va='top')#lyz是我名字缩写#plt.show()
3.建模、缺失值替换 # 夜阑专用捏# 开发时间:2023/5/27 9:41}import pandas as pdimport statsmodels.api as smimport seaborn as snsimport matplotlib.pyplot as pltdf = pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx')df = df.dropna()# 处理缺失值df['Heightfeet'] = df['Heightfeet'].astype(float)df['Speedmph'] = df['Speedmph'].astype(float)df['Lengthfeet'] = df['Lengthfeet'].astype(float)df['Number of Inversions'] = df['Number of Inversions'].astype(float)df['Drop (feet)'] = df['Drop (feet)'].astype(float)df['G Force'] = df['G Force'].astype(float)df['Vertical Angle (degrees)'] = df['Vertical Angle (degrees)'].astype(float)df['Duration (min:sec)'] = df['Duration (min:sec)'].astype(float)'''# Dr 数据# 提取五个变量的子集variables1 = ['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions','Drop (feet)']subset =df[variables1]sns.pairplot(subset, kind='reg')# 绘制变量之间的散点图和回归线#plt.show()# 显示图形# 定义自变量X和因变量yX1= df[['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions']]y1= df['Drop (feet)']X1= sm.add_constant(X1)# 添加截距项model1 = sm.OLS(y1, X1)# 构建回归模型results1 = model1.fit()# 拟合数据print(results1.params)# 查看回归系数print(results1.rsquared)# 查看相关系数''''''# G 数据# 提取五个变量的子集variables2 = ['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions','G Force']subset =df[variables2]sns.pairplot(subset, kind='reg')# 绘制变量之间的散点图和回归线plt.show()# 显示图形# 定义自变量X和因变量yX2 = df[['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions']]y2 = df['G Force']X2 = sm.add_constant(X2)# 添加截距项model2 = sm.OLS(y2, X2)# 构建回归模型results2 = model2.fit()# 拟合数据print(results2.params)# 查看回归系数print(results2.rsquared)# 查看相关系数''' '''# V 数据# 提取五个变量的子集variables3 = ['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions','Vertical Angle (degrees)']subset3 =df[variables3]sns.pairplot(subset3, kind='reg')# 绘制变量之间的散点图和回归线plt.show()# 显示图形# 定义自变量X和因变量yX3 = df[['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions']]y3 = df['Vertical Angle (degrees)']X3 = sm.add_constant(X3)# 添加截距项model3 = sm.OLS(y3, X3)# 构建回归模型results3= model3.fit()# 拟合数据 print(results3.params)# 查看回归系数print(results3.rsquared)# 查看相关系数''' # Du 数据# 提取五个变量的子集variables4 = ['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions','Duration (min:sec)']subset4 =df[variables4]sns.pairplot(subset4, kind='reg')# 绘制变量之间的散点图和回归线plt.show()# 显示图形# 定义自变量X和因变量yX4 = df[['Heightfeet', 'Speedmph','Lengthfeet','Number of Inversions']]y4 = df['Duration (min:sec)']X4 = sm.add_constant(X4)# 添加截距项model4 = sm.OLS(y4, X4)# 构建回归模型results4= model4.fit()# 拟合数据 print(results4.params)# 查看回归系数print(results4.rsquared)# 查看相关系数
4.主成分分析
# 夜阑专用捏
# 开发时间:2023/5/27 13:46}
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 读取Excel数据
df = pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx')
# 提取需要进行主成分分析的列数据
data = df[['Height(feet', 'Speedmph','Lengthfeet','Number of Inversions','Drop (feet)','G Force','Vertical Angle (degrees)','Duration (min:sec)']]
# 执行主成分分析
pca = PCA()
pca.fit(data)
# 获取主成分分析的结果
component_matrix = pd.DataFrame(pca.components_, columns=data.columns)
explained_variance_ratio = pca.explained_variance_ratio_
cumulative_explained_variance_ratio = np.cumsum(explained_variance_ratio)
# 绘制碎石图
plt.plot(np.arange(1, len(explained_variance_ratio) + 1), cumulative_explained_variance_ratio, marker='o', linestyle='-', color='b')
plt.axhline(y=1, color='r', linestyle='--')
plt.axvline(x=np.where(cumulative_explained_variance_ratio >= 1)[0][0] + 1, color='r', linestyle='--')
plt.axhline(y=np.mean(cumulative_explained_variance_ratio), color='k', linestyle='--')
plt.xlabel('Number of Components')
plt.ylabel('Cumulative Explained Variance Ratio')
plt.title('Scree Plot')
#plt.show()
# 输出主成分分析的结果
print("Component Matrix:")
print(component_matrix)
print("\nExplained Variance Ratio:")
print(explained_variance_ratio)
print("\nCumulative Explained Variance Ratio:")
print(cumulative_explained_variance_ratio)
5.数字归一化
# 夜阑专用捏
# 开发时间:2023/5/27 20:52}
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
df = pd.read_excel(r'C:\Users\28377\Desktop\bigdata大作业\COMAP_RollerCoasterData_2018_updated.xlsx')
# 提取需要归一化的八列变量
variables = ['Number of Inversions','Drop (feet)','Duration (min:sec)','G Force','Vertical Angle (degrees)','Height(feet)', 'Speed(mph)','Length(feet)']
subset = df[variables]
scaler = MinMaxScaler()# 创建MinMaxScaler对象
normalized_data = scaler.fit_transform(subset)# 对数据进行归一化
normalized_df = pd.DataFrame(normalized_data, columns=variables)# 将归一化后的数据转换为DataFrame
# 将归一化后的数据写入Excel文件
normalized_df.to_excel(r'C:\Users\28377\Desktop\bigdata大作业\3.MinMaxScaler.xlsx', index=False)
版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2023/05/28/%e5%a4%a7%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e6%9c%9f%e6%9c%ab%e6%8a%a5%e5%91%8a/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论