본문 바로가기
파이썬

파이썬 matplotlib에서 상관 관계 그래프 그리기

by º기록 2020. 9. 25.
반응형

n = 2 인 이산 벡터 데이터 세트가 있다고 가정합니다.

DATA = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]

두 변수 간의 상관 관계를 시각화하기 위해 matplotlib로 해당 데이터 세트를 어떻게 플로팅 할 수 있습니까?

간단한 코드 예제라면 좋을 것입니다.

 

해결 방법

 

Joe Kington이 정답을 가지고 있지만 DATA 가 표현 된 것보다 더 복잡 할 수 있습니다. 'a'에 여러 값이있을 수 있습니다. Joe가 x 축 값을 작성하는 방법은 빠르지 만 고유 한 값 목록에서만 작동합니다. 이 작업을 수행하는 더 빠른 방법이있을 수 있지만이 방법으로 수행했습니다.

import matplotlib.pyplot as plt

def assignIDs(list):
    '''Take a list of strings, and for each unique value assign a number.
    Returns a map for "unique-val"->id.
    '''
    sortedList = sorted(list)

    #taken from
    #http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in-python-whilst-preserving-order/480227#480227
    seen = set()
    seen_add = seen.add
    uniqueList =  [ x for x in sortedList if x not in seen and not seen_add(x)]

    return  dict(zip(uniqueList,range(len(uniqueList))))

def plotData(inData,color):
    x,y = zip(*inData)

    xMap = assignIDs(x)
    xAsInts = [xMap[i] for i in x]


    plt.scatter(xAsInts,y,color=color)
    plt.xticks(xMap.values(),xMap.keys())


DATA = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]


DATA2 = [
    ('a', 3),
    ('b', 4),
    ('c', 4),
    ('d', 3),
    ('e', 1),
    ('f', 4),
    ('a', 5),
    ('b', 7),
    ('c', 7),
    ('d', 6),
    ('e', 4),
    ('f', 7),
]

plotData(DATA,'blue')
plotData(DATA2,'red')

plt.gcf().savefig("correlation.png")

DATA2 세트에는 모든 x 축 값에 대해 두 개의 값이 있습니다. 아래에 빨간색으로 표시됩니다. 여기에 이미지 설명 입력

수정


import matplotlib.pyplot as plt
import numpy as np

def plotData(inData,color):
    x,y = zip(*inData)

    xMap = assignIDs(x)
    xAsInts = np.array([xMap[i] for i in x])

    pearR = np.corrcoef(xAsInts,y)[1,0]
    # least squares from:
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
    A = np.vstack([xAsInts,np.ones(len(xAsInts))]).T
    m,c = np.linalg.lstsq(A,np.array(y))[0]

    plt.scatter(xAsInts,y,label='Data '+color,color=color)
    plt.plot(xAsInts,xAsInts*m+c,color=color,
             label="Fit %6s, r = %6.2e"%(color,pearR))
    plt.xticks(xMap.values(),xMap.keys())
    plt.legend(loc=3)

새로운 수치는 다음과 같습니다. 여기에 이미지 설명 입력


선형 근사값이 유용하고 적합도 만보고 정 성적으로 결정할 수있는 경우 y 방향을 평평하게하기 전에이 추세를 빼고 싶을 수 있습니다. 이것은 선형 추세에 대한 가우스 랜덤 분포가 있음을 보여주는 데 도움이됩니다.

 

참조 페이지 https://stackoverflow.com/questions/8154511

 

 

반응형

댓글