[TIL] 22.10.13

문종현·2022년 10월 13일
0

TIL

목록 보기
15/119
post-custom-banner

👉 오늘 한 일

  • 의약품 처방정보 분석

📌kosis 복습
matplotlib 계열은 한글 시각화를 지원하지 않음. koreanize_matplotlib 라이브러리로 한글폰트 사용하기

파일 불러올 때 glob 사용해서 변수에 지정해서 사용 권장

df.drop()

  • how='any' : 디폴트. 결측치가 하나라도 있으면 삭제.
    • 'all' : 모두 결측치면 삭제

의약품 처방정보 분석

처방정보 공공데이터에 데이터가 잘 되어 있음에도 유료로 구매하는 이유
=> 해당 공공데이터는 시기성이 떨어짐
=> 데이터셋에 따라 이유가 다름

외부 데이터 참고

  • 데이터를 처리하고 분석할 때, 데이터에 대한 정보를 외부에서 추가로 수집해야 할 필요가 있음

  • 데이터가 수집된 분야에 대한 지식을 알고 있다면 더 유의미하고 정확한 데이터 분석이 가능함

  • 관련된 또 다른 데이터 확보, 관련 분야 논문, 관련 분야 종사자의 의견 등 다양한 정보가 참고할만한 외부 데이터가 될 수 있음

  • 논문이나 칼럼을 읽고 데이터에 대한 새로운 인사이트를 얻어 분석할 수도 있고, 다른 데이터의 변수와의 상관관계를 도출해낼 수도 있음

데이터 샘플링

데이터가 너무 커서 일부만 샘플링함
seed는 42로 고정

42의 의미?
https://namu.wiki/w/42(%EC%9D%80%ED%95%98%EC%88%98%EB%A5%BC%20%EC%97%AC%ED%96%89%ED%95%98%EB%8A%94%20%ED%9E%88%EC%B9%98%ED%95%98%EC%9D%B4%EC%BB%A4%EB%A5%BC%20%EC%9C%84%ED%95%9C%20%EC%95%88%EB%82%B4%EC%84%9C)

  1. numpy 이용
  • np 공식문서에서 random.seed()보다 random generator(rng)를 사용해 시드를 사용할 것을 권장함
# np.random.seed(42)
# sample_no = np.random.choice(raw["가입자 일련번호"].unique(), 10000)
rng = np.random.default_rng(42)
sample_no = rng.choice(raw["가입자 일련번호"].unique(), 10000)
sample_no
  1. pandas 이용
sample_no = raw["가입자 일련번호"].sample(10000, random_state=42)

분석 이전에 도메인 지식을 충분히 숙지하고 분석 시작하기

시도명같은 텍스트 데이터를 코드값으로 변경해서 사용하는 이유?
=> 데이터 용량을 줄이기 위해

데이터 전처리 및 분석

Series와 매칭 가능한 딕셔너리도 map을 통해 적용할 수 있음

  • map(함수 or 반복가능한 객체)
  • key와 value의 데이터 타입은 map을 적용할 Series와 잘 맞춰줘야 함
  • map 대신 replace 사용 가능
  • e.g.
age_code = """1 00~04세 
2 05~09세
3 10~14세
4 15~19세
5 20~24세
6 25~29세
7 30~34세
8 35~39세
9 40~44세
10 45~49세
11 50~54세
12 55~59세
13 60~64세
14 65~69세
15 70~74세
16 75~79세
17 80~84세
18 85세+"""

age_list = age_code.split("\n")
# 딕셔너리 컴프리헨션
# 반복문으로 직접 key, value값 지정해서 딕셔너리 생성할 수도 있음
age_dict = {int(age.split(" ")[0]) : age.split(" ")[1] for age in age_list}

df["연령대"] = df["연령대코드(5세단위)"].map(age_dict)

파생변수 만들기

# 투여경로 처리
drug_type = "내복제:A, 주사제:B, 외용제:C, 기타:D" # 홈페이지에서 copy
drt_dict = {drt.split(":")[1].strip() : drt.split(":")[0].strip() for drt in drug_type.split(",")}
df["투여경로"] = df["약품일반성분명코드"].str[6].map(drt_dict)

# 제형명칭 처리
table = pd.read_html("https://www.health.kr/drug_info/basedrug/main_ingredient.html")[1]
df_table = table[["제형코드", "제형명칭"]]
df_table_dict = df_table.set_index("제형코드")["제형명칭"].to_dict()
df["제형명칭"] = df["약품일반성분명코드"].str[-2:].map(df_table_dict)

상관분석

sns.heatmap()

  • vmin, vmax : 값의 최소, 최대 범위 지정

np.ones_like(corr) : corr의 배열만큼 1로 채워진 array 만들기

  • np.ones(corr.shape) 로도 사용할 수 있음

np.triu() : matrix를 상삼각행렬로 만드는 numpy math

가독성을 높이기 위해 대각행렬 기준으로 한쪽의 데이터들만 masking 기법을 통해 plot

코드 정리

corr = df.corr()
mask = np.triu(np.ones_like(corr))

sns.heatmap(corr, annot=True, cmap="Blues", mask=mask)

cmap 팔레트

  • 가장 색상 대비가 잘되는 coolwarm 사용
print(plt.colormaps())

시각화

seaborn에서는 데이터프레임에 등장한 값의 순서대로 자동 정렬함

  • 축 label의 정렬을 위해 data=df.sort_values() 로 데이터프레임 자체를 정렬해서 시각화

퀴즈정리
변수에 리스트가 들어있을 때 unique 값의 개수를 확인하는 법
=> len(set(변수))

profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글