중간고사 문제풀이 (24 Spring)

Author

Hyun Jhin Lee

문제

palmerpenguins 패키지의 내장 데이터인 penguins 데이터를 가지고, 데이터로 알 수 있는 팽귄들의 현황에 대하여 10개 이상의 관점에서 의미있는 인사이트를 도출하시오.

데이터 분석 결과는 qmd 파일 또는 R 파일로 클래스룸에 제출하시오.

palmerpenguins 패키지에 대하여

#install.packages("palmerpenguins")
library(palmerpenguins)
help(package="palmerpenguins") ## ?? palmerpenguins

palmerpenguins 패키지는 R에서 데이터 시각화와 분석을 위해 사용되는 패키지이다. 이 패키지는 Palmer Archipelago (Antarctica)에 서식하는 펭귄들의 데이터를 포함하고 있으며, penguins 데이터셋에는 펭귄의 종류, 섬, 부리 길이(mm), 부리 깊이(mm), 플리퍼 길이(mm), 그리고 몸무게(g) 등의 여러 변수들이 기록되어 있다.

penguins 데이터셋은 세 종류의 펭귄 (Adelie, Chinstrap, Gentoo)과 세 개의 섬 (Torgersen, Biscoe, Dream)에서 수집된 데이터를 포함하고 있다.

data(package="palmerpenguins") 

penguins 데이터와 penguins_raw 데이터가 존재함.

penguins 데이터에 대하여

str(penguins)
'data.frame':   344 obs. of  8 variables:
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num  39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
 $ bill_depth_mm    : num  18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
 $ flipper_length_mm: int  181 186 195 NA 193 190 181 195 193 190 ...
 $ body_mass_g      : int  3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
 $ year             : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
  1. penguin 데이터는 8개 항목에 대한 344개의 측정값이 있으며, species, island, sex항목은 factor, 부리 길이, 부리 넓이는 numeric, 날개 길이와 몸무게, 년도는 integer 값이다.
head(penguins) #View(penguins)도 가능
  species    island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
1  Adelie Torgersen           39.1          18.7               181        3750
2  Adelie Torgersen           39.5          17.4               186        3800
3  Adelie Torgersen           40.3          18.0               195        3250
4  Adelie Torgersen             NA            NA                NA          NA
5  Adelie Torgersen           36.7          19.3               193        3450
6  Adelie Torgersen           39.3          20.6               190        3650
     sex year
1   male 2007
2 female 2007
3 female 2007
4   <NA> 2007
5 female 2007
6   male 2007

데이터 목록을 보니 결측값이 있다.

sum(is.na(penguins)) #is.na(penguins)하면 모든 값의 na여부가 나옴 
[1] 19
penguins_n <- na.omit(penguins)
sum(is.na(penguins_n))
[1] 0
str(penguins_n)
'data.frame':   333 obs. of  8 variables:
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num  39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
 $ bill_depth_mm    : num  18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
 $ flipper_length_mm: int  181 186 195 193 190 181 195 182 191 198 ...
 $ body_mass_g      : int  3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 1 2 1 2 1 2 2 ...
 $ year             : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
 - attr(*, "na.action")= 'omit' Named int [1:11] 4 9 10 11 12 48 179 219 257 269 ...
  ..- attr(*, "names")= chr [1:11] "4" "9" "10" "11" ...
  1. 19개의 결측값을 na.omit( )으로 제외하여 결측 없는 333개의 penguins_n값으로 분석함.
summary(penguins)
      species          island    bill_length_mm  bill_depth_mm  
 Adelie   :152   Biscoe   :168   Min.   :32.10   Min.   :13.10  
 Chinstrap: 68   Dream    :124   1st Qu.:39.23   1st Qu.:15.60  
 Gentoo   :124   Torgersen: 52   Median :44.45   Median :17.30  
                                 Mean   :43.92   Mean   :17.15  
                                 3rd Qu.:48.50   3rd Qu.:18.70  
                                 Max.   :59.60   Max.   :21.50  
                                 NA's   :2       NA's   :2      
 flipper_length_mm  body_mass_g       sex           year     
 Min.   :172.0     Min.   :2700   female:165   Min.   :2007  
 1st Qu.:190.0     1st Qu.:3550   male  :168   1st Qu.:2007  
 Median :197.0     Median :4050   NA's  : 11   Median :2008  
 Mean   :200.9     Mean   :4202                Mean   :2008  
 3rd Qu.:213.0     3rd Qu.:4750                3rd Qu.:2009  
 Max.   :231.0     Max.   :6300                Max.   :2009  
 NA's   :2         NA's   :2                                 
  1. 데이터를 요약해보면, 펭귄의 종류는 adelie, chinstrap, gentoo가 있고, 각각 152, 68, 124개의 측정값이 있다. 측정한 섬은 Biscoe, Dream, Torgersen이 있고, Torgersen의 측정량은 52개로 다른 섬보다 적다. 부리 길이의 평균은 43.92mm, 부리 깊이 17.15mm, 날개 200.9mm, 몸무게 4202g이 평균값이다. 성별은 암, 수 165, 168마리이며, 성별 구분되지 않은 11마리가 있다. 측정 시점은 2007, 2008, 2009년에 걸쳐 측정했다. 측정 년도는 factor로 바꾸는 것이 필요할 것 같다.
