그래프 종류

1 : 선 그래프 (line plot)

시계열 데이터와 같이 연속적인 값의 변화와 패턴을 파악하는데 적합하다.

 

그래프 꾸미기 옵션

'o' =                  : 선 아닌 점그래프로 표현

marker = 'o'      : 마커 모양 ('o' , '+', '*' 등등)

markerfacecolor='green' : 마커 배경색

markersize=10 : 마커 크기

color='olive'      : 선의 색

linewidth = 2    : 선의 두께

label=               : 라벨 지정

 

그래프 여러개 그리기

fig = plt.figure( figsize= ( x, y))

ax1 = fig.add_subplot(2,2,1)

ax2 = fig.add_subplot(2,2,2)

ax3 = fig.add_subplot(2,2,3)

ax4 = fig.add_subplot(2,2,4)

 

sns.stripplot(~, ~, data=df, ax1)

 

2 : 면적 그래프

선 그래프와 같지만  그래프 아래 색이 입혀진다.

색의 투명도 alpha= num 으로 투명도 설정 가능

stacked = True / False 로 누적할지 여부 설정 가능 (default= True)

 

 

 

3 : 막대 그래프

막대 그래프 : 각 변수 사이 값의 크기 차이를 설명하는데 적합하다.

kind=barh로 하면 수직 / 수평 역전가능 ! 

 

4 : 히스토그램

변수 하나인 단변수 데이터의 빈도수를 그래프로 표현한다.

x축을 같은 크기의 여러 구간으로 나누고 각 구간에 속하는 데이터 값의 개수를 y축에 표시함.!

 

5: 산점도

서로 다른 두 변수 사이의 관계를 나타낸다.

mpg 데이터로 산점도 그래프를 그려보자.

 

 

# cylinders 개수의 상대적 비율을 계산하여 시리즈 생성
cylinders_size = df.cylinders/df.cylinders.max() * 300

# 3개의 변수로 산점도 그리기
df.plot(kind='scatter',x = 'weight', y = 'mpg', marker='+', figsize=(10,5),
       cmap = 'viridis', c=cylinders_size, s=50, alpha=0.3)     # 실린더 사이즈 값
plt.title('Scatter Plot : mpg-weight-cylinders')
plt.show()
plt.savefig('C:\\Users\\woghk\\OneDrive\\바탕 화면\\스터디\\판다스 자료실\\part3\/저장파일.png')
plt.savefig('C:\\Users\\woghk\\OneDrive\\바탕 화면\\스터디\\판다스 자료실\\part3\/저장파일(투명).png', transparent=True)
plt.show()

 

 

cmap =  컬러 설정 ( 종류가 엄청 많지만 cmap = 'viridis' 만 쓰자.)

 

5: 파이 차트

원을 파이처럼 나눠서 표현.

비율을 한눈에 볼 수 있다는 장점

 

 

6: 박스 플롯

범주형 데이터의 분포를 파악하는데 적합하다

 

# 박스 플롯

df = pd.read_csv("C:\\Users\\woghk\\OneDrive\\바탕 화면\\스터디\\판다스 자료실\\part3\/auto-mpg.csv",header=None)
print(df.head())

#열 이름 지정
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
             'acceleration','model year','origin','name']
from matplotlib import font_manager, rc
font_path = "C:\\Users\\woghk\\Downloads\\nanum-all\\나눔 글꼴\\나눔고딕\\NanumFontSetup_TTF_GOTHIC\/malgun.ttf"
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family = font_name)

plt.style.use('seaborn-poster')
plt.rcParams['axes.unicode_minus']=False

fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

ax1.boxplot(x=[df[df['origin']==1]['mpg'],  # 위에 origin = 1 미국, 2: 영국, 3: 일본    
              df[df['origin']==2]['mpg'],   # 미국[연비]....
              df[df['origin']==3]['mpg']],
            labels = ['USA','EU','JAPAN'])

ax2.boxplot(x=[df[df['origin']==1]['mpg'],
              df[df['origin']==2]['mpg'],
              df[df['origin']==3]['mpg']],
              labels = ['USA','EU','JAPAN'],
              vert=False)
