진료정보_통합.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 |