데이터 분석/Python - pandas

[실습] pandas 심화 1

toraa 2025. 1. 14. 15:42

진료정보_통합.csv 파일과 기상청_서울.csv 파일에서 다음 작업 진행

1. 진료정보_통합에서 '지역명'이 '서울'인 관측치를 인덱싱

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

plt.rc('font',family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] =False

df_medical = pd.read_csv('data/진료정보_통합.csv')
df_seoul = df_medical[df_medical['지역명']=='서울']
df_seoul

 

2. 기상청_서울에서 '일강수량(mm)'의 결측치를 0으로 채우고 나머지 컬럼의 결측치는 이전 관측치의 값으로 채우기

 

파일 불러오기

df_w = pd.read_csv('data/기상청_서울.csv',
                  encoding ='cp949')
df_w

 

결측치 채우기

df_w['일강수량(mm)'] = df_w['일강수량(mm)'].fillna(0)
df_w = df_w.bfill()
df_w

 

3. 두 테이블에서 지역을 의미하는 컬럼은 제거하고 날짜를 의미하는 컬럼의 이름을 동일하게 하여 날짜를 기준으로 병합(양쪽다 존재하는 데이터만)

df_w.drop(['지점', '지점명'], axis=1, inplace =True)
df_w.rename({'일시':'날짜'}, axis =1, inplace = True)
df_seoul.drop(['지역명','시도지역코드'], axis = 1,
             inplace =True)
df_merge = pd.merge(df_seoul, df_w, how='inner',
                   on='날짜')
df_merge

▷ 지점, 지점명 제거

inplace 인자 :기본값이 원래 False임 (원본이 바뀌기보다, 원본을 보존시키고 새로운 결과를 만듦)

원본이 바뀌어도 될때는 True로 설정해도 됨

True로 설정하면 한번 더 drop실행했을때 keyerror발생 주의(이미 drop을 시켰기 때문)

▷ 양쪽에 동일하게 존재하는 데이터 사용할때는 how='inner' 사용


3번의 병합결과에서 진행

4. '감기'컬럼의 데이터를 등비율 간격으로 나누어 '낮음','중간','높음'으로 범주화 하여 '감기발생' 컬럼으로 추가

df_merge['감기발생'] = pd.qcut(df_merge['감기'], q=3,
                          labels=['낮음','중간', '높음'])
df_merge

▷ 수치적 표현이 아닌 범주형 컬럼으로 변경 (그룹별로 분석 유용)

▷ qcut으로 등비율로 나눔

 

 

5. 감기발생 그룹에 따른 평균기온, 일강수량, 평균 풍속, 평균 상대습도의 평균 막대그래프를 4개의 표에 각각 그려 (2,2) 구조로 배치 하여 표현

- 각 그래프에는 낮음, 중간, 높음 범주에 대한 3개의 막대가 표현된 막대그래프가 표현되야함

df_gb = df_merge.groupby('감기발생')[['평균기온(°C)', '일강수량(mm)', '평균 풍속(m/s)', '평균 상대습도(%)']].mean()

plt.figure(figsize = (10,10))
i=0
for col in df_gb.columns:
    i += 1
    ax = plt.subplot(2,2,i)
    ax.bar(x=df_gb.index, height=df_gb[col])
    ax.set_title(f'감기발생에 따른 {col}')

plt.show()

▷ 감기발생으로 그룹화시켜서 각 변수에 대한 평균 집계

▷ 막대그래프는 기본값은 (2,2)에 그려짐

▷ 반복문 : 4개의 컬럼에 대해 반복문 컬럼진행

(데이터프레임 붙여도 컬럼만 가져와서 데이터프레임 넣어도됨)

▷ items로 넣는 반복문도 가능

▷ 컬럼이름을 문자열 포멧팅으로 설

 

 

6. 날짜 데이터로 부터 년도 데이터를 생성하고 년도 별 '천식', '눈병', '피부병' 평균을 집계하여 년도 변화에 따른 '천식', '눈병', '피부병' 추이를 하나의 표안에 3개의 선그래프로 그리기

df_merge['날짜']=pd.to_datetime(df_merge['날짜'], format='%Y-%m-%d')

df_merge['년도'] = df_merge['날짜'].dt.year.astype('str')
df_merge

문자열로 타입변환

 

df_gb = df_merge.groupby('년도')[['천식', '눈병', '피부병']].mean()

plt.figure(figsize=(20,10))
ax = plt.subplot()

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

ax.legend()
plt.show()

▷ 년도별로 그룹화해서 나머지 질병에 대해 평균값을 집계

df_gb = df_merge.groupby('년도')[['천식', '눈병', '피부병']].mean()

plt.figure(figsize=(20,10))
ax = plt.subplot()

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

ax.legend()
plt.show()

▷ columns로 반복문

▷ label값도 col로 설정

▷ 숫자형이 아닌 문자형으로 년도를 설정했기 때문에 명확하게 표기

 

 

7. [심화] 2022년도에 해당하는 관측치에서 월별 '감기'평균과 '일강수량(mm)' 평균을 하나의 표에 2개의 선그래프로 그리기 -그래프는 '감기'평균과 '일강수량(mm)' 평균은 각 컬럼의 가장 큰 값을 나눈값으로 y 축을 설정 (apply 함수 활용)

df_2022 = df_merge[df_merge['년도'] == '2022']
df_2022['월'] = df_2022['날짜'].dt.month
df_gb = df_2022.groupby('월')[['감기', '일강수량(mm)']].mean()

def scale(x):
    result = x / x.max()
    return result

df_scale = df_gb.apply(scale, axis=0)

plt.figure(figsize=(20,10))
ax = plt.subplot()

for col in df_scale.columns:
    ax.plot(df_scale.index, df_scale[col],
            label = col)
    
ax.legend()
plt.show()

▷ 여기선 월은 생략되어도 괜찮아서 문자가 아닌 숫자로 가져왔음

▷ scale함수: 하나의 값이 아닌 구조(시리즈)가 들어온다고 생각해서 만듦

최대값으로 나눠주는 scale 함수 생성

▷apply 함수에 scale함수 적용

: 감기/강수량 컬럼이 각각 scale 함수에 들어가야 하므로 axis=0으로 설정

▷ df_scale.index : index가 월에 해당

'데이터 분석 > Python - pandas' 카테고리의 다른 글

[실습] pandas 심화 2  (2) 2025.01.14
[이론] 기능의 반복적 적용  (2) 2025.01.14
[이론] 문자열과 날짜형  (2) 2025.01.14
[이론] 연속형과 비연속  (2) 2025.01.14
[실습] 시각화 : 여러 그래프  (2) 2025.01.13