ax1.set_title('제조국가별 연비 분포(수직 박스 플롯)')
ax2.set_title('제조국가별 연비 분포(수평 박스 플롯)')
plt.show()

# 박스플롯에서 평균을 볼 수 없다. 주황색은 중간값
# 동그라미는 이상값??

주황색 중간값

맨 위 맨 아래 : 최소, 최대값 

박스의 끝 : 1분위, 3분위 값

 

 

 

 

고급 그래프 ( seaborn 활용 )

seaborn = matlpot의 기능 스타일 확장 버전이다.

 

회귀선이 있는 산점도

regplot() 서로 다른 2개의 연속 변수 사이의 산점도를 그리고 선형회귀분석에 의한 회귀선을 함께 나타낸다.

fit_reg = False 옵션을 설정하면 회귀선을 안 보이게 할 수 있다.

 

## regplot() 함수 = 서로 다른 2개의 연속 변수 사이의 산점도를 그리고 선형회귀 분석에 의한 회귀선을 나타냄.
# fig_reg = False 하면 회귀선 안보이게 할 수 있다.
import matplotlib.pyplot as plt
import seaborn as sns
# 스타일 테마 ( darkgrid, whitegrid, dark, white, ticks)
sns.set_style('darkgrid')
# 그래프 객체 생성
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
# 그래프 = 선형회귀선 표시   (fit_reg = True)
sns.regplot(x='age',
            y='fare',
            data = titanic,
            ax= ax1)
# 그래프 = 선형회귀선 표시 X (fit_reg = False)
sns.regplot(x = 'age',
            y = 'fare',
            data = titanic,
            ax = ax2,
            fit_reg = False)
plt.show()

 

히트맵

히트맵으로 상관관계를 표현하기도 좋음!

table = titanic.pivot_table(index=['sex'], columns = ['class'], aggfunc = 'size')

#히트맵 그리기
sns.heatmap(table,
            annot = True, fmt = 'd',
            cmap = 'YlGnBu',
            linewidth = .5,
            cbar = False)
plt.show()

 

 

 

범주형 데이터의 산점도

stripplot() 과 swarmplot()이용

 

 

기존에 범주형 데이터면 stripplot을 애용했지만

분산까지 보여주는 swarmplot()을 쓰도록 하자!!!

 

 

조인트 그래프

jointplot() => 산점도를 기본으로 표시하고, 히스토그램을 동시에 보여줌

3장 - 데이터 살펴보기

 

mpg(csv)파일을 불러오자.

import pandas as pd

df = pd.read_csv('C:\\Users\\woghk\\AppData\\Local\\Microsoft\\WindowsApps\/auto-mpg.csv', header = None)

df.columns = ["mpg","cylinders",'displacement','horsepower','weight','acceleration','model year','origin','name']

print(df.head()) # head()는 데이터의 상단부분만 노출!!!
                # tail()은 데이터의 하단부분만 노출!
print('\n')
print(df.tail())

print(df.shape) # . shape 은 데이터의 행x열 개수를 반환한다.
# Data Frame의 기본 정보 = info() 함수 사용

print(df.info())
# Data Frame의 각 열이 어떤 자료형인지 볼 수 있다. . dtypes를 통해서
# info안에 포함되어 있음.

print(df.dtypes)

# describe 기술정보

print(df.describe())
print('\n')
print(df.describe(include='all'))

결과값

    mpg  cylinders  displacement horsepower  weight  acceleration  model year  \
0  18.0          8         307.0        130    3504          12.0          70   
1  15.0          8         350.0        165    3693          11.5          70   
2  18.0          8         318.0        150    3436          11.0          70   
3  16.0          8         304.0        150    3433          12.0          70   
4  17.0          8         302.0        140    3449          10.5          70   

   origin                       name  
0       1  chevrolet chevelle malibu  
1       1          buick skylark 320  
2       1         plymouth satellite  
3       1              amc rebel sst  
4       1                ford torino  


      mpg  cylinders  displacement horsepower  weight  acceleration  \
