[오늘의 문제] 다양한 그래프와 EDA

shlim55·2025년 11월 23일

코딩테스트

목록 보기
181/223

기본적인 EDA 접근 방식

  • 데이터의 특징을 탐색하는 과정으로 시각화, 통계량, 더 나아가 모델링 기법을 통해 데이터에 내재된 패턴 파악

1. 기본적인 문제 정의 & 분석 목표 설정

  • 이 데이터는 무엇을 보여주고 싶은가?
  • 데이터에 담긴 값의 의미를 생각해보기
  • 타겟 변수(궁금한 값)이 있는가?
  • 어떤 관계를 탐색할 것인가? (타겟 변수에 영향을 주는 요인이 무엇인지?)
  • 가설 설정 등

2. 데이터의 구조 파악하기

  • 데이터의 행/열 개수
  • 각 변수의 데이터 유형
  • 기초적인 통계량(평균, 최대, 최소, 최빈, 빈도, 고유값, 중앙값 등)

3. 데이터의 품질 점검하기 (결측치/중복/이상치)

  • 결측치 탐색하기(그에 따른 처리 전략 수립)
  • 중복 데이터 탐색하기
    • pandas의 duplicated() 함수
  • boxplot 또는 IQR(Inter-Quartile Range) 활용하여 이상치 탐색하기

4. 단변량 분석(단일 변수에 대한 탐색)

  • 각 변수의 통계량, 분포를 통해 패턴 탐색
  • 수치형 데이터: 히스토그램, 박스플롯 등
  • 범주형 데이터: countplot, 파이 차트 등

    이 변수는 어떻게 생겼는가? 어떠한 형태? 어떠한 패턴?

5. 이변량 분석(두 변수 간의 관계 탐색)

  • 타겟 변수와 다른 변수와의 패턴/관계? (또는 서로 다른 변수 간의 관계)
  • 수치형 x 수치형: 산점도, 상관관계 등
  • 범주형 x 수치형: 박스플롯, 바이올린 플롯 등
  • 범주형 x 범주형: 파이 차트, 막대 그래프, 히트맵 등

    한 변수가 다른 변수에 영향을 주는가?

6. 다변량 분석(여러 개 변수 간의 관계 및 전체적인 패턴 파악)

  • 복합적인 여러 개의 변수간의 패턴 파악
  • 상관관계 히트맵
  • seaborn의 pairplot() 함수

7. 핵심 인사이트 도출 및 결과 요약 정리

  • 어떤 변수가 타깃에 가장 큰 영향을 주는가?
  • 데이터의 분포적 특징은 무엇인가?
  • 노이즈/편향/한계점 등은 무엇인가?
  • 분석 목적에 맞는 설명 정리
  • 핵심 그래프 선정
  • 변수 간 주요 관계 요약
  • 데이터의 특성·문제점·해석 가능한 인사이트 정리

필요에 따라 파생 변수 생성 등 활용

와인 데이터 분석

Wine Quality 데이터셋: 포르투갈 “Vinho Verde” 와인의
화학적 성질과 전문가들에 의해 매겨진 품질 점수(0~10)를 기록한 것이다.

레드 와인과 화이트 와인 두 버전이 있으며,
와인의 품질이 어떤 물리·화학적 요소와 관련되는지 분석하기 위해 만들어졌다.
(와인의 품질(quality)을 예측하기 위한 회귀/분류 연구)

  • winequality-red.csv : 레드 와인 데이터셋
컬럼 이름설명
fixed acidity고정 산도
volatile acidity휘발성 산도
citric acid시트르산
residual sugar잔류 당분
chlorides염화물
free sulfur dioxide유리 이산화황
total sulfur dioxide총 이산화황
density밀도
pH산성도
sulphates황산염
alcohol알코올 도수
quality품질 점수 (0-10점); 타겟 변수

Guide

  • 자유롭게 각 작업마다 코드 셀을 추가해서 EDA를 진행해보세요!
    • 코드 셀 추가하는 단축키 : esc + b
  • 각 스텝마다에서 얻어진 객관적 사실

을 각각 정리해보세요!

  • 분석 진행이나 컬럼/값의 의미/해석 등을 생성형 AI의 도움을 통해 아이디어를 받아보세요!
  • 아래의 코드셀의 스텝 설명들은 일종의 가이드입니다.

데이터의 기본 구조 파악하기

  • 데이터의 정보 파악하기
  • 데이터의 요약 통계량, 데이터 타입 등 확인
  • 변수의 단위 파악 (산도, 당도, 알콜, 밀도 등)
  • 타겟 변수인 quality의 분포(0~10), 통계량 확인

