pandas.qcut และ pandas.cut ต่างกันอย่างไร?


98

เอกสารระบุว่า:

http://pandas.pydata.org/pandas-docs/dev/basics.html

"ค่าต่อเนื่องสามารถแยกออกได้โดยใช้ฟังก์ชันการตัด (ถังขยะตามค่า) และ qcut (ถังขยะตามจำนวนตัวอย่าง)"

ฟังดูเป็นนามธรรมมากสำหรับฉัน ... ฉันเห็นความแตกต่างในตัวอย่างด้านล่าง แต่qcut (ควอนไทล์ตัวอย่าง) ทำอะไร / หมายความว่าอย่างไร? คุณจะใช้ qcut กับ cut เมื่อใด

ขอบคุณ.

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]]`

คำตอบ:


223

ในการเริ่มต้นโปรดทราบว่าควอนไทล์เป็นเพียงคำทั่วไปสำหรับสิ่งต่างๆเช่นเปอร์เซ็นไทล์ควอไทล์และค่ามัธยฐาน คุณระบุห้าถังในตัวอย่างของคุณดังนั้นคุณจึงขอqcutquintiles

ดังนั้นเมื่อคุณขอ quintiles ด้วยqcutถังขยะจะถูกเลือกเพื่อให้คุณมีจำนวนบันทึกเท่ากันในแต่ละถัง คุณมีระเบียน 30 รายการดังนั้นควรมี 6 รายการในแต่ละถัง (ผลลัพธ์ของคุณควรมีลักษณะเช่นนี้แม้ว่าเบรกพอยต์จะแตกต่างกันเนื่องจากการสุ่มจับ):

pd.qcut(factors, 5).value_counts()

[-2.578, -0.829]    6
(-0.829, -0.36]     6
(-0.36, 0.366]      6
(0.366, 0.868]      6
(0.868, 2.617]      6

ในทางกลับกันcutคุณจะเห็นสิ่งที่ไม่สม่ำเสมอมากขึ้น:

pd.cut(factors, 5).value_counts()

(-2.583, -1.539]    5
(-1.539, -0.5]      5
(-0.5, 0.539]       9
(0.539, 1.578]      9
(1.578, 2.617]      2

นั่นเป็นเพราะcutจะเลือกถังขยะให้มีระยะห่างเท่า ๆ กันตามค่าตัวเองและไม่ใช่ความถี่ของค่าเหล่านั้น ดังนั้นเนื่องจากคุณดึงจากค่าปกติแบบสุ่มคุณจะเห็นความถี่ที่สูงขึ้นในถังด้านในและด้านนอกน้อยลง โดยพื้นฐานแล้วนี่จะเป็นรูปแบบตารางของฮิสโตแกรม (ซึ่งคุณคาดว่าจะเป็นรูประฆังที่มี 30 ระเบียน)


คำตอบที่ดีสำหรับสิ่งที่เป็น คุณช่วยพูดได้ไหมว่าทำไมคุณถึงเลือกที่อื่น?
James Hulse

5
@JamesHulse นั่นเป็นคำถามที่ยุติธรรม แต่ฉันไม่มีคำตอบทั่วไป มันขึ้นอยู่กับว่าคุณกำลังมองหาการวัดสัมบูรณ์เทียบกับการวัดแบบสัมพัทธ์ (ควอนไทล์) มากกว่าสิ่งอื่นใด พิจารณาความสูงเช่นคุณอาจสนใจความสูงสัมพัทธ์ (สูงเกิน 6 ฟุต) และใช้cutหรือคุณอาจสนใจมากกว่า 5% ที่สูงที่สุดและใช้งานqcut
JohnE

19
  • คำสั่ง cut สร้างถังขยะที่เท่ากันแต่ความถี่ของตัวอย่างไม่เท่ากันในแต่ละถัง
  • คำสั่ง qcut สร้างถังขยะขนาดไม่เท่ากันแต่ความถี่ของตัวอย่างเท่ากันในแต่ละถัง

ป้อนคำอธิบายภาพที่นี่

    >>> x=np.array([24,  7,  2, 25, 22, 29])
    >>> x
    array([24,  7,  2, 25, 22, 29])

    >>> pd.cut(x,3).value_counts() #Bins size has equal interval of 9
    (2, 11.0]        2
    (11.0, 20.0]     0
    (20.0, 29.0]     4

    >>> pd.qcut(x,3).value_counts() #Equal frequecy of 2 in each bins
    (1.999, 17.0]     2
    (17.0, 24.333]    2
    (24.333, 29.0]    2

1
x, bins = pd.cut (list_of_values, bins = 10, label = list (range (10,0, -1)), retbins = True) สิ่งนี้มีประโยชน์ในการรับ bins
Dev_Man

9

ดังนั้น qcut จึงมั่นใจได้ว่าการกระจายค่าในแต่ละถังจะมีความสม่ำเสมอมากขึ้นแม้ว่าจะรวมกลุ่มในพื้นที่ตัวอย่างก็ตาม ซึ่งหมายความว่าคุณมีโอกาสน้อยที่จะมีถังข้อมูลที่มีค่าใกล้เคียงมากและอีกถังหนึ่งที่มีค่า 0 โดยทั่วไปแล้วการสุ่มตัวอย่างจะดีกว่า


-1

Pd.qcut แจกจ่ายองค์ประกอบของอาร์เรย์ในการแบ่งตาม ((จำนวนองค์ประกอบในอาร์เรย์) / (จำนวนถังขยะ - 1)) จากนั้นหารจำนวนมากนี้ ขององค์ประกอบตามลำดับในแต่ละถังขยะ

Pd.cut แจกจ่ายองค์ประกอบของอาร์เรย์ในการแบ่งตาม ((องค์ประกอบแรก + สุดท้าย) / (หมายเลข bins-1)) จากนั้นกระจายองค์ประกอบตามช่วงของค่าที่ตกอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.