파이썬: 필수 문법 및 함수 요약 (numpy, pandas, matplotlib, seaborn )

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

파이썬: 필수 문법 및 함수 요약

데이터 분석과 프로그래밍에서 자주 사용되는 Python과 NumPy의 주요 기능들을 정리합니다. 이 글에서는 Python의 기본 자료구조와 NumPy 라이브러리의 유용한 함수들을 소개합니다.


Python 기본 자료구조 활용

Dictionary (딕셔너리)

Python의 딕셔너리는 키(key)와 값(value) 쌍으로 데이터를 저장하는 자료구조입니다.

Dictionary = {'-': 'ee'}
# 특정 키-값 삭제
del Dictionary['-']

List (리스트)

리스트는 Python에서 가장 유용하게 쓰이는 순차 자료구조입니다. 아래는 리스트 관련 주요 함수들입니다.

  1. pop()
    특정 인덱스의 값을 반환하고 삭제합니다.

    List = ['apple', 'banana', 'cherry']
    List.pop(1)  # 'banana'를 반환하고 리스트에서 삭제
    List.pop()   # 마지막 요소 반환 후 삭제
    
  2. count()
    리스트에서 특정 값의 개수를 반환합니다.

    List.count('apple')  # 'apple'의 개수를 반환
    
  3. split()
    문자열을 특정 구분자로 나눠 리스트로 반환합니다.

    text = "apple,banana,cherry"
    text.split(',')  # ['apple', 'banana', 'cherry']
    
  4. join()
    리스트의 문자열 요소를 하나의 문자열로 병합합니다.

    words = ['pat', 'cat']
    print("".join(words))  # 'patcat'
    print("&".join(words)) # 'pat&cat'
    

예제: join()을 이용해서 문자열을 매핑하고 결과를 반환하는 예제

다음은 dictionary를 이용해서 입력 문자열의 문자를 매핑하고, 그 결과를 반환하는 함수에 관한 예제 입니다.  input_str의 각 문자를 순회하며 signal doctionary에 매핑된 값이 있으면 대체합니다. 만일 doctionary에 매핑된 값이 없으면 그대로 둡니다.

import numpy as np
import pandas as pd

# Dictionary
signal = {'a':'n', 'b':'d', 'c':'a', 'd':'b', 'e':'v', 'f':'z', 'g':'k'}
def code(input_str):
    var1 = "".join(signal[char] if char in signal else char for char in input_str)
    return var1
print(code('w fhle khj'))

Tuple (튜플)

튜플은 리스트와 유사하지만, 불변(immutable) 특성을 갖는 자료구조입니다.

Tupple = ('-', 'ee')

NumPy 활용

기초 배열 생성

  1. 0과 1로 채워진 배열

    np.zeros(10, dtype=int)      # 0으로 채워진 정수형 배열
    np.ones((3, 5), dtype=float) # 1로 채워진 3x5 배열
    
  2. 숫자 시퀀스 생성

    np.arange(0, 20, 2)          # 0부터 20까지 2 간격의 숫자 배열
    np.linspace(0, 1, 5)         # 0부터 1까지 균등 간격으로 5개의 숫자
    

난수 배열 생성

  1. 임의의 값으로 배열 생성

    np.random.random((2, 2))     # 2x2 크기의 임의의 실수 배열
    
  2. 정규분포 난수 생성

    np.random.normal(0, 1, (2, 2)) # 평균 0, 표준편차 1의 정규분포
    
  3. 정수 난수 생성

    np.random.randint(0, 10, (2, 2)) # 0~9 사이의 정수 배열
    

배열 조작

  1. 배열 형태 변환

    x = np.arange(8).reshape(2, 4) # 1차원 배열을 2x4 배열로 변환
    
  2. 배열 결합

    np.concatenate([x, x], axis=0) # 행 방향 결합
    np.concatenate([x, x], axis=1) # 열 방향 결합
    
  3. 배열 분할

    upper, lower = np.split(x, [1], axis=0) # 행 방향으로 분할
    

예제: NumPy와 Python의 조합

