matplotlib 绘制带有重尾数据的Pandas直方图

yhived7q  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(192)

我经常处理有很长尾巴的数据,我想用直方图来概括分布,但当我尝试使用Pandas时,我得到的是一个条形图,只有一个巨大的可见条形,其他的都是不可见的。
下面是我正在使用的序列的一个例子,因为它很长,所以我使用了value_counts(),这样它就可以适合这个页面。

In [10]: data.value_counts.sort_index()

Out[10]:
0          8012
25         3710
100       10794
200       11718
300        2489
500        7631
600          34
700         115
1000       3099
1200       1766
1600         63
2000       1538
2200         41
2500        208
2700       2138
5000        515
5500        201
8800         10
10000        10
10900       465
13000         9
16200        74
20000       518
21500        65
27000        64
53000        82
56000         1
106000       35
530000        3

我猜答案是把不太常见的结果分成更大的组(53000、56000、106000和53000分成一个〉50000的组,等等),并且改变y索引来表示出现的百分比而不是绝对数字,但是,我不知道我将如何自动地做到这一点。

0s7z1bwu

0s7z1bwu1#

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

mydict = {0: 8012,25: 3710,100: 10794,200: 11718,300: 2489,500: 7631,600: 34,700: 115,1000: 3099,1200: 1766,1600: 63,2000: 1538,2200: 41,2500: 208,2700: 2138,5000: 515,5500: 201,8800: 10,10000: 10,10900: 465,13000: 9,16200: 74,20000: 518,21500: 65,27000: 64,53000: 82,56000: 1,106000: 35,530000: 3}
mylist = []

for key in mydict:
for e in range(mydict[key]):
    mylist.insert(0,key)

df = pd.DataFrame(mylist,columns=['value'])
df2 = df[df.value <= 5000]

绘制为条形图:

fig = df.value.value_counts().sort_index().plot(kind="bar")
plt.savefig("figure.png")

作为直方图(限于值5000 &以下是〉97%的数据):我喜欢用linspace来控制桶。

df2 = df[df.value <= 5000]
df2.hist(bins=np.linspace(0,5000,101))
plt.savefig('hist1')

编辑:将np.linspace(0,5000,100)更改为np.linspace(0,5000,101)并更新直方图。

67up9zun

67up9zun2#

通常,heavy tail distributions以幂律尾结尾,例如Pareto distribution,在这种情况下,一个powerfull表示将是log-log plot,这在python中很容易实现,见例如。

请注意,提取一些值可能是查看幂律分布的低效方法。
还要考虑数据的Pareto analysis
如果你对幂律分布感兴趣,你可以阅读更多关于分类数据在构造上本质上是幂律的事实,因为它们不能被排序,这是Vitold Belevitch在1959年的一个结果。

相关问题