library(psych)
describe(penguins_n)
                  vars   n    mean     sd median trimmed    mad    min    max
species*             1 333    1.92   0.89    2.0    1.90   1.48    1.0    3.0
island*              2 333    1.65   0.71    2.0    1.57   1.48    1.0    3.0
bill_length_mm       3 333   43.99   5.47   44.5   43.98   6.97   32.1   59.6
bill_depth_mm        4 333   17.16   1.97   17.3   17.19   2.22   13.1   21.5
flipper_length_mm    5 333  200.97  14.02  197.0  200.36  16.31  172.0  231.0
body_mass_g          6 333 4207.06 805.22 4050.0 4159.46 889.56 2700.0 6300.0
sex*                 7 333    1.50   0.50    2.0    1.51   0.00    1.0    2.0
year                 8 333 2008.04   0.81 2008.0 2008.05   1.48 2007.0 2009.0
                   range  skew kurtosis    se
species*             2.0  0.16    -1.72  0.05
island*              2.0  0.62    -0.85  0.04
bill_length_mm      27.5  0.04    -0.90  0.30
bill_depth_mm        8.4 -0.15    -0.91  0.11
flipper_length_mm   59.0  0.36    -0.98  0.77
body_mass_g       3600.0  0.47    -0.75 44.13
sex*                 1.0 -0.02    -2.01  0.03
year                 2.0 -0.08    -1.49  0.04
  1. 각 값의 표준편차 값이 크지 않고, 평균과 trimed 값이 큰 차이가 나지 않는 것으로 보아 팽귄의 측정값이 극단적인 값은 적은 것으로 보인다. 부리 길이와 몸무게는 최소, 최대 값이 평균과 많이 차이나서 극단적인 개체가 있다.

데이터의 항목별 요약

penguins_n$year <-as.factor(penguins_n$year) #측정 년도를 factor data로 변경함.
str(penguins_n)
'data.frame':   333 obs. of  8 variables:
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num  39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
 $ bill_depth_mm    : num  18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
 $ flipper_length_mm: int  181 186 195 193 190 181 195 182 191 198 ...
 $ body_mass_g      : int  3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 1 2 1 2 1 2 2 ...
 $ year             : Factor w/ 3 levels "2007","2008",..: 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "na.action")= 'omit' Named int [1:11] 4 9 10 11 12 48 179 219 257 269 ...
  ..- attr(*, "names")= chr [1:11] "4" "9" "10" "11" ...
boxplot(penguins_n$bill_length_mm, col="yellow3", main="팽귄의 부리 길이 분포")

boxplot(penguins_n$bill_depth_mm,col="pink3", main="팽귄의 부리 깊이 분포")

boxplot(penguins_n$flipper_length_mm,col="green4", main="팽귄의 날개 길이 분포")

plot(penguins_n$flipper_length_mm, col=penguins_n$species,main="팽귄의 날개 길이 분포(모든 개체)")

boxplot(penguins_n$body_mass_g, main="팽귄의 몸무게 분포")

  1. 부리 길이, 깊이, 날개 길이, 몸무게의 숫자형 데이터들을 시각화 하였다. 각 데이터의 단위가 달라서 그래프를 한번에 비교하는 것은 어렵다. 날개 길이의 경우는 평균보다 작은 값들의 분포가 좁은 것을 볼 수 있다. 부리 길이와 몸무게는 3/4 이상 값이 상대적으로 넓게 분포한다. 날개 길이 값의 분포가 3개 그룹인 것을 볼 때, 종 별로 길이 값이 다를 것으로 생각된다.