데이터의 품질 확인하기

  • 결측치 탐색(확인, 비율)
  • 중복 데이터 확인
  • boxplot으로 각 feature의 이상치 탐색
  • IQR로 정량적 이상치 판단 (개수, 비율 등)

단변량 분석

  • 타겟 변수인 quality의 분포를 다양하게 확인해보기
    • ex) 좋은 와인 vs 나쁜 와인 처럼 이분화하여 그룹 비교
  • 변수의 분포 파악 (데이터 유형에 따라)

이변량, 다변량 분석

  • 타겟 변수인 quality 변수와 다른 각각의 변수와의 관계성 파악하기
    • 산점도, 막대 그래프, 상관관계
    • ex) alchol vs. quality, quality별 평균 값 비교
  • 그 외의 변수 간의 관계 파악하기

핵심 인사이트 정리

  • 품질 높은 와인은 어떤 경향을 가진다? 등
  • 산도/당도/알코올이 품질과 어떤 관계가 있는가? 등
  • 데이터의 한계 및 왜곡 가능성 등등

내가 한 풀이

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 시각화 한글 깨짐 방지 설정
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams["axes.unicode_minus"] = False

df = pd.read_csv('winequality-red.csv', sep=';')# 콤마가 아닌 ;로 구분되어있음 이걸 읽기 위해 옵션에 ;을 넣어주시면 그 값을 구분자로 파일을 읽는다. 

# 데이터의 정보 파악하기

# 데이터의 요약 통계량, 데이터 타입 등 확인
# df.describe()
print('데이터 타입: ', df.dtypes)
# df.shape
# 변수의 단위 파악 (산도, 당도, 알콜, 밀도 등)
# print(df['pH'])


# 타겟 변수인 quality의 분포(0~10), 통계량 확인
# sns.countplot(data=df, x="quality")

## 데이터의 품질 확인하기

# 결측치 탐색(확인, 비율)
ratio = df.isna().sum() / len(df)
# print(ratio)

# 중복 데이터 확인
duplicate_count = df.duplicated().sum()

print(f"전체 중복 행의 개수: {duplicate_count}개")
# boxplot으로 각 feature의 이상치 탐색
Q1 = df['quality'].quantile(0.25)
Q3 = df['quality'].quantile(0.75)

# IQR로 정량적 이상치 판단 (개수, 비율 등)
IQR = Q3 - Q1 
outlier = df[(df['quality'] < Q1 - 1.5 * IQR) | (df['quality'] > Q3 + 1.5 * IQR)]


## 단변량 분석
# - 타겟 변수인 quality의 분포를 다양하게 확인해보기
#   - ex) 좋은 와인 vs 나쁜 와인 처럼 이분화하여 그룹 비교
# 나는 0~4, 5~9이라고 해보기 
bins = [0, 5, 9]
labels = ['0~4(나쁜와인)', '5~9(좋은와인)']

df['QualityBin'] = pd.cut(df['quality'], bins = bins, labels = labels)
print(df['QualityBin'])
rate_by_bin = df.groupby('QualityBin')['quality'].count().reset_index() # column 병합


# - 변수의 분포 파악 (데이터 유형에 따라)
# sns.barplot(data=rate_by_bin, x='QualityBin', y='quality') #  Could not interpret value `Qualitybin` for `x`. An entry with this name does not appear in `data`.
# sns.countplot(data=df, x='QualityBin')
# 좋은와인 5점이상인 와인이 800개 이상 나쁜와인 4점이하가 750개정도된다. 


## 이변량, 다변량 분석
# - 타겟 변수인 quality 변수와 다른 각각의 변수와의 관계성 파악하기
#   - 산점도, 막대 그래프, 상관관계
#   - ex) alchol vs. quality, quality별 평균 값 비교
# - 그 외의 변수 간의 관계 파악하기

# 알콜과 퀄리티간의 상관관계? 와인농도가 높을수록  퀄리티가 전반적으로 높다
plt.bar(df['quality'], df['alcohol'])
plt.xlabel('알콜')
plt.ylabel('퀄리티')
plt.title('알콜과 퀄리티간의 상관관계')

# alchol vs. quality, quality별 평균 값 비교
# grouped = df.groupby('quality')['alcohol'].mean().reset_index()
# sns.barplot(data=grouped, x='quality', y='alcohol', hue='quality', errorbar=None)
# plt.title('와인 품질별 평균 알콜')

