根据医疗保险费用绘制 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()

结果是这样的:

现在我不确定一些事情:

如果你看一下 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()

示例输出: