250529 TIL

수이·2025년 5월 29일

🟡 TIL

목록 보기
60/60

개인스터디

파이썬 종합 복습반 3회차

문제 1) 포켓몬 타입 분포 (Bar Plot)
포켓몬 데이터셋의 type1 컬럼을 이용하여, 각 포켓몬 주요 타입별 포켓몬 수를 나타내는 막대 그래프를 그리세요. 타입별로 몇 마리의 포켓몬이 있는지 한눈에 비교할 수 있도록 시각화합니다.
Matplotlib 라이브러리를 사용하여 구현하세요.

# 데이터 확인
df['type1'].head()

import matplotlib.pyplot as plt

# 1. type1별 포켓몬 수 계산
# - 각 타입별 개수 세기
# - 보기 좋게 개수 내림차순 정렬
type1_cnt = df['type1'].value_counts()
type1_cnt.sort_values(ascending=False)

# print(type1_cnt.index)
# print(type1_cnt.values)

# 2. 막대 그래프 그리기
# - 타입명을 x축, 포켓몬 수를 y축으로 막대 그리기
plt.figure(figsize=(10,5))
plt.bar(type1_cnt.index, type1_cnt.values, color='skyblue')
# 그래프에 대한 친구들은 그래프 안에서 해야됨 / 색깔 

# 3. 그래프 제목과 축 레이블 설정
# - 그래프 제목
# - x축 레이블
# - y축 레이블

plt.xlabel('타입')
plt.ylabel('포켓몬 수')
plt.title('포켓몬 타입 분포')


# 4. x축 눈금 라벨 각도 조정 (라벨 겹침 방지)
# - 타입 이름이 많으므로 45도 회전

plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

문제 2) 공격 vs 방어 상관관계 (Scatter Plot)
포켓몬의 공격력(attack)과 방어력(defense) 사이의 관계를 산점도로 시각화하세요. Seaborn 라이브러리의 scatterplot을 사용하며, 전설 포켓몬과 일반 포켓몬이 서로 구분되도록 점의 색상을 다르게 표시합니다 (is_legendary 값을 활용). 이를 통해 공격력과 방어력 간 상관관계와 전설 포켓몬들의 분포 특성을 관찰합니다.

import seaborn as sns

# 1. 전설 여부를 나타내는 새로운 범주형 컬럼 추가 (시각화용)
# - 'is_legendary'가 0이면 '일반', 1이면 '전설' 문자열로 변환
df['legendary'] = df['is_legendary'].map({0 : '일반', 1 : '전설'})
# df['legendary].unique() 

# 2. 산점도 그리기 (공격력 vs 방어력)
plt.figure(figsize=(6,5))
sns.scatterplot(data=df, x='attack', y='defense', hue='legendary', alpha=0.7,
                palette='Set1', markers='o')

# hue : 색상을 분류하는 기준(범례도 자동 생성)
# style : 마커 모양 분류 기준 
# markers : 마커 모양 
# palette : 색상 조합 
# alpha : 투명도

# 3. 그래프 제목과 축 레이블 설정
# - 그래프 제목
# - x축 레이블
# - y축 레이블
plt.title('공격 vs 방어 일반 vs 전설 포켓몬')
plt.xlabel('공격력')
plt.ylabel('방어력')

# 4. 범례 제목 설정
plt.legend(title = '포켓몬 구분')
plt.show()

문제 3) 전설 vs 일반 포켓몬 능력치 분포 비교 (Histogram)
전설 포켓몬과 일반 포켓몬의 종합 능력치(base_total) 분포를 비교하는 히스토그램을 그리세요. 두 그룹의 분포를 한 그래프에 겹쳐서 표시하여, 전설 포켓몬이 일반 포켓몬에 비해 능력치 분포에 어떤 차이가 있는지 시각적으로 확인합니다.
Matplotlib 라이브러리를 사용하여 구현하세요.

import matplotlib.pyplot as plt