다음은 Python과 NumPy를 조합하여 간단한 데이터 처리 작업을 수행하는 예제입니다.

import numpy as np
import pandas as pd

# 데이터 생성
data = np.random.randint(0, 100, (5, 5))
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E'])

# 특정 열의 합계 계산
column_sum = df['A'].sum()
print(f"A 열의 합계: {column_sum}")

# 배열 결합
combined = np.concatenate([data, data], axis=0)
print(combined)


Pandas 활용

Pandas는 데이터 처리와 분석에 강력한 기능을 제공하는 Python 라이브러리입니다. 이번 포스팅에서는 Pandas의 주요 기능과 함께 DataFrame 생성, 데이터 전처리, 그룹화 및 정렬 등의 유용한 메서드들을 정리했습니다.


1. DataFrame 생성

Pandas의 핵심 데이터 구조는 DataFrame입니다.
DataFrame은 행(row)과 열(column)로 구성된 테이블 형태의 데이터를 다룹니다.

직접 생성

import pandas as pd

score = pd.DataFrame({
    '이름': ['민수', '도윤', '하나', '지민'],
    '국어': [95, 98, 89, 100],
})
print(score)

CSV 또는 Excel 파일 불러오기

# CSV 파일 읽기
df = pd.read_csv('data.csv')

# Excel 파일 읽기
df = pd.read_excel('data.xlsx')

2. 데이터 변환 및 결합

데이터 형 변환

# 문자열 -> 숫자 변환
df["어른"] = pd.to_numeric(df["어른"])

# 문자열 -> 날짜 변환
df["날짜"] = pd.to_datetime(df["날짜"])

DataFrame 결합

  1. 행(row) 추가

    df = pd.concat([df1, df2], axis=0, join='outer', ignore_index=True)
    df = df1.append(df2)
  1. 열(column) 추가

    df = pd.merge(df1, df2, on='월', how='inner')
    

3. 데이터 조회 및 요약

기본 조회

df.head()  # 상위 5개 데이터
df.tail()  # 하위 5개 데이터

특정 열/행 조회

df[["공휴일", "어른"]] # 특정 열 선택
df.loc[0] # 첫 번째 행의 모든 열
df.loc[23, "합계"] # 특정 행의 값 선택
df.loc[(df["어른"] > 10) & (df["아이"] < 10), ["날짜", "합계"]]

요약 정보 및 통계

df.info() # 데이터 정보
df.describe() # 통계 요약
df["공휴일"].value_counts()   # "공휴일" 열에 있는 각 공휴일의 개수를 출력
df["어른"].mean() # 특정 열의 평균


4. 데이터 변형 및 전처리

데이터 수정

# 데이터 형 변환
df["어른"] = df["어른"].astype(int)

# 문자열 대체
df["합계"] = df["합계"].str.replace('-', '0')

새로운 열 추가

# 날짜에서 연도 추출
df["년"] = df["날짜"].dt.year

# 조건에 따른 값 변환
df["날씨"] = df["날씨"].apply(lambda e: '눈/비' if e == '눈' else e)
df["고령여부"] = df["노인인구비율"].apply(lambda e: "X" if e >= 0.14 else "O")

# 딕셔너리 매핑
week = {'월': 'Mon', '화': 'Tue', '수': 'Wed'}
df["요일"] = df["요일"].map(week)

5. 데이터 분석

그룹화와 집계

# 특정 열 기준 평균 계산
df.groupby("날씨")["총계"].mean()

# 여러 열 합계 계산 후 초기화
df2 = df.groupby("지역구분")[["10대 미만", "10대"]].sum().reset_index()

조건부 필터링

df[(df["어른"] > 10) & (df["아이"] < 10)]

6. 데이터 정렬

df.sort_values("총계", ascending=True) # 값 기준 오름차순 정렬
df.sort_values(["A", "B"], ascending=[True, False], inplace=True) # "A" 열 오름차순, "B" 열 내림차순, inplace=True 변경된 결과를 직접 저장

예제: 실습 코드

# CSV 파일 불러오기
df = pd.read_csv('data.csv')

# 어른 열을 숫자로 변환
df["어른"] = pd.to_numeric(df["어른"])

