Seaborn Tutorial study 6

김상민·2023년 3월 2일
0

self-directed learning

목록 보기
6/7

seaborn에서 허용하는 데이터 구조

  • 데이터 시각화 라이브러리인 seaborn을 사용하려면 데이터를 제공해야 합니다. 이 장에서는 그 작업을 수행하는 다양한 방법을 설명합니다. Seaborn은 여러 가지 데이터 세트 형식을 지원하며, 대부분의 함수는 목록이나 딕셔너리와 같은 기본 제공 파이썬 유형뿐만 아니라 판다나 널파이 라이브러리의 객체로 표현된 데이터도 받아들입니다. 이러한 다양한 옵션과 관련된 사용 패턴을 이해하면 거의 모든 데이터 집합에 대해 유용한 시각화를 신속하게 만드는 데 도움이 됩니다.

** 참고

현재 버전(v0.11.0) 기준으로, 여기서 다루는 모든 옵션은 seaborn의 일부 모듈(즉, 관계형 및 분포 모듈)에서만 지원됩니다. 다른 모듈은 거의 동일한 유연성을 제공하지만 몇 가지 예외가 있습니다(예: catplot() 및 lmplot()은 명명된 변수가 있는 긴 형식의 데이터로 제한됨). 데이터 수집 코드는 다음 몇 번의 릴리스 주기에 걸쳐 표준화될 예정이지만, 그 전까지는 각 함수가 데이터 집합에서 예상한 대로 작동하지 않는 경우 각 함수에 대한 특정 설명서를 염두에 두어야 합니다.

긴 형식의 데이터와 넓은 형식의 데이터

시본의 대부분의 플로팅 함수는 데이터의 벡터를 지향합니다. x를 y에 대해 플롯할 때 각 변수는 벡터여야 합니다. Seaborn은 둘 이상의 벡터가 표 형식으로 구성된 데이터 집합을 허용합니다. "긴 형식" 데이터 테이블과 "넓은 형식" 데이터 테이블 사이에는 근본적인 차이가 있으며, Seaborn은 각각을 다르게 처리합니다.

긴 형식의 데이터와 넓은 형식의 데이터

시본의 대부분의 플로팅 함수는 데이터의 벡터를 지향합니다. x를 y에 대해 플롯할 때 각 변수는 벡터여야 합니다. Seaborn은 둘 이상의 벡터가 표 형식으로 구성된 데이터 집합을 허용합니다. "긴 형식" 데이터 테이블과 "넓은 형식" 데이터 테이블 사이에는 근본적인 차이가 있으며, Seaborn은 각각을 다르게 처리합니다.

  • 긴 형식의 데이터에서는 테이블의 열을 변수 중 하나에 명시적으로 할당하여 플롯에서 열에 역할을 부여합니다. 예를 들어 연간 승객 수의 월별 플롯을 만들면 다음과 같습니다:
flights = sns.load_dataset("flights")
flights.head()

############################################################################################################

  • 긴 형식의 데이터의 장점은 플롯을 이렇게 명시적으로 지정하는 데 적합하다는 것입니다. 변수와 관측값을 명확하게 정의할 수 있는 한, 임의의 복잡한 데이터 집합도 수용할 수 있습니다. 그러나 이 형식은 머릿속에 있는 데이터 모델과 다른 경우가 많기 때문에 익숙해지는 데 다소 시간이 걸립니다.
sns.relplot(data=flights, x="year", y="passengers", hue="month", kind="line")

와이드 폼 데이터

간단한 데이터 집합의 경우, 열과 행에 다양한 변수의 수준이 포함된 스프레드시트에서 볼 수 있는 방식으로 데이터를 생각하는 것이 더 직관적인 경우가 많습니다. 예를 들어, 항공편 데이터 집합을 '피벗'하여 각 열이 수년에 걸친 월별 시계열을 갖도록 함으로써 와이드 폼 조직으로 변환할 수 있습니다:

flights_wide = flights.pivot(index="year", columns="month", values="passengers")
flights_wide.head()


-여기에는 동일한 세 개의 변수가 있지만 구성이 다르게 되어 있습니다. 이 데이터 집합의 변수는 명명된 필드가 아니라 테이블의 차원에 연결됩니다. 각 관측값은 테이블의 셀에 있는 값과 행 및 열 인덱스에 대한 해당 셀의 좌표로 정의됩니다.