# 1. 전설 포켓몬과 일반 포켓몬으로 데이터 분리
# - 전설 포켓몬들의 종합 능력치 시리즈
# - 일반 포켓몬들의 종합 능력치 시리즈
legendary_stat = df[df['legendary'] == '전설']['base_total']
normal_stat = df[df['legendary'] == '일반']['base_total']

# 2. 히스토그램 설정
# - 능력치 최소 180부터 최대 800까지 40 간격으로 구간 설정
bins = range(180, 801, 40) # 근데 800으로 해도 크게 차이가 없어보이는데 왤까

# 3. 두 그룹의 히스토그램을 투명도 있게 겹쳐 그리기
plt.hist(normal_stat, bins=bins, alpha=0.5, label='일반 포켓몬', color='skyblue')
plt.hist(legendary_stat, bins=bins, alpha=0.5, label='일반 포켓몬', color='orange')

# 4. 그래프 제목과 축 레이블, 범례 설정
plt.title('전설 vs 일반 포켓몬 종합 능력치 분포')
plt.xlabel('종합 능력치')
plt.ylabel('포켓몬 수')
plt.legend()

plt.tight_layout()
plt.show()

문제 4) 세대별 평균 능력치 추이 (Line Plot)
포켓몬 세대(generation)별 평균 종합 능력치(base_total)의 변화를 선 그래프로 나타내세요. 세대를 1세대부터 7세대까지 x축에 두고, 해당 세대에 속한 포켓몬들의 평균 종합 능력치가 y축으로 오도록 해서 세대 간 능력치 변화 추이를 파악합니다.
Matplotlib 라이브러리를 사용하여 구현하세요.

import matplotlib.pyplot as plt

# 1. 세대별 평균 종합 능력치 계산
# - generation 컬럼으로 그룹화하여 base_total 평균 계산
avg_stats = df.groupby('generation')['base_total'].mean()
# print(avg_stats)

# 2. 세대 값과 평균값 준비
# - 세대 번호 (1, 2, ..., 7)
# - 각 세대별 평균 base_total 값
generations = avg_stats.index
avg_values = avg_stats.values 

# 3. 선 그래프 그리기
# - 세대별 평균을 선으로 연결 (포인트 표시)
plt.figure(figsize=(7,5))
plt.plot(generations, avg_values, marker='o', color='orange')

# 4. 그래프 제목과 축 레이블 설정
plt.title('세대별 평균 종합 능력치 추세')
plt.xlabel('세대')
plt.ylabel('평균 종합 능력치')

# 5. x축 눈금 세대를 정수 단위로 표시
# - 1~7 정수값 그대로 눈금 표시
plt.xticks(generations) # 한 거랑 안 한거랑 차이를 모르겟음
plt.tight_layout()
plt.show()

문제 5) 세대별 능력치 분포 비교 (Box Plot)
세대별 포켓몬들의 종합 능력치 분포를 Boxplot으로 시각화하세요. x축에 세대(generation)를, y축에 종합 능력치(base_total)를 놓고, 세대마다 포켓몬 능력치의 분포(중앙값, 사분위 범위 등)를 비교합니다. 각 세대별로 포켓몬 능력치가 어느 범위에 분포하는지, 그리고 세대 간 분포의 차이가 있는지 확인해보세요.
Seaborn 라이브러리를 사용하여 구현합니다.

import seaborn as sns

# 1. Boxplot 그리기 (세대별 base_total 분포)
plt.figure(figsize=(8,5))
sns.boxplot(x='generation', y='base_total', data=df, hue='generation', palette='Set3', legend=False)

# 2. 그래프 제목과 축 레이블 설정
plt.title('세대별 포켓몬 종합 능력치분포 (Boxplot)')
plt.xlabel('세대')
plt.ylabel('종합 능력치')

plt.show()

문제 6) 타입별 스피드 분포 (Violin Plot)
포켓몬의 주 타입별 스피드 분포를 Violin Plot으로 나타내세요. 각 포켓몬의 주 타입(type1)을 그룹으로 구분하여, 해당 그룹 포켓몬들의 스피드(speed) 분포가 어떻게 나타나는지 비교합니다. Seaborn의 violinplot을 사용하여 구현하며, Violin Plot의 모양을 통해 각 타입의 스피드 분포 형태(중심, 퍼짐 정도 등)를 관찰해보세요.

