根据医疗保险费用绘制 bmi
Plotting bmi against medical insurance charges
我有一个这样的数据框(来自 df.head()
):
以及我将其转换为 numpy 数组后的数据帧。
array([[1.90000000e+01, 2.79000000e+01, 0.00000000e+00, 1.68849240e+04],
[1.80000000e+01, 3.37700000e+01, 1.00000000e+00, 1.72555230e+03],
[2.80000000e+01, 3.30000000e+01, 3.00000000e+00, 4.44946200e+03],
[3.30000000e+01, 2.27050000e+01, 0.00000000e+00, 2.19844706e+04],
[3.20000000e+01, 2.88800000e+01, 0.00000000e+00, 3.86685520e+03]])
我有这段代码,尝试针对 charges
绘制 bmi
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(20, 8))
bmi = df["bmi"]
charges = df["charges"]
ax.plot(bmi, label="bmi")
ax.plot(charges, label="charges")
ax.legend()
plt.show()
结果是这样的:
现在我不确定一些事情:
- 如果我没有画错,这意味着我不确定它是针对 bmi 的,指控还是针对 bmi 的指控。如果我一起做
ax.plot(bmi, charges)
我会得到这个:
- 或者如果比较
bmi[0]
和 charges[0]
,bmi 的值与费用相比非常小,这就是为什么 bmi 由于非常小的值而被视为一条直线。
- 我预计 BMI 越高,保险费用越高。但是当我查看最接近 34 的 BMI 时,与小于 24 的人的 BMI 相比,费用非常低。而且我不太确定如何解释图表。
如果你看一下 documentation of matplotlib.pyplot.plot()
,你会发现第一个参数是自变量(x 轴变量),第二个参数是因变量(y 轴变量)。
根据您的问题,我了解到您希望可视化保险费用如何随 bmi 变化。在这种情况下,charges
将位于 y 轴上,而 bmi
将位于 x 轴上。
案例一:
如果您不想保留列表中的实际顺序,则需要按升序对两个列表进行排序以获得线性相关性,如下所示:
import matplotlib.pyplot as plt
import numpy as np
bmi = [33.770, 33.000, 22.705, 28.880]
charges = [16884.92400, 1725.55230, 449.46200, 21984.47061]
plt.plot(np.sort(bmi), np.sort(charges))
plt.ylabel('Charges')
plt.xlabel('BMI')
plt.show()
示例输出:
这就是您的代码显示不同结果的原因:
- 在第一个代码片段中,当您执行
ax.plot(bmi, label="bmi"), ax.plot(charges, label="charges")
;由于未指定 x 轴,因此它根据元素的索引绘制了两个未排序的列表。
- 在第二个代码片段中,当您执行
ax.plot(bmi,charges)
而不进行排序时,它会给出您获得的结果(假设您有相同大小的列表)。但是正如您提到的,当 bmi 较高时,您预计费用会更高,我假设您需要排序。
更新:案例 2:
根据对初始答案的评论,您正在从数据框中获取数据。在这种情况下,理想情况下,您应该根据 bmi
值对数据框进行排序,然后采用相应的 charges
值进行绘图。这是一个例子:
import pandas as pd
##### replace this portion with your actual dataframe #######
df = pd.DataFrame(columns = ['bmi','charges'])
df['bmi'] = bmi
df['charges'] = charges
bmi = [33.770, 33.000, 22.705, 28.880]
charges = [16884.92400, 1725.55230, 449.46200, 21984.47061]
##############################################################
df = df.sort_values('bmi')
plt.plot(df['bmi'], df['charges'])
plt.ylabel('Charges')
plt.xlabel('BMI')
plt.show()
示例输出:
我有一个这样的数据框(来自 df.head()
):
以及我将其转换为 numpy 数组后的数据帧。
array([[1.90000000e+01, 2.79000000e+01, 0.00000000e+00, 1.68849240e+04],
[1.80000000e+01, 3.37700000e+01, 1.00000000e+00, 1.72555230e+03],
[2.80000000e+01, 3.30000000e+01, 3.00000000e+00, 4.44946200e+03],
[3.30000000e+01, 2.27050000e+01, 0.00000000e+00, 2.19844706e+04],
[3.20000000e+01, 2.88800000e+01, 0.00000000e+00, 3.86685520e+03]])
我有这段代码,尝试针对 charges
bmi
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(20, 8))
bmi = df["bmi"]
charges = df["charges"]
ax.plot(bmi, label="bmi")
ax.plot(charges, label="charges")
ax.legend()
plt.show()
结果是这样的:
现在我不确定一些事情:
- 如果我没有画错,这意味着我不确定它是针对 bmi 的,指控还是针对 bmi 的指控。如果我一起做
ax.plot(bmi, charges)
我会得到这个:
- 或者如果比较
bmi[0]
和charges[0]
,bmi 的值与费用相比非常小,这就是为什么 bmi 由于非常小的值而被视为一条直线。 - 我预计 BMI 越高,保险费用越高。但是当我查看最接近 34 的 BMI 时,与小于 24 的人的 BMI 相比,费用非常低。而且我不太确定如何解释图表。
如果你看一下 documentation of matplotlib.pyplot.plot()
,你会发现第一个参数是自变量(x 轴变量),第二个参数是因变量(y 轴变量)。
根据您的问题,我了解到您希望可视化保险费用如何随 bmi 变化。在这种情况下,charges
将位于 y 轴上,而 bmi
将位于 x 轴上。
案例一:
如果您不想保留列表中的实际顺序,则需要按升序对两个列表进行排序以获得线性相关性,如下所示:
import matplotlib.pyplot as plt
import numpy as np
bmi = [33.770, 33.000, 22.705, 28.880]
charges = [16884.92400, 1725.55230, 449.46200, 21984.47061]
plt.plot(np.sort(bmi), np.sort(charges))
plt.ylabel('Charges')
plt.xlabel('BMI')
plt.show()
示例输出:
这就是您的代码显示不同结果的原因:
- 在第一个代码片段中,当您执行
ax.plot(bmi, label="bmi"), ax.plot(charges, label="charges")
;由于未指定 x 轴,因此它根据元素的索引绘制了两个未排序的列表。 - 在第二个代码片段中,当您执行
ax.plot(bmi,charges)
而不进行排序时,它会给出您获得的结果(假设您有相同大小的列表)。但是正如您提到的,当 bmi 较高时,您预计费用会更高,我假设您需要排序。
更新:案例 2:
根据对初始答案的评论,您正在从数据框中获取数据。在这种情况下,理想情况下,您应该根据 bmi
值对数据框进行排序,然后采用相应的 charges
值进行绘图。这是一个例子:
import pandas as pd
##### replace this portion with your actual dataframe #######
df = pd.DataFrame(columns = ['bmi','charges'])
df['bmi'] = bmi
df['charges'] = charges
bmi = [33.770, 33.000, 22.705, 28.880]
charges = [16884.92400, 1725.55230, 449.46200, 21984.47061]
##############################################################
df = df.sort_values('bmi')
plt.plot(df['bmi'], df['charges'])
plt.ylabel('Charges')
plt.xlabel('BMI')
plt.show()
示例输出: