我有一个包含我试图识别异常值的数字的PDF。
trtbps=[145 130 130 120 120 140 140 120 172 150 140 130 130 110 150 120 120 150 150 140 135 130 140 150 140 160 150 110 140 130 105 120 130 125 125 142 135 150 155 160 140 130 104 130 140 120 140 138 128 138 130 120 130 108 135 134 122 115 118 128 110 108 118 135 140 138 100 130 120 124 120 94 130 140 122 135 125 140 128 105 112 128 102 152 102 115 118 101 110 100 124 132 138 132 112 142 140 108 130 130 148 178 140 120 129 120 160 138 120 110 180 150 140 110 130 120 130 120 105 138 130 138 112 108 94 118 112 152 136 120 160 134 120 110 126 130 120 128 110 128 120 115 120 106 140 156 118 150 120 130 160 112 170 146 138 130 130 122 125 130 120 132 120 138 138 160 120 140 130 140 130 110 120 132 130 110 117 140 120 150 132 150 130 112 150 112 130 124 140 110 130 128 120 145 140 170 150 125 120 110 110 125 150 180 160 128 110 150 120 140 128 120 118 145 125 132 130 130 135 130 150 140 138 200 110 145 120 120 170 125 108 165 160 120 130 140 125 140 125 126 160 174 145 152 132 124 134 160 192 140 140 132 138 100 160 142 128 144 150 120 178 112 123 108 110 112 180 118 122 130 120 134 120 100 110 125 146 124 136 138 136 128 126 152 140 140 134 154 110 128 148 114 170 152 120 140 124 164 140 110 144 130 130]
使用箱线图,我能够识别如下所示的6个异常值
但是,当我手动尝试使用 IQR 计算异常值时,我得到了 9 个不同的异常值,如下所示。
#Calculating the IQR
IQR = df.trtbps.quantile(0.75) - df.trtbps.quantile(0.25)
#Calculating the upper and lower boundaries
lower_bridge=df['trtbps'].quantile(0.25)-(IQR*1.5)
upper_bridge=df['trtbps'].quantile(0.75)+(IQR*1.5)
print(lower_bridge), print(upper_bridge)
#Printing the outliers in trtbps column based on upper and lower boundaries
print(df[(df['trtbps'] > upper_bridge) | (df['trtbps'] < lower_bridge)])
输出:
trtbps
8 172
101 178
110 180
203 180
223 200
241 174
248 192
260 178
266 180
问题是为什么箱线图和手动计算的异常值之间的异常值计数不匹配?他们两个之间的计数不应该相同吗?
异常值是一样的。你只是不能在箱线图中计算它们,因为其中三个的值是180,两个的值是178。这两组将在图中各显示一个点。这就是三个“缺失”点的原因。