[Pandas 기초] EDA, 데이터 탐색하기(요약정보, 기초통계, 시각화)
업데이트:
1. 데이터 내용 미리보기 : head()
, tail()
head()
는 데이터의 앞단, tail()
은 뒷단을 볼 수 있다.
괄호()
안에 숫자를 입력해 해당 숫자만큼의 행을 볼 수 있고, 기본값은 6row까지다.
import pandas as pd
df = pd.read_csv("~/auto-mpg.csv",header=None)
df.head()
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 18.0 | 8 | 307.0 | 130.0 | 3504.0 | 12.0 | 70 | 1 | chevrolet chevelle malibu |
1 | 15.0 | 8 | 350.0 | 165.0 | 3693.0 | 11.5 | 70 | 1 | buick skylark 320 |
2 | 18.0 | 8 | 318.0 | 150.0 | 3436.0 | 11.0 | 70 | 1 | plymouth satellite |
3 | 16.0 | 8 | 304.0 | 150.0 | 3433.0 | 12.0 | 70 | 1 | amc rebel sst |
4 | 17.0 | 8 | 302.0 | 140.0 | 3449.0 | 10.5 | 70 | 1 | ford torino |
print(df.columns)
[Output]
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype='int64')
열이름을 지정해주자
물론 앞에서 배운 read_csv()옵션으로 names = []를 줘서 바꿔 줄수도 있다.
df.columns = ['mpg', 'cyclinders','displacement','horsepower','weight',
'accerleration','model year','origin','name']
df.head()
mpg | cyclinders | displacement | horsepower | weight | accerleration | model year | origin | name | |
---|---|---|---|---|---|---|---|---|---|
0 | 18.0 | 8 | 307.0 | 130.0 | 3504.0 | 12.0 | 70 | 1 | chevrolet chevelle malibu |
1 | 15.0 | 8 | 350.0 | 165.0 | 3693.0 | 11.5 | 70 | 1 | buick skylark 320 |
2 | 18.0 | 8 | 318.0 | 150.0 | 3436.0 | 11.0 | 70 | 1 | plymouth satellite |
3 | 16.0 | 8 | 304.0 | 150.0 | 3433.0 | 12.0 | 70 | 1 | amc rebel sst |
4 | 17.0 | 8 | 302.0 | 140.0 | 3449.0 | 10.5 | 70 | 1 | ford torino |
df.tail()
mpg | cyclinders | displacement | horsepower | weight | accerleration | model year | origin | name | |
---|---|---|---|---|---|---|---|---|---|
393 | 27.0 | 4 | 140.0 | 86.00 | 2790.0 | 15.6 | 82 | 1 | ford mustang gl |
394 | 44.0 | 4 | 97.0 | 52.00 | 2130.0 | 24.6 | 82 | 2 | vw pickup |
395 | 32.0 | 4 | 135.0 | 84.00 | 2295.0 | 11.6 | 82 | 1 | dodge rampage |
396 | 28.0 | 4 | 120.0 | 79.00 | 2625.0 | 18.6 | 82 | 1 | ford ranger |
397 | 31.0 | 4 | 119.0 | 82.00 | 2720.0 | 19.4 | 82 | 1 | chevy s-10 |
2. 데이터 요약정보 확인하기
2-1. shape
데이터 프레임의 모든 기본 정보(타입, 행열크기, 타입, 메모리 등)를 보여준다.
df.info()
[Output]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 398 entries, 0 to 397
Data columns (total 9 columns):
mpg 398 non-null float64
cyclinders 398 non-null int64
displacement 398 non-null float64
horsepower 398 non-null object
weight 398 non-null float64
accerleration 398 non-null float64
model year 398 non-null int64
origin 398 non-null int64
name 398 non-null object
dtypes: float64(4), int64(3), object(2)
memory usage: 28.1+ KB
None
2-2. info()
데이터의 행과 열을 보여준다.
df.shape
[Output]
(398, 9)
2-3. dtypes
데이터 변수(열)들의 타입을 보여준다.
df.dtypes
[Output]
mpg float64
cyclinders int64
displacement float64
horsepower object
weight float64
accerleration float64
model year int64
origin int64
name object
dtype: object
시리즈(mpg 열)의 자료형만 확인할수도 있다.
df.mpg.dtypes
[Output]
float64
3. 기초 통계정보 확인하기
3-1. 기초통계량 : describe()
describe()
는 데이터의 기초통계량을 제공한다.
총 데이터 수(count), 평균(mean), 표준편차(std), 분위수(25,50,75%), 최대최소(max,min)
여기서 50%가 중앙값(median)인건 당연하다.
df.describe()
[Output]
mpg cyclinders displacement weight accerleration \
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
추가로 입력인수로 include='all'
을 넣어주면 문자열 데이터가 있는 열에 대한 추가정보를 제공한다.
정확히는 고유값 개수(unique), 최빈값(top), 빈도수(freq)이다.
숫자형 열에 대해서는 NaN인 것을 알 수 있다.
df.describe(include='all')
[Output]
mpg cyclinders displacement horsepower weight \
count 398.000000 398.000000 398.000000 398 398.000000
unique NaN NaN NaN 94 NaN
top NaN NaN NaN 150.0 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
accerleration 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
3-2. 데이터 개수 확인 : count()
count()
는 데이터의 열마다 개수를 시리즈 형태로 반환한다.
df.count()
[Output]
mpg 398
cyclinders 398
displacement 398
horsepower 398
weight 398
accerleration 398
model year 398
origin 398
name 398
dtype: int64
print(type(df.count()))
[Output]
<class 'pandas.core.series.Series'>
3-3. 각 열의 고유값 개수 : value_counts()
이 함수는 시리즈 자료형에 적용하는 함수로, 특정 열의 고유값 개수를 다시 시리즈형태로 반환한다.
df['origin'].value_counts()
[Output]
1 249
3 79
2 70
Name: origin, dtype: int64
의미는 ‘1’이 249개, ‘3’이 79개, ‘70’이 70개가 있다는 소리다.
3-4 기초통계량 직접 계산하기 : mean()
,median()
,max()
, min()
, std()
아까 describe()
함수로 한번에 보여줄 수도 있고, 특정 의도로 어떤 기초통계 값만 뽑아서 사용하고 싶을때가 있다.
이 연산메소드들은 데이터프레임, 시리즈(특정열)에 다 적용할 수 있다.
`
print(df.mean()) # 데이터프레임에 적용
print('\n')
print(df['mpg'].mean()) # 시리즈에 적용
print('\n')
print(df[['mpg','weight']].mean()) # 2개의 시리즈, 즉 데이터프레임에 적용
[Output]
mpg 23.514573
cyclinders 5.454774
displacement 193.425879
weight 2970.424623
accerleration 15.568090
model year 76.010050
origin 1.572864
dtype: float64
23.514572864321615
mpg 23.514573
weight 2970.424623
dtype: float64
3-5. 상관계수(문자열은 제외) : corr()
상관관계는 두 변수간의 상관성에 대한 정보로 -1~1사이의 값을 갖는다.
이는 선형성가정 등을 고려해야할 필요가 있지만, EDA과정에서 한번 볼 필요는 있다.
corr()
함수는 문자열을 제외한 변수간 매트릭스를 생성하고 각 쌍들의 상관계수를 반환한다.
df.corr()
[Output]
mpg cyclinders displacement weight accerleration \
mpg 1.000000 -0.775396 -0.804203 -0.831741 0.420289
cyclinders -0.775396 1.000000 0.950721 0.896017 -0.505419
displacement -0.804203 0.950721 1.000000 0.932824 -0.543684
weight -0.831741 0.896017 0.932824 1.000000 -0.417457
accerleration 0.420289 -0.505419 -0.543684 -0.417457 1.000000
model year 0.579267 -0.348746 -0.370164 -0.306564 0.288137
origin 0.563450 -0.562543 -0.609409 -0.581024 0.205873
model year origin
mpg 0.579267 0.563450
cyclinders -0.348746 -0.562543
displacement -0.370164 -0.609409
weight -0.306564 -0.581024
accerleration 0.288137 0.205873
model year 1.000000 0.180662
origin 0.180662 1.000000
특정 두 변수만 지정해서 상관계수를 구할수도 있다.
print('\n')
print(df[['mpg','weight']].corr())
[Output]
mpg weight
mpg 1.000000 -0.831741
weight -0.831741 1.000000
4. 판다스 내장 그래프 도구 활용
판다스에 내장된 시각화 도구를 이용하여 데이터를 살펴보자.
4-1. 선 그래프 : plot()
df = pd.read_excel("D:/Python/Pandas_ML/source/part3/남북한발전전력량.xlsx")
df.head(6)
전력량 (억㎾h) | 발전 전력별 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | ... | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 남한 | 합계 | 1077 | 1186 | 1310 | 1444 | 1650 | 1847 | 2055 | 2244 | ... | 4031 | 4224 | 4336 | 4747 | 4969 | 5096 | 5171 | 5220 | 5281 | 5404 |
1 | NaN | 수력 | 64 | 51 | 49 | 60 | 41 | 55 | 52 | 54 | ... | 50 | 56 | 56 | 65 | 78 | 77 | 84 | 78 | 58 | 66 |
2 | NaN | 화력 | 484 | 573 | 696 | 803 | 1022 | 1122 | 1264 | 1420 | ... | 2551 | 2658 | 2802 | 3196 | 3343 | 3430 | 3581 | 3427 | 3402 | 3523 |
3 | NaN | 원자력 | 529 | 563 | 565 | 581 | 587 | 670 | 739 | 771 | ... | 1429 | 1510 | 1478 | 1486 | 1547 | 1503 | 1388 | 1564 | 1648 | 1620 |
4 | NaN | 신재생 | - | - | - | - | - | - | - | - | ... | - | - | - | - | - | 86 | 118 | 151 | 173 | 195 |
5 | 북한 | 합계 | 277 | 263 | 247 | 221 | 231 | 230 | 213 | 193 | ... | 236 | 255 | 235 | 237 | 211 | 215 | 221 | 216 | 190 | 239 |
6 rows × 29 columns
남북한발전전력량 데이터에서 남한과 북한의 합계 자료먄 인덱싱하고, 인덱스명을 부여해주었다.
그리고 컬렴명을 숫자형으로 map함수를 이용해 숫자형으로 변환했다.
map함수는 추후에 포스팅할 것이다.
df_ns = df.iloc[[0,5], 2:]
df_ns.index = ['South','North']
df_ns.columns = df_ns.columns.map(int)
print(df_ns)
[Output]
1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 ... 2007 \
South 1077 1186 1310 1444 1650 1847 2055 2244 2153 2393 ... 4031
North 277 263 247 221 231 230 213 193 170 186 ... 236
2008 2009 2010 2011 2012 2013 2014 2015 2016
South 4224 4336 4747 4969 5096 5171 5220 5281 5404
North 255 235 237 211 215 221 216 190 239
[2 rows x 27 columns]
간단히 plot()
함수를 이용해 선그래프를 그려보았다.
df_ns.plot()
뭔가 그림이 이상하니, 전치(transpose)해서 다시 그려보자.
tdf_ns = df_ns.T
print(tdf_ns.head())
South North
1990 1077 277
1991 1186 263
1992 1310 247
1993 1444 221
1994 1650 231
tdf_ns.plot()
발전 전력량은 한국은 계속 상승하고 있지만, 북한은 거의 정체되어 있음을 알 수 있다.
4-2. 막대그래프 : plot(kind='bar')
tdf_ns.plot(kind='bar')
4-3. 히스토그램 : plot(kind='hist')
tdf_ns.plot(kind='hist')
히스토그램은 변수의 의미가 아닌, 단지 값들에 대한 빈도수를 의미하므로 이 데이터에는 어울리지 않는 듯하다.
4-4. 산점도 : plot(kind='scatter')
df = pd.read_csv("D:/Python/Pandas_ML/source/part3/auto-mpg.csv", header=None)
df.columns = ['mpg', 'cyclinders','displacement','horsepower','weight',
'accerleration','model year','origin','name']
print(df.head())
[Output]
mpg cyclinders displacement horsepower weight accerleration \
0 18.0 8 307.0 130.0 3504.0 12.0
1 15.0 8 350.0 165.0 3693.0 11.5
2 18.0 8 318.0 150.0 3436.0 11.0
3 16.0 8 304.0 150.0 3433.0 12.0
4 17.0 8 302.0 140.0 3449.0 10.5
model year origin name
0 70 1 chevrolet chevelle malibu
1 70 1 buick skylark 320
2 70 1 plymouth satellite
3 70 1 amc rebel sst
4 70 1 ford torino
산점도는 x축과 y축의 변수를 지정하고 kind = 'scatter'
옵션을 추가해 주면 된다.
df.plot(x='weight',y='mpg', kind = 'scatter')
4-5. 박스플롯(box-plot) : plot(kind='box')
df = pd.read_csv("D:/Python/Pandas_ML/source/part3/auto-mpg.csv", header=None)
df.columns = ['mpg', 'cyclinders','displacement','horsepower','weight',
'accerleration','model year','origin','name']
print(df.head())
[Output]
mpg cyclinders displacement horsepower weight accerleration \
0 18.0 8 307.0 130.0 3504.0 12.0
1 15.0 8 350.0 165.0 3693.0 11.5
2 18.0 8 318.0 150.0 3436.0 11.0
3 16.0 8 304.0 150.0 3433.0 12.0
4 17.0 8 302.0 140.0 3449.0 10.5
model year origin name
0 70 1 chevrolet chevelle malibu
1 70 1 buick skylark 320
2 70 1 plymouth satellite
3 70 1 amc rebel sst
4 70 1 ford torino
df[['mpg','cyclinders']].plot(kind='box')
박스플롯은 이상치 제외 최소값, 1분위수, 중앙값, 3분위수, 이상치 제외 최대값, 이상치 를 제공한다.
자세한 설명은 여기 블로그에 설명이 잘 되어있어 참고하면 좋을 것 같다.
Reference
도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.
댓글남기기