[LG헬로비전 DX DATA SCHOOL 4기] Python(8) (250115)

mini_bang·2025년 1월 15일

Pandas(2)

Pivot Table

: 테이블에서 두 개의 column을 각각 index, column index로 사용하여 데이터를 재정렬 하는 것을 말함.
=> 복잡한 데이터를 요약하고 분석하는데 유용한 테이블

  • 테이블 재정렬 및 데이터 요약

기본 Pivot Table 예제

// 실습 코드
import pandas as pd

df = pd.DataFrame({'State':['CA', 'NY', 'NY', 'CA', 'PA', 'TX', 'PA', 'TX'],
                   'Gender':['M', 'M', 'F', 'F', 'F', 'F', 'M', 'M'],
                   'Income':[21, 17, 23, 32, 25, 14, 29, 18],
                   'Expense':[15, 21, 28, 13, 21, 18, 25, 15]})
print(df)
print(df.pivot(index='Gender', columns='State'))
print(df.pivot(index='Gender', columns='State', values='Income'))

Column이 여러 개인 경우 Pivot Table

// 실습 코드
# column이 2개인 경우
df = pd.DataFrame({
    'lev1':[1, 1, 1, 2, 2, 2],
    'lev2':[1, 1, 2, 1, 1, 2],
    'lev3':[1, 2, 1, 2, 1, 2],
    'lev4':[1, 2, 3, 4, 5, 6],
    'values':[0, 1, 2, 3, 4, 5]
})

print(df.pivot(index='lev1', columns=['lev2', 'lev3'], values='values'))

데이터 랭글링 (Data Wrangling)

: 원자료(raw data)를 보다 쉽게 접근하고 분석할 수 있도록 데이터를 정리하고 통합하는 과정

탐색적 데이터 분석 (Exploratory Data Analysis)

: 데이터 분포 및 값을 검토함으로써 데이터가 표현하는 현상을 더 잘 이해하고, 데이터에 대한 잠재적인 문제를 발견하는 것

palmer penguins 데이터 사용 예제

palmer penguins 데이터 불러오기

// 실습 코드
# palmer penguins 데이터 불러오기
!pip install palmerpenguins

import pandas as pd
import seaborn as sns # 통계학으로 그리는 그림

from palmerpenguins import load_penguins
sns.set_style('whitegrid')
penguins = load_penguins()
print(penguins.head())
print(penguins.describe())
print(penguins.info())
  • apply() 함수 사용
    : DataFrame또는 Series의 각 요소 또는 행/열 함수에 적용

특정 컬럼 값 변형

// 실습 코드
# bill_leng_mm 칼럼의 모든 값을 10으로 나누어 새로운 칼럼 bill_length_mm/10 생성하기

penguins['bill_length_mm/10'] = penguins['bill_length_mm'].apply(lambda x : x / 10)
penguins.head()

penguins['bill_length_mm/10'] = penguins.groupby(['bill_length_mm'])

로그 변환 예제

// 실습 코드
pengunis = penguins.rename(columns = {'species' : 'pengunis_species'})

# 부리 길이의 로그 변환
import numpy as np

pengunis['log_bill_length'] = pengunis['bill_length_mm'].apply(lambda x : np.log(x) if pd.notnull(x) and x > 0 else x)
print(pengunis['log_bill_length'])
  • nunique()
    : DataFrame열의 고유한 값의 수를 계산하는데 사용
// 실습 코드
penguins['species'].nunique()
  • sort_values()
    : 오름차순 또는 내림차순으로 하나 이상의 열을 기준으로 DataFrame을 정렬하는데 사용
// 실습 코드
penguins.sort_values("body_mass_g", ascending=False)
  • rename()
    : DataFrame의 열 이름을 변경하는데 사용함
// 실습 코드
pengunis = penguins.rename(columns = {'species' : 'pengunis_species'})
pengunis
  • groupby 함수 사용
    : DataFrame의 데이터를 하나 이상의 열로 그룹화한 다음 그룹화된 데이터에 대한 계산을 수행하는데 사용

: 데이터 집계 및 분석에 자주 사용되는 강력한 기능

그룹화 후 평균 계산

// 실습 코드
grouppengunis = pengunis.groupby(['pengunis_species']).mean(numeric_only=True)
grouppengunis

그룹화 후 최대값 및 최소값 계산