# 날짜 변환 및 연도 추출
df["날짜"] = pd.to_datetime(df["날짜"])
df["년"] = df["날짜"].dt.year

# 지역별 데이터 요약
region_summary = df.groupby("지역구분")[["10대 미만", "10대"]].sum().reset_index()

# 특정 조건 데이터 조회
filtered_data = df[(df["어른"] > 10) & (df["아이"] < 10)]
print(filtered_data)

7. 데이터 정렬 및 선택

데이터 정렬

특정 열 기준으로 데이터를 정렬하고, 특정 값을 추출할 수 있습니다.

# '초미세먼지' 기준 내림차순 정렬 후 세 번째 행의 날짜 값 추출
pollution1 = mm.sort_values("초미세먼지", ascending=False).iloc[2]["날짜"]

# 추출된 날짜 값을 가공
pollution2 = pollution1.split('-')  # '-' 기준으로 문자열 분리
pollution = "".join(pollution2)     # 분리된 문자열을 다시 합침

8. 데이터프레임 변환

인덱스 초기화

df = df.reset_index(drop=True)  # 기존 인덱스를 제거하고 새로운 인덱스 설정

열 삭제

df = df.drop(["유료", "무료"], axis=1)  # '유료'와 '무료' 열 삭제

열 이름 변경

df = df.rename(columns={"총계": "개수"})  # '총계' 열 이름을 '개수'로 변경

9. 결측치 처리

결측치 확인

df.isnull().sum()  # 각 열의 결측치 개수 확인

결측치 채우기

# '어른' 열의 평균값으로 결측치를 채움
df["어른"] = df["어른"].fillna(int(df["어른"].mean()))

결측치 삭제

# '어른' 열에서 결측치가 포함된 행 삭제
df = df.dropna(subset=["어른"], ignore_index=True)

10. 데이터 가공 및 추가

열 추가: 문자열 분리와 가공

# '시군구'에서 두 번째 단어만 추출하여 '구' 열 생성
df["구"] = df["시군구"].apply(lambda e: e.split()[1])

날짜 데이터 생성

# 연, 월, 일을 결합하여 '날짜' 열 생성
df["날짜"] = df["년"].astype('str') + df["월"].astype('str') + df["일"].astype('str')

# '날짜' 열을 datetime 형식으로 변환
df["날짜"] = pd.to_datetime(df["날짜"], format='%y%m%d')

요일 정보 추가

# '날짜' 열에서 요일 추출 (0: 월요일, 1: 화요일, ...)
df["요일"] = df["날짜"].dt.dayofweek

# 요일 숫자를 한글 요일로 매핑
df["요일"] = df["요일"].map({0: '월', 1: '화', 2: '수', 3: '목', 4: '금', 5: '토', 6: '일'})

11. 데이터 확인 및 활용

데이터 확인

df.iloc[0]  # 첫 번째 행 조회 (Index Location)

데이터 정렬 후 값 추출

# '먼지' 열 기준 내림차순 정렬 후 세 번째 날짜 값 추출
pollution = df.sort_values("먼지", ascending=False).iloc[2]["날짜"]

# 날짜 값 가공
list_pollution = pollution.split('-')
pollution = "".join(list_pollution)

예제 코드: 데이터 전처리 흐름

아래는 위에서 다룬 주요 기능들을 조합한 데이터 전처리 예제입니다.

import pandas as pd

# 데이터프레임 생성
df = pd.DataFrame({
    "시군구": ["서울 강남구", "서울 송파구", "서울 마포구"],
    "년": [2024, 2024, 2024],
    "월": [11, 11, 11],
    "일": [25, 26, 27],
    "초미세먼지": [35, 40, 45],
    "유료": [10, 15, 20],
    "무료": [5, 10, 15],
    "어른": [None, 20, 25]
})

