ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 - 데이터 전처리/시각화
    파이썬 정리/데이터 전처리, 시각화 툴 2024. 5. 9. 12:23

     

     

    전처리 및  시각화 - 설득 :  데이터 전달의 목적성효과성

     

    정의 : 무엇을 위해 ~이런 형태의 데이터가 필요하다

    이유 : 복잡 다양 데이터를 다루다가  전처리 로직에 매몰되어 큰 그림을 잊는 경우 발생

    결론 : 정의 활용 - 올바른 의사결정을 위한 사전 설계 습관  

     

     

    ---

    내가 원하는 데이터를 보기 위한 데이터 전처리

     

    정형 데이터 속 불규칙한 데이터

    ex) 성별 : 남 or 여 +남성 + 여자 +여성 등 의 다양한 경우의 수

          핸드폰 번호 '-'붙였다가 뗏다가 띄워쓰거나 다양.

    =>데이터 전달의 목적성에 따른 처리, 효과성을 가짐

     

    excel vs pandas

    판다스의 장점

    1. 자동화와 프로그래밍 기능

    2. 대용량 데이터 처리

    3. 복잡한 데이터 처리 분석

    4. 확장성과 유연성

    5. 버젼 관리

     

    Index

    더보기
    df = pd.DataFrame({
    	'A' : [1,2,3]
        'B' : ['a','b','c']
        index : ['idx1','idx2','idx3']
    })
    # 인덱스 이름 지정 가능

     

    df.loc['idx2']
    #A	2
    #B	b
    #Name :idx2, dtype : object

     

    df.sort_index()
    #인덱스 순서 정렬

     

    df.set_index('A')
    #column A를 index로 사용
    #	B
    #A
    #1	a
    #2	b
    #3	c

     

    df.index = ['1','2','3']
    #	A	B
    #1	1	a	
    #2	2	b
    #3	3	c

     

    df.reset_index()
    #	A	B
    #0	1	a	
    #1	2	b
    #2	3	c
    
    df.reset_index(drop=True)
    # 차이?

     

    Column

    더보기
    data = {
    	'name' : ['Alice', 'Bob', 'Charlie']
        'age' : [25,30,35]
        'gender' : ['female','male','male']
    }
    
    df = pd.DataFrame(data)
    
    df['name'] / df['age']
    #0	Alice	/	25
    #1	Bob		/	30
    #2	Charlie	/	35

     

    df.columns = ['이름', '나이', '성별']

     

    df = df.rename(columns = ('이름': 'name')
    
    #	name		나이		성별
    #0	Alice		25		female
    #1	Bob		30		male
    #2	Charlie		35		male

     

    df['스포츠'] = '축구'
    
    #	name		나이		성별		스포츠
    #0	Alice		25		female		축구
    #1	Bob		30		male		축구
    #2	Charlie		35		male		축구

     

    del df['스포츠']
    #	name		나이		성별
    #0	Alice		25		female
    #1	Bob		30		male
    #2	Charlie		35		male

     

    iloc / loc

    더보기

    iloc

    df = pd.DataFrame({
    	'A' : [1,2,3,4,5]
        'B' : [10,20,30,40,50]
        'C' : [100,200,300,400,500]
        })
    
    df
    #	A	B	C
    #0	1	10	100
    #1	2	20	200
    #2	3	30	300	
    #3	4	40	400
    #4	5	50	500

     

    df.iloc[0:2]
    
    #	A	B	C
    #0	1	10	100
    #1	2	20	200

     

    df.iloc[0,0:2]
    #A	1
    #B	10

     

     

     

     

     loc

    df = pd.DataFrame({
    	'A' : [1,2,3,4,5]
        'B' : [10,20,30,40,50]
        'C' : [100,200,300,400,500]
        'index' : ['a','b','c','d','e']
        })
    
    df
    #	A	B	C
    #a	1	10	100
    #b	2	20	200
    #c	3	30	300	
    #d	4	40	400
    #e	5	50	500

     

    df.iloc[1:3,0]
    
    #b	2	
    #c	3		
    
    df.loc[b:d,'A':'C']
    
    #	A	B	C
    #b	2	20	200
    #c	3	30	300	
    #d	4	40	400

    iloc 1:3 => 1~2

    loc b:d => b~d

    Slice

    더보기

     

    df.loc[:,'A']
    
    df['A']
    
    #a	1
    #b	2
    #c	3	
    #d	4
    #e	5

     

    df['A','B'] #불가
    
    df.loc['a':'b'['B','A']] #가능
    #	B	A
    #a	10	1
    #b	20	2

     

    df.loc['a':'b', 'B':'C']
    
    #	B	C
    #a	10	100
    #b	20	200

     

    boolean indexing

    더보기
    import seaborn as sns
    data = sns.load_dataset('tips')
    data.to_csv("tips_data.csv", index=False)
    df = pd.read_csv("tips_data.csv") #index_col = 0
    
    
    df[(df['sex']=='Male') & (df['smoker']=='Yes')] # 참인경우 추출
    # & = and
    # | = or

     

    df.loc[df['size']>3, 'tips':'smoker']

     

     

    df[df['size'].isin([1,2])] #특정 컬럼의 특정 값을 가질떄 추출

     

     

     

     

     

    활용

    df['tip'] <2
    
    
    #0	True
    #..
    #243	False
    condition = df['tip] <2
    
    df[condition]
    #데이터 프레임 내의 tip<2값

     

     

    변수 할당하는 것이 일반적이고 보기 편하다고 함. 

    cond1 = df['size'] >= 3
    cond2 = df['tip'] < 2
    
    df[cond1 & cond2]
    #조건 and로 맞는 값만.

     

    df['created_at'] = '2024-01-01'
    
    df
    #=> column 'created_at' 및 '2024-01-01'나열 됨
    
    df.info()
    # created_at : object(Dtype)

     

    df['created_at'] = pd.datetime(df['created_at'])
    
    df.info()
    #=> created_at : datetime64[ns]

     

    데이터 병합

    더보기

    concat(to link together)

    pd.concat([df1,df2,df3, axis = 0])
    
    # 세로로 union처럼 // 인덱스는 유지(0~3,0~3...) // 자동으로 열 맞춤 (NaN)
    # .reset_index(drop=True) - 인덱스 갱신
    
    pd.concat([df1,df2], axis=1])
    
    # 가로로 join처럼 // left outer 와 유사하게 자리가 비면 자동으로 행 맞춤(NaN)

     

    merge

    pd.merge(df1, df2, on='key', how='inner')#'outer' // 교집합, 합집합
    
    # 진짜 join이 나타났다!
    
    # how = 'left' # 기본 inner

     

    groupby

    df.groupby('Category')
    # <pandas.coe.groupby.generic.DataFrameGroupBy object at ~~~> 오브젝트 생성 !=generator ?
    
    df.groupby('Category').mean()
    # 해당 카테고리가 index 로 취급, 연산을 시행함.
    
    .first() # 기록 내 첫번째 값
    
    .agg(list) # aggregation : list 결과값 묶음?

     

    활용

     

    df[['day', 'total_bill', 'tip', 'size']].groupby('day').mean()
    # 숫자만 존재하는 column을 평균(mean)낼 수 있음

     

     

    df[['sex','day', 'total_bill', 'tip', 'size']].groupby('sex','day')/
    .agg({'total_bill' : 'max', 'tip' : 'mean', 'size' : 'sum'})

     

     

     Pivot Table

    #df <>'date','category','value'
    
    pivot = df.pivot_table(index='Date', columns='Category',values='Values', aggfunc='sum')
    pivot table

     

     

     

    데이터 정렬하기

    더보기
    df.sort_values(by=['Age', 'Score'], ascending=[True, False])

     1,2 순으로 각각 asc desc 적용한 코드

     

     

    Matplotlib - 데이터 시각화

     

    왜? 

    데이터 전달 방식으로

    의사결정을 잘 할 수 있도록 도와줌 // 설득력 

     

    더보기
    import matplotlib.pyplot as plt
    
    x = [1,2,3,4,5]
    y = [2,4,6,8,10]
    
    plt.plot(x,y)
    plt.xlabel('X-axis')
    plt.ylabel('Y-axis')
    plt.title('example')
    plt.show

     

     

    스타일 설정

     

    df.plot(x='A', y='B', color='green', linestyle='--', marker='o')
    plt.show()

     

     

    범례 추가

    df.plot(x='A', y='B', color='red', linestyle='--', marker='o', label = 'Data Serie' )
    
    # ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o', label = 'Data Serie' )
    # ax.legned(['Data Series'])
    
    plot.show()

     

     

     축 제목 입력하기

    #fig, ax = plt.subplots(figsize=(8,6))
    ax = df.plot(x='A', y='B', color='red', linestyle='--', marker='o', label = 'Data Serie' , ax=ax)
    #ax.legend(['Data Series'])
    #ax.set_xlabel('X-axis')
    #ax.set_ylabel('Y-axis')
    #ax.set_title('TItle')
    #ax.text(3,3, 'Some Text', fontsize=12)
    #ax.text(~~~)
    plt.show()
    
    #이름 삽입 가능
    #좌표 3,3 // 중간점(존재) 우측에 text 작성됨

     

    plt.figure(figsize=(18,6))
    x = [2,3,4,5,6]
    y = [2,4,6,8,10]
    
    plt.plot(x,y)
    plt.show()

    그래프 

    *100 pixel 단위로 크기 설정 됨.

     

     

     

     

     

     

     

Designed by Tistory.