Python pandas - 상관관계 분석 -2

2018. 11. 6. 22:31Python/pandas

지난 시행착오를 통해 분석을하는데 데이터를 어떻게 만들어주느냐가 중요하다는걸 깨달았다.

그러려면 분석을 공부해야될것같다....

일단은 pandas의 사용법을 익히고있으니 그거에 맞춰서만 진행해보자


지난 데이터의 잘못된점을 찾아본다면, 

내가 상관관계의 분석을 a의 변화에 맞춰서 b의 변화가 얼마나 이루어지나로 이해했다고 해놓고

데이터는 값이 변화하는걸 뽑은게 아니라, 여자와 남자의 구분수가 얼마나 있는지를 뽑았으니 

원하는 결과가 안나왔던거 같다. 


그럼 값이 변화하는 데이터를 뽑아보자.


import pandas as pd

from pandas import DataFrame

from pandas import Series

import numpy as np
import matplotlib.pyplot as plt
# Reading abalone data set
pd.set_option('display.float_format', None)
co = pd.read_excel("D:\Project\myProject\python\pandas\CO.xlsx",
                   sheet_name='Sheet1')

# 필요한열만가지고옴#
co2 = co[ ["남여구분","월소득액","주민번호 앞자리"] ]


## 월소득액이 nan 인거 제거
co2 = co2.dropna()
co2
Out[48]:
남여구분월소득액주민번호 앞자리
1여성1000000.0830707
25남성1430000.0530804
26남성1430000.0530804
27남성1430000.0530804
52남성695880.0541116
53남성695880.0541116
63여성700000.0530138
88여성800000.0530136
94여성3500000.0170916
153여성510000.0330930
154여성510000.0330930
172여성520000.0681130
179여성1000000.0600630
244남성30.0490805
245남성1600000.0530518
339남성500000.0380716
340남성500000.0380716
360남성590840.0570930
379여성2000000.0531030
381여성500000.0671314
396여성0.0730608
441남성650000.0440337
447남성650000.0440337
452여성340000.0430304
453여성640000.0510314
454여성130.0510706
467여성564550.0470335
477남성1400000.0530104
480여성695880.0470335
488여성695880.0470335
............
64538남성120000.0511004
64546남성555950.0700536
64551남성55950.0700536
64584남성1700000.0530338
64606남성1180000.0391110
64619남성4000000.0770801
64643남성1100000.0490737
64648남성900000.0530539
64660남성600000.0630806
64671남성600000.0630806
64703남성1000000.0530703
64705남성400000.0600307
64722남성2000000.0851113
64729남성537000.0840430
64747남성0.0981313
64809남성1500000.0530405
64820여성595880.0390903
64821여성100000.0400133
64822여성100000.0400133
64823여성100000.0400133
64824여성100000.0400133
64827남성674480.0581031
64834여성500000.0350709
64875여성3000000.0161119
64885여성130.0790618
64897여성5000000.0170706
64929여성204010.0350408
64932여성400000.0380818
64940여성1400000.0511113
64941여성0.0530930

5678 rows × 3 columns


값이 변화할만한 데이터가 마땅치 않아서, 주민번호와 월소득액을 이용해서

주민번호에따른 월소득액의 상관관계가 어떻게 되는지를 분석해보도록 하겠다.

(상관관계분석이란 이런식의 데이터 분석이 맞는것같다...)


주민번호를 그대로 사용해도되지만, pandas에 익숙해지기 위하여 앞부분2자리만 잘라서 데이터를 만드는걸

해보기로했다.


co2["월소득액"] =  co2["월소득액"].astype(int)

## 월소득액이 10000보다 작은 값이 있을 경우 포맷에 맞춰 변경
co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0)  , ["월소득액"]] = co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] * 10000
##주민번호 앞자리 string 변경 substring 후 다시 int 변환
co2["주민번호 앞자리"] =  co2["주민번호 앞자리"].astype(str)
co2['주민번호 앞자리'] = co2['주민번호 앞자리'].apply(lambda e: e[0:2])
co2["주민번호 앞자리"] = co2["주민번호 앞자리"].astype(int)
co2 = co2[co2["주민번호 앞자리"] > 48]
#인덱스 기준 정렬 axis = 0 인덱스  axis = 1 컬럼 , ascending=False -> 내림차순
#co2.sort_index(axis=1)
co2.sort_values(by="주민번호 앞자리")
Out[63]:
남여구분월소득액주민번호 앞자리
14226여성30000049
17025남성60000049
17026남성60000049
53533여성50000049
48395남성52000049
38297남성100000049
17027남성60000049
38295남성100000049
57217남성62121049
53513여성50000049
57216남성92000049
32944여성69000049
44761여성42000049
57214남성62121049
51533여성20260049
57213남성83000049
48391남성52000049
48385남성52000049
48379남성52000049
31224남성130000049
54467여성049
57197남성62121049
48399남성52000049
48403남성52000049
48406남성52000049
48409남성52000049
48363남성52000049
20504여성24605049
20503여성24605049
42235여성66621049
............
29884남성110000094
48832남성80000094
58563남성71464094
49521남성60000095
26236여성110000095
26233여성110000095
13615여성160000095
31955남성200000095
26239여성110000095
26238여성110000095
26237여성110000095
26235여성110000095
26234여성110000095
59053남성095
13614여성180000095
59051남성095
13613여성180000095
15823여성53586096
19752남성65038096
56641여성70000096
21853여성5000096
15826여성53586096
13661남성97040097
42379남성54000097
64747남성098
43613남성200000098
58991여성098
15656여성099
22193남성099
43129여성240000099