# 전처리 작업
df = df.drop(["유료", "무료"], axis=1)
df["어른"] = df["어른"].fillna(int(df["어른"].mean()))
df["구"] = df["시군구"].apply(lambda e: e.split()[1])
df["날짜"] = df["년"].astype('str') + df["월"].astype('str') + df["일"].astype('str')
df["날짜"] = pd.to_datetime(df["날짜"], format='%Y%m%d')
df["요일"] = df["날짜"].dt.dayofweek.map({0: '월', 1: '화', 2: '수', 3: '목', 4: '금', 5: '토', 6: '일'})

# 정렬 후 특정 값 추출
pollution = df.sort_values("초미세먼지", ascending=False).iloc[2]["날짜"]
list_pollution = pollution.split('-')
pollution = "".join(list_pollution)

print(df)
print(f"세 번째 높은 초미세먼지 날짜: {pollution}")


예제 코드: 아파트 실거래 분석

#데이터 전처리
import pandas as pd
import numpy as np
df=pd.read_csv("./data/seoul_apart_2022.csv")
df.head()
df.info()

#불필요 컬럼 제거
df=df.drop(["해제사유발생일", "중개사소재지", "번지", "본번", "부번", "도로명", "거래유형"], axis=1)

#필드명 쉽게 변경
df=df.rename(columns={"전용면적(㎡)":"전용면적"})

#필드를 쉽게 분리
df["구"]=df["시군구"].apply(lambda e: e.split()[1])
df["동"]=df["시군구"].apply(lambda e: e.split()[2])
df.head()

# 면적에 따라 아파트 유형을 분류하는 함수
def category(e):
    if e<=60:
        return "소형"
    elif e<=85:
        return "중형"
    elif e<=102:
        return "중대형"
    else:
        return "대형"

df["유형"]=df["전용면적"].apply(category)
df.head()

df["계약일"]=df["계약년월"].astype('str') + df["계약일"].astype(str)
df["계약일"] = pd.to_datetime(df["계약일"], format='%Y%m%d')
df["계약일"].info()

df["계약월"]=df["계약일"].dt.month
df["계약요일"]=df["계약일"].dt.dayofweek
df["계약요일"]=df["계약요일"].map({0:'월', 1:'화', 2:'수', 3:'목', 4:'금', 5:'토', 6:'일'})
df.head()

# 주요 필드 결측치 확인
df.isnull().sum()

# "거래금액(만원)"컬럼에 결측치가 존재하는 데이터를 삭제
df.dropna(subset=["거래금액(만원)"], ignore_index=True)

df["거래금액(만원)"]=df["거래금액(만원)"].str.replace(",","") # str.replace를 활용해 콤마(,)를 아무것도 없는() 것으로 교체
df["거래금액(만원)"] = pd.to_numeric(df["거래금액(만원)"])
df["거래금액(만원)"].info()

df.sort_values("거래금액(만원)", ascending=False).head(10)

df["전용면적"] = round(df["전용면적"]/3.3, 2) # round(,2)는 소수점 두번째 자리에서 반올림
df=df.rename(columns={"전용면적":"전용면적(평)"})
df.head()

df["평당금액"]=df["거래금액(만원)"]/df["전용면적(평)"]
df["평당금액"]=round(df["평당금액"],2) # 소수점 둘째자리 반올림
df.info()

df.sort_values("평당금액", ascending=False).head(10)

df.groupby("구")[["평당금액"]].mean()
df.groupby(["구","동"])[["평당금액"]].mean().loc["서초구"].sort_values("평당금액", ascending=False)
df[df["구"]="서초구"].groupby("동")[["평당금액"]].mean()



Matplotlib 활용: 기본부터 Subplot까지

Python의 Matplotlib는 강력한 데이터 시각화 라이브러리로, 다양한 유형의 차트와 그래프를 생성할 수 있습니다. 여기서는 Matplotlib의 기본 사용법부터 figuresubplot을 활용한 고급 그래프 작성법까지 단계별로 설명하겠습니다.

1. 기본 그래프 그리기

라인 플롯(Line Plot)

Matplotlib에서 가장 기본적인 플롯은 라인 플롯입니다. 아래는 라인 플롯의 기본 구성입니다.

import matplotlib.pyplot as plt

# 데이터
xdata = [2018, 2019, 2020, 2021]
ydata = [20, 21, 22, 23]