-긴 형식의 데이터에서는 데이터 집합의 변수에 이름으로 액세스할 수 있습니다. 와이드 폼 데이터는 그렇지 않습니다. 그럼에도 불구하고 테이블의 차원과 데이터 집합의 변수 간에 명확한 연관성이 있기 때문에 seaborn은 플롯에서 해당 변수에 역할을 할당할 수 있습니다.

%참고%

Seaborn은 데이터에 대한 인수가 x나 y가 지정되지 않은 경우 와이드 형식으로 처리합니다.

sns.relplot(data=flights_wide, kind="line")

  • 이 플롯은 이전 플롯과 매우 유사합니다. Seaborn은 데이터 프레임의 인덱스를 x에, 데이터 프레임의 값을 y에 할당하고 각 월에 대해 별도의 선을 그렸습니다. 그러나 두 플롯 사이에는 눈에 띄는 차이가 있습니다. 데이터 집합을 롱폼에서 와이드폼으로 변환하는 '피벗' 작업을 거쳤을 때 값의 의미에 대한 정보가 손실되었습니다. 그 결과, Y축 레이블이 없습니다. (릴플롯()이 열 변수를 색조 및 스타일 시맨틱에 매핑하여 플롯에 더 쉽게 액세스할 수 있도록 했기 때문에 여기에도 대시가 있습니다. 긴 형식의 경우에는 그렇게 하지 않았지만 스타일 스타일을 "월"로 설정하면 가능합니다.)

  • 지금까지 와이드 폼 데이터를 사용하면서 훨씬 적은 타이핑을 하고도 거의 동일한 플롯을 만들었습니다. 이게 더 쉬워 보입니다! 하지만 롱폼 데이터의 큰 장점은 올바른 형식의 데이터를 확보하면 더 이상 데이터의 구조에 대해 생각할 필요가 없다는 것입니다. 그 안에 포함된 변수만 생각하면서 플롯을 디자인할 수 있습니다. 예를 들어, 연도별 월별 시계열을 나타내는 선을 그리려면 변수를 다시 할당하기만 하면 됩니다.

sns.relplot(data=flights, x="month", y="passengers", hue="year", kind="line")

  • 와이드 폼 데이터 집합으로 동일한 리매핑을 수행하려면 테이블을 바꾸어야 합니다:
sns.relplot(data=flights_wide.transpose(), kind="line")

  • (이 예는 또 다른 문제점을 보여주는데, 현재 seaborn은 와이드 폼 데이터 집합의 열 변수를 데이터 유형에 관계없이 범주형으로 간주하는 반면, 롱 폼 변수는 숫자이므로 수량 색상표와 범례가 할당된다는 점입니다. 이는 향후 변경될 수 있습니다.)

  • 명시적인 변수 할당이 없다는 것은 각 플롯 유형이 와이드폼 데이터의 차원과 플롯의 역할 간에 고정된 매핑을 정의해야 한다는 의미이기도 합니다. 이러한 자연스러운 매핑은 플롯 유형에 따라 다를 수 있으므로 와이드 폼 데이터를 사용할 때 결과를 예측하기 어렵습니다. 예를 들어 범주형 플롯은 테이블의 열 차원을 x로 지정한 다음 인덱스를 무시하고 행에 걸쳐 집계합니다:

sns.catplot(data=flights_wide, kind="box")

  • 팬더를 사용하여 와이드 폼 데이터를 표현할 때는 변수가 몇 개(3개 이하)로만 제한됩니다. 이는 seaborn이 다중 인덱스 정보를 사용하지 않기 때문인데, 이는 팬다가 추가 변수를 표 형식으로 표현하는 방식입니다. xarray 프로젝트는 레이블이 지정된 N차원 배열 객체를 제공하며, 이는 와이드 폼 데이터를 더 높은 차원으로 일반화한 것으로 간주할 수 있습니다. 현재 seaborn은 xarray의 객체를 직접 지원하지는 않지만, to_pandas 메서드를 사용하여 긴 형식의 pandas.DataFrame으로 변환한 다음 다른 긴 형식의 데이터 세트와 마찬가지로 seaborn에서 플로팅할 수 있습니다.

    	- 요약하면, 긴 형식의 데이터 집합과 넓은 형식의 데이터 집합은 다음과 같은 모양으로 생각할 수 있습니다:


