A documentação diz:
http://pandas.pydata.org/pandas-docs/dev/basics.html
"Valores contínuos podem ser discretizados usando as funções cut (bins baseados em valores) e qcut (bins baseados em quantis de amostra)"
Parece muito abstrato para mim ... posso ver as diferenças no exemplo abaixo, mas o que qcut (quantil de amostra) realmente significa / significa? Quando você usaria qcut versus cut?
Obrigado.
factors = np.random.randn(30)
In [11]:
pd.cut(factors, 5)
Out[11]:
[(-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (0.575, 1.561], ..., (-0.411, 0.575], (-1.397, -0.411], (0.575, 1.561], (-2.388, -1.397], (-0.411, 0.575]]
Length: 30
Categories (5, object): [(-2.388, -1.397] < (-1.397, -0.411] < (-0.411, 0.575] < (0.575, 1.561] < (1.561, 2.547]]
In [14]:
pd.qcut(factors, 5)
Out[14]:
[(-0.348, 0.0899], (-0.348, 0.0899], (0.0899, 1.19], (0.0899, 1.19], (0.0899, 1.19], ..., (0.0899, 1.19], (-1.137, -0.348], (1.19, 2.547], [-2.383, -1.137], (-0.348, 0.0899]]
Length: 30
Categories (5, object): [[-2.383, -1.137] < (-1.137, -0.348] < (-0.348, 0.0899] < (0.0899, 1.19] < (1.19, 2.547]]`
Respostas:
Para começar, observe que quantis é apenas o termo mais geral para coisas como percentis, quartis e medianas. Você especificou cinco caixas em seu exemplo, então está pedindo
qcut
quintis.Portanto, quando você solicitar quintis com
qcut
, as caixas serão escolhidas de forma que você tenha o mesmo número de registros em cada caixa. Você tem 30 registros, então deve ter 6 em cada compartimento (sua saída deve ser assim, embora os pontos de interrupção sejam diferentes devido ao sorteio aleatório):Por outro lado,
cut
você verá algo mais desigual:Isso porque
cut
escolherá os bins para serem espaçados uniformemente de acordo com os próprios valores e não a frequência desses valores. Conseqüentemente, como você tirou de uma normal aleatória, você verá frequências mais altas nas caixas internas e menos nas externas. Esta será essencialmente uma forma tabular de um histograma (que você esperaria ter em forma de sino com 30 registros).fonte
cut
ou pode se preocupar mais com os 5% mais altos e usarqcut
fonte
Portanto, o qcut garante uma distribuição mais uniforme dos valores em cada compartimento, mesmo se eles se agruparem no espaço amostral. Isso significa que é menos provável que você tenha um compartimento cheio de dados com valores muito próximos e outro compartimento com 0 valores. Em geral, é uma amostragem melhor.
fonte
Pd.qcut distribui os elementos de um array ao fazer a divisão com base em ((no.of elementos no array) / (no. De bins - 1)), então divida este tanto no. de elementos em série em cada caixa.
Pd.cut distribui os elementos de um array ao fazer a divisão com base em ((primeiro + último elemento) / (no. De bins-1)) e, em seguida, distribui o elemento de acordo com a faixa de valores em que eles caem.
fonte