# 그래프 생성
plt.title("파이썬의 언어 점유율", fontsize=20)  # 제목 설정
plt.plot(xdata, ydata, label="파이썬", marker=".", linestyle="--", color="r")  # 첫 번째 라인
plt.plot(xdata, ydata, label="bbb")  # 두 번째 라인
plt.xticks([2018, 2019, 2020, 2021])  # X축 눈금 설정
plt.yticks([20, 21, 22, 23])  # Y축 눈금 설정
plt.grid(True, axis="both")  # 그리드 활성화 (X, Y축 모두)
plt.xlabel("년도")  # X축 라벨
plt.ylabel("점유율 (%)")  # Y축 라벨
plt.legend()  # 범례 표시
plt.show()  # 그래프 출력

결과

위 코드는 파이썬과 다른 데이터 세트에 대한 라인 플롯을 생성하며, X축과 Y축 눈금, 범례, 제목 등을 설정합니다.


2. 여러 그래프 관리: Figure와 Subplot

Figure 객체 생성

Matplotlib에서는 하나의 창을 figure라고 하며, 각 figure에 개별 그래프를 그릴 수 있습니다.

# Figure 1
fig1 = plt.figure(1, figsize=(4, 3))  # ID가 1인 새로운 figure 생성
plt.plot(xdata, ydata, label="Python")  # 그래프 추가
plt.title("fig1: Python 점유율")  # 제목 설정

# Figure 2
fig2 = plt.figure(2, figsize=(4, 3))  # ID가 2인 새로운 figure 생성
plt.plot(xdata, [15, 16, 18, 20], label="Java", color="g")  # 그래프 추가
plt.title("fig2: Java 점유율")  # 제목 설정

plt.show()  # 모든 figure를 출력

결과

각 figure는 독립적인 그래프를 담고 있어 데이터를 비교하거나 개별적으로 분석할 때 유용합니다.


3. Subplots: 한 Figure에 여러 그래프 배치

하나의 figure 안에 여러 그래프를 배치하려면 **subplot**이나 **subplots**를 사용할 수 있습니다.

기본 Subplot

fig, (ax1, ax2) = plt.subplots(2, 1, constrained_layout=True)  # 2행 1열 레이아웃 생성

# 첫 번째 축(ax1)에 그래프 추가
ax1.plot(xdata, ydata, color="b")
ax1.set_title("Python 점유율")  # 제목
ax1.set_xlabel("년도")  # X축 라벨
ax1.set_ylabel("점유율 (%)")  # Y축 라벨

# 두 번째 축(ax2)에 그래프 추가
ax2.plot(xdata, [15, 16, 18, 20], color="g")
ax2.set_title("Java 점유율")  # 제목
ax2.set_xlabel("년도")  # X축 라벨
ax2.set_ylabel("점유율 (%)")  # Y축 라벨

plt.show()  # 그래프 출력

결과

  • 하나의 창에 두 개의 그래프가 위아래로 배치됩니다.
  • 각 그래프는 독립적으로 설정 가능하며, constrained_layout=True 옵션을 통해 자동 정렬됩니다.

4. 응용: 다양한 그래프 스타일

범례(Legend) 설정

범례를 명시적으로 설정하여 각 라인의 의미를 나타낼 수 있습니다.

plt.legend(['Python', 'Java', 'C'])  # 그래프에 포함된 데이터 레이블 명시

Grid 설정

plt.grid(True, axis="x")  # X축에만 그리드 표시
plt.grid(True, axis="y")  # Y축에만 그리드 표시

커스텀 스타일

plt.plot(xdata, ydata, marker="o", linestyle="-.", color="purple", label="Custom Style")

5. 실전 예제: 다중 그래프와 레이아웃

# 데이터 준비
year = [2018, 2019, 2020, 2021]
python = [20, 21, 22, 23]
java = [15, 16, 18, 20]

# Subplots 생성
fig, axs = plt.subplots(1, 2, figsize=(10, 4), constrained_layout=True)  # 1행 2열 레이아웃