// 실습 코드
# 종별 최대값과 최소값 계산(bill_length_mm)
species_min_max = pengunis.groupby('pengunis_species').agg({'bill_length_mm':['min', 'max']})
print(species_min_max)
  • 결측치 처리

결측값 확인

// 실습 코드
penguins.isnull().sum()
# penguins.isna().sum()

결측값 채우기

// 실습 코드
# bill_length_mm의 결측치를 채워보세요.
penguins['bill_length_mm'].fillna(pengunis['bill_length_mm'].mean(), inplace=True)

결측값 제거

// 실습 코드
# 특정 열의 결측값 제거
penguins_no_na = pengunis.dropna(subset=['flipper_length_mm'])

# 전체 결측값 제거
pengunis_clean = pengunis.dropna()
  • query() 함수 사용
    : 쿼리 문자열을 기반으로 DataFrame행을 필터링할 때 사용

특정 종 필터링

// 실습 코드
# 특정 종(Adelie)만 필터링
# query 방법
adeliepengunis = pengunis.query('pengunis_species=="Adelie"')
print(adeliepengunis)

# 데이터 필터링 방법
adeliepengunis = pengunis[pengunis['pengunis_species'] == 'Adelie']
print(adeliepengunis)

부리 길이가 40mm 이상인 데이터 필터링

// 실습 코드
# 부리 길이가 40mm 이상인 데이터 필터링
long_bills = pengunis[pengunis["bill_length_mm"] > 40]
print(long_bills)
  • melt() 함수 사용(데이터 구조 변경)
    : 여러 개의 옅은 행으로 쌓아 하나의 열로 만들고 싶을 때 사용하는 좋은 함수
// 실습 코드
meltedpengunis = pengunis.melt(id_vars=['pengunis_species'], value_vars=['bill_length_mm', 'bill_depth_mm'])
print(meltedpengunis)
  • crosstab() 함수 사용
    : DataFrame에서 둘 이상의 열에 대한 교차표를 만들 때 사용

: 두 범주형(categorial)간의 관계를 분석하는데 유용함

교차표 생성

// 실습 코드
crosstab = pd.crosstab(pengunis['pengunis_species'], pengunis['sex'])
print(crosstab)
  • pivot_table() 함수 사용
    : 하나 이상의 열로 그룹화된 데이터 요약이며 데이터 탐색 및 분석에 유용
// 실습 코드
pivot = pengunis.pivot_table(index='pengunis_species', columns='sex',
                             values = 'bill_length_mm', aggfunc = 'mean')
print(pivot)

정리

함수설명
pivot()데이터를 재정렬하여 요약 및 분석하는 데 유용한 테이블 생성
pivot_table()그룹화된 데이터를 요약하여 데이터 분석에 유용한 테이블 생성
fillna()결측값을 특정 값으로 대체
dropna()결측값이 있는 행 또는 열 제거
rename()데이터프레임의 열 이름 변경
describe()데이터프레임의 통계 요약 정보 제공
info()데이터프레임의 구조 및 요약 정보 출력
head()데이터프레임의 상위 n개의 행 표시
apply()데이터프레임 또는 시리즈의 각 요소에 함수를 적용
nunique()열의 고유값 수 계산
sort_values()특정 열을 기준으로 데이터프레임 정렬
groupby()데이터를 그룹화하여 계산 수행
agg()그룹화된 데이터에 대해 여러 집계 함수 적용
query()조건 기반으로 데이터프레임의 행 필터링
melt()여러 열을 하나로 녹여 데이터를 세로 형태로 변환
crosstab()범주형 데이터 간의 관계를 분석하기 위한 교차표 생성

Matplotlib

Matplotlib 기본 사용법

  • 간단한 선 그래프 그리기
// 실습 코드
import matplotlib.pyplot as plt
#%matplotlib inline
#$matplotlib qt
#%matmplotlib notebook

#jupyter notebook 안에 그려달라.
plt.plot([1, 2, 3, 4])
plt.show()
  • 데이터 리스트를 사용한 그래프
// 실습 코드
data = [10, 50, 20, 60, 70]

plt.plot(data)
plt.show()
  • Numpy를 사용한 선 그래프와 축 설정
// 실습 코드
import numpy as np

x = np.arange(10)
y = x + 10

plt.plot(x, y)
plt.show()

plt.xlim([0, 10])
plt.ylim([0, 20])
plt.plot(x, y)
plt.show()

여러 플롯 및 설정

  • 여러 개의 축 설정 (subplots)