393  27.0          4         140.0         86    2790          15.6   
394  44.0          4          97.0         52    2130          24.6   
395  32.0          4         135.0         84    2295          11.6   
396  28.0          4         120.0         79    2625          18.6   
397  31.0          4         119.0         82    2720          19.4   

     model year  origin             name  
393          82       1  ford mustang gl  
394          82       2        vw pickup  
395          82       1    dodge rampage  
396          82       1      ford ranger  
397          82       1       chevy s-10  
(398, 9)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 398 entries, 0 to 397
Data columns (total 9 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   mpg           398 non-null    float64
 1   cylinders     398 non-null    int64  
 2   displacement  398 non-null    float64
 3   horsepower    398 non-null    object 
 4   weight        398 non-null    int64  
 5   acceleration  398 non-null    float64
 6   model year    398 non-null    int64  
 7   origin        398 non-null    int64  
 8   name          398 non-null    object 
dtypes: float64(3), int64(4), object(2)
memory usage: 28.1+ KB
None
mpg             float64
cylinders         int64
displacement    float64
horsepower       object
weight            int64
acceleration    float64
model year        int64
origin            int64
name             object
dtype: object
              mpg   cylinders  displacement       weight  acceleration  \
count  398.000000  398.000000    398.000000   398.000000    398.000000   
mean    23.514573    5.454774    193.425879  2970.424623     15.568090   
std      7.815984    1.701004    104.269838   846.841774      2.757689   
min      9.000000    3.000000     68.000000  1613.000000      8.000000   
25%     17.500000    4.000000    104.250000  2223.750000     13.825000   
50%     23.000000    4.000000    148.500000  2803.500000     15.500000   
75%     29.000000    8.000000    262.000000  3608.000000     17.175000   
max     46.600000    8.000000    455.000000  5140.000000     24.800000   

       model year      origin  
count  398.000000  398.000000  
mean    76.010050    1.572864  
std      3.697627    0.802055  
min     70.000000    1.000000  
25%     73.000000    1.000000  
50%     76.000000    1.000000  
75%     79.000000    2.000000  
max     82.000000    3.000000  


               mpg   cylinders  displacement horsepower       weight  \
count   398.000000  398.000000    398.000000        398   398.000000   
unique         NaN         NaN           NaN         94          NaN   
top            NaN         NaN           NaN        150          NaN   
freq           NaN         NaN           NaN         22          NaN   
mean     23.514573    5.454774    193.425879        NaN  2970.424623   
std       7.815984    1.701004    104.269838        NaN   846.841774   
min       9.000000    3.000000     68.000000        NaN  1613.000000   
25%      17.500000    4.000000    104.250000        NaN  2223.750000   
50%      23.000000    4.000000    148.500000        NaN  2803.500000   
75%      29.000000    8.000000    262.000000        NaN  3608.000000   
max      46.600000    8.000000    455.000000        NaN  5140.000000   

        acceleration  model year      origin        name  
count     398.000000  398.000000  398.000000         398  
unique           NaN         NaN         NaN         305  
top              NaN         NaN         NaN  ford pinto  
freq             NaN         NaN         NaN           6  
mean       15.568090   76.010050    1.572864         NaN  
std         2.757689    3.697627    0.802055         NaN  
min         8.000000   70.000000    1.000000         NaN  
25%        13.825000   73.000000    1.000000         NaN  
50%        15.500000   76.000000    1.000000         NaN  
75%        17.175000   79.000000    2.000000         NaN  
max        24.800000   82.000000    3.000000         NaN

info()shapedtypes()describe()등등 이 있다..

 

+ 데이터 개수 확인 + ( value_counts() )

# df.count()함수   :  각 열의 데이터 개수를 반환한다.  (유효한 데이터만)
print(df.count())
print('\n')

# df.count()가 반환하는 객체 타입도 출력한다. type(): 객체의 타입
print(type(df.count()))

# value_counts() 함수는 데이터 각 열의 고유값의 종류와 개수를 확인함 dropna=True를 더하면 Nan데이터 제외
unique_values =  df["origin"].value_counts()
print(unique_values)
print('\n')
print(type(unique_values))

결과값

mpg             398
cylinders       398
displacement    398
horsepower      398
weight          398
acceleration    398
model year      398
origin          398
name            398
dtype: int64


<class 'pandas.core.series.Series'>
1    249
3     79
2     70
Name: origin, dtype: int64


<class 'pandas.core.series.Series'>

 

각 열의 고유값 개수 = value_counts()

시리즈

시리즈 : 데이터가 순차적으로 나열된 1차원 배열의 형태

데이터프레임

데이터프레임: 2차원 배열 (행렬)

 

 

 

시리즈

import pandas as pd

dict_data = {'a':1, 'b':2, 'c':3}

pd = pd.Series(dict_data)

print(type(pd))
print('\n')
print(pd)

<class 'pandas.core.series.Series'>


a    1
b    2
c    3
dtype: int64

 

 

 

데이터 프레임

import pandas as pd

dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}