-판다스를 사용하여 와이드 폼 데이터를 표현할 때는 변수가 몇 개(3개 이하)로만 제한됩니다. 이는 seaborn이 다중 인덱스 정보를 사용하지 않기 때문인데, 이는 판다스가 추가 변수를 표 형식으로 표현하는 방식입니다. xarray 프로젝트는 레이블이 지정된 N차원 배열 객체를 제공하며, 이는 와이드 폼 데이터를 더 높은 차원으로 일반화한 것으로 간주할 수 있습니다. 현재 seaborn은 xarray의 객체를 직접 지원하지는 않지만, to_pandas 메서드를 사용하여 긴 형식의 pandas.DataFrame으로 변환한 다음 다른 긴 형식의 데이터 세트와 마찬가지로 seaborn에서 플로팅할 수 있습니다.

요약하면, 긴 형식의 데이터 집합과 넓은 형식의 데이터 집합은 다음과 같은 모양으로 생각할 수 있습니다:

Messy Data(지저분한 데이터)

  • 많은 데이터 집합은 긴 형식 또는 넓은 형식 규칙을 사용하여 명확하게 해석할 수 없습니다. 명확하게 롱폼 또는 와이드폼인 데이터 집합을 '깔끔한' 데이터 집합이라고 한다면, 이렇게 모호한 데이터 집합은 '지저분한' 데이터 집합이라고 할 수 있습니다. 지저분한 데이터 집합에서는 변수가 키에 의해 고유하게 정의되지도 않고 테이블의 차원에 의해 정의되지도 않습니다. 이는 각 행이 데이터 수집 단위와 일치하도록 테이블을 구성하는 것이 자연스러운 반복 측정 데이터에서 종종 발생합니다. 20명의 피험자가 주의가 분산되거나 집중된 상태에서 애너그램을 공부하는 기억력 과제를 수행한 심리학 실험의 간단한 데이터 집합을 예로 들어 보겠습니다:
anagrams = sns.load_dataset("anagrams")
anagrams

  • 주의력 변수는 피험자 간 변수이지만, 1에서 3까지 다양한 애너그램에 대한 가능한 해답의 수라는 피험자 내 변수도 있습니다. 종속 측정값은 기억력 점수입니다. 이 두 변수(수와 점수)는 여러 열에 걸쳐 공동으로 인코딩됩니다. 결과적으로 전체 데이터 집합은 명확하게 긴 형식도 아니고 명확하게 넓은 형식도 아닙니다.

    시본에게 주의 집중도와 솔루션 수에 따른 평균 점수를 플롯하도록 하려면 어떻게 해야 할까요? 먼저 데이터를 두 가지 구조 중 하나로 강제 변환해야 합니다. 각 변수가 열이 되고 각 행이 관측값이 되도록 깔끔한 긴 형식의 테이블로 변환해 보겠습니다. 이 작업을 수행하기 위해 pandas.DataFrame.melt() 메서드를 사용할 수 있습니다:

 anagrams_long = anagrams.melt(id_vars=["subidr", "attnr"], var_name="solutions", value_name="score")
anagrams_long.head()

sns.catplot(data=anagrams_long, x="solutions", y="score", hue="attnr", kind="point")

추가 읽기 및 요점

표 형식 데이터 구조에 대한 자세한 논의는 Hadley Whickham의 "Tidy Data" 문서를 참조하세요. 이 논문에서 정의한 것과는 약간 다른 개념 세트를 사용한다는 점에 유의하세요. 이 논문에서는 깔끔함을 긴 형식 구조와 연관시키지만, 우리는 데이터 집합의 변수와 테이블의 차원 사이에 명확한 매핑이 있는 '깔끔한 와이드 형식' 데이터와 그러한 매핑이 존재하지 않는 '지저분한 데이터'를 구분했습니다.

긴 형식 구조에는 분명한 장점이 있습니다. 데이터 집합의 변수를 플롯의 역할에 명시적으로 할당하여 그림을 만들 수 있으며, 3개 이상의 변수를 사용하여 그림을 만들 수 있습니다. 가능한 경우, 진지한 분석을 시작할 때는 데이터를 긴 형식의 구조로 표현하는 것이 좋습니다. seaborn 문서에 있는 대부분의 예제에서는 긴 형식의 데이터를 사용합니다. 그러나 데이터 집합을 넓게 유지하는 것이 더 자연스러운 경우에는 seaborn이 여전히 유용할 수 있다는 점을 기억하세요.

profile
꾸준히 하고싶다

0개의 댓글