// 실습 코드
fig, axs = plt.subplots(1, 3, figsize=(9, 3)) # 1행 3열의 axis / figsize : 가로 9cm 세로 3cm

axs[1].set_xticks([0, 2, 4, 6])
axs[1].set_yticks([0, 5, 10])

axs[2].set_xticklabels(['A', 'B', 'C', 'D', 'E'])
axs[2].set_yticks([0, 1, 2])
axs[2].set_yticklabels(['a', 'b', 'c'])

plt.show()
  • 그래프에 레이블과 범례 추가
// 실습 코드
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 201)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()

ax.plot(x, y1, label='sin')
ax.plot(x, y2, label='cos')

ax.legend(loc='lower right')

plt.show()
  • 한글 폰트 설정과 색상 설정
// 실습 코드
# !sudo apt-get install -y fonts-nanum
# !sudo fc-cache -fv
# !rm ~/.cache/matplotlib -rf
plt.rc('font', family='NanumBarunGothic')     # 한글 패치

x = np.linspace(-np.pi, np.pi, 201)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()

ax.plot(x, y1, label='사인', color = (0.1, 0.3, 0.5))  # RGB
ax.plot(x, y2, label='코사인', color = 'red') # or #32a8a0 (HexColor)

ax.legend(loc='lower right')

plt.show()

그래프 스타일링

  • 점선, 마커, 색상을 활용한 스타일링
// 실습 코드
plt.plot([1, 2, 3, 4], [5, 6, 7, 8], 'bo--')  # 파란색 + 점선 + 마커
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
  • 여러 그래프 한 번에 그리기
// 실습 코드
# 여러 개의 그래프
# 200ms 간격으로 균일하게 샘플된 시간

t = np.arange(0., 5., 0.2)
# r--: 빨간색 dashed / bs: blue + square  / g^: green + triangle
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
  • 폰트 스타일 및 여백 설정
// 실습 코드
# 여백 주기, 폰트 설정
import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [2, 3, 4, 10])
plt.xlabel('X-axis', labelpad=50, fontdict={'family':'serif', 'color':'b', 'weight':'bold', 'size':14})
plt.ylabel('Y-axis', labelpad=50, fontdict={'family':'fantasy', 'color':'deeppink', 'weight':'normal', 'size':'xx-large'})
plt.show()
// 실습 코드
# 여백 주기, 폰트 설정(변수 이용)
import matplotlib.pyplot as plt

font1 = {'family':'serif',
         'color':'b',
         'weight':'bold',
         'size':14}
font2 = {'family':'fantasy',
         'color':'deeppink',
         'weight':'normal',
         'size':'xx-large'}

plt.plot([1, 2, 3, 4], [2, 3, 4, 10])
plt.xlabel('X-axis', labelpad=50, fontdict=font1)
plt.ylabel('Y-axis', labelpad=50, fontdict=font2)
plt.show()

다양한 플롯

  • Line Plot (선 그래프)
// 실습 코드
# Line plot

x = np.arange(-5, 5, 0.5)
y1 = x
y2 = x**2
y3 = np.sin(x)
y4 = np.cos(x)

plt.plot(x, y1)
plt.plot(x, y2, marker = 'D')
plt.plot(x, y3, color = 'r')
plt.plot(x, y4, linestyle='dashed')
plt.show()
  • Bar Plot (막대 그래프)
// 실습 코드
import matplotlib.pyplot as plt

# bar plot
data = {'사과':21, '바나나':15, '배':5, '키위':20}
names = list(data.keys())
values = list(data.values())
colors = ['y', 'dodgerblue', 'C2', 'r']

fig, ax = plt.subplots()
ax.bar(names, values, align='edge', edgecolor='lightgrey', linewidth=5, color = colors, width=0.4)
plt.show()

fig, ax = plt.subplots()
ax.barh(names, values, align='edge', edgecolor='lightgrey', linewidth=5, color = colors)
plt.show()
  • Histogram (히스토그램)
// 실습 코드
# histogram
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(10000)
fig, ax = plt.subplots()
ax.hist(data, bins=100, facecolor='r')      # bin : 몇 개 생성할 지

plt.show()
  • Scatter Plot (산점도)
// 실습 코드
# scatter plot
np.random.seed(42)

n = 50
x = np.random.rand(n)
y = np.random.rand(n)

plt.scatter(x, y)
plt.show()
// 실습 코드
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
size = 1000 * np.random.rand(50)

