데이터 분석/Python - pandas

[실습] 시각화 : 여러 그래프

toraa 2025. 1. 13. 22:40

진료정보_통합.csv 파일에서 다음 작업 진행

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='Malgun Gothic')

df= pd.read_csv('./data/진료정보_통합.csv')
df

 

1. '날짜'가 '2023' 보다 크고 '지역명'이 '서울'인 관측치를 인덱싱

plt.figure()
df_sub = df[(df['지역명']== '서울') & (df['날짜']>'2023')]
df_sub

 

 

2. 1번 결과에서 날짜별 '천식','눈병','피부병'의 추이를 하나의 표안에 여러개의 선그래프로 그리기

df_gp = df_sub.groupby('날짜',as_index=True)[['천식','눈병','피부병']].mean()
df_gp

plt.figure(figsize=(20,10))
ax = plt.subplot()
x = df_gb.index.astype('datetime64[ns]')

for col in df_gp.columns:
    ax.plot(x, df_gb[col], label = col)

ax.legend()
plt.show()

▷ groupby안하고 날짜 컬럼만 가져와도 됨 (컬럼인지 인덱스인지 잘 인지만 하면 됨)

▷ 여러개의 그래프를 그릴때, 값을 동일하게 하는것이 좋기 때문에

▷ astype으로 타입 날짜형으로 변환

▷ for반복문으로 컬럼을 하나씩 가져옴

: y값만 각 컬럼에 해당하는 값만 시리즈로 가져옴

 

 

3. '날짜'가 '2023' 보다 큰 관측치에서 '지역명'과 '날짜'로 그룹화 하여 '감기'의 평균을 피벗 테이블로 생성

df_sub = df[df['날짜']>'2023']
pivot = pd.pivot_table(df_sub, index='지역명',
                      columns='날짜',
                      values='감기',
                    aggfunc='mean')
pivot=pivot.astype('int64')

 

 

4. 3번의 결과에서 '날짜'가 '2023-01-01','2023-02-01','2023-03-01','2023-04-01'인 데이터만 선택하여 부분 데이터프레임 생성

print(pivot.columns)

Index(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
       '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10',
       ...
       '2023-04-21', '2023-04-22', '2023-04-23', '2023-04-24', '2023-04-25',
       '2023-04-26', '2023-04-27', '2023-04-28', '2023-04-29', '2023-04-30'],
      dtype='object', name='날짜', length=120)

▷ 날짜가 인덱스가 아닌 컬럼이므로, 선택할때 주의해야함

▷ 컬럼으로 되어있는 날짜만 인덱싱하기 

pivot_sub = pivot[['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']]
pivot_sub

▷ 이렇게 피벗 테이블 들고와도 됨

pivot_sub = pivot.loc[:,['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']]
pivot_sub

▷ pivot.loc[['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']] 가 아닌

pivot.loc[ : , ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']]

 

 

5. 4번의 결과에서 다음과 같은 3개의 그래프를 각각의 표로 하나의 그림판 안에 그리기 (배치는 자유롭게)

plt.figure(figsize = (20,20))

ax1 = plt.subplot(2,2,1)
ax2 = plt.subplot(2,2,2)
ax3 = plt.subplot(2,1,2)

plt.show()


 a. '지역명'이 '경기'인 관측치에서 각 날짜별 감기 평균값을 막대그래프로 그리고 평균선을 중첩하여 그리기

 b. '지역명'이 '서울'인 관측치에서 각 날짜별 감기 평균값을 막대그래프로 그리고 평균선을 중첩하여 그리기
 c. 경기의 날짜별 감기 평균과 서울의 날짜별 감기 평균을 중첩 막대그래프로 표현

plt.figure(figsize = (20,20))

ax1 = plt.subplot(2,2,1)
ax2 = plt.subplot(2,2,2)
ax3 = plt.subplot(2,1,2)

mean = pivot.loc['경기'].mean()
ax1.bar(x=pivot_sub.columns, height=pivot_sub.loc['경기'], color = '#AFEEEE', label='값')
ax1.axhline(mean, color='red', linestyle='--', label=f'평균: {mean:.2f}')
ax1.set_title('경기 막대 평균',fontsize=16)

mean = pivot.loc['서울'].mean()
ax2.bar(x=pivot_sub.columns, height=pivot_sub.loc['경기'], color = '#FFB6C1', label='값')
ax2.axhline(mean, color='red', linestyle='--', label=f'평균: {mean:.2f}')
ax2.set_title('서울 막대 평균',fontsize=16)


# 막대 너비 설정
bar_width = 0.4
# 막대 위치 조정
x1 = [i - bar_width/2 for i in range(4)]
x2 = [i + bar_width/2 for i in range(4)]

# 첫 번째 막대 
ax3.bar(x1, pivot_sub.loc['경기'], bar_width, label='경기')
# 두 번째 막대 
ax3.bar(x2, pivot_sub.loc['서울'], bar_width, label='서울')

#컬럼 이름들 변경
ax3.set_xticks(range(len(x1))) 
ax3.set_xticklabels(pivot_sub.columns, fontsize=12)
ax3.set_title('경기&서울 막대',fontsize=16)

plt.tight_layout()
plt.legend()
plt.show()

▷ height=pivot_sub.loc['경기'] : '경기'에 해당하는 값들을 시리즈로 들고 옴