Loading the catalog…
Loading the catalog…
📅 Date : 2026.10.08 🏷️ Tags : #Python #DataVisualization #Plotnine #ggplot #EDA #DataAnalysis #Matplotlib #LogScale #Boxplot #DensityPlot #TexasHousing 🎯 이번 주 목표 이번 세션에서는 데이터 시각화를 단순히 그래프를 보기 좋게 그리는 과정이 아니라, 데이터의 특성과 분석 목적에 맞는 시각적 표현을 선택하여 정보를 정확하게 전달하는 과정으로 이해하는 것을 목표로 했다. 지금까지 데이터를 분석하면서 어떤 그래프를 사용할지 고민할 때 주로 변수의 종류를 기준으로 판단했다. 범주형 데이터에는 막대 그래프를, 연속형 데이터에는 히스토그램이나 산점도를 사용하는 식이었다. 하지만 이번 세션을 통해 같은 데이터라도 위치 스케일, 색상 스케일, 정렬 방식, 구간 폭 등에 따라 전달되는 의미가 달라질 수 있다는 것을 알게 되었다. 특히 이번 과제에서는 처음 작성한 그래프를 그대로 사용하는 것이 아니라, 실제 출력 결과를 살펴보면서 왜 특정 그래프가 모호하게 보이는지, 어떻게 수정해야 정보가 더 명확하게 전달되는지를 고민했다. 가장 기억에 남는 것은 세 가지였다. 첫째, 로그 스케일은 단순히 큰 값을 작게 만드는 것이 아니라 데이터의 차이를 배율 관점에서 해석하도록 바꾸는 방법이라는 점이다. 둘째, 색상은 그래프를 꾸미기 위한 요소가 아니라 데이터의 종류와 의미에 따라 선택해야 하는 시각적 속성이라는 점이다. 셋째, 그래프가 정상적으로 실행되더라도 분석 질문에 대한 답이 직관적으로 드러나지 않는다면 더 적절한 시각화 방식을 고민해야 한다는 점이다. 마지막 자유 과제에서는 txhousing 데이터를 사용하여 주택 가격과 거래량의 관계를 분석했다. 처음에는 산점도를 작성했지만 일부 도시의 거래량이 지나치게 높아 대부분의 데이터가 아래쪽에 몰리는 문제가 나타났다. 이에 박스플롯과 로그 스케일을 적용하여 가격 구간별 거래량 분포를 비교하는 방식으로 수정했다. 이번 글에서는 세션에서 학습한 개념과 과제별 실습 결과, 그리고 실습 과정에서 새롭게 이해한 내용을 정리하고자 한다. 📌 Contents 세션 복습 — 데이터 시각화의 기본 원칙 코랩 실습과제 복습 시각적 속성과 스케일 위치 스케일과 로그 변환 색상 스케일 수량 데이터의 시각화 분포 데이터의 시각화 추가적인 공부 및 탐구 종합 과제 — 텍사스 주택 가격과 거래량 분포 분석 과제에서 AI를 활용한 방식 이번 주 한 줄 정리 1️⃣ 세션 복습 데이터 시각화란 무엇인가? 데이터 시각화는 미학과 과학의 결합이며, 데이터를 정확하게 전달하는 것이 최우선이다. 처음에는 그래프를 예쁘게 만드는 것이 시각화의 중요한 목적이라고 생각했다. 하지만 세션에서는 보기 좋은 그래프와 정보를 정확하게 전달하는 그래프가 반드시 일치하지는 않는다는 점을 강조했다. 구분 의미 핵심 문제 Ugly 시각적인 완성도가 부족한 그래프 가독성 저하 Bad 정보가 충분히 전달되지 않는 그래프 분석 목적에 부적합한 표현 Wrong 데이터를 잘못 해석하도록 만드는 그래프 정보 왜곡 특히 Bad와 Wrong의 차이가 중요하다고 느꼈다. Bad는 데이터 자체가 틀린 것은 아니지만 표현 방식이 적절하지 않아 중요한 정보를 파악하기 어려운 경우에 해당한다. 반면 Wrong은 축이나 스케일을 잘못 설정하여 실제 데이터와 다른 인상을 전달하는 경우이다. 이번 과제에서 작성한 그래프들도 이러한 관점에서 평가할 수 있었다. 시각적 속성(Aesthetic Attributes) 시각적 속성은 데이터의 값을 그래픽 요소로 표현하는 방법이다. 대표적으로 다음과 같은 요소가 있다. 시각적 속성 의미 예시 Position 위치 x축과 y축의 값 Color 색상 지역 또는 집단 구분 Size 크기 인구수나 거래량 Shape 모양 범주별 점의 형태 Line width 선 두께 특정 선 강조 Line type 선 종류 실선과 점선 구분 여기서 스케일(Scale)은 데이터의 값과 시각적 속성을 연결하는 방식이다. 예를 들어 자동차 데이터에서 배기량은 x축, 연비는 y축, 마력은 색상, 무게는 점의 크기, 실린더 수는 점의 모양에 대응시킬 수 있다. 처음에는 스케일이라는 단어를 x축이나 y축의 범위 정도로만 이해했다. 하지만 색상, 크기, 모양에도 각각의 스케일이 존재한다는 사실을 알게 되었다. 즉, 하나의 산점도에서도 여러 가지 시각적 속성을 활용하여 다양한 변수의 정보를 동시에 전달할 수 있다. 다만 표현 가능한 변수가 많다고 해서 무조건 많은 스케일을 사용하는 것이 좋은 것은 아니다. 그래프를 보는 사람이 정보를 구분하고 해석할 수 있는 수준에서 시각적 속성을 선택해야 한다. 위치 스케일(Position Scale) 위치 스케일은 데이터를 그래프의 축에 어떻게 배치할지 결정한다. 이번 세션에서는 특히 선형 스케일과 로그 스케일의 차이를 학습했다. 선형 스케일(Linear Scale) 선형 스케일은 같은 숫자 차이를 같은 거리로 표현한다. 예를 들어, 0 → 10 → 20 → 30 각 구간의 차이는 10이므로 그래프에서도 동일한 간격으로 나타난다. 일반적으로 데이터의 절대적인 차이를 비교할 때 적합하다. 로그 스케일(Logarithmic Scale) 로그 스케일은 같은 배율을 같은 거리로 표현한다. 1 → 10 → 100 → 1000 각 구간은 10배씩 증가하므로 로그 스케일에서는 같은 간격으로 표시된다. 따라서 값의 범위가 매우 넓거나, 데이터의 절대적인 차이보다 상대적인 배율이 중요한 경우에 유용하다. 예를 들어 인구가 100명인 지역과 100,000명인 지역을 선형 스케일로 표현하면 인구가 적은 지역들은 대부분 0 근처에 몰려 보일 수 있다. 하지만 로그 스케일을 적용하면 서로 다른 규모의 지역을 하나의 그래프에서 비교하기 쉬워진다. 다만 로그 스케일은 다음과 같은 한계가 있다. $$ \log(0)=-\infty $$ 따라서 0이 포함된 데이터는 일반적인 로그 스케일에 그대로 표현할 수 없다. 세션에서는 이에 대한 대안으로 제곱근 스케일(Square Root Scale)을 소개했다. 이번 실습을 통해 스케일은 단순히 그래프를 확대하거나 축소하는 기능이 아니라, 데이터의 차이를 어떻게 해석하도록 만들 것인지 결정하는 요소라는 점을 이해했다. 색상 스케일(Color Scale) 색상 스케일은 크게 네 가지 방식으로 구분할 수 있다. 색상 스케일 사용 목적 예시 정성적(Qualitative) 순서가 없는 집단 구분 제조국, 성별, 펭귄 종 순차적(Sequential) 값의 크기 표현 인구, 주택 가격 발산형(Diverging) 기준점 대비 양방향 차이 평균 대비 증가·감소 강조(Highlighting) 특정 집단에 시선 집중 특정 제조사 강조 특히 색상을 선택할 때 데이터가 무엇을 의미하는지 먼저 생각해야 한다는 점이 중요했다. 예를 들어 제조국은 한국, 미국, 일본 사이에 크기의 순서가 존재하지 않는다. 따라서 색상 간에 순서를 암시하지 않는 정성적 팔레트를 사용해야 한다. 반면 주택 가격은 값의 크기가 존재하므로 순차적 색상 스케일을 사용하는 것이 적절하다. 또한 평균 대비 증가율이나 감소율처럼 0을 기준으로 양수와 음수가 나뉘는 데이터에는 발산형 스케일을 사용할 수 있다. 처음에는 색상 팔레트를 그래프의 분위기에 따라 선택해도 된다고 생각했지만, 색상 자체가 데이터에 대한 정보를 전달하기 때문에 잘못된 팔레트 선택도 해석에 영향을 미칠 수 있다는 사실을 알게 되었다. 수량 데이터와 분포 데이터의 차이 세션에서는 분석 목적에 따라 그래프의 종류를 선택해야 한다는 점도 강조했다. 수량 데이터의 시각화는 특정 집단이나 범주의 값을 비교하는 데 초점이 있다. 대표적으로 막대 그래프, 묶은 막대 그래프, 누적 막대 그래프, 점 도표 등이 있다. 반면 분포 데이터의 시각화는 데이터가 어떤 값에 집중되어 있고 얼마나 퍼져 있는지를 확인하는 데 초점이 있다. 대표적으로 히스토그램과 밀도 도표가 있다. 특히 같은 데이터라도 다음과 같이 분석 질문이 달라질 수 있다. 어느 도시의 주택 거래량이 가장 많은가? → 정렬된 막대 그래프 도시별 주택 거래량은 얼마나 차이가 나는가? → 점 도표 주택 거래량은 어떤 범위에 집중되어 있는가? → 히스토그램 주택 가격 구간에 따라 거래량 분포가 다른가? → 박스플롯 결국 그래프를 선택할 때 가장 먼저 생각해야 하는 것은 변수의 종류뿐 아니라 내가 데이터에서 무엇을 알고 싶은가라는 분석 질문이다. 2️⃣ 코랩 실습과제 복습 2.1 시각적 속성과 스케일 — 변수에 적합한 표현 방식 선택하기 문제 1-1. 자동차 데이터에 5개의 스케일 적용하기 첫 번째 문제에서는 mtcars 데이터를 이용하여 자동차의 배기량과 연비 사이의 관계를 시각화했다. ( ggplot(mtcars, aes( x="disp", y="mpg", color="hp", size="wt", shape="factor(cyl)" )) + geom_point() + scale_color_cmap("viridis") + labs( x="displacement (cu. in.)", y="fuel efficiency (mpg)", color="power (hp)", size="weight (1000 lbs)", shape="cylinders" ) ) 이 그래프에서는 x축과 y축의 위치 스케일뿐 아니라 색상, 크기, 모양 스케일까지 총 5개의 스케일을 사용했다. 처음에는 aes() 내부에 변수를 지정하는 문법 자체가 익숙하지 않았다. 특히 hp , wt 를 따옴표 없이 작성했을 때 NameError 가 발생했다. plotnine 에서는 aes() 에 데이터프레임의 열을 문자열로 전달할 수 있으므로 다음과 같이 작성해야 했다. color="hp" size="wt" 단순한 문법 오류였지만, 이를 해결하면서 aes() 가 데이터의 변수를 시각적 속성에 연결하는 역할을 한다는 것을 이해했다. 문제 1-2. 왜 factor(cyl) 을 사용해야 할까? 이 문제에서는 실린더 수를 나타내는 cyl 에 왜 factor() 를 적용하는지 설명해야 했다. 처음에는 실린더 수가 4, 6, 8처럼 숫자로 표현되므로 그대로 사용해도 된다고 생각했다. 하지만 모양( shape )은 연속적인 수치의 크기를 표현하는 것보다 서로 다른 범주를 구분하는 데 적합한 시각적 속성이다. 따라서 다음과 같이 작성했다. shape="factor(cyl)" 이를 통해 숫자로 저장된 데이터라고 해서 반드시 연속형 변수로 해석해야 하는 것은 아니라는 점을 알게 되었다. 4기통, 6기통, 8기통은 숫자이지만 이번 그래프에서는 자동차의 종류를 구분하는 범주로 사용하는 것이 목적이다. 데이터의 저장 형태와 분석에서 사용하는 변수의 의미는 다를 수 있다. 따라서 시각화할 때는 값이 숫자인지만 확인하는 것이 아니라, 해당 값을 연속적인 크기로 표현할지 독립적인 범주로 표현할지 판단해야 한다. 2.2 위치 스케일 — 로그 스케일과 기준선의 의미 문제 2-1. 인구 비율에 로그 스케일 적용하기 이번 문제에서는 midwest 데이터의 카운티별 인구를 전체 카운티 인구의 중간값으로 나누어 비율을 계산했다. county["ratio"] = ( county["poptotal"] / county["poptotal"].median() ) 처음에는 왜 중간값에 해당하는 비율이 1인지 궁금했다.하지만 계산식을 확인하니 그 이유는 단순했다. $$ ratio=\frac{\text{해당 카운티의 인구}}{\text{전체 카운티 인구의 중간값}} $$ 해당 카운티의 인구가 중간값과 같다면, $$ ratio=\frac{\text{중간값}}{\text{중간값}}=1 $$ 이 된다. 따라서 비율은 다음과 같이 해석할 수 있다. 비율 의미 0.5 중간값의 절반 1 중간값과 동일 2 중간값의 2배 10 중간값의 10배 기존 선형 스케일 그래프에서는 인구가 많은 소수의 카운티 때문에 다른 카운티들이 그래프 아래쪽에 몰려 있었다. 이를 개선하기 위해 다음과 같이 로그 스케일을 적용했다. ( p_linear + scale_y_log10() + geom_hline( yintercept=1, linetype="dashed", color="gray" ) ) 여기서 추가적으로 궁금했던 점은 왜 굳이 중간값에 점선 기준선을 표시하는가였다. 처음에는 그래프의 장식적인 요소라고 생각했다. 하지만 yintercept=1 은 중간값이라는 의미 있는 기준을 표시한다. 점선 위쪽에 있는 카운티는 중간값보다 인구가 많고, 아래쪽에 있는 카운티는 중간값보다 인구가 적다. 또한 로그 스케일에서는 같은 배율이 같은 거리로 표현되기 때문에, 비율 0.5와 2는 기준선 1을 중심으로 같은 거리만큼 떨어져 있다. 즉, 점선은 단순한 장식이 아니라 그래프를 해석할 기준점을 제공하는 역할을 한다. 그래프의 기준선은 특정 값을 강조하기 위한 요소이면서 동시에 데이터의 의미를 해석하도록 돕는 장치이다. 특히 로그 스케일에서는 절대적인 차이보다 배율에 주목해야 한다. 문제 2-2. 데이터와 축 제목이 일치하지 않는 Wrong 사례 이 문제에서는 로그 변환된 데이터를 사용하면서도 축 제목은 원래 비율인 것처럼 작성한 그래프를 수정했다. 잘못된 그래프에서는 다음과 같이 작성되어 있었다. county["log_ratio"] = np.log10(county["ratio"]) ggplot(county, aes(x="rank", y="log_ratio")) 하지만 축 제목은 다음과 같았다. y="population / median" 처음에는 데이터를 로그 변환한 것이 왜 잘못된 것인지 이해하기 어려웠다. 그래서 로그 변환과 로그 스케일의 차이를 다시 확인했다. 예를 들어 실제 인구 비율이 100이라면, $$ \log_{10}(100)=2 $$ 이다. 따라서 log_ratio 를 y축에 사용하면 실제로 표시되는 값은 100이 아니라 2이다. 그런데 축 제목을 단순히 population / median 이라고 작성하면 그래프를 보는 사람이 2를 원래 인구 비율로 오해할 수 있다. 수정한 코드는 다음과 같다. ( ggplot(county, aes(x="rank", y="ratio")) + geom_point(size=0.8, color="#0072B2") + scale_y_log10() + labs( x="Midwest counties, from most to least populous", y="population / median" ) ) 여기서는 원래 비율을 사용하면서 축 자체에 로그 스케일을 적용했다. 다만 직접 로그 변환하는 방법 자체가 잘못된 것은 아니다. 그 경우에는 축 제목을 log10(population / median) 처럼 작성하여 변환된 값이라는 사실을 명시해야 한다. 그래프가 정상적으로 실행되고 모양이 그럴듯하더라도 축 제목과 실제 표현한 값이 다르면 잘못된 정보를 전달할 수 있다. 따라서 시각화의 정확성은 코드 실행 여부뿐 아니라 데이터와 축의 의미가 일치하는지에 달려 있다. 문제 2-3. 로그 스케일에서 0은 어떻게 표현할까? 로그 스케일은 값이 매우 크게 퍼져 있는 데이터에 유용하지만 0을 표현할 수 없다는 한계가 있다. $$ \log(0)=-\infty $$ 따라서 연간 사고 건수처럼 0이 포함된 데이터를 일반적인 로그 스케일로 표현하면 일부 관측값이 그래프에서 제외될 수 있다.세션에서는 이에 대한 대안으로 제곱근 스케일(Square Root Scale)을 소개했다. $$ \sqrt{0}=0 $$ 제곱근 스케일은 0을 유지하면서도 큰 값의 차이를 압축할 수 있다. 2.3 색상 스케일 — 데이터의 의미에 맞게 색상 선택하기 문제 3-1. 정성적 색상 스케일로 제조국 구분하기 이번 문제에서는 자동차 제조사를 평균 고속도로 연비 순으로 정렬하고, 제조국에 따라 막대 색상을 다르게 표현했다. ( ggplot( maker, aes( x="reorder(manufacturer, hwy)", y="hwy", fill="country" ) ) + geom_col() + coord_flip() + scale_fill_manual(values=OKABE_ITO) + labs(x="", y="mean highway mpg", fill="country") ) 여기서는 OKABE_ITO 팔레트를 사용했다. 처음에는 왜 제조국을 구분할 때 특정 팔레트를 사용하는지 궁금했다.하지만 제조국은 연속적인 수치가 아니라 순서가 없는 범주형 데이터이다. 따라서 색상의 밝기가 점진적으로 증가하는 순차적 팔레트를 사용하기보다는, 각 집단을 서로 다르게 구분할 수 있는 정성적 팔레트를 사용하는 것이 적절하다. Okabe-Ito 팔레트는 색각 이상이 있는 사람도 비교적 구분하기 쉽도록 설계되었다는 장점도 있다. 또한 코드를 작성하는 과정에서 reorder() 와 manufacturer 의 철자를 잘못 입력하여 오류가 발생하기도 했다. 이를 수정하면서 reorder(manufacturer, hwy) 가 제조사를 연비 기준으로 정렬하는 함수라는 것을 다시 확인했다. 순서가 없는 집단을 표현할 때 중요한 것은 색상으로 크기를 나타내는 것이 아니라, 집단 간 차이를 명확하게 구분하는 것이다. 문제 3-2. 강조 색상 스케일로 Hyundai만 표시하기 이번에는 모든 제조국을 다른 색으로 표현하는 대신, Hyundai만 강렬한 색으로 강조했다. maker["highlight"] = np.where( maker["manufacturer"] == "hyundai", "hyundai", "other" ) ( ggplot( maker, aes( x="reorder(manufacturer, hwy)", y="hwy", fill="highlight" ) ) + geom_col() + coord_flip() + scale_fill_manual( values={ "hyundai": "#D55E00", "other": "lightgray" }, guide=None ) + labs(x="", y="mean highway mpg") ) 이 과정에서 np.where() 에 "hyundai" 를 두 번 사용하는 이유가 궁금했다. 처음에는 같은 값을 중복해서 입력하는 것처럼 보였다. 하지만 np.where() 는 다음과 같은 구조를 갖는다. np.where(조건, 참일 때 값, 거짓일 때 값) 따라서 첫 번째 "hyundai" 는 제조사가 현대인지 확인하는 조건이고, 두 번째 "hyundai" 는 해당 조건을 만족했을 때 새로운 열에 저장할 값이다. 두 값이 반드시 같은 이름일 필요는 없다는 사실도 알게 되었다. 문제 3-3. 순차적 스케일로 텍사스 주택 가격 히트맵 그리기 이번에는 txhousing 데이터로 텍사스 46개 도시의 연도별 주택 가격 중위값을 히트맵으로 표현했다. ( ggplot(tx, aes(x="year", y="city", fill="median")) + geom_tile(color="white", size=0.2) + scale_fill_cmap( "magma", labels=lambda v: [f"${x/1000:.0f}k" for x in v] ) + labs(x="", y="", fill="median price") + theme( figure_size=(7, 9), axis_text_y=element_text(size=7) ) ) 주택 가격은 연속적인 수치형 데이터이므로 값이 증가함에 따라 색상이 단계적으로 변화하는 순차적 컬러맵 magma 를 사용했다. 여기서 흥미로웠던 것은 도시를 단순히 이름순으로 정렬하지 않았다는 점이다. 실습에서는 각 도시의 주택 가격 중위값이 처음으로 15만 달러 이상이 된 연도를 기준으로 도시 순서를 정했다. 이는 연도별 주택 가격 변화가 어떤 순서로 나타났는지 비교하기 위한 방법이었다. 같은 히트맵이라도 범주의 정렬 기준에 따라 중요한 패턴이 더 명확하게 드러날 수 있다는 것을 알게 되었다. 또한 그래프를 실행했을 때 일부 도시와 연도의 교차 지점에 흰색 빈 공간이 나타나는 것이 궁금했다. 처음에는 그래프가 잘못 그려진 것이라고 생각했지만, 전처리 코드를 확인하니 다음과 같은 부분이 있었다. txhousing.dropna(subset=["median"]) 이 과정에서 주택 가격 중위값이 없는 관측값을 제외하고 있었다. 따라서 흰색 빈 공간은 해당 도시·연도 조합의 가격 데이터가 없거나 집계 결과에 포함되지 않았기 때문에 나타났을 가능성이
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
투빅스 6주차 정규세션. 📅 Date : 2026.10.08 🏷️ Tags : #Python #DataVisualization #Plotnine #ggplot #EDA #DataAnalysis #Matplotlib #LogScale #Boxplot #DensityPlot #TexasHousing 🎯 이번 주 목표 이번 세션에서는 데이터 시각화를 단순히 그래프를 보기 좋게 그리는 과정이 아니라, 데이터의 특성과 분석 목적에 맞는 시각적 표현을 선택하여 정보를 정확하게 전달하는 과정으로 이해하는 것을 목표로 했다. 지금까지 데이터를 분석하면서 어떤 그래프를 사용할지 고민할 때 주로 변수의 종류를 기준으로 판단했다. 범주형 데이터에는 막대 그래프를, 연속형 데이터에는 히스토그램이나 산점도를 사용하는…
Open source