plt.scatter(
    x,
    y,
    c = colors,     # 마커 색상을 설정(colors 배열로 전달)
    s = size,       # 마커 크기를 설정(size 배열로 전달)
    alpha = 0.3,    # 마커 투명도(0.0은 완전히 투명, 1.0은 불투명)
    cmap = 'viridis', # 컬러맵 설정(viridis는 기본적인 컬러맵)
    edgecolors = 'red',  # 마커 테두리 색상 설정(빨간색)
    linewidths = 2       # 마커 테두리의 두께 설정(2픽셀)
)

plt.show()
  • Pie Chart (원형 차트)
// 실습 코드
# pie chart
ratio = [34, 32, 16, 18]
labels = ['Apple', 'Banana', 'Melon', 'Grapes']

# autopct : 부채꼴 안에 표시될 숫자의 형식을 나타냄. 소수점 한자리까지 표시.
# startangle : 시작점   /   counterclock : 시계방향으로 할 것인지 선택
plt.pie(ratio, labels=labels, autopct='%.1f%%', startangle=260, counterclock=True)
plt.show()

# explode : 구간 사이에 공간을 띄워줌
explode = [0, 0.10, 0, 0.10]

plt.pie(ratio, labels=labels, autopct='%.1f%%', startangle=260, counterclock=True, explode=explode)
plt.show()
  • Boxplot (상자 그림)
// 실습 코드
np.random.seed(42)  # 재현성을 위해 시드 고정

data = [np.random.normal(50, 10, 200),  # 평균 : 50, 표준편차 : 10인 200개인 데이터
        np.random.normal(60, 12, 200),  # 평균 : 60, 표준편차 : 12인 200개인 데이터
        np.random.normal(70, 20, 200)]  # 평균 : 70, 표준편차 : 20인 200개인 데이터

# Boxplot 그리기
plt.boxplot(data,
            notch=True, # 중위수에 대한 노치 표시
            patch_artist=True,  # 상자 책상 채우기 활성화
            boxprops=dict(facecolor='lightblue', color='blue'), # 상자 속성 설정
            medianprops=dict(color='red', linewidth=2),  # 중앙값 속성 설정
            whiskerprops=dict(color='blue', linewidth=1.5), # 수염(whisker) 속성
            capprops=dict(color='blue', linewidth=1.5))  # 끝부분 캡 속성
plt.xticks([1, 2, 3], ['Dataset1', 'Dataset2', 'Dataset3']) # x축 레이블
plt.ylabel('Values')
plt.title('boxplot example')
plt.show()
  • Error Bar (오차 막대)
// 실습 코드
# 데이터 생성
x = np.linspace(0, 10, 10)
y = x**2
errors = np.random.rand(10) + 5

plt.errorbar(x, y, yerr = errors, fmt='o')
plt.title('Error bar')
plt.show()

통계 그래프

  • 신뢰구간 계산 및 에러바 플롯
// 실습 코드
from scipy.stats import norm

np.random.seed(42)
data = np.random.normal(loc=50, scale=10, size=100)

# 평균과 표준편차 계산
mean = np.mean(data)
std = np.std(data, ddof=1)  # 샘플 표준편차

# 신뢰구간 계산(95% 신뢰수준)
confidence_level = 0.95
z = norm.pdf((1 + confidence_level) / 2)
n = len(data)
margin_of_error = z * (std / np.sqrt(n))  # 신뢰구간의 반폭(Margin of Error)
lower_bound = mean - margin_of_error
upper_bound = mean + margin_of_error

# 결과 출력
print(f'Mean : {mean:.2f}')
print(f'Standard Deviation : {std:.2f}')
print(f'95% Confidence Interval : ({lower_bound:.2f}, {upper_bound:.2f})')

# 에러바 플롯
x = [1]
y = [mean]
yerr = [margin_of_error]  # 에러바는 신뢰구간의 반폭

plt.errorbar(x, y, yerr = yerr, fmt='o', capsize=5, label="95% Confidence Interval")
plt.title("Error Bar Representing Confidence Interval")
plt.xticks([])
plt.ylabel("Value")
plt.legend()
plt.show()

Seaborn

  • Relation Plot (관계 그래프)
// 실습 코드
# Seaborn : matplotlib 기반으로 다양한 색 테마, 차트 기등을 추가한 라이브러리(주로 통계용 그래프)
import seaborn as sns
print(sns.__version__)

# Relation Plot
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips)
plt.show()
  • Categorical Plot (범주형 데이터 시각화)
