【问题标题】:Bivariate CDF/CCDF Distribution Python双变量 CDF/CCDF 分布 Python
【发布时间】:2016-08-31 16:11:32
【问题描述】:

我正在尝试绘制具有xy 值的数据集的二元ccdf

单变量我可以很好地绘制,下面是输入,代码是单变量数据集。

输入:这些只是数据点的前 20 行。输入有 1000 行,其中 col[1]col[3] 需要绘制,因为它们具有用户和关键字频率关系。

tweetcricscore  34 #afgvssco   51
tweetcricscore  23 #afgvszim   46
tweetcricscore  24 #banvsire   12
tweetcricscore  456 #banvsned  46
tweetcricscore  653 #canvsnk   1
tweetcricscore  789 #cricket   178
tweetcricscore  625 #engvswi   46
tweetcricscore  86 #hkvssco    23
tweetcricscore  3 #indvsban    1
tweetcricscore  87 #sausvsvic  8
tweetcricscore  98 #wt20       56

代码:统一数据集

import numpy as np
import matplotlib.pyplot as plt
from pylab import*
import math
from matplotlib.ticker import LogLocator

data = np.genfromtxt('keyword.csv', delimiter=',', comments=None)

d0=data[:,1]
X0 = np.sort(d0)
cdf0 = np.arange(len(X0))/float(len(X0))
ccdf0 = 1 - cdf0
plt.plot(X0,ccdf0, color='b', marker='.', label='Keywords')

plt.legend(loc='upper right')
plt.xlabel('Freq (x)')
plt.ylabel('ccdf(x)')
plt.gca().set_xscale("log")
#plt.gca().set_yscale("log")
plt.show()

我正在为双变量数据点寻找一些选项。我提到了Seaborn Bivariate Distribution,但我无法将它与我的数据集放在适当的上下文中。

欢迎在 python、matplotlib、seaborn 中提出任何替代建议。 提前致谢。

【问题讨论】:

  • 您的示例在其中一列中只有 1 个不同的值,所以我不确定我是否看到了双变量密度估计的意义。
  • 我确实提到它只是前 20 行。数据已经排序。两列都有不同的值
  • 那么您应该更新您的示例以更具代表性。随机数据就足够了。
  • 您能否详细说明 col[0]、col[1]、col[2] 和 col[3] 中的值代表什么?我怀疑你有一些分类的东西(col[3] 是类别 ID 还是有意义的值?)。你可以建立一个累积分布函数,但它是不相关的,因为你的数据不是连续的,所以它是不可解释的(除了某个类别对 cdf 贡献了一定的百分比..)
  • col[0] 是一个用户,col[2] 是同一用户发布的关键词 col[1] 和 col[3] 分别是用户和关键词的频率。数据本质上是离散的,我试图在分类前后绘制这些数据的性质。

标签: python numpy matplotlib visualization seaborn


【解决方案1】:

您尝试描述的双变量分布通常是连续的,例如房屋的大小(输入,x)和价格(输出,y)。在您的情况下,没有有意义的关系(我认为)在关键字的编号中,因为它可能只是分配给关键字的 ID 对吗?

在我看来,您似乎有类别(关键字)。每个类别似乎有两个数字 tweetcricscorekeyword 数字。 \

你的代码在这里:

cdf0 = np.arange(len(X0))/float(len(X0))

对我来说,您的 x 范围只是它们的标签,而不是有意义的值。

可以找到更好的分类图来源here

要创建二元分布,假设您仍然希望阅读该分布,您可以使用您的数据作为示例,使用上面的数据执行以下操作:

import numpy as np
import seaborn as sns

col_1 = np.array([34, 23, 24, 456, 653, 789, 625, 86, 3, 87, 98])
col_3 = np.array([51, 46, 12, 46, 1, 178, 46, 23, 1, 8, 56])

sns.jointplot(x=col_3, y=col_1)

这里产生了非常荒谬的数字:

您必须手动添加 x 和 y 标签;这是因为您传递的是 numpy arrays 而不是 pandas Dataframes 这可以被认为是 dictionaries 其中字典中的每个键是列的标题,值是 numpy 数组.

使用随机数来展示它在更随机、连续、相关的数据集下的外观。

这是取自文档的示例。

import numpy as np
import seaborn as sns
import pandas as pd

mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df);

这给出了这个:

图表顶部的条形图可以被认为是单变量图表(您可能已经生成了),因为它们只描述了一个或另一个变量(x、或 y、col_3 或 col_1)的分布

【讨论】:

  • 感谢您的回答。关于用户和关键字之间的关系,是的,当我们看到输入时,我们不会直接看到它。我的目的是显示用户的活动频率col[1] 和同一用户使用的关键字col[3] 的频率之间的关系。前用户tweetcricscore 他的总活动频率是789,他从中使用了#cricket 关键字178 次。所以我想展示这种关系的本质。如果我可能提出了错误的问题,请纠正我,但这是我一直在搜索的内容,但找不到任何相关内容。
  • 所以如果我理解正确的话,有很多推特用户(例如tweetcricscore)和很多标签。他的“总活动频率”代表什么?
  • 是的 twitter 用户和关键字.. 活动频率是用户发帖、转发或回复其他人的次数.. 用户出现的次数..
  • 我在某处读到了关于采用相应 xy 值的 mean 并绘制该 mean 值的 ccdf 也是解决方案之一。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2014-09-07
  • 2015-07-20
相关资源
最近更新 更多