健康診断データを使用した仮定の検証


これらの内容は、Boost Cos🎄 仮定の作成
データの分析を始める前に、まずしなければならないこと.
  • 飲酒するかどうか健康診断の数値と違いがありますか
  • 身長やウエストの大きさは体重と正に相関していますか
  • 🎄 優先パラメータ
    # 글꼴 설치
    !sudo apt-get install -y fonts-nanum
    !sudo fc-cache -fv
    !rm ~/.cache/matplotlib -rf
    # 라이브러리 로드
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as pl
    import os
    
    # 폰트 설정
    plt.rc("font", family="NanumGothic")
    sns.set(font="NanumGothic", 
            rc={"axes.unicode_minus":False},
            style='darkgrid')
    🎄 データ検証
    ### 데이터 불러오기
    df = pd.read_csv("data/NHIS_OPEN_GJ_2017.CSV", encoding="cp949")
    
    ### 데이터 확인
    df.info()  # 기본정보
    df.columns # 데이터 행 종류
    df.dytpes  # 데이터 타입
    df.shape   # 데이터 크기
    
    ### 데이터 미리보기
    df.head() # 상위 5개
    df.tail() # 하위 5개
    
    ### 결측치 확인
    df.isnull()     		# 결측치 확인(isna() 동일) -> true/false
    df.isna().sum() 		# 결측치 수 집계
    df.isnull().sum().plot(rot=60)  # 시각화
    df.isnull().mean()		# 결측치의 비율 확인
    
    ### 데이터 요약
    # 단일데이터 -> series
    df['(혈청지오티)ALT']
    # 2개 이상 데이터 -> dataframe
    df[["(혈청지오티)ALT", "(혈청지오티)AST"]]
    # 수치데이터 요약 -> count, mean, std, min, max, Q1, Q2, Q3
    df[["(혈청지오티)ALT","(혈청지오티)AST"]].describe()
    🎄 データグループ
    ### groupby() -> series
    # '성별코드'에 따라 모든 열 평균
    df.groupby(['성별코드']).mean()
    # '성별코드'에 따른 '가입자일련번호' 빈도 수
    df.groupby(["성별코드"])["가입자일련번호"].count()
    # '성별코드', '음주여부'에 따른 '가입자일련번호' 빈도 수
    df.groupby(["성별코드", "음주여부"])["가입자일련번호"].count()
    # '성별코드', '음주여부'에 따른 '감마지티피' 평균
    df.groupby(["성별코드", "음주여부"])["감마지티피"].mean()
    # '성별코드', '음주여부'에 따른 '감마지티피' 수치데이터 요약
    df.groupby(["성별코드", "음주여부"])["감마지티피"].describe()
    
    ### pivot_table() -> dataframe :: groupby보다 연산속도↑, 직관
    # 연산 x, 데이터 구조 변경
    df.pivot
    # '음주여부'에 따른 '감마지티피' 평균(default)
    pd.pivot_table(df, index="음주여부", values="감마지티피")
    #  '음주여부'에 따른 '감마지티피' 수치데이터 요약
    pd.pivot_table(df, index="음주여부", values="감마지티피", 
      			aggfunc="describe")
    # '성별코드'에 따른 '가입자일련번호' 빈도 수
    df.pivot_table(index="성별코드", values="가입자일련번호", aggfunc="count")
    # '성별코드'에 따른 '가입자일련번호' 평균, 중앙값
    df.pivot_table(index="성별코드", values="가입자일련번호",
      			aggfunc=['mean', 'median'])
    🎄 データの表示
  • title:タイトル出力
  • xlim:x軸の範囲設定
  • grid:グラフのgrid
  • サブブロック:グラフを複数の部分に分割する
  • [histogram]
    # 연속된 데이터에 대해, 카테고리형으로 생성
    # 모든 컬럼에 대해 히스토그램 생성
    h = df.hist(figsize=(12, 12))
    
    # 일부 행(12:24)에 대해 히스토그램 생성
    h = df.iloc[:, 12:24].hist(figsize(12,12))
    # bins 옵션으로 막대의 개수 설정
    h = df.iloc[:, 12:24].hist(figsize=(12,12), bins=100)
    [countplot, barplot]
    # 1,000,000개 중 랜덤으로 정해준 개수만큼 가져옵
    df_sample = df.sample(1000, random_state=1)
    # seaborn 옵션 변경
    sns.set(font_scale=0.8, font="NanumGothic")
    
    ### countplot
    # pandas: 연산 후 시각화
    df["음주여부"].value_counts().plot.bar()
    
    # seaborn: x, y, data 지정
    sns.countplot(x="음주여부", data=df)
    # hue: 카테고리형 데이터 함께 그리기
    sns.countplot(x="음주여부", data=df, hue="성별코드")
    
    
    ### barplot(막대)
    sns.barplot(data=df, x="연령대코드(5세단위)", y="총콜레스테롤")
    # hue: 음주여부 추가
    sns.barplot(data=df_sample, x="연령대코드(5세단위)", y="총콜레스테롤", 
      		hue="음주여부")
    
    # 신뢰구간: ci = n(%)
    # 모수가 어느 범위 안에 있는지를 확률적으로 보여주는 방법
    sns.barplot(data=df_sample, x="연령대코드(5세단위)", y="트리글리세라이드", 
      		hue="음주여부", ci=95)
    [lineplot(線)、pointplot(点)]
    # plot 크기 조절
    plt.figure(figsize=(15,4))
    
    # 기울기 표현 가능
    # 가격데이터, 매출/재고 데이터 표현
    
    ### lineplot
    # 편차, 신뢰구간: 그림자로 표현
    sns.lineplot(data=df, x="연령대코드(5세단위)", y="체중(5Kg단위)", 
      		hue="성별코드")
    # ci="sd" (standard deviation(표준편차))
    sns.lineplot(data=df, x="연령대코드(5세단위)", y="신장(5Cm단위)",
      		hue="성별코드", ci="sd")
    
    ### pointplot(점)
    # 편차, 신뢰구간: 막대로 표현
    sns.pointplot(data=df, x="연령대코드(5세단위)", y="신장(5Cm단위)", 
      		hue="음주여부", ci="sd")
    [boxplot, violinplot, swarmplot]
    ### boxplot
    # IQR = Q3 - Q1
    # (Q3 + 1.5*IQR) 초과 OR (Q1 - 1.5*IQR) 미만 == 이상치
    sns.boxplot(data=df, x="신장(5Cm단위)", y="체중(5Kg단위)",
      			hue="성별코드")
    
    ### violinplot
    # ~~ hist + box
    # boxplot 단점 보완 -> 결과분포의 정확한 값, 세부정보 확인
    sns.violinplot(data=df, x="신장(5Cm단위)", y="체중(5Kg단위)")
    # split 옵션 -> 2개의 데이터 함께
    sns.violinplot(data=df_sample, x="신장(5Cm단위)", y="체중(5Kg단위)", 
      		hue="음주여부", split=True)
    
    ### swarmplot(산점도)
    sns.swarmplot(data=df_sample, x="신장(5Cm단위)", y="체중(5Kg단위)", 
      		hue="음주여부")
    [sportplot(散布図)、implot(回帰線)]
    ### scatterplot
    # 수치형 데이터, 이상치 파악에 유리
    sns.scatterplot(data=df, x="(혈청지오티)AST", y="(혈청지오티)ALT")
    
    ### implot
    # 상관관계 파악에 유리
    # 여러 카테고리에 따라 subplot 그리기 가능
    sns.lmplot(data=df_sample,x="연령대코드(5세단위)", y="혈색소", hue="음주여부")
    # robust=True: 이상치를 제외하고 그리기
    sns.lmplot(data=df_sample, x="(혈청지오티)AST", y="음주여부", robust=True)
    # 이상치 다루기: 범위 지정
    df_ASLT = df_sample[(df_sample["(혈청지오티)AST"] < 400)
                           & (df_sample["(혈청지오티)ALT"] < 400)]
    [distplot, kdeplot]
    ### distplot: 히스토그램 + 선
    # 결측치 존재하지 않는 데이터 활용해야 함
    df_chol = df.loc[df["총콜레스테롤"].notnull(), "총콜레스테롤"]
    # bins: 데이터를 몇개로 나눠 담을지
    sns.distplot(df_chol, bins=10)
    # hist=False: 선만 표시
    sns.distplot(df.loc[(df["총콜레스테롤"].notnull())
      			& (df["음주여부"] == 1), "총콜레스테롤"],hist=False)
    
    ### kdeplot: 확률밀도함수
    sns.kdeplot(df.loc[(df["총콜레스테롤"].notnull()) 
      			& (df["음주여부"] == 1), "총콜레스테롤"])
    # plt.axvline(): 평균값, 중앙값 표시
    plt.axvline(df_sample["총콜레스테롤"].median(), linestyle="--")
    sns.kdeplot(df.loc[(df["총콜레스테롤"].notnull()) 
      			& (df["음주여부"] == 1), "총콜레스테롤"])
    [heatmap]
    # 상관관계가 있는 dataframe반환
    df_corr = df_sample.corr()
    # 상관관계↑ = 숫자↑
    df_corr['신장(5cm단위)'].sort_values()
    # 상관계수 조건 설정
    df_corr.loc[df_corr["신장(5Cm단위)"] > 0.3, "신장(5Cm단위)"]
      
    ### heatmap
    # correlation(상관관계) 표현
    sns.heatmap(df_corr, annot=True, fmt=".2f", cmap="Blues")
    # 대각선 아래만 표시
    mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
    sns.heatmap(df_corr, annot=True, fmt=".2f", cmap="Blues", mask=mask)
    🎄 コード結果の確認
    健康診断データを用いて仮説検査を行う。ipynb
    🎄 その他の参考資料
    python-Seabornライブラリのヒストグラム、カウントアウトマップ、distplotの主な違いは何ですか?