import seaborn as sns

# 1. 타입별 스피드 분포를 나태내는 Violinplot 그리기
plt.figure(figsize=(6,8))

# 2. type1 값을 스피드 중앙값 기준으로 정렬하여 순서 지정 (분포 비교를 더 쉽게)
# - 각 타입별 speed 중앙값으로 정렬된 타입 순서
order = df.groupby('type1')['speed'].median().sort_values().index
sns.violinplot(x='speed', y='type1', data=df, hue='type1', palette='Set1', order=order)

# 3. 그래프 제목과 축 레이블 설정
plt.title('포켓몬 타입별 스피드 분포(Violin plot)')
plt.xlabel('스피드')
plt.ylabel('타입')
plt.show()

문제 7) 능력치 상관관계 히트맵 (Heatmap)
포켓몬의 주요 능력치 간 상관관계를 히트맵(Heatmap)으로 시각화하세요. 예를 들어 HP, Attack, Defense, Special Attack, Special Defense, Speed 등의 기본 스탯들 사이의 상관계수 행렬을 구한 뒤, 이를 Heatmap으로 표시합니다. 가능하다면 몸무게(Weight)나 키(Height) 같은 물리적 특성과의 상관관계도 함께 포함해보세요.
Seaborn 라이브러리를 사용하여 히트맵을 그리고, 각 셀에 상관계수 값을 숫자로 표시합니다.

import seaborn as sns

# 1. 상관관계를 볼 특성 선택 (HP, Attack, Defense, Sp.Atk, Sp.Def, Speed, Weight, Height 등)
stats = ['hp', 'attack', 'defense', 'sp_attack', 'sp_defense', 'speed', 'weight_kg', 'height_m']

# 2. 선택한 특성들의 상관계수 행렬 계산
# - stats 리스트에 해당하는 컬럼들 간의 피어슨 상관계수 계산
corr=df[stats].corr()

# 3. 히트맵 그리기
# - 상관계수를 소수 둘째자리까지 표시
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm')

# 3. 그래프 제목과 축 레이블 설정
# - x축 레이블 각도 조정
# - y축 레이블은 수평 표시
plt.title('포켓몬 스탯 상관관계 Heatmap')
plt.xticks(rotation=45)
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()

문제 8) 키와 몸무게의 관계 (Plotly Scatter Plot)
Plotly 라이브러리를 사용하여 포켓몬의 키(height_m)와 몸무게(weight_kg) 관계를 나타내는 인터랙티브 산점도를 그리세요. 일반 포켓몬과 전설 포켓몬이 구분되도록 점 색상을 다르게 설정하고, 각 데이터 점에 마우스를 올리면 해당 포켓몬의 이름이 표시되도록 구현합니다. Plotly의 scatter(혹은 px.scatter) 기능을 활용하여 대화형으로 확대/축소 및 툴팁 확인이 가능한 산점도를 만들어 보세요.

import plotly.express as px

# 1. 전설 여부를 나타내는 범주형 라벨 컬럼 추가 (Normal vs Legendary)

# 2. Plotly 익스프레스의 scatter 함수로 산점도 객체 생성
fig = px.scatter(df,
                 x = 'height_m', y='weight_kg',
                 color='legendary',
                 title='Pokemon Height vs Weight (Interactive Scatter)',
                 hover_name='name')

# 3. 산점도 그래프 보여주기 (주피터 노트북 등에서 인터랙티브로 표시)
fig.show()


일기

  • SQLD 아답터 1과목 ✅ 아답터 2과목 ✅ 모의고사 2회 ✅
  • 종합복습반 4회차 과제 ✅ 3회차 복습 ✅

어제랑 똑같은 것 같지만 ... 네 ... SQLD 왤케 어려운 건데?

0개의 댓글