3332 rows × 3 columns



## 월소득액이 10000보다 작은 값이 있을 경우 포맷에 맞춰 변경
co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0)  , ["월소득액"]] = co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] * 10000
##주민번호 앞자리 string 변경 substring 후 다시 int 변환
co2["주민번호 앞자리"] =  co2["주민번호 앞자리"].astype(str)
co2['주민번호 앞자리'] = co2['주민번호 앞자리'].apply(lambda e: e[0:2])
co2["주민번호 앞자리"] = co2["주민번호 앞자리"].astype(int)
co2 = co2[co2["주민번호 앞자리"] > 48]

이부분을 하는데 애를먹었다.

 

설명을 하자면


## 월소득액이 10000보다 작은 값이 있을 경우 포맷에 맞춰 변경 co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] = co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] * 10000


부분은 월소득액이 어떤거는 2400000 으로되어있고, 어떤거는 240 으로되어있어서 format을 맞춰주는 작업이 필요하였다.

어떤식으로 진행해야될지몰라 여러번시도한결과 위와같이 사용했다.



co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] =


는 월소득액이 <10000보다 작고 0보다 큰 조건일때의 월소득액 column을 loc로 선택하고, 거기에 값을 대입하는데


 co2.loc[(co2["월소득액"] < 10000) & (co2["월소득액"] > 0) , ["월소득액"]] * 10000

그조건에 해당하는 값에 * 10000을 해준다는 의미다..

코드가 너무 번거롭고 수준이 낮은것같지만 (다른방법이 많을듯) 현재로서는 이것밖에 생각이 안났다.




##주민번호 앞자리 string 변경 substring 후 다시 int 변환
co2["주민번호 앞자리"] =  co2["주민번호 앞자리"].astype(str)
co2['주민번호 앞자리'] = co2['주민번호 앞자리'].apply(lambda e: e[0:2])
co2["주민번호 앞자리"] = co2["주민번호 앞자리"].astype(int)

substring을 해줄려고 보니, python에서는 substring이 없는것같았다?????(맞나??)

자를때 사용을 str[0:2] 이런식으로 사용하는걸로 판단하였고, 이걸 각 값마다 어떻게 적용해줄까 찾아보니

lambda 식이란게 존재하여 lambda식을 사용하였다.

정확하게 찾아본건아니지만 사용되는 형식만 봤을땐


자바스크립트로 따지면

apply(function (e) { e = e.substring(0,2)}) 뭐 이런 느낌인것같아서

문자열자르기인 e[0:2] 를 사용해보니까 적용되었다.






이제 드디어 pandas 의 상관관계 분석 함수인 corr 을 적용해보겠다.

co2.corr()
Out[62]:
월소득액주민번호 앞자리
월소득액1.000000.01039
주민번호 앞자리0.010391.00000




???????

이게 내가 원하는 값인가?? 라는 생각이 들었다. 제대로 적용한게 맞고, 이렇게 사용하는게 맞나??

그럼 두개는 상관관계가 거의없다고 인식해도되는것일까??

데이터가 실제로 변화가 거의없는것일까???




이를 확인해보기위해 직접 데이터를 만들어보고 상관관계분석을 해봐야될것같다





test_date = {'월소득액': [1000, 1000, 990, 800, 700, 670, 640, 620, 610, 600,590,580,570,560,550,540,530,520,510,300,300,280],
            '주민번호 앞자리': [40, 40, 41, 42,50,51,51,53,55,58,58,60,62,66,68,80,82,85,88,93,93,93]
            }
#22,22
co3 = pd.DataFrame(test_date)
Out[71]:
월소득액주민번호 앞자리
0100040
1100040
299041
380042
470050
567051
664051
762053
861055
960058
1059058
1158060
1257062
1356066
1455068
1554080
1653082
1752085
1851088
1930093
2030093
2128093
In [72]:
co3.corr()
Out[72]:
월소득액주민번호 앞자리
월소득액1.000000-0.887109
주민번호 앞자리-0.8871091.000000



주민번호에 따라 월소득액이 작아지게 data를 만들고 적용해본결과!!

원하는 결과가 나왔다.

-0.0887109


이를 통해 위의 데이터도 맞고, 상관관계분석은 이렇게 사용한다는것을 알았다.


이제 방금뽑은 데이터를 이용해서 그래프를 그려주면 이쁠것같은데....

반응형

'Python > pandas' 카테고리의 다른 글

Python pandas - 상관관계 분석 -1  (0) 2018.11.06
Pandas 엑셀파일읽고 데이터 컨트롤  (0) 2018.10.17
Python Pandas 시작  (0) 2018.09.28