#상관관계랑 corr도 구해보기 선그래프로 표현하는게 더 나을듯 결론 와인 품질과 와인 농도는 상관관계가 있다. 
# grouped_corr = grouped.corr(numeric_only=True)
# print(grouped_corr)
plt.boxplot
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 시각화 한글 깨짐 방지 설정
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams["axes.unicode_minus"] = False

df = pd.read_csv('winequality-red.csv', sep=';')# 콤마가 아닌 ;로 구분되어있음 이걸 읽기 위해 옵션에 ;을 넣어주시면 그 값을 구분자로 파일을 읽는다. 

# 데이터의 정보 파악하기

# 데이터의 요약 통계량, 데이터 타입 등 확인
# df.describe()
print('데이터 타입: ', df.dtypes)
# df.shape
# 변수의 단위 파악 (산도, 당도, 알콜, 밀도 등)
# print(df['pH'])


# 타겟 변수인 quality의 분포(0~10), 통계량 확인
# sns.countplot(data=df, x="quality")

## 데이터의 품질 확인하기

# 결측치 탐색(확인, 비율)
ratio = df.isna().sum() / len(df)
# print(ratio)

# 중복 데이터 확인
duplicate_count = df.duplicated().sum()

print(f"전체 중복 행의 개수: {duplicate_count}개")
# boxplot으로 각 feature의 이상치 탐색
Q1 = df['quality'].quantile(0.25)
Q3 = df['quality'].quantile(0.75)

# IQR로 정량적 이상치 판단 (개수, 비율 등)
IQR = Q3 - Q1 
outlier = df[(df['quality'] < Q1 - 1.5 * IQR) | (df['quality'] > Q3 + 1.5 * IQR)]


## 단변량 분석
# - 타겟 변수인 quality의 분포를 다양하게 확인해보기
#   - ex) 좋은 와인 vs 나쁜 와인 처럼 이분화하여 그룹 비교
# 나는 0~4, 5~9이라고 해보기 
bins = [0, 5, 9]
labels = ['0~4(나쁜와인)', '5~9(좋은와인)']

df['QualityBin'] = pd.cut(df['quality'], bins = bins, labels = labels)
print(df['QualityBin'])
rate_by_bin = df.groupby('QualityBin')['quality'].count().reset_index() # column 병합


# - 변수의 분포 파악 (데이터 유형에 따라)
# sns.barplot(data=rate_by_bin, x='QualityBin', y='quality') #  Could not interpret value `Qualitybin` for `x`. An entry with this name does not appear in `data`.
# sns.countplot(data=df, x='QualityBin')
# 좋은와인 5점이상인 와인이 800개 이상 나쁜와인 4점이하가 750개정도된다. 


## 이변량, 다변량 분석
# - 타겟 변수인 quality 변수와 다른 각각의 변수와의 관계성 파악하기
#   - 산점도, 막대 그래프, 상관관계
#   - ex) alchol vs. quality, quality별 평균 값 비교
# - 그 외의 변수 간의 관계 파악하기

# 알콜과 퀄리티간의 상관관계? 와인농도가 높을수록  퀄리티가 전반적으로 높다
plt.bar(df['quality'], df['alcohol'])
plt.xlabel('알콜')
plt.ylabel('퀄리티')
plt.title('알콜과 퀄리티간의 상관관계')

# alchol vs. quality, quality별 평균 값 비교
# grouped = df.groupby('quality')['alcohol'].mean().reset_index()
# sns.barplot(data=grouped, x='quality', y='alcohol', hue='quality', errorbar=None)
# plt.title('와인 품질별 평균 알콜')

#상관관계랑 corr도 구해보기 선그래프로 표현하는게 더 나을듯 결론 와인 품질과 와인 농도는 상관관계가 있다. 
# grouped_corr = grouped.corr(numeric_only=True)
# print(grouped_corr)
plt.boxplot

데이터 타입: fixed acidity float64
volatile acidity float64
citric acid float64
residual sugar float64
chlorides float64
free sulfur dioxide float64
total sulfur dioxide float64
density float64
pH float64
sulphates float64
alcohol float64
quality int64
dtype: object
전체 중복 행의 개수: 240개
0 0~4(나쁜와인)
1 0~4(나쁜와인)
2 0~4(나쁜와인)
3 5~9(좋은와인)
4 0~4(나쁜와인)
...
1594 0~4(나쁜와인)
1595 5~9(좋은와인)
1596 5~9(좋은와인)
1597 0~4(나쁜와인)
1598 5~9(좋은와인)

profile
Normal Programmer

0개의 댓글