df = pd.DataFrame(dict_data)

print(type(df))
print('\n')
print(df)


<class 'pandas.core.frame.DataFrame'>
   c0  c1  c2  c3  c4
0   1   4   7  10  13
1   2   5   8  11  14
2   3   6   9  12  15

 

type()으로 뽑아보면

<class 'pandas.core.frame.DataFrame'>

데이터프레임을 확인할 수 있다.

 

 

행   인덱스/열  이름 설정

import pandas as pd

df = pd.DataFrame([[15,'남','덕영중'],[17,'여','수리중']],
                  index = ['준서',"예은"], 
                  columns = ['나이','성별','학교'])

print(df)
print('\n')
print(df.index)
print('\n')
print(df.columns)


    나이 성별   학교
준서  15  남  덕영중
예은  17  여  수리중


Index(['준서', '예은'], dtype='object')


Index(['나이', '성별', '학교'], dtype='object')

행   인덱스/열  이름 설정 : 

행 인덱스 변경: df.index = rename

열 이름 변경: df.columns = rename

 

실습해보자.

df.index = ["학생1","학생2"]
df.columns = ["연령","남녀","소속"]

print(df)
print('\n')
print(df.index)
print('\n')
print(df.columns)

결과값

    나이 성별   학교
준서  15  남  덕영중
예은  17  여  수리중


Index(['준서', '예은'], dtype='object')


Index(['나이', '성별', '학교'], dtype='object')
     연령 남녀   소속
학생1  15  남  덕영중
학생2  17  여  수리중


Index(['학생1', '학생2'], dtype='object')


Index(['연령', '남녀', '소속'], dtype='object')

 

 

행   인덱스/열  이름 설정

rename() 함수를 통해서도 가능하다.

 

행 인덱스 변경 : df.rename(index={기존: 새})

열 이름 변경     : df.rename(columns = {기존: 새})

 

import pandas as pd

df = pd.DataFrame([[15,'남','덕영중'],[17,'여','수리중']],
                  index = ['준서','예은'],
                  columns = ['나이','성별','학교'])
print(df)
print('\n')

df.rename(columns={'나이':'연령','성별':'남녀','학교':'소속'},inplace = True)
df.rename(index = {'준서':'학생1','예은':'학생2'},inplace = True)

print(df)


    나이 성별   학교
준서  15  남  덕영중
예은  17  여  수리중


     연령 남녀   소속
학생1  15  남  덕영중
학생2  17  여  수리중

 

행 / 열 삭제

 

df.drop(행 / 배열, axis= 0 or 1)

 

 

 

 

 

★★★★공부 시작 전 람다함수 이해 ★★★★https://amatoroi.tistory.com/8

 

판다스 데이터프레임과 Lambda 함수의 이해와 사용법

람다(lambda) 함수의 활용은 많은 python 개발자나 pandas 이용자들이 입을 모아 하는 말이다. 손 쉽게 적용할 수 있다고 한다. 나같은 초심자의 입장에서는 도무지 알 수가 없다. 아니, 이해는 되는데

amatoroi.tistory.com

함수 매핑:  시리즈 또는 데이터프레임의 개별 원소를 특정 함수에 일대일 대응시키는 과정

여기서 배울 것:

  • 데이터 프레임에 함수를 매핑하는 방법 
  • 데이터를 집계하는 그룹 연산
  • 데이터프레임을 합치거나 다양한 형태로 구조를 변경하는 방법

 

