ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022년 12월 2일 금요일(엑셀파일 읽어오기,쓰기,데이터의 시각화(그래프))
    개발/개발일지(국비지원) 2022. 12. 2. 20:23
    728x90

    pandas모듈을 이용하여

    표형태의 데이터를 처리해줄것이다.

    Series: 1차원형태의 배열

    DataFrame:2차원형태의 배열 을 처리해줄수 있다.

     

    import pandas as pd :편의를위해 pd라는 알리아스(별명)을 설정한다.

    dict_data ={ '키값':밸유값}

    키값과 밸유값을 쌍으로가진 딕셔너리 데이터이다.

    df에 pandas 모듈을 이용하여 DataFrame으로생성해주는데

    데이터들로는 위에 딕셔너리 데이터를 넣어준다.

    이때 인덱스(행)의 값은 'r0','r1','r2'로 설정해준다.

     

    index값을 따로 설정해주지않으면

    r0,r1,r2대신 기본값으로 0,1,2 숫자가 인덱스값으로 들어간다.

     

    결과)

     c0  c1  c2  c3  c4
    r0   1   4   7  10  13
    r1   2   5   8  11  14
    r2   3   6   9  12  15

     

    39-43행

    현재df객체에는 위처럼 r0,r1,r2 3가지행밖에존재하지않는다.

    하지만 

    ndf 라는 객체를 새로만들고

    ndf = df.reindex(['r0','r1','r2','r3','r4'])를하게되면

    ndf객체에는

    r3,r4라는 행이 추가되고

    그에 해당하는 컬럼값들은 현재 존재하지않기때문에 NaN이라는 값을 출력해준다.

    NaN은 값이 없다는 의미로 결측값 이라고도 불린다.

     

    결과)

    c0   c1   c2    c3    c4
    r0  1.0  4.0  7.0  10.0  13.0
    r1  2.0  5.0  8.0  11.0  14.0
    r2  3.0  6.0  9.0  12.0  15.0
    r3  NaN  NaN  NaN   NaN   NaN
    r4  NaN  NaN  NaN   NaN   NaN

     

    45-47행

    ndf2객체에도

    df의객체에 r3,r4라는 행을 추가한다.

    하지만 아까와 다른점은

    reindex(['r0','r1','r2','r3','r4'],fill_value=0)

    fill_value=0 을 뒤에 추가해주었다.

    이 의미는 NaN인 값을 0이라는값으로 채워준다는의미이다.

    결과를보면 더 빠르게 이해된다.

     

    결과)

    c0  c1  c2  c3  c4
    r0   1   4   7  10  13
    r1   2   5   8  11  14
    r2   3   6   9  12  15
    r3   0   0   0   0   0
    r4   0   0   0   0   0

     

    49-55행

    정렬하기.

    sort_index() : 인덱스명으로 정렬

    sort_values() : 기준컬럼의 값으로 정렬

    df객체는 현재

     

    c0  c1  c2  c3  c4
    r0   1   4   7  10  13
    r1   2   5   8  11  14
    r2   3   6   9  12  15

     

    이러한 값을 가지고있다.

    인덱스명으로 조회를 하게되면 결과는 달라지지않을것이다.

    하지만 인덱스명으로 내림차순정렬을 하게되면 달라질것이다.

    sort_index(ascending=False)

    이뜻은 오름차순정렬을 하지않는다는것이다.

    즉 입력하지않았을때는 기본값으로 오름차순정렬이된다.

     

    내림차순결과) 컬럼의 순서가 바뀐다.

    c0  c1  c2  c3  c4
    r2   1   4   7  10  13
    r1   2   5   8  11  14
    r0   3   6   9  12  15

     

    이번에는 sort_values(by='c1',ascending=False)

    컬럼의 값을 기준으로 내림차순정렬을 해보았다.

    컬럼의 값을 기준으로해야하기때문에

    원하는 컬럼을 by='컬럼명'을 추가로 설정해줘야한다.

     

     컬럼 내림차순정렬 결과)

          c0  c1  c2  c3  c4
    r2   3   6   9  12  15
    r1   2   5   8  11  14
    r0   1   4   7  10  13

     

    설정해준 c1컬럼을 기준으로

    가장높은 6>5>4 순서로 내림차순정렬이 된 모습을 확인할 수 있다.

     

    57-62행

    exam_data : 딕셔너리 데이터를 

    df객체에 DataFrame객체로 생성하면서 넣어준다.

     

    현재)

    이름  수학  영어   음악   체육
    0   서준  90  98   85    100
    1  우현  80  89   95   90
    2  인아  70  95  100   90

     

    64-65행

    현재 컬럼으로 설정된 '이름'컬럼을

    인덱스로 바꿔줄것이다.

    set_index('해당컬럼명',inplace=True)

    inplace=True를 하지않으면 변경된 값이 저장안되니 꼭 해줘야한다.

     

    결과)

                                    이름     수학  영어   음악   체육                   
    서준     90  98   85  100
    우현      80  89   95   90
    인아     70  95  100   90

     

    이러한형태로 컬럼이었던 이름이 인덱스로 변경된것을 확인할 수 있다.

     

     이름의 역순과 영어점수의 역순으로 정렬하는방법은

    위에서 했던방식과 똑같이 진행하면된다.

    78-82행

    dataFrame객체의 컬럼을 조회할때에는

    데이터프레임객체명['컬럼명']을 해주면

    해당 컬럼의 값들을 출력할수있다.

    이걸이용하여

     

    df['총점']=df['수학']....+df['체육]을 입력해주면

    총점이라는 컬럼이 생성되면서

    입력해준 컬럼들의 연산결과를 맨오른쪽끝에 출력될것이다.

     

                              이름   수학  영어   음악   체육   총점                      
    서준  90  98   85  100  373
    인아  70  95  100   90  355
    우현  80  89   95   90  354

     

    105-111행

    seaborn 모듈을 사용하기위해 import해준다.

    seaborn은 데이터를 시각화해주기위한 모듈(도구)이다.

    seaborn을 앞으로 sns로 별명설정을해서 사용할것이다!

     

    108행

    seaborn모듈에 저장된 데이터셋 목록을 출력해준다.

    그중 하나인 titanic데이터로 학습을할것이다.

     

    titanic변수에 sns(seaborn).load_dataset('titanic')

    sns모듈에서 titanic이름을가진 데이터셋을 가져와서

    titanic변수에 저장해준다.

     

    113-116행

    데이터객체.head() : 상위5개의 데이터만 불러온다.

    head(갯수)를 입력하면 원하는 갯수의 상위 데이터를 불러올수있다.

     

    현재 titanic객체는 DataFrame객체로 2차원배열형태인데,

    원하는컬럼의 상위5개만 조회하고싶을때는,

    titanic[['컬럼명1','컬럼명2']].head()를 입력해주면

    원하는 결과를 가져올수있다.

     

    118-124행

    컬럼별로 건수를 조회하고싶을때는

    titanic.count()를 입력해주면

    결측값을 제외한 데이터들을 조회할수있다.

     

    건수중에 가장 작은값을 조회하고싶을때는

    titanic.count().min()

    만 추가해주면 원하는 값을 얻을수있다.

     

    가장 적은수의 인덱스를 알고싶을때는

    titanic.count().idxmin()

    idx만 추가해준다면 원하는 값을 얻을 수 있다.

     

    126-128행

    2가지이상의 컬럼을 출력하기위한 방법이다.

    df = titanic[['age','fare']]

    대괄호:[ ] 를 2개를 사용해줘야한다.

     

    129-133행

    평균을 구할수있는 함수 mean()

    최대값을 구할수있는 max()

    최소값을 구할수있는 min() 

    함수를 사용하여 원하는값을 얻을 수 있다.

     

    134-138행

    df.age.value.counts().head()

    df객체에서 나이컬럼의 값을 모두조회한다.

    모두조회한값중 head()를 통해 상위5개의 값들을 조회하여 출력해준다.

     

    head(10) : head('원하는 데이터갯수')를 입력해주면

    원하는 결과를 얻을 수 있다.

     

     

    141-147행

    titanic[titanic['age]==titanic['age'].max()]

    타이타닉객체 전체에서 

    타이타닉[나이]컬럼이 == 타이타닉[나이]컬럼중 가장높은값인

    데이터를 출력해준다.

     

    titanic['age'].idxmax()

    타이타닉 컬럼중 나이컬럼의 최대값을가진 행의값을 조회해준다.

     

    titanic.iloc[titanic['age'].idxmax()]

    타이타닉 컬럼중 나이컬럼의 최대값을가진 행의값을 조회해주고

    조회된 행 ex)300번행

    300번행의 모든데이터들을 출력해준다.

     

    149-152행

    생존여부에 관한 컬럼인

    survived와 alive를 이용하여

    titanic['survived'].value.counts()

    value.counts()를 사용하여 해당컬럼의 건수를 조회한다.

     

    154-156행

    성별로 인원수 조회하는방법이다

    위에했던 방법과 동일하고

    컬럼명만 변경된다.

     

    158-162행

    성별로 생존건수를 조회해보았다.

    titanic[['컬럼명1','컬럼명2']].value_counts()

    을 통해 쉽게 결과를 얻을 수 있었다.

    위의 방식과동일하지만 2개이상의 컬럼을 조회할때에는

    []: 대괄호의 갯수를 잘 확인 후 사용해야한다.

     

    164-167행

    객체.corr()을 사용하면

    해당하는 객체에 상관관계를 알수있다.

    상관관계란 

    예를드면 자동차의 무게가 많이 나갈수록 연비가 많이든다.

    처럼 서로간의 관계여부에대해 

    1~-1값으로 표현해준다.

     

    194-196행

    컬럼별로 건수를 조회하는

    두가지방법이다.

    1 .데이터객체명.컬럼명.value_counts()

    2. 데이터객체명['컬럼명'].value_counts()

     

    198-200행

    컬럼의 값을 조회하는 방법이지만

    위와 다른점은 중복되는 값은 제거하여 조회한다는점이다.

    mpg.origin.unique()를 사용해주면 가능하다.

     

    202-204행

    자동차의 출시년도를 출력한다.

    203행: 중복된값을 제거하여 출력하는 unique()

    204행: 출시년도에 생산된 자동차건수를 모두출력해준다.

     

    211행

    해당하는 데이터의 행과 열의 갯수를 출력할수있다.

     

    212-215행

    mpg.shape는 튜플데이터로

    (열,행)의 형태로 되어있기때문에

    행의 값을 조회하고싶을때는 mpg.shape[0]

    열의 값을 조회하고싶을때는 mpg.shape[1]

    을 사용해준다.

     

    227-228행

    기술통계정보를 조회하는 함수이다.

    데이터객체명[['컬럼1','컬럼2']].describe(include='all')

    데이터의 컬럼1,2에 해당하는 기술통계정보 모두가 조회된다.

     

     

    254-257행

    데이터를 시각화하기위해

    그래프로 나타내는방법이다.

    데이터명.plot(x='x축에사용할 컬럼' , y='y축에사용할 컬럼', kind='그래프종류')

    ▼로 설정해준다. 산점도그래프가 생성된다.▼

    데이터의 시각화 산점도그래프

     

    257행

    ▼해당데이터의 해당컬럼의 빈도수도 확인할 수 있다.▼

    266-270행

    위에서 xlsx파일의 데이터를 df에 저장하였다.

    df를 출력해보았을때

    남한과 북한의 index는 0과 5이기 때문에

    ndf = df.iloc[[0,5]]

    남한과북한의 데이터만 ndf객체에 저장해준다.

     

    2열이후의 값들만 저장해주기위해

    ndf = df.iloc[[0,5],2:]

    2:를 추가해준다.

    2:의 의미는 앞에서 배웠듯이

    2열부터 끝열까지를 의미한다.

     

    272행 실행결과

    위에서 저장한데이터인 ndf를 선그래프로 시각화하면

    이러한 그래프가 출력이된다.

    막상 출력해보니 보기가 매우불편하다.

    위에서 알수있듯이 컬럼명의 수만큼 그래프가 그려진걸 확인할 수 있다.

    그렇다면 현재 열로되어있는 남한,북한을

    컬럼으로 바꿔주면 그래프의 형태가달라질것이다.

     

    274-279행

    ndf2객체를 새로 생성해주고 

    ndf2 = ndf.T를 사용해주면

    현재 열인(남한=0, 북한=5)를 .T를 사용해서  열과 행의 위치를 바꿔준다.

     

    280-283행

    하지만, 지금남한=0 북한=5숫자로 표기되어있어서 더 직관적으로 해주기위해컬럼명을바꿔준다(위에서 열에서 행으로바꿔줬다.)

    컬럼명은 ndf2.columns=['south','north']로 바꿔준다.

     

    284-285행

    바꾼결과값을 선그래프로 한번 확인해본다.

    ▼그래프가 출력될때 범례는 컬럼명으로 출력 될 것이다.▼

     

    289-293행

    데이터값의 형태를 변환해주기위해

    데이터명.astype(int)을 사용했다.

     

    마지막으로 

    남한/북한의 전력량의 사용 빈도를 

    ▼시각화해서 쉽게 이해할수있다.▼

     

     

    296-300행

    외부에서 엑셀파일을 읽어왔다.

    읽어온 데이터에서 '전출지별'컬럼의 상위5개데이터만 조회해보았다.

     

    결과)

    0    전출지별
    1      전국
    2     NaN
    3     NaN
    4     NaN
    Name: 전출지별, dtype: object

     

    2,3,4행도 전국이지만

    엑셀에서 읽어온 데이터이기때문에 NaN으로 표기된다.

     

    301-305행

    위에 NaN(결측값)이 보기가 안좋기때문에

    결측값을 앞의 데이터 전국으로 채워준다.

    df = df.fillna(method='ffill')을 사용하여

    결측값들을 앞의 데이터로 채워준다.

     

    상위5건 결과)

    0    전출지별
    1      전국
    2      전국
    3      전국
    4      전국
    Name: 전출지별, dtype: object

     

    하위5건 결과)

    320    제주특별자치도
    321    제주특별자치도
    322    제주특별자치도
    323    제주특별자치도
    324    제주특별자치도
    Name: 전출지별, dtype: object

     

    318-320행

    컬럼명을 변경해주는 방법이다.

    df_seoul.rename(columns={'원래컬럼명':'바꿀컬럼명'},inplace=True}

    inplace=True를 작성해야 변경된값이 저장된다!

     

    321-324행

    컬럼을 제거하는 방법이다.

    이전에 다뤘던내용이지만 한번 더 나왔다..!

    해당데이터객체.drop('지울컬럼명',axis=1)

    axis=0일땐 행(인덱스) , axis=1일땐 열(컬럼)

     

    325행-328행

    전입지 컬럼을 인덱스로 설정하는방법이다.

    해당데이터명.set_index('컬럼명',inplace=True)

    여기서도 마찬가지 inplace=True를 해줘야 변경된값이 저장된다.

     

    330-332행

    경기도로 이동한 데이터만 sr1에 저장이되어있다.

    저장된 데이터를 시각화하여

    ▼출력해보면 이러한 그래프가 출력된다.▼

    333행-336행

    위에 값에서 전국의 컬럼을 추가해서 

    선 그래프로 출력해본다.

    출력하기전에, 열과 행의 위치를바꿔줘야

    원하는 형태의 그래프를 출력할 수 있다.

    ▼결과▼

    하지만,, 자세히보면 범례가 아주맘에안든다.

    한글값을 읽어오지 못한것이다.

    이것을 수정하기위해서 밑에서 다뤄볼것이다.

     

    338행-346행

    한글이 가능한 폰트로 설정하기위해서

    import matplotlib.pyplot as plt

    모듈을 임포트해준다.

    폰트종류와 타이틀,x축과 y축의 이름을 지어주고

    실행해보자.

    x축의 데이터의 값들이 겹쳐서 잘 보이지 않기때문에

    plt.xticks(rotation=45)를 추가해서

    기울기를 설정해주었다.

     

    ▼결과▼

    728x90

    댓글

Designed by Tistory.