범주형 변수 별 수치형 변수의 값 분포 (종별, 성별, 년도, 서식지 별)

plot(penguins_n$bill_length_mm ~penguins_n$species,col="yellow3", main="종 별 부리 길이 비교")

plot(penguins_n$bill_depth_mm ~penguins_n$species, col="pink3",main="종 별 부리 깊이 비교")

plot(penguins_n$flipper_length_mm ~penguins_n$species,col="green4", main="종 별 날개 길이 비교")

plot(penguins_n$body_mass_g ~penguins_n$species, main="종 별 몸무게 비교")

  1. 부리 길이는 Adelie가 짧은 편이다. 부리 깊이는 Gentoo가 얕다.날개 길이는 Gentoo가 길다. 몸무게도 Gentoo가 무겁다. 전체적으로 볼 때 Gentoo가 다른 종과 차별점이 많다.
library(lattice)
histogram(~penguins_n$bill_length_mm|penguins_n$sex, main="성별 부리 길이 분포", col="yellow3", type="count" )

histogram(~penguins_n$flipper_length_mm|penguins_n$sex, main="성별 날개 길이 분포",col="green4", type="count")

histogram(~penguins_n$body_mass_g|penguins_n$sex, main="성별 몸무게 분포", col="grey", type="count")

  1. 부리 길이는 수컷이 큰 편이고, 날개 길이는 수컷이 고르게 분포되어 있다. 몸무게도 수컷이 전체적으로 무거우면서 분포가 고르다.
histogram(~penguins_n$bill_length_mm|penguins_n$year, main="년도별 부리 길이 분포", type="percent", col="yellow3")

histogram(~penguins_n$flipper_length_mm|penguins_n$year, main="년도별 날개 길이 분포", type="percent", col="green4")

histogram(~penguins_n$body_mass_g|penguins_n$year, main="년도별 몸무게 분포", type="percent",col="grey")

  1. 부리 길이는 년도별로 의미 있는 차이가 보이지 않고, 날개 길이와 몸무게는 2007년 이후 측정값이 커지고, 고르게 분포하는 경향이 있다.
par(mfrow=c(1,3))
penguins_t <- penguins_n[(penguins_n$island=="Torgersen"),]
penguins_b <- penguins_n[(penguins_n$island=="Biscoe"),]
penguins_d <- penguins_n[(penguins_n$island=="Dream"),]
plot(penguins_t$species, main="Torgersen Island", ylim=c(0,130) )
plot(penguins_b$species,  main="Biscoe Island", ylim=c(0,130))
plot(penguins_d$species, main="Dream Island",ylim=c(0,130))

par(mfrow=c(1, 1))
  1. 각 서식지별로 팽귄의 종류 비율이 다르다. Torgersen에는 Adelie가 주로 살고, Biscoe에는 Gentoo가 다수 살고 있다.Deram에는 Adelie, Chinstrap이 비슷한 숫자로 서식한다.

상관 관계 분석 (종별 부리 길이와 부리 깊이, 몸무게와 날개 길이)

plot( penguins_n$bill_length_mm, penguins_n$bill_depth_mm,  main="종별 부리 길이와 깊이의 상관 관계", col=penguins_n$species)

plot( penguins_n$flipper_length_mm, penguins_n$body_mass_g,  main="종별 몸무게와 날개 길이의 상관 관계", col=penguins_n$species)

  1. 부리 길이와 깊이, 몸무게와 날개 길이는 양의 상관 관계가 있다. 부리는 종별 차이가 뚜렸하고, 몸무게와 날개 길이는 gentoo만 뚜렸하게 다르다.

팽귄 데이터의 인사이트 종합

세 종류의 팽귄은 종 별, 서식지 별로 종류의 개체수가 다르며, Torgersen 지역에는 개체수가 적다. 전체 개체수는 Chinstrap의 수가 적다. 각 종 별로 부리, 날개, 몸무게의 분포가 차이가 있다. 측정 년도 별로는 2007년에 비하여 2009년의 측정치가 분포가 퍼져있고, 전체적으로 측정치가 커졌다. 부리의 길이와 깊이는 양의 상관 관계, 날개와 몸무게는 양의 상관 관계가 있다. 팽귄의 성별 측정치는 차이가 있으며, 수컷의 경우는 측정 분포가 퍼져있어 다양성이 더 크다.