ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 44 - 공분산 / 상관계수 예제
    Python 데이터 분석 2022. 11. 10. 12:21

     

     

    # 공분산 / 상관계수
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rc('font', family = 'malgun gothic')
    
    df = pd.read_csv('../testdata/drinking_water.csv')
    print(df.head(3))
    
    # 표준편차
    print(np.std(df['친밀도']))
    print(np.std(df['적절성']))
    print(np.std(df['만족도']))
    
    # 공분산
    print('공분산---') # numpy 이용(2개씩밖에 못 넣음)
    print(np.cov(df['친밀도'], df['적절성']))
    print(np.cov(df['친밀도'], df['만족도']))
    
    print()
    print(df.cov())  # pandas 이용
    
    print('상관계수---') # numpy 이용(2개씩밖에 못 넣음)
    print(np.corrcoef(df['친밀도'], df['적절성']))
    print(np.corrcoef(df['친밀도'], df['만족도']))
    
    print()
    print(df.corr())  # pandas 이용
    print(df.corr(method='pearson'))  # 등간, 비율 척도. 정규성을 따름
    print(df.corr(method='spearman')) # 서열 척도. 정규성을 따르지 않음.
    print(df.corr(method='kendall'))  # spearman과 유사
    
    # 만족도에 대한 다른 특성 사이의 상관관계 출력
    co_re = df.corr()
    print(co_re['만족도'].sort_values(ascending = False)) # 만족도만 따로 호출
    
    print()
    # 시각화
    df.plot(kind = 'scatter', x = '만족도', y = '적절성')
    plt.show()
    
    from pandas.plotting import scatter_matrix
    attr = ['친밀도', '적절성', '만족도']
    scatter_matrix(df[attr], figsize = (10, 6))
    plt.show()
    
    # 상관관계 시각화 : heatmap
    import seaborn as sns
    sns.heatmap(df.corr())
    plt.show()
    
    print()
    # heatmap에 텍스트 표시 추가사항 적용해 보기
    corr = df.corr()
    # Generate a mask for the upper triangle
    mask = np.zeros_like(corr, dtype=np.bool)  # 상관계수값 표시
    mask[np.triu_indices_from(mask)] = True
    # Draw the heatmap with the mask and correct aspect ratio
    vmax = np.abs(corr.values[~mask]).max()
    fig, ax = plt.subplots()     # Set up the matplotlib figure
    
    sns.heatmap(corr, mask=mask, vmin=-vmax, vmax=vmax, square=True, linecolor="lightgray", linewidths=1, ax=ax)
    
    for i in range(len(corr)):
        ax.text(i + 0.5, len(corr) - (i + 0.5), corr.columns[i], ha="center", va="center", rotation=45)
        for j in range(i + 1, len(corr)):
            s = "{:.3f}".format(corr.values[i, j])
            ax.text(j + 0.5, len(corr) - (i + 0.5), s, ha="center", va="center")
    ax.axis("off")
    plt.show()
    
    
    
    <console>
       친밀도  적절성  만족도
    0    3    4    3
    1    3    3    2
    2    4    4    4
    0.968505126935272
    0.8580277077642035
    0.8271724742228969
    공분산---
    [[0.94156873 0.41642182]
     [0.41642182 0.73901083]]
    [[0.94156873 0.37566252]
     [0.37566252 0.68681588]]
    
              친밀도       적절성       만족도
    친밀도  0.941569  0.416422  0.375663
    적절성  0.416422  0.739011  0.546333
    만족도  0.375663  0.546333  0.686816
    상관계수---
    [[1.         0.49920861]
     [0.49920861 1.        ]]
    [[1.         0.46714498]
     [0.46714498 1.        ]]
    
              친밀도       적절성       만족도
    친밀도  1.000000  0.499209  0.467145
    적절성  0.499209  1.000000  0.766853
    만족도  0.467145  0.766853  1.000000
              친밀도       적절성       만족도
    친밀도  1.000000  0.499209  0.467145
    적절성  0.499209  1.000000  0.766853
    만족도  0.467145  0.766853  1.000000
              친밀도       적절성       만족도
    친밀도  1.000000  0.511078  0.501201
    적절성  0.511078  1.000000  0.748510
    만족도  0.501201  0.748510  1.000000
              친밀도       적절성       만족도
    친밀도  1.000000  0.466729  0.459353
    적절성  0.466729  1.000000  0.703214
    만족도  0.459353  0.703214  1.000000
    만족도    1.000000
    적절성    0.766853
    친밀도    0.467145
    Name: 만족도, dtype: float64

     

     

    만족도와 적절성의 시각화

     

    친밀도, 적절성, 만족도의 시각화

     

    상관관계 시각화(heatmap 사용)

     

    상관관계 시각화(heatmap 사용) 숫자 표시

     

     

    댓글

Designed by Tistory.