ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. EDA를 통해 데이터 탐색하기
    교육/코칭스터디<Data Science Projects 2024> 2024. 1. 22. 14:27
    728x90

    2.1.1 당뇨병 데이터셋 미리보기

    데이터 구성

    • Pregnancies : 임신 횟수
    • Glucose : 2시간 동안의 경구 포도당 내성 검사에서 혈장 포도당 농도
    • BloodPressure : 이완기 혈압 (mm Hg)
    • SkinThickness : 삼두근 피부 주름 두께 (mm), 체지방을 추정하는데 사용되는 값
    • Insulin : 2시간 혈청 인슐린 (mu U / ml)
    • BMI : 체질량 지수 (체중kg / 키(m)^2)
    • DiabetesPedigreeFunction : 당뇨병 혈통 기능
    • Age : 나이
    • Outcome : 768개 중에 268개의 결과 클래스 변수(0 또는 1)는 1이고 나머지는 0입니다.
    #라이브러리 로드
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    %matplotlib inline
    
    #데이터셋 로드
    pd.read_csv("data/diabetes.csv")
    
    #데이터셋 행렬크기 확인
    df.shape
    
    #데이터셋 상위 5개 행 미리보기
    df.head()
    
    #데이터셋 타입,결측치,메모리사용량확인
    df.info()
    
    #데이터셋 결측치 확인
    df_null=df.isnull()
    df_null.head()
    
    #데이터셋 결측치 수 확인
    df_null.sum()
    
    #데이터셋 수치데이터에 대한 요약값
    df.describe()
    
    #처음 시작열부터 마지막에서 2번째 열까지 가져와 리스트 형태로 만듦
    feature_columns=df.columns[0:1].tolist()
    feature_columns

    2.1.2 결측치 보기

    #데이터셋에서 첫번쨰 열을 빼고 나머지 열들을 cols변수로 가져옴
    cols=feature_columns[1:]
    cols
    
    #0으로 기록된 값은 null처리 후, 결측치를 알아봄
    df_null=df[cols].replace(0,np.nan)
    df_null=df_null.isnull()
    df_null.sum()
    
    #결측치 수치를 시각화
    df_null.sum().plot.barh()
    
    #결측치 전체 대비 비율
    df_null.mean()*100
    
    #히트맵
    plt.figure(figsize=(15,4))
    sns.heatmap(df_null, cmap="Greys_r")

    2.1.3 훈련과 예측에 사용할 정답값을 시각화로 보기

    #정답값
    df["Outcome"]
    
    #발병한 경우/발병하지 않은 경우의 수 비교
    df["Outcome"].value_counts()
    
    #발병하는 확률을 전체비율로 확인
    df["Outcome"].value_count(normalize=True)
    
    #임신횟수에 따른 당뇨병 발병확률
    df.groupby(["Pregnancies"])["Outcome"].mean()
    
    #임신횟수에 따른 당뇨병 빈도수
    df.groupby(["Pregnancies"])["Outcome"].agg(["mean","count"])
    
    #Pregnancies를 인덱스값으로 사용
    df_po=df.groupby(["Pregnancies"])["Outcome"].agg(["mean","count"]).reset_index()
    df_po
    
    #시각화 그래프
    df_po.plot()
    
    #mean에 대한 시각화 그래프
    df_po["mean"].plot()
    
    #mean에 대한 막대 그래프
    df_po["mean"].plot().bar()
    
    #글씨를 회전하여 세워서 볼 수 있음
    df_po["mean"].plot().bar(rot=0)
    
    #seaborn 그래프
    sns.countplot(data=df,x="Outcome")
    
    #임신횟수를 카운트하여 시각화
    sns.countplot(data=df, x="Pregnancies")
    
    #임신횟수에 따른 당뇨병 발병 빈도수 비교
    sns.coutplot(data=df, x="Pregnancies",hue="Outcome")
    
    #임신횟수 6번을 기준으로 True/False지정
    df["Pregnancies_high"]=df["Pregnancies"]>6
    df[["Pregnancies","Pregnancies_high"]].head()
    
    #2개의 카테고리로 나뉜 임신 횟수를 카운트
    sns.countplot(data=df,x="Pregnancies_high")
    
    #임신횟수에 따른 발병횟수 비교
    sns.countplot(data=df, x="Pregnancies_high", hue="Outcome")

    2.1.4 두 개의 변수를 정답값에 따라 시각화 해보기

    #당뇨병 발병에 따른 BMI수치를 비교
    sns.barplot(data=df, x="Outcome",y="BMI")
    
    #당뇨병 발병에 따른 글루코스수치 비교
    sns.barplot(data=df, x="Outcome",y="Glucose")
    
    #당뇨병 발병에 따른 인슐린수치 비교
    sns.barplot(data=df, x="Outcome",y="insulin")
    
    #임신횟수에 따른 당뇨병 발병 횟수 비교
    sns.barplot(data=df,x="Pregnancies",y="Outcome")
    
    #임신횟수에 따른 당뇨병 발병횟수에 따른 글루코스수치 비교
    sns.barplot(data=df,x="Pregnancies",y="Glucose",hue="Outcome")
    
    #임신횟수에 따른 당뇨병 발병횟수에 따른 BMI수치 비교
    sns.barplot(data=df, x="Pregnancies",y="BMI",hue="Outcome")
    
    #임신횟수에 따른 당뇨병 발병횟수에 따른 인슐린수치 비교
    sns.barplot(data=df, x="Pregnancies, y="insulin", hue="Outcome")
    
    sns.barplot(data=df[df["Insulin"] > 0], x="Pregnancies", y="Insulin", hue="Outcome")
    sns.boxplot(data=df, x="Pregnancies", y="Insulin", hue="Outcome")
    sns.boxplot(data=df[df["Insulin"] > 0], x="Pregnancies", y="Insulin", hue="Outcome")
    
    plt.figure(figsize=(15, 4))
    sns.violinplot(data=df[df["Insulin"] > 0], x="Pregnancies", y="Insulin", hue="Outcome", split=True)
    
    plt.figure(figsize=(15, 4))
    sns.violinplot(data=df[df["Insulin"] > 0], x="Pregnancies", y="Insulin", hue="Outcome")

    2.1.5 수치형 변수의 분포를 정답값에 따라 시각화해보기

    #1개의 수치형변수(Pregnancies) 표현
    sns.distplot(df["Pregnancies"])
    
    #발병한 경우/발병하지 않은 경우를 변수에 할당
    df_0=df[df["Outcome"]==0]
    df_1=df[df["Outcome"]==1]
    df_0.shape,df_1.shape
    
    #임신여부에 따른 당뇨병 발병률
    sns.distplot(df_0["Pregnancies"])
    sns.distplot(df_1["Pregnancies"])
    
    #나이에 따른 당뇨병 발병률
    sns.distplot(df_0["Age"])
    sns.distplot(df_1["Age"])
    
    #곡선 그래프만 남길 때
    sns.distplot(df_0["Age"],hist=false)
    sns.distplot(df_1["Age"],hist=false)

    2.1.6 서브플롯으로 모든 변수 한번에 시각화하기

    #distplot은 밀도함수와 커널추정함수를 같이 그려줌
    #subplot은 범주형 column을 시각화할 때 사용
    #histplot은 수치형 데이터를 시각화할 때 사용
    df["Pregnancies_high"]=df["Pregnancies_high"].astype(int)
    h=df.hist(figsize=(15,15),bins=20)
    
    #모든 column을 다 만들고 싶으면 서브플롯을 그려야함
    #column의 갯수 세기
    col_num=df.columns.shape
    col_num
    
    #서브플롯 그리기
    fig, axes=plt.subplots(nrows=3,ncols=3,figsize(15,15))
    
    #Outcome을 x축으로 하는 displot 그리기
    fig,axes=plt.subplots(nrows=3,ncols=3, figsize=(15,15))
    sns.distplot(df["Outcome"],ax=axes[0][0])
    
    #반복문을 활용하여 subplots를 그리기
    cols=df.columns[:-1].tolist()
    fig, axes=plt.subplots(nrows=3,ncols=3,figsize=(15,15))
    
    for i, col_name in enumerate(cols):
        row=i//3
        col=i%3
        
    sns.distplot(df[col_name],ax=axes[row][col])

    2.1.7 시각화를 통한 변수간의 차이 이해하기

    #violin plot
    fig,axes=plt.subplots(nrows=4,ncols=2,figsize=(15,15))
    
    for i, col_name in enumerate(cols[:-1]):
        row=i//2
        col=i%2
    sns.violinplot(data=df, x="Outcome",y=col_name, ax=axes[row][col])
    
    sns.regplot(data=df,x="Glucose",y="Insulin")
    
    sns.lmplot(data=df, x="Glucose",y="Insuline", hue="Outcome")
    
    sns.lmplot(data=df[df["Insulin"]>0],x="Glucose",y="Insulin",hue="Outcome")
    
    #Pairplot(모든 수치에 대해 plot을 그림)
    sns.pairplot(df)
    
    g=sns.PairGrid(df, hue="Outcome")
    g.map(plt.scatter)

    2.1.8 피처엔지니어링을 위한 상관계수 분석하기

    #상관분석
    df_corr=df.corr()
    
    #상관계수
    df_corr.style.background_gradient()
    
    #히트맵
    sns.heatmap(df_corr)
    sns.heatmap(df_corr,vmax=1,vmin=1)
    
    figure(figsize=(15,8))
    sns.heatmap(df_corr, annot=True, vmax=1, vmin=-1,cmap="coolwarm")
    
    df.iloc[:,:-2].replace(0,np.nan)
    
    df_matrix=df.iloc[:,:-2].replace(0,np.nan)
    df_matrix=["Outcome"]=df["Outcome"]
    df_matrix.head()
    
    df_corr["Outcome"]
    
    sns.regplot(data=df_matrix,x="Insulin",y="Glucose")
    
    sns.regplot(data=df,x="Age",y="Pregnancies")
    
    sns.lmplot(data=df, x="Age",y="Pregnancies",hue="Outcome")
    
    sns.lmplot(data=df,x="Age",y="Pregnancies",hue="Outcome",col="Outcome")

    댓글

Designed by Tistory.