双变量CDF / CCDF分发Python

时间:2016-05-05 18:40:56

标签: python numpy matplotlib visualization seaborn

我正在尝试绘制具有ccdfx值的数据集的双变量y

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

输入:这些只是数据点的前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

代码:univeriate dataset

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 个答案:

答案 0 :(得分:2)

您尝试描述的双变量分布通常是连续的,例如房屋的大小(输入,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)

这产生了非常荒谬的人物:

enter image description here

您必须手动添加x和y标签;这是因为您传递了numpy array而不是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);

这给出了这个:

enter image description here

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