# 첫 번째 그래프
axs[0].plot(year, python, label="Python", color="r", marker="o")
axs[0].set_title("Python 점유율")
axs[0].set_xlabel("년도")
axs[0].set_ylabel("점유율 (%)")

# 두 번째 그래프
axs[1].plot(year, java, label="Java", color="g", linestyle="--")
axs[1].set_title("Java 점유율")
axs[1].set_xlabel("년도")
axs[1].set_ylabel("점유율 (%)")

# 범례 표시
for ax in axs:
    ax.legend()

plt.show()


데이터 시각화 : Seaborn과 Matplotlib 활용

데이터 분석의 핵심은 데이터를 효과적으로 시각화하여 인사이트를 도출하는 데 있습니다. Python의 대표적인 시각화 라이브러리 SeabornMatplotlib를 활용해 다양한 유형의 그래프를 생성하는 방법은 아래와 같습니다.


1. 선 그래프 (Line Plot)

선 그래프는 시간에 따른 데이터 변화를 시각화하는 데 유용합니다.

기본 선 그래프

Seaborn의 lineplot과 Matplotlib의 plot을 사용해 그래프를 쉽게 그릴 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns

# 데이터
year = [2018, 2019, 2020, 2021]
python = [20, 22, 24, 27]
java = [15, 17, 19, 21]

# Seaborn 선 그래프
sns.set_style("darkgrid")
sns.lineplot(x=year, y=python, label="Python", color="blue")
plt.plot(year, python, linestyle="--", color="r", label="Python (Matplotlib)")
plt.grid(True, axis="both")
plt.title("연도별 프로그래밍 언어 점유율")
plt.legend()
plt.show()

Subplots로 여러 그래프 그리기

한 화면에 여러 그래프를 나란히 배치하려면 plt.subplots()를 활용합니다.

fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True)

sns.lineplot(x=year, y=python, ax=ax1, label="Python")
ax1.set_title("Python 점유율")

sns.lineplot(x=year, y=java, ax=ax2, label="Java")
ax2.set_title("Java 점유율")

plt.show()

2. 막대 그래프 (Bar Plot)

기본 막대 그래프

Matplotlib과 Seaborn을 사용해 월별 데이터를 시각화할 수 있습니다.

# 데이터 준비
df_mon = df.groupby("월").mean(numeric_only=True)

# Matplotlib 막대 그래프
plt.bar(df_mon.index, df_mon["어른"], label="어른", color="skyblue")
plt.title("월별 어른 입장객 수")
plt.xlabel("월")
plt.ylabel("평균 입장객")
plt.legend()
plt.show()

Seaborn 막대 그래프

Seaborn의 barplot을 사용하면 범주형 데이터와 연속형 데이터를 쉽게 표현할 수 있습니다.

sns.barplot(data=df, x="월", y="어른", hue="공휴일", errorbar=None)
plt.title("공휴일별 어른 입장객")
plt.show()

3. 파이 차트

비율 분석

Matplotlib의 pie를 사용해 데이터를 시각적으로 비교할 수 있습니다.

# 데이터 준비
data_2019 = df[df["연"] == 2019][["어른", "청소년", "어린이"]].sum()
labels = data_2019.index.tolist()
data = data_2019.tolist()

plt.pie(data, labels=labels, autopct="%1.1f%%", startangle=90)
plt.title("2019년 연령별 입장객 비율")
plt.legend(loc="lower left")
plt.show()

4. 히스토그램 (Histogram)

기본 히스토그램

히스토그램은 연속형 데이터의 분포를 확인하는 데 유용합니다.

# Matplotlib 히스토그램
df_sat = df[df["요일"] == "토"]
plt.hist(df_sat["어린이"], bins=10, color="purple", alpha=0.7)
plt.title("토요일 어린이 입장객 분포")
plt.xlabel("어린이 입장객 수")
plt.ylabel("빈도")
plt.show()

Seaborn 히스토그램

Seaborn의 histplot을 사용하면 추가적인 스타일링이 가능합니다.

sns.histplot(
    data=df,
    x="어린이",
    hue="연",
    binrange=(0, 800),
    bins=10,
    multiple="dodge",
    shrink=0.8,
)
plt.title("연도별 어린이 입장객 분포")
plt.show()

