ปัจจัยใน R: ตัวแปรหมวดหมู่และตัวแปรต่อเนื่อง
⚡ สรุปอย่างชาญฉลาด
ในภาษา R นั้น Factor จะจัดเก็บข้อมูลเชิงหมวดหมู่เป็นเวกเตอร์ของรหัสจำนวนเต็มที่จับคู่กับชุดของระดับ ซึ่งเป็นวิธีที่ภาษานี้ใช้แยกกลุ่มหมวดหมู่ที่มีจำนวนจำกัดออกจากการวัดแบบต่อเนื่อง

ปัจจัยใน R คืออะไร?
ปัจจัยในอาร์ แฟกเตอร์ (Factor) คือตัวแปรที่ใช้ในการจัดหมวดหมู่และจัดเก็บข้อมูล โดยมีค่าที่แตกต่างกันได้จำนวนจำกัด โดยจะจัดเก็บข้อมูลในรูปแบบเวกเตอร์ของค่าจำนวนเต็ม แฟกเตอร์ใน R ยังเป็นที่รู้จักในชื่อตัวแปรเชิงหมวดหมู่ (categorical variable) ที่เก็บทั้งค่าสตริงและค่าจำนวนเต็มเป็นระดับ โดยส่วนใหญ่แล้ว แฟกเตอร์จะใช้ในการสร้างแบบจำลองทางสถิติและการวิเคราะห์ข้อมูลเชิงสำรวจด้วย R
ภายในแล้ว แฟคเตอร์ประกอบด้วยวัตถุสองชิ้นที่เดินทางไปด้วยกัน ได้แก่ เวกเตอร์จำนวนเต็มของรหัส และคุณลักษณะที่เป็นอักขระชื่อ... ระดับแต่ละรหัสเป็นตำแหน่งในเวกเตอร์ระดับนั้น ซึ่งเป็นเหตุผลว่าทำไมการพิมพ์แฟกเตอร์จึงแสดงเป็นคำ ในขณะที่ คลาส() แสดงตัวเลข
ในชุดข้อมูล เราสามารถแยกแยะตัวแปรได้สองประเภท: เด็ดขาด และ ต่อเนื่องกัน.
- ในสถิติเชิงพรรณนาสำหรับตัวแปรเชิงหมวดหมู่ใน R ค่าจะถูกจำกัดและโดยปกติจะขึ้นอยู่กับกลุ่มจำกัดเฉพาะ ตัวอย่างเช่น ตัวแปรหมวดหมู่ใน R อาจเป็นประเทศ ปี เพศ อาชีพ
- อย่างไรก็ตาม ตัวแปรต่อเนื่องสามารถรับค่าใดก็ได้ ตั้งแต่จำนวนเต็มไปจนถึงทศนิยม ตัวอย่างเช่น เราสามารถมีรายได้ ราคาหุ้น เป็นต้น
ความแตกต่างนี้ควรค่าแก่การจดจำ เพราะ R จะเลือกค่าเริ่มต้นที่แตกต่างกันสำหรับแต่ละกรณีโดยไม่แจ้งให้ทราบล่วงหน้า คอลัมน์ตัวเลขจะถูกสรุปด้วยค่าเฉลี่ยและค่ามัธยฐาน ในขณะที่คอลัมน์ประเภทแฟกเตอร์จะถูกสรุปด้วยจำนวนนับต่อระดับ ดังนั้น การจัดเก็บหมวดหมู่เป็นข้อความหรือเป็นตัวเลขจึงเปลี่ยนการวิเคราะห์ที่คุณได้รับ ชุดโหมดการจัดเก็บที่ครอบคลุมมากขึ้นจะกล่าวถึงในคู่มือ ประเภทข้อมูลและตัวดำเนินการในภาษา R.
ตัวแปรหมวดหมู่
ตัวแปรหมวดหมู่ใน R ค่าต่างๆ จะถูกเก็บไว้ในตัวแปรประเภทแฟกเตอร์ ลองตรวจสอบโค้ดด้านล่างเพื่อแปลงตัวแปรประเภทอักขระให้เป็นตัวแปรประเภทแฟกเตอร์ในภาษา R รูทีนการสร้างแบบจำลองและการเรียนรู้ของเครื่องจำนวนมากไม่สามารถประมวลผลข้อความดิบได้ ดังนั้นหมวดหมู่ต่างๆ จึงต้องถูกเข้ารหัสเป็นระดับหรือเป็นตัวเลขก่อนที่จะทำการสร้างแบบจำลอง
วากยสัมพันธ์
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
เอกสารอ้างอิงพื้นฐานของ R ระบุข้อโต้แย้งเพิ่มเติมอีกสองประการที่รูปแบบย่อข้างต้นละเว้นไป: ไม่รวมซึ่งจะลบค่าออกก่อนที่จะสร้างชุดระดับ และ เอ็นแม็กซ์ซึ่งเป็นขีดจำกัดสูงสุดของจำนวนระดับที่ช่วยเร่งความเร็วในการแปลงเวกเตอร์ขนาดใหญ่มาก
ข้อโต้แย้ง:
- x: เวกเตอร์ของข้อมูลเชิงหมวดหมู่ใน R ต้องเป็นสตริงหรือจำนวนเต็ม ไม่ใช่เลขฐานสิบ
- ระดับ: เวกเตอร์ของค่าที่เป็นไปได้ที่ x สามารถรับได้ อาร์กิวเมนต์นี้เป็นตัวเลือก ค่าเริ่มต้นคือรายการที่ไม่ซ้ำกันของค่าในเวกเตอร์ x ซึ่งเรียงลำดับจากน้อยไปมาก
- ฉลาก: เพิ่มป้ายกำกับให้กับข้อมูลประเภท x ใน R ตัวอย่างเช่น 1 สามารถใช้เป็นป้ายกำกับเพศชาย และ 0 สามารถใช้เป็นป้ายกำกับเพศหญิง
- ไม่รวม: เวกเตอร์ของค่าที่จะถูกตัดออกเมื่อสร้างเซตระดับ ค่าที่ถูกตัดออกจะกลายเป็น NA ในผลลัพธ์
- สั่งซื้อ: ตัวบ่งชี้เชิงตรรกะที่ใช้กำหนดว่าระดับต่างๆ ควรเรียงลำดับตามลำดับที่กำหนดหรือไม่
- เอ็นแม็กซ์: ขีดจำกัดบนของจำนวนระดับ (ซึ่งเป็นตัวเลือกเสริม มีประโยชน์สำหรับเวกเตอร์ที่มีความยาวมาก)
ตัวอย่าง:
มาแปลงเวกเตอร์อักขระให้เป็นแฟกเตอร์และตรวจสอบการเปลี่ยนแปลงด้วยฟังก์ชัน class() กัน
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
Output:
## [1] "character" ## [1] "factor"
คลาสเปลี่ยนจากอักขระเป็นแฟกเตอร์ แต่ค่าที่พิมพ์ออกมายังคงเหมือนเดิม การแปลงค่าเป็นสิ่งสำคัญ เชือก แปลงเป็นตัวแปรแฟกเตอร์ใน R ก่อนนำไปใช้กับงานแมชชีนเลิร์นนิง เนื่องจากนั่นคือจุดที่หมวดหมู่ต่างๆ กลายเป็นชุดที่แน่นอนและได้รับการตรวจสอบแล้ว
ตัวแปรหมวดหมู่ใน R สามารถแบ่งออกเป็น ตัวแปรหมวดหมู่ที่ระบุ และ ตัวแปรเด็ดขาดลำดับ.
ตัวแปรหมวดหมู่ที่กำหนด
ตัวแปรเชิงหมวดหมู่แบบนาม (Nominal categorical variable) มีค่าได้หลายค่า แต่ลำดับไม่สำคัญ ตัวอย่างเช่น เพศชายหรือเพศหญิง ตัวแปรเชิงหมวดหมู่แบบนามใน R ไม่มีการกำหนดลำดับใดๆ
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
Output:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
จากค่า factor_color เราไม่สามารถบอกลำดับได้ รายการระดับเรียงตามตัวอักษรเท่านั้น เนื่องจากไม่ได้ระบุอาร์กิวเมนต์ระดับไว้ ดังนั้น R จึงเรียงลำดับค่าที่ไม่ซ้ำกันเอง การเรียงลำดับนั้นเป็นไปตามภาษาท้องถิ่นที่ใช้งานอยู่ ไม่ใช่ ASCII ทั่วไป ซึ่งเป็นเหตุผลหนึ่งที่ต้องระบุระดับอย่างชัดเจนทุกครั้งที่ลำดับมีความสำคัญ
ตัวแปรหมวดหมู่ลำดับ
ตัวแปรเชิงหมวดหมู่แบบเรียงลำดับมีลำดับตามธรรมชาติ การจัดอันดับมาจากการเรียงลำดับของเวกเตอร์ที่ส่งผ่านไปยังตัวแปรนั้น ระดับ การตั้งค่า ordered = TRUE จะบอกให้ R ถือว่าลำดับนั้นเป็นการจัดอันดับ แทนที่จะเป็นเพียงรายการธรรมดา การตั้งค่า ordered = FALSE จะไม่กลับลำดับ แต่จะสร้างแฟกเตอร์ที่ไม่เรียงลำดับธรรมดาขึ้นมา หากต้องการจัดอันดับจากสูงสุดไปต่ำสุด ให้กลับลำดับของเวกเตอร์ระดับนั้นเอง
ตัวอย่าง:
เราสามารถใช้การสรุปเพื่อนับค่าสำหรับตัวแปรแต่ละตัวใน R
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
Output:
## [1] evening morning afternoon midday
midnight evening
คอนโซลจะแสดงค่าต่างๆ ก่อน แล้วจึงแสดงอันดับไว้ด้านล่าง บล็อกถัดไปเริ่มต้นด้วยบรรทัด Levels ที่ยังคงถูกคอมเมนต์ไว้ เพื่อให้อันดับยังคงมองเห็นได้ในขณะที่การเรียกใช้ summary() ถูกเพิ่มเข้าไปในโค้ดก่อนหน้า
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Output:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R เรียงลำดับระดับจาก 'เช้า' ถึง 'เที่ยงคืน' ตามที่ระบุไว้ในอาร์กิวเมนต์ levels เนื่องจากปัจจัยมีการเรียงลำดับ ตัวดำเนินการเปรียบเทียบ เช่น < และ > จึงสามารถใช้งานได้ ซึ่งใช้ไม่ได้กับปัจจัยสีแบบระบุชื่อข้างต้น
ตัวแปรต่อเนื่อง
ตัวแปรคลาสแบบต่อเนื่องเป็นค่าเริ่มต้นใน R โดยจะถูกจัดเก็บเป็นตัวเลขหรือจำนวนเต็ม เราสามารถเห็นได้จากชุดข้อมูลด้านล่าง mtcars เป็นชุดข้อมูลในตัวที่รวบรวมข้อมูลเกี่ยวกับรถยนต์ประเภทต่างๆ เราสามารถนำเข้าได้โดยใช้ mtcars และตรวจสอบคลาสของตัวแปร mpg (ไมล์ต่อแกลลอน) ซึ่งจะส่งคืนค่าตัวเลข แสดงว่าตัวแปรนี้เป็นตัวแปรต่อเนื่อง
dataset <- mtcars class(dataset$mpg)
เอาท์พุต
## [1] "numeric"
ไม่ใช่ทุกคอลัมน์ตัวเลขจะเป็นค่าต่อเนื่องอย่างแท้จริง ในชุดข้อมูลเดียวกัน คอลัมน์ cyl เก็บค่าได้เพียง 4, 6 และ 8 ในขณะที่คอลัมน์ am เก็บค่าได้เพียง 0 และ 1 ดังนั้นทั้งสองจึงเป็นหมวดหมู่ที่บังเอิญถูกจัดเก็บในรูปแบบตัวเลข การแปลงค่าด้วยฟังก์ชัน factor() ก่อนการสร้างแบบจำลองจะช่วยป้องกันไม่ให้ R ถือว่าช่องว่างระหว่าง 4 และ 6 กระบอกสูบเป็นปริมาณที่วัดได้ ส่วนการดำเนินการตรงกันข้าม คือการแบ่งคอลัมน์ต่อเนื่องออกเป็นช่วงๆ นั้น สามารถทำได้โดยใช้ฟังก์ชัน cut()
ระดับปัจจัยและป้ายกำกับใน R
คุณลักษณะระดับ (levels) เป็นส่วนหนึ่งของปัจจัยที่คุณจะใช้เวลาปรับแต่งมากที่สุด เพราะมันควบคุมทั้งสิ่งที่พิมพ์ออกมาและสิ่งที่โมเดลใช้เป็นค่าพื้นฐาน ตัวช่วยพื้นฐานสี่ตัวของ R ครอบคลุมเกือบทุกกรณี
| ฟังก์ชัน | สิ่งที่มันไม่ | การใช้งานทั่วไป |
|---|---|---|
| ระดับ(f) | อ่านหรือแทนที่ชื่อระดับ | เปลี่ยนชื่อย่อให้เป็นป้ายกำกับที่อ่านง่าย |
| nระดับ(f) | ส่งคืนจำนวนระดับ | การตรวจสอบพบว่าหมวดหมู่ไม่ได้เกิดข้อผิดพลาดหลังจากการเชื่อมต่อ |
| relevel(f, ref) | เลื่อนไปด้านหน้าหนึ่งระดับ | การเลือกเส้นฐานสำหรับการถดถอย |
| ระดับดรอป(f) | ลบระดับที่มีค่าสังเกตการณ์เป็นศูนย์ออก | การทำความสะอาดหลังจากการเลือกกลุ่มย่อยหรือการกรอง |
บล็อกด้านล่างนี้ใช้ทั้งสี่ปัจจัยกับสีและเพศที่สร้างขึ้นก่อนหน้านี้
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
มีรายละเอียดสองอย่างที่ควรจดจำ การกำหนดค่าให้กับ levels() จะเปลี่ยนชื่อตามตำแหน่ง ดังนั้นเวกเตอร์ที่ไม่ตรงกันจะเปลี่ยนชื่อหมวดหมู่ผิดโดยไม่แจ้งให้ทราบ และชุดย่อยจะเก็บระดับเดิมทั้งหมดไว้จนกว่าจะมีการเรียกใช้ droplevels() ซึ่งเป็นเหตุผลว่าทำไมการกรองจึงจำเป็น กรอบข้อมูล ยังสามารถพล็อตแท่งว่างเปล่าได้ ฉลาก เหตุผลก็แตกต่างออกไปอีก: มันตั้งชื่อระดับต่างๆ ในขณะสร้าง และป้ายกำกับที่ซ้ำกันจะรวมค่าอินพุตหลายค่าเข้าเป็นระดับเดียว
วิธีการแปลงแฟกเตอร์เป็นตัวเลขหรืออักขระใน R
นี่คือข้อผิดพลาดที่พบบ่อยที่สุดเกี่ยวกับตัวแปรประเภท Factor ใน R เนื่องจาก Factor เก็บค่าเป็นรหัสจำนวนเต็ม การเรียกใช้เมธอด as.numeric() จะคืนค่าเป็นรหัสเหล่านั้นแทนที่จะเป็นค่าที่แสดงบนหน้าจอ ตัวอย่างเช่น Factor ของปี 2021 ถึง 2023 จะได้ค่ากลับมาเป็น 1, 2 และ 3
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
เอกสารพื้นฐานของ R แนะนำให้ใช้ as.numeric(levels(f))[f] เป็นวิธีที่ถูกต้องและเร็วกว่าเล็กน้อย โดยมี as.numeric(as.character(f)) เป็นวิธีที่อ่านง่ายกว่า ทั้งสองวิธีจะอ่านป้ายกำกับก่อนแล้วจึงแปลงในภายหลัง
- ปัจจัยที่ส่งผลต่อลักษณะนิสัย: as.character(f) ส่งคืนป้ายกำกับเป็นข้อความธรรมดา
- การแยกตัวประกอบเป็นรหัสจำนวนเต็ม: as.integer(f) หรือ unclass(f) เมื่อรหัสเป็นสิ่งที่คุณต้องการจริงๆ
- ตัวละครต่อปัจจัย: factor(x) หรือทางลัดที่เร็วกว่าอย่าง as.factor(x)
- แปลงตัวเลขเป็นตัวประกอบ: factor(x) สำหรับรหัสแบบไม่ต่อเนื่อง, cut(x, breaks) สำหรับค่าต่อเนื่องที่ต้องการการจัดกลุ่ม
มีมาตรการป้องกันอย่างหนึ่งที่ใช้ได้กับทุกกรณี หากค่าใน x ไม่ปรากฏในเวกเตอร์ระดับ ฟังก์ชัน factor() จะตั้งค่าองค์ประกอบนั้นเป็น NA แทนที่จะแสดงข้อผิดพลาด ดังนั้นช่องว่างที่ไม่พึงประสงค์หรือความแตกต่างของตัวพิมพ์ใหญ่และตัวพิมพ์เล็กอาจทำให้แถวถูกลบไปโดยไม่รู้ตัว การเปรียบเทียบค่าที่ไม่ซ้ำกันก่อนและหลังการแปลง หรือ การเรียงลำดับเฟรมข้อมูล การเพิ่มคอลัมน์ใหม่ทำให้เห็นปัญหาได้อย่างชัดเจน
ใน R ตัวแปรประเภท Factor, Character และ Numeric: ควรใช้แบบไหนในสถานการณ์ใด
การเลือกโหมดการจัดเก็บข้อมูลตั้งแต่เนิ่นๆ จะช่วยลดเวลาในการแก้ไขข้อผิดพลาดในภายหลังได้มาก ตารางนี้เปรียบเทียบโหมดทั้งสามที่คอลัมน์ของข้อความหรือโค้ดสามารถใช้ได้
| อสังหาริมทรัพย์ | ปัจจัย | คาแรคเตอร์ | เป็นตัวเลข |
|---|---|---|---|
| จัดเก็บเป็น | รหัสจำนวนเต็มบวกคุณลักษณะระดับ | Strings | Doubles หรือจำนวนเต็ม |
| ชุดค่าคงที่ | ใช่ กำหนดโดยระดับ | ไม่ | ไม่ |
| การสั่งซื้อจอแสดงผลแบบกำหนดเอง | ใช่ ผ่านหลายระดับ | เรียงตามตัวอักษรเท่านั้น | เฉพาะตัวเลข |
| คณิตศาสตร์ | ไม่ได้รับอนุญาต | ไม่ได้รับอนุญาต | ได้รับอนุญาต |
| ความแตกต่างของแบบจำลอง | สร้างโดยอัตโนมัติ | ถูกบังคับก่อน | ถือเป็นการวัดผล |
ใช้ ปัจจัย เมื่อค่าต่างๆ มาจากรายการที่ทราบและปิดสนิท เมื่อลำดับการแสดงผลหรือการจัดอันดับมีความสำคัญ หรือเมื่อคอลัมน์นั้นป้อนข้อมูลให้กับแบบจำลองหรือคำอธิบายแผนภูมิ ให้ใช้ ตัวอักษร สำหรับข้อความอิสระ ตัวระบุ และสิ่งใดก็ตามที่คุณจะนำมาแยกวิเคราะห์หรือเชื่อมต่อ เช่น ชื่อ บันทึก และรหัสที่ปรากฏขึ้นเรื่อยๆ พร้อมค่าใหม่ๆ ให้ใช้ เป็นตัวเลข เฉพาะเมื่อระยะห่างระหว่างค่าสองค่านั้นมีความหมายเท่านั้น
ตารางด้านล่างแสดงวิธีตรวจสอบสิ่งที่คุณมีอยู่ได้อย่างรวดเร็วที่สุด
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
มีสองวิธีที่จะทำให้การเลือกเป็นไปอย่างเที่ยงตรง คือ รัน sapply(df, class) หลังจากการนำเข้าทุกครั้ง เพราะอักขระผิดที่เพียงตัวเดียวในคอลัมน์ตัวเลขจะทำให้ทั้งคอลัมน์กลายเป็นข้อความ และแปลงเป็นแฟกเตอร์ให้ช้าที่สุดเท่าที่จะเป็นไปได้ หลังจากที่ทำความสะอาดและรวมข้อมูลแล้ว เพื่อให้ ดีพลีร์ การเชื่อมต่อและการกรองยังคงเปรียบเทียบสตริงธรรมดา ไม่ใช่ชุดระดับที่ไม่ตรงกัน