함수 매핑은 사용자가 직접 만든 함수를 적용할 수 있기 때문 판다스 기본 함수로 처리하기 어려 복잡한 연산을 데이터프레임 등의 판다스 객체 적용시킬 수 있는 장점 보유 !

 

 

1 - 1 : 개별 원소에 함수 매핑

  • 시리즈 원소에 함수 매핑

시리즈 객체 apply() 메소드를 적용하면 인자로 전달하는 매핑 함수에 시리즈의 모든 원소를 하나씩 입력하 함수의 리턴값을 돌려 받는다. 시리즈 원소의 개수만큼 리턴값을 받아서 같은 크기 시리즈 객체로 반환한다.

import seaborn as sns

# titanic 데이터셋에서 age,fare 2개 열을 선택하여 데이터 프레임만들기

titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','fare']]
df['ten'] = 10
print(df.head())

    age     fare  ten
0  22.0   7.2500   10
1  38.0  71.2833   10
2  26.0   7.9250   10
3  35.0  53.1000   10
4  35.0   8.0500   10

사용자 함수를 정의함.

 

def add_10(n):                # n에 10을 더하는것
	return n + 10
    
def add_two_obj(a, b):        # a + b의 값을 return
	return a + b
    
print(add_10(10))
print(add_two_obj(10, 10))

20
20

apply() : 데이터프레임의 개별원소에 함수를 적용할 때 사용  !!!!!

 

sr1 = df['age'].apply(add_10)              # n = df['age']의 모든 원소들
print(sr1.head())
print('\n')

# 시리즈 객체와 숫자에 적용 : 2개의 인수 ( 시리즈 + 숫자 )
sr2 = df['age'].apply(add_two_obj, b=10)   # a = df['age']의 모든 원소들, b=10
print(sr2.head())
print('\n')

# lambda 함수 활용 : 시리즈 객체 적용
sr3 = df['age'].apply(lambda x : add_10(x))   # x = df['age']
print(sr3.head())

0    32.0
1    48.0
2    36.0
3    45.0
4    45.0
Name: age, dtype: float64


0    32.0
1    48.0
2    36.0
3    45.0
4    45.0
Name: age, dtype: float64


0    32.0
1    48.0
2    36.0
3    45.0
4    45.0
Name: age, dtype: float64
  • 데이터프레임 원소에 매핑

데이터프레의 개별 원소에 매핑하려면 applymap()을 써야한다!!!

a = df.applymap(add_10)             # 시리즈와 다르게 간편하게 df.apply~~ 로 바로 사용가능!
print(a)

    age     fare  ten
0  32.0  17.2500   20
1  48.0  81.2833   20
2  36.0  17.9250   20
3  45.0  63.1000   20
4  45.0  18.0500   20

 

1 - 2 : 시리즈 객에 함수 매핑

  • 데이터프레의 각 열에 함수 매핑

데이터프레임에 apply(axis=0) 메소드를 적용하면 모든 열을 하나씩 분리해 매핑 함수의 인자로 각 열(시리즈)이 전달됨.

(axis=0각 열의 모든 행에 대해서 동작), axis=1은 그 반대

매핑 함수에 따라 반환되는 객체의 종류가 달라짐 ( 시리즈 or 데이터프레임)

ex) 시리즈를 입력받고 시리즈를 반환하는 함수를 매핑하, 데이터프레임을 반환한다.

아래 예제를 통해 이해해보자.

참고) isnull() = 누락데이터 불리안 형태로 반환하는 함수

import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,["age","fare"]]

# 사용자 함수 정의
def missing_value(series):
	return series.isnull()

# 데이터프레임의 각 열을 인자로 전달하면 데이터프레임을 반환
result = df.apply(missing_value, axis = 0)
print(result.head())
print('\n')
print(type(result))


     age   fare
0  False  False
1  False  False
2  False  False
3  False  False
4  False  False


<class 'pandas.core.frame.DataFrame'>

'데이터분석' 카테고리의 다른 글

2 - 데이터 입출력  (0) 2023.01.23
1 - 판다스 입문  (0) 2023.01.23

+ Recent posts