// 실습 코드
# Categorical Plot
sns.catplot(x="day", y="total_bill", hue="smoker", col="time", aspect=0.6, kind="swarm", data=tips)
plt.show()

titanic = sns.load_dataset('titanic')
g = sns.catplot(x='fare', y='survived', row='class', kind='box', orient='h', height=1.5, aspect=4,
                data = titanic.query("fare > 0"))
g.set(xscale="log")
plt.show()
  • Boxplot (상자 그림)과 로그 스케일

catplot을 사용한 막대 그래프

// 실습 코드
tips = sns.load_dataset("tips")

sns.catplot(
    x='day',  # x축: 요일
    y='total_bill',  # y축: 총 계산 금액
    hue='sex', # 색상을 성별로 구분
    data = tips,  # 데이터셋 설정
    kind = 'bar', # 그래프 유형: 막대그래프
    palette='viridis',  # 색상 팔레트: viridis
    height=6, # 그래프 높이 설정(단위: 인치)
    aspect=1.5  # 그래프 가로-세로 비율 설정(1.5는 더 넓게)
)
plt.show()

# 막대 가운대 그려진 검은색 선은 신뢰구간을 나타냄

barplot을 사용한 막대 그래프와 신뢰구간 표시

// 실습 코드
tips = sns.load_dataset("tips")


sns.barplot(
    x='day',
    y='total_bill',
    hue='smoker',
    data = tips,
    palette='Set2',
    capsize=0.2,
    errorbar=("ci", 99)   # ci(confidence interval) 적용
)
plt.show()

정리

라이브러리함수설명
Matplotlibplt.plot(x, y)x, y 데이터를 이용한 선 그래프 그리기
plt.plot(data)리스트 데이터를 이용한 선 그래프 그리기
np.arange(start, stop, step)주어진 범위에서 일정 간격으로 값 생성
plt.xlim([min, max]), plt.ylim([min, max])x, y축의 범위를 설정
plt.xlabel('label')x축 레이블 추가
plt.ylabel('label')y축 레이블 추가
plt.title('title')그래프에 제목 추가
plt.show()그래프 출력
fig, axs = plt.subplots(nrows, ncols)서브플롯을 만들고, fig, axs 객체 반환
axs[n].set_xticks([values])특정 서브플롯의 x축 값 설정
axs[n].set_yticks([values])특정 서브플롯의 y축 값 설정
axs[n].set_xticklabels(['labels'])특정 서브플롯의 x축 레이블 설정
axs[n].set_yticklabels(['labels'])특정 서브플롯의 y축 레이블 설정
plt.rc('font', family='Font Name')그래프 폰트 설정
plt.plot(x, y, 'color', marker='marker', linestyle='style')그래프 스타일 설정 (색, 마커, 선 스타일)
plt.scatter(x, y)산점도 그래프 그리기
plt.bar(x, height)막대 그래프 그리기
plt.barh(y, width)수평 막대 그래프 그리기
plt.hist(data, bins)히스토그램 그리기
plt.pie(ratio, labels, autopct='%.1f%%')원형 차트 그리기 (비율, 레이블, 퍼센트 표기)
plt.boxplot(data)박스플롯 그리기
plt.errorbar(x, y, yerr=errors, fmt='o')에러바 플롯 (y값에 에러값 추가)
plt.xticks([values])x축 값 설정
plt.yticks([values])y축 값 설정
Seabornsns.relplot(x='x', y='y', hue='hue', style='style', data=df)관계형 그래프
sns.catplot(x='x', y='y', hue='hue', kind='kind', data=df)범주형 데이터 시각화
sns.barplot(x='x', y='y', hue='hue', data=df)범주형 막대 그래프
sns.boxplot(x='x', y='y', data=df)범주형 박스 플롯
sns.set_style('style')seaborn 스타일 설정
sns.set_palette('palette')seaborn 색상 팔레트 설정
sns.set_context('context')seaborn 컨텍스트 설정
sns.load_dataset('dataset')seaborn 내장 데이터셋 불러오기
sns.pairplot(df)변수 쌍 간의 관계 시각화
sns.heatmap(data)히트맵 그래프
sns.jointplot(x='x', y='y', data=df)두 변수 간 관계 시각화
sns.violinplot(x='x', y='y', data=df)바이올린 플롯
기타plt.figure(figsize=(width, height))그래프의 크기 설정 (인치 단위)

0개의 댓글