5. 박스 그래프 (Box Plot)

박스 그래프는 데이터의 분포와 이상치를 한눈에 파악할 수 있습니다.

# Matplotlib 박스 그래프
df_apr = df[(df["연"] == 2018) & (df["월"] == 4)]
plt.boxplot([df_apr["어린이"], df_apr["어른"], df_apr["청소년"]])
plt.xticks([1, 2, 3], labels=["어린이", "어른", "청소년"])
plt.title("2018년 4월 입장객 분포")
plt.show()

Seaborn 박스 그래프

Seaborn의 boxplot으로 더 세련된 그래프를 그릴 수 있습니다.

sns.boxplot(data=df_apr, y="어린이")
plt.title("2018년 4월 어린이 입장객 분포")
plt.show()

6. 산점도 (Scatter Plot)

산점도는 두 변수 간의 관계를 시각화하는 데 사용됩니다.

# Matplotlib 산점도
plt.scatter(df["어른"], df["청소년"], alpha=0.7)
plt.xlabel("어른 입장객 수")
plt.ylabel("청소년 입장객 수")
plt.title("어른과 청소년 입장객 상관관계")
plt.show()

# Seaborn 산점도
sns.scatterplot(data=df, x="어른", y="어린이", hue="공휴일")
plt.title("어른과 어린이 입장객 상관관계")
plt.show()

7. 히트맵 (Heatmap)

히트맵은 변수 간 상관관계를 한눈에 파악할 수 있는 도구입니다.

df_corr = df.corr(numeric_only=True)  # 상관계수 계산
sns.heatmap(df_corr, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("상관관계 히트맵")
plt.show()

예제: 실습 코드

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

DATA_PATH ="data/sdf.csv"

def load_csv(path) -> pd.DataFrame:
    # pandas로 데이터를 DataFrame 형태로 로딩
    df = pd.read_csv(path)
    return df

def make_heatmap(df: pd.DataFrame):
    # seaborn으로 모든 열의 상관 관계를 heatmap으로 표시
    df_corr=df.corr()
    sns.heatmap(df_corr)
    show_plot("heatmap")

def get_corr(df: pd.DataFrame) -> float:
    # platelets와 serium_sodium의 상관계수를 구하여 float형으로 반환
    df_corr = df.corr()
    return(df_corr["platelets"]["serium_sodium"])

def main():
    df = load_csv(DATA_PATH)
    make_heatmap(df)
    corr = get_corr(df)
    print("상관계수:", corr)

if __name__ == "__main__":
    main()

8. 주요 시각화 정리

그래프 유형라이브러리함수사용 목적
선 그래프Seabornlineplot시간에 따른 변화 시각화
sns.lineplot(data = data, x = 'body_mass_g', y = 'flipper_length_mm', ci = None)
막대 그래프Seabornbarplot범주형 데이터 비교
sns.barplot(data = data, x = 'body_mass_g', y = 'species', hue = 'sex')
파이 차트Matplotlibplt.pie데이터 비율 표현
히스토그램Seabornhistplot연속형 데이터의 분포 분석
sns.histplot(data = data, x = 'body_mass_g', bins = 15, hue = 'species', multiple='stack')
박스 그래프Seabornboxplot데이터 분포 및 이상치 시각화
sns.boxplot(data = data, x = 'species', y = 'bill_depth_mm', hue= 'sex')
산점도Seabornscatterplot변수 간 상관관계 시각화
sns.scatterplot(data = data, x ='flipper_length_mm', y = 'body_mass_g', hue = 'sex')
히트맵Seabornheatmap변수 간 상관관계 또는 데이터 밀도 분석
corr = data.corr()
sns.heatmap(data = corr, square= True, cmap = 'Blues', annot=True)

맺음말

SeabornMatplotlib를 활용해 다양한 시각화 방법을 소개했습니다. 데이터 분석의 마지막 단계인 시각화를 통해 보다 깊은 통찰을 얻으시길 바랍니다.

댓글 쓰기

0 댓글