ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 05-2 회귀 분석 시각화를 위한 matplotlib
    데이터 분석/파이썬으로 배우는 데이터 분석을 위한 통계학 2022. 3. 28. 17:04

     라이브러리의 이름에서도 알 수 있듯이 이번 시간에는 mat(h):수학, plot:그래프, lib(rary):라이브러리! 맷플롯립을 배워볼거야. 데이터 그래프를 그리기에 아주 좋은 라이브러리지! 정규 분포 그래프에 대해 잠깐 배웠었지?

     

    https://kimhaksung.tistory.com/entry/pytong04-7

     

    04-7 정규분포 그래프 그리기 : matplotlib를 활용한 데이터 시각화 그리고 확률 밀도 함수

     이제 이 단원의 마지막이야! 끝이 멋있어야지? 정규분포 그래프를 그려볼거야!  일단 정규분포 그래프를 그리기 위해선 표준화를 해야 될 거고, 표준화를 하기 위해선 원점수가 필요할거야.

    kimhaksung.tistory.com

     

     이번 시간에는 회귀 분석에 앞서 본격적으로 맷플롯 라이브러리를 배우고 갈거야. 회귀 분석에 대해 배우고 맷플롯 라이브러리에 대해 배우면 아래와 같은 그래프를 그릴 수 있게 돼!

     

     

     아직은 감이 잘 오지 않지? 위와 같은 그래프를 그릴 수 있게 하는 것을 목표로 공부해볼까?!

     

     -

     

     먼저 matplotlib를 사용하기 위해 import 해야되는데, 정규분포 그래프를 그릴 때 처럼 matplotlib의 pyplot이라는 모듈을 import 해줄거야. 아래와 같은 명령어를 사용하면 되겠지?

     

    from matplotlib import pyplot
    혹은
    import matplotlib.pyplot

     

     둘 중에 맘에 드는 명령어로 import 해주면 돼. 그런 다음 그래프의 기본이 되는 껍데기를 만들어 볼거야. 복습 차원에서 다시 안내해 주자면,

     

    pyplot.title('그래프 제목')
    pyplot.xlabel('x축 레이블')
    pyplot.ylabel('y축 레이블')
    pyplot.grid() # 그리드 추가
    pyplot.scatter(X, Y) # 점 찍기
    pyplot.plot(X, Y) # 선 그리기

     

     위와 같은 함수들로 그래프의 껍데기를 만들고 점을 찍거나 선을 그릴 수 있어. 이번 시간의 목표는

     

     ① 주어진 X 리스트와 Y 리스트에 해당되는 값을 점 찍고 선 긋기.

     ② 주어진 X 리스트와 Y 리스트가 일차방정식의 관계라면 X값을 활용해서 점 찍고 선 긋기.

     

     라고 할 수 있겠네. 저번 시간에 예를 들었던 것 처럼 시급이 2만원인데 일당 보너스가 5만원 지급되는 알바라면

    에이스 알바생 학성이의 시급 : Y=2X+5
    X (시간) 0 1 2 3 4 5
    Y (돈) 5 7 9 11 13 15

     이런 표로 알바비를 정리할 수 있을거야. 우리는 위의 표의 X값과 Y값을 가지고 그래프에 점을 찍을거고, 그 점들을 이어서 선을 만들어 볼거야. ()

     물론 X와 Y의 관계식(Y=2X+5)을 알고 있기 때문에 X값만 있어도 Y값을 알 수 있겠지? ()

     

     자, 이제 파이썬 에디터를 열고 같이 그래프를 그려볼까?!

     

    -

     

     ① 주어진 X 리스트와 Y 리스트에 해당되는 값을 점 찍고 선 긋기.

     

     먼저 껍데기를 만들어 줄거야. X 데이터와 Y 데이터를 준비해 준 다음 그래프의 제목이나 X축과 Y축의 이름을 정해주는 것 부터 할까?

     X값은 시간을 뜻 해. [0, 1, 2, 3, 4, 5]로 정해줄게. Y값은 돈을 뜻 하고, [5, 7, 9, 11, 13, 15]로 정해줄게. 그래프의 제목은 '알바비'라고 했어. 제목이 맘에 안들면 여러분들이 바꿔도 돼! X축은 시간, Y축은 돈이라고 이름지어주면 끝이야. 'grid()' 함수를 사용해서 격자를 만들어 주면 훨씬 보기 좋겠지?

     

     

    이제 이 껍데기 위에 점을 찍어 볼거야. 점을 찍기 위해서는 'scatter()' 함수가 필요해. scatter() 함수로 점을 찍을 땐 하나의 점을 찍을 것인지, 아니면 여러개의 점을 동시에 찍을 것인지 생각해 봐야 돼. 만약 하나의 점을 찍는다면,

     

    scatter(X좌표, Y좌표)

     

     위와 같은 코드로 구현 가능해. 아래의 코드가 여러개의 점을 하나씩 찍는 방법이야.

     

     

     X의 값과 Y의 값을 각각 X축의 좌표, Y축의 좌표로 놓고 점을 찍어 봤어. 근데 넘 무식한 방법같지? X리스트와 Y리스트에 이미 값들이 다 담겨있으니 리스트를 사용하는게 낫잖아. 아래의 코드 처럼 말야.

     

     

     실행해 보면 어차피 결과는 똑같겠지만 리스트의 값을 이용하는게 더 낫지? 하지만 이 방법 역시 무식한 방법이긴 해. 리스트의 항목들을 X와 Y좌표로 정할 것이라면 반복문을 이용하면 되잖아? 아래의 코드처럼 말야.

     

     

     이게 우리가 배웠던 반복문을 사용해서 쉽게 여러개의 점을 찍는 방법이지?

     그런데 만약 X리스트와 Y리스트의 항목수가 같다면, 즉, 리스트의 길이가 같다면, 즉 일대일 대응이라면! 더 쉬운 방법이 있어. 두 리스트를 하나로 묶어서 반복문에 사용하는거야. 이 때 사용하게 될 함수는 'zip()'이라는 내장 함수야.

     

    zip(묶을놈들)

     

     zip()은 처음 배우네! 위의 X와 Y처럼 일대일 대응을 하고 있는 자료구조에서 써먹기 아주 좋은 내장 함수니까 꼭 기억해! zip() 함수를 이용해 반복문을 다르게 나타내어 보면 아래와 같아.

     

     

     리스트를 활용한 for문에 사용되는 항목이 두 개로 되어있지? 쉼표로 구분된 x와 y말야. 반복문에 사용될 리스트가 두 개니까 반목누에 사용될 항목도 두 개야. 리스트와 항목의 순서를 맞춰주고 쉼표로 구분하면 돼.

     

     이 방법들이 반복문을 사용해서 하나의 점을 여러 번 찍는 방법들이야.

     하지만 귀찮지. 난 여러개의 점을 한 번에 찍어버리고 싶지! 안그래?

     

     그럴땐.. 미안하지만 scatter() 함수에 아예 그냥 리스트 자체를 넣어버리면 돼. 아래의 코드처럼 말야. 하핫! 대신 X와 Y가 일대일 대응이어야 한다는거 잊지마!

     

     

     코드를 실행시켜 여태까지와 다르게 점들이 하나의 색깔로 표현된 것을 볼 수 있어. 그 전에는 여러가지 색깔로 표현되었잖아? 각각의 점을 찍을 때 마다 색깔이 다르게 정해지기 때문이었어. 하지만 이번에는 여러개의 점을 한 번에 찍는 것이기 때문에 점들의 색깔이 같은거야. 참 쉽지?

     

     아니 그럼 첨부터 여러개의 점을 한 번에 찍는 방법을 알려주면 되는거지.. 왜 하나의 점을 여러 번 찍는 방법을 알려주는거야 대체! 타자(키보드를 두드리는 사람)의 성격이 꼬인거 아냐? 라고 생각했다면 미안해! 하지만 두 가지 방법 모두 알고 있어야 다른 상황에서 응용할 수 있으니까 이해해줘! (타자의 성격이 꼬인 것도 맞는 말이긴 해. 하핫!)

     

    -

     

    자, 점을 찍는 방법에 대해 배워봤으니 이제 선을 그리는 방법에 대해 알아볼까?

    점을 찍기 위해서는 X좌표와 Y좌표 하나만 알면 됐어. 그 곳에 딱! 하고 점을 찍기만 하면 되니까. 하지만 선은 그렇지 않아. 하나의 좌표만 있으면 점이 될 수 없잖아? 꼭 두 개의 좌표가 있어야 돼. 두 점을 연결해야 선이 되니까 말야.

     선은 'plot()' 함수를 사용해서 그릴 수 있어. X좌표와 Y좌표를 리스트로 묶어주면 해당되는 좌표들을 선으로 이어줘.

     

    plot([X1좌표, X2좌표], [Y1좌표, Y2좌표])

     

      좀 헷갈릴 수도 있겠어. 왜냐면 우리가 보통 좌표에 대해서 표기할 땐 (X, Y)와 같은 식으로 X좌표와 Y좌표를 묶잖아? 하지만 plot() 함수에서는 X는 X끼리, Y는 Y끼리 묶으니까 말야. 그럼 왜 헷갈리게 X와 Y를 묶는게 아닐까? 그건 여러분들이 생각해 볼까? 답은 이 글을 읽다보면 알게 될거야!

     

     가장 처음 그려볼 선은 0시간부터 1시간 일했을 때로 해볼게. 일을 하지 않아도 5만원의 보너스를 받으니 0시간 일했을 땐 5만원, 1시간 일했을 땐 7만원이 될거야. X와 Y로 정리해서 plot() 함수에 적용해 보면 아래와 같아.

     

     

     코드를 실행해 보면 첫 번째 점과 두 번째 점이 선으로 이어진 것을 볼 수 있어. plot() 함수에 대해 알겠지? 나머지 선들도 그려볼까?

     

     

     여러가지 색의 선들이 그려진 것을 볼 수 있어. 그런데 숫자들이 반복되고 있는 것을 보니 반복문을 사용해 그리는 것이 더 나을거 같아. 그치? 아래의 코드처럼 말야.

     

     

    하지만 이 방법도 그리 똑똑해 보이진 않아. 그냥 (0, 5)와 (5, 15)를 이어서 그리면 되는데 일일히 하나씩 그릴 필요는 없잖아? 그럼 X의 가장 첫 번째 항목과 마지막 항목, 그리고 Y의 첫 번째 항목과 가장 마지막 항목을 이용하면 한 번에 선을 쉽게 그릴 수 있지 않을까? 대신 이번에는 X의 길이를 N이라고 정해놓을게.

     

     

     오! 선의 색깔을 보니 한 번에 그려진 것을 알 수 있겠어. 하지만 점의 색이랑 같기 때문에 다른 색으로 바꿔주고 싶네! 그 전에, 선을 기르는 더 쉬운 방법은 없을까?

     있지! 왜 없겠어! 하핫! 여러개의 점을 한 번에 찍을 때 처럼 선 또한 그리고자 하는 리스트를 한 번에 넣어주면 돼. 아래의 코드처럼 말야.

     

     

     이번에는 점과 선의 색을 구분해 봤어. 점은 기본값인 파란색, 선은 빨간색으로 정해봤어. 만약 하나의 그래프 안에 여러개의 점과 선이 있다면 더 보기 쉽겠지?

     아니 그럼 처음부터 이 방법을 알려주면 되는 것을.. 이라고 또 생각했다면 미안해! 하지만 이번에도 여러가지 방법을 알아야 그래프를 쉽게 그려낼 수 있기 때문이었어. 그리고 엄연히 말하자면 이번에 그린 선은 '일직선'이라고 보긴 어려워. 데이터에 따라 다른 모습을 나타낼 수도 있거든. 무슨 의미인지는 아래의 데이터와 그래프를 보면 쉽게 알 수 있어.

     

     

     위의 코드에서는 Y의 항목 순서를 살짝 바꿔봤어. 그래프가 일직선이 아니라 꺾인선 그래프가 되도록 말야. 그랬더니 정말 선이 꺾여버리고 말았지? plot() 함수에 리스트를 넣을 땐 그 안에 있는 항목들을 하나 하나 이어서 그리겠다는 뜻이기 때문에 데이터에 따라서 일직선이 그려질 수도 있고 지금처럼 꺾인선이 그려질 수도 있어. 꼭! 알고 있어야 돼!

     

    -

     

     ② 주어진 X 리스트와 Y 리스트가 일차방정식의 관계라면 X값을 활용해서 점 찍고 선 긋기.

     

     자, 이제 점 찍는 방법도, 선 그리는 방법도 알았으니 방정식을 가지고 X값을 활용해서 Y를 계산한 다음 그래프를 그려볼까?

     

     점이 더 쉬우니까 이번에도 점찍는 방법부터 살펴볼게.

     학성이의 알바비에서 X(시간)과 Y(돈)의 관계는 'Y=2X+5'로 나타낼 수 있었어. Y는 X에 2를 곱한 다음 5를 더하라는 뜻이지. X가 가지고 있는 각각의 항목들에 2를 곱하고 5를 더하면 Y를 알 수 있다는 뜻이기도 해. 무식하게 나타내면 아래와 같은 코드로 구현할 수 있을거야.

     

     

     하지만 위의 코드 처럼 반복되는 숫자가 있음에도 반복문을 사용하지 않으면 안되겠지? 반복문으로 한 개의 점을 여러 번 찍어볼까?

     

     

     반복문 안에 반복되는 내용만 보더라도 X와 Y의 관계가 Y=2X+5라는 것을 쉽게 알 수 있겠어. 코드가 훨씬 좋아졌지? 이쯤이면 여러분들은 '타자는 이것보다 더 쉽고 간단한 방법을 맨 나중에 알려줄거야..'라는 생각을 갖고 있을거야. 맞아! 더 쉬운 방법이 있어! numpy를 이용하는거야. numpy의 array()를 사용하면 numpy 배열이라는 자료구조를 이용할 수 있어.

     

    array(numpy배열로바꿀놈)

     

     우리가 알던 리스트를 numpy 배열로 바꿔서 살펴볼까? 아래의 코드를 실행해 봐!

     

     

     X의 형(type)을 알아보기 위해 'type()'이라는 내장 함수를 사용했어. 'list'라고 출력되는 것을 볼 수 있지? 그리고 리스트 X를 numpy 배열로 바꾼 다음 출력해보니.. 'numpy.ndarray'라고 출력되는 것을 볼 수 있어. 출력 내용 또한 대괄호 안에 항목들이 쉼표가 아니라 띄어쓰기로 구분된 것을 볼 수 있구 말야. 리스트와 닮았지만 리스트는 아니야. 그럼 이 numpy 배열을 어떻게 사용하면 될까? 아래의 코드를 볼게.

     

     

     리스트 X의 항목들에 각각 2를 곱해주고 싶다고 해 볼게. 그럼 X에 2를 곱하면 될까? 아냐. 코드를 실행해 보면 항목들에 2가 곱해진 것이 아니라 항목들 자체가 두 배로 늘어났어!

     우리는 방정식을 이용해야 하기 때문에 항목들 각각에 연산을 바로 해 주면 참 좋은데, 리스트 자료구조는 반복문을 사용하지 않으면 그게 잘 안돼. 이럴땐 numpy 배열을 쓰면 좋아. 아래의 코드도 볼게.

     

     

     이번에도 X에 통째로 2를 곱했는데! 결과를 출력해 보니 X의 항목들이 두 배가 된 것을 볼 수 있어! 우리가 원하던 것이지! 어때? 리스트와 numpy 배열의 차이를 알겠지? 이 원리를 적용해서 점 찍는 코드를 새로 만들어 볼게.

     

     

     짠! 반복문을 사용하지 않고 X에 바로 연산을 했음에도 제대로된 그래프가 출력되는 것을 볼 수 있어. 참 편하지? 이 방법을 사용하면 점 뿐만 아니라 선도 쉽게 그릴 수 있어. numpy 배열에 바로 연산을 해주면서 선을 그려볼게.

     

     

     어때? 정말 쉽다! 마지막으로 선의 색깔과 범례등을 출력하기 위한 코드를 추가해서 마무리 해볼까?

     

     

     plot()함수에 'Y=2X+5'라는 레이블을 적어서 이 직선이 어떤 방정식인지 쉽게 볼 수 있도록 나타냈어. 그리고 이 범례를 'legend()' 함수를 사용해서 표시했지.

     

    -

     

     이제 matplotlib를 활용해서 점을 찍거나 선을 그릴 수 있게 되었네!

     앞으로 만나게 될 데이터들을 시각화 할 수 있다면 참 좋겠지? 다음 시간에는 본격적으로 회귀 분석과 함께 시각화 까지 공부해 볼게! 안녕!

Designed by Tistory.