작성일자 : 2023-10-30
Ver 0.1.1
1 ~ 32 문제 풀이 : https://youtu.be/PxTIbZJ3xrA?si=VnVsvEjvH9sRM_mS
1. Getting & Knowing Data¶
#sckit-learn 설치
#pip install scikit-learn
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
Q1. 데이터를 로드하라. 데이터는 '\t' 기준으로 구분되어 있다.
URL : https://raw.githubusercontent.com/Datamanim/pandas/main/lol.csv
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/lol.csv', sep = '\t') #sep
Q2. 데이터의 상위 5개 행을 출력하라
df.head()
gameId | creationTime | gameDuration | seasonId | winner | firstBlood | firstTower | firstInhibitor | firstBaron | firstDragon | ... | t2_towerKills | t2_inhibitorKills | t2_baronKills | t2_dragonKills | t2_riftHeraldKills | t2_ban1 | t2_ban2 | t2_ban3 | t2_ban4 | t2_ban5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3326086514 | 1504279457970 | 1949 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 5 | 0 | 0 | 1 | 1 | 114 | 67 | 43 | 16 | 51 |
1 | 3229566029 | 1497848803862 | 1851 | 9 | 1 | 1 | 1 | 1 | 0 | 1 | ... | 2 | 0 | 0 | 0 | 0 | 11 | 67 | 238 | 51 | 420 |
2 | 3327363504 | 1504360103310 | 1493 | 9 | 1 | 2 | 1 | 1 | 1 | 2 | ... | 2 | 0 | 0 | 1 | 0 | 157 | 238 | 121 | 57 | 28 |
3 | 3326856598 | 1504348503996 | 1758 | 9 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 164 | 18 | 141 | 40 | 51 |
4 | 3330080762 | 1504554410899 | 2094 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 3 | 0 | 0 | 1 | 0 | 86 | 11 | 201 | 122 | 18 |
5 rows × 61 columns
Q3. 데이터의 행과 열의 갯수를 파악하라
df.shape
(51490, 61)
Q4. 전체 컬럼을 출력하라
print(df.columns)
Index(['gameId', 'creationTime', 'gameDuration', 'seasonId', 'winner', 'firstBlood', 'firstTower', 'firstInhibitor', 'firstBaron', 'firstDragon', 'firstRiftHerald', 't1_champ1id', 't1_champ1_sum1', 't1_champ1_sum2', 't1_champ2id', 't1_champ2_sum1', 't1_champ2_sum2', 't1_champ3id', 't1_champ3_sum1', 't1_champ3_sum2', 't1_champ4id', 't1_champ4_sum1', 't1_champ4_sum2', 't1_champ5id', 't1_champ5_sum1', 't1_champ5_sum2', 't1_towerKills', 't1_inhibitorKills', 't1_baronKills', 't1_dragonKills', 't1_riftHeraldKills', 't1_ban1', 't1_ban2', 't1_ban3', 't1_ban4', 't1_ban5', 't2_champ1id', 't2_champ1_sum1', 't2_champ1_sum2', 't2_champ2id', 't2_champ2_sum1', 't2_champ2_sum2', 't2_champ3id', 't2_champ3_sum1', 't2_champ3_sum2', 't2_champ4id', 't2_champ4_sum1', 't2_champ4_sum2', 't2_champ5id', 't2_champ5_sum1', 't2_champ5_sum2', 't2_towerKills', 't2_inhibitorKills', 't2_baronKills', 't2_dragonKills', 't2_riftHeraldKills', 't2_ban1', 't2_ban2', 't2_ban3', 't2_ban4', 't2_ban5'], dtype='object')
Q5. 6번째 컬럼명을 출력하라
print(df.columns[5])
firstBlood
Q6. 6번째 컬럼의 데이터 타입을 확인하라
df[df.columns[5]].dtype
dtype('int64')
Q7.데이터셋의 인덱스 구성은 어떤가
df.index
RangeIndex(start=0, stop=51490, step=1)
df.sort_values('gameDuration').index
Index([46157, 5405, 44738, 45845, 49702, 47087, 41788, 961, 46624, 37119, ... 31885, 38911, 36686, 44721, 7669, 7989, 25416, 13583, 50101, 30524], dtype='int64', length=51490)
df.sort_values('gameDuration').reset_index()
index | gameId | creationTime | gameDuration | seasonId | winner | firstBlood | firstTower | firstInhibitor | firstBaron | ... | t2_towerKills | t2_inhibitorKills | t2_baronKills | t2_dragonKills | t2_riftHeraldKills | t2_ban1 | t2_ban2 | t2_ban3 | t2_ban4 | t2_ban5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 46157 | 3331593233 | 1504682337714 | 190 | 9 | 2 | 2 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 18 | 157 | 40 | 57 | 55 |
1 | 5405 | 3326389082 | 1504297218541 | 190 | 9 | 1 | 2 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 16 | 35 | 18 | 29 | 40 |
2 | 44738 | 3264274092 | 1500070064159 | 191 | 9 | 2 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 497 | 114 | 51 | 105 | 141 |
3 | 45845 | 3308449378 | 1503054002498 | 191 | 9 | 2 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 122 | 74 | 8 | 53 | 157 |
4 | 49702 | 3295181020 | 1502215697446 | 191 | 9 | 1 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 157 | 55 | 122 | 31 | 57 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51485 | 7989 | 3316170772 | 1503566185019 | 4132 | 9 | 2 | 2 | 1 | 1 | 2 | ... | 8 | 3 | 1 | 2 | 0 | 157 | 51 | 45 | 497 | 6 |
51486 | 25416 | 3329569062 | 1504529046227 | 4210 | 9 | 2 | 2 | 1 | 2 | 1 | ... | 11 | 6 | 2 | 3 | 0 | 64 | 119 | 23 | 157 | 11 |
51487 | 13583 | 3329122407 | 1504466436882 | 4220 | 9 | 2 | 1 | 1 | 1 | 2 | ... | 11 | 4 | 2 | 2 | 0 | 29 | 11 | 67 | 53 | 238 |
51488 | 50101 | 3230018445 | 1497872895195 | 4562 | 9 | 2 | 2 | 2 | 2 | 1 | ... | 9 | 4 | 1 | 3 | 0 | 122 | 238 | 117 | 105 | 412 |
51489 | 30524 | 3327791693 | 1504384857161 | 4728 | 9 | 2 | 1 | 1 | 2 | 2 | ... | 11 | 9 | 2 | 2 | 0 | 134 | 107 | 29 | 53 | 154 |
51490 rows × 62 columns
df.sort_values('gameDuration').reset_index(drop = True)
gameId | creationTime | gameDuration | seasonId | winner | firstBlood | firstTower | firstInhibitor | firstBaron | firstDragon | ... | t2_towerKills | t2_inhibitorKills | t2_baronKills | t2_dragonKills | t2_riftHeraldKills | t2_ban1 | t2_ban2 | t2_ban3 | t2_ban4 | t2_ban5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3331593233 | 1504682337714 | 190 | 9 | 2 | 2 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 18 | 157 | 40 | 57 | 55 |
1 | 3326389082 | 1504297218541 | 190 | 9 | 1 | 2 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 16 | 35 | 18 | 29 | 40 |
2 | 3264274092 | 1500070064159 | 191 | 9 | 2 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 497 | 114 | 51 | 105 | 141 |
3 | 3308449378 | 1503054002498 | 191 | 9 | 2 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 122 | 74 | 8 | 53 | 157 |
4 | 3295181020 | 1502215697446 | 191 | 9 | 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 157 | 55 | 122 | 31 | 57 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51485 | 3316170772 | 1503566185019 | 4132 | 9 | 2 | 2 | 1 | 1 | 2 | 1 | ... | 8 | 3 | 1 | 2 | 0 | 157 | 51 | 45 | 497 | 6 |
51486 | 3329569062 | 1504529046227 | 4210 | 9 | 2 | 2 | 1 | 2 | 1 | 1 | ... | 11 | 6 | 2 | 3 | 0 | 64 | 119 | 23 | 157 | 11 |
51487 | 3329122407 | 1504466436882 | 4220 | 9 | 2 | 1 | 1 | 1 | 2 | 1 | ... | 11 | 4 | 2 | 2 | 0 | 29 | 11 | 67 | 53 | 238 |
51488 | 3230018445 | 1497872895195 | 4562 | 9 | 2 | 2 | 2 | 2 | 1 | 1 | ... | 9 | 4 | 1 | 3 | 0 | 122 | 238 | 117 | 105 | 412 |
51489 | 3327791693 | 1504384857161 | 4728 | 9 | 2 | 1 | 1 | 2 | 2 | 1 | ... | 11 | 9 | 2 | 2 | 0 | 134 | 107 | 29 | 53 | 154 |
51490 rows × 61 columns
Q8. 6번째 컬럼의 3번째 값은 무엇인가?
df.head()
gameId | creationTime | gameDuration | seasonId | winner | firstBlood | firstTower | firstInhibitor | firstBaron | firstDragon | ... | t2_towerKills | t2_inhibitorKills | t2_baronKills | t2_dragonKills | t2_riftHeraldKills | t2_ban1 | t2_ban2 | t2_ban3 | t2_ban4 | t2_ban5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3326086514 | 1504279457970 | 1949 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 5 | 0 | 0 | 1 | 1 | 114 | 67 | 43 | 16 | 51 |
1 | 3229566029 | 1497848803862 | 1851 | 9 | 1 | 1 | 1 | 1 | 0 | 1 | ... | 2 | 0 | 0 | 0 | 0 | 11 | 67 | 238 | 51 | 420 |
2 | 3327363504 | 1504360103310 | 1493 | 9 | 1 | 2 | 1 | 1 | 1 | 2 | ... | 2 | 0 | 0 | 1 | 0 | 157 | 238 | 121 | 57 | 28 |
3 | 3326856598 | 1504348503996 | 1758 | 9 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 164 | 18 | 141 | 40 | 51 |
4 | 3330080762 | 1504554410899 | 2094 | 9 | 1 | 2 | 1 | 1 | 1 | 1 | ... | 3 | 0 | 0 | 1 | 0 | 86 | 11 | 201 | 122 | 18 |
5 rows × 61 columns
df['firstBlood'].head()
0 2 1 1 2 2 3 1 4 2 Name: firstBlood, dtype: int64
df['firstBlood'][2]
2
#df.iloc['행숫자', '열숫자']
df.iloc[2,5]
2
df['gameDuration_Norm'] = MinMaxScaler().fit_transform(df[['gameDuration']])
df[['gameDuration', 'gameDuration_Norm']]
gameDuration | gameDuration_Norm | |
---|---|---|
0 | 1949 | 0.387616 |
1 | 1851 | 0.366020 |
2 | 1493 | 0.287131 |
3 | 1758 | 0.345527 |
4 | 2094 | 0.419568 |
... | ... | ... |
51485 | 1944 | 0.386514 |
51486 | 3304 | 0.686205 |
51487 | 2156 | 0.433230 |
51488 | 1475 | 0.283164 |
51489 | 1445 | 0.276554 |
51490 rows × 2 columns
df['gameDuration_Norm'].agg(['mean','max'])
mean 0.361913 max 1.000000 Name: gameDuration_Norm, dtype: float64
Q9. 데이터를 로드하라. 컬럼이 한글이기에 적절한 처리해줘야함
URL : https://raw.githubusercontent.com/Datamanim/pandas/main/Jeju.csv
- utf-8
- cp949
- euc-kr
- latin
df2 = pd.read_csv('https://raw.githubusercontent.com/Datamanim/pandas/main/Jeju.csv', encoding = 'euc-kr')
df2.head()
id | 일자 | 시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 22448 | 2018-01-01 | 제주시 | 도두동 | 32249.987 | 3418.266 | 102709.092 | 138377.345 | 39.556 | 29.167 | 5.0 | 0.0 | 2.5 |
1 | 22449 | 2018-01-01 | 제주시 | 외도동 | 213500.997 | 10341.172 | 112692.789 | 336534.958 | 32.900 | 30.900 | 5.0 | 0.0 | 2.5 |
2 | 22450 | 2018-01-01 | 제주시 | 이도2동 | 1212382.218 | 96920.834 | 541194.481 | 1850497.533 | 29.538 | 35.692 | 2.9 | 0.0 | 2.4 |
3 | 22451 | 2018-01-01 | 제주시 | 일도1동 | 33991.653 | 6034.253 | 72155.919 | 112181.825 | 30.000 | 23.500 | 2.9 | 0.0 | 2.4 |
4 | 22452 | 2018-01-01 | 서귀포시 | 대천동 | 155036.925 | 9403.969 | 150882.409 | 315323.303 | 41.583 | 14.375 | 5.1 | 0.0 | 2.3 |
type(df2)
pandas.core.frame.DataFrame
Q10. 데이터 마지막 3개행을 출력하라
df2.tail(3)
id | 일자 | 시도명 | 읍면동명 | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9618 | 32066 | 2020-04-30 | 제주시 | 도두동 | 28397.481 | 3144.895 | 84052.697 | 115595.073 | 41.053 | 29.421 | 20.3 | 0.0 | 3.0 |
9619 | 32067 | 2020-04-30 | 서귀포시 | 안덕면 | 348037.846 | 29106.286 | 251129.660 | 628273.792 | 46.595 | 49.189 | 17.6 | 0.0 | 3.5 |
9620 | 32068 | 2020-04-30 | 제주시 | 연동 | 1010643.372 | 65673.477 | 447622.068 | 1523938.917 | 40.863 | 27.765 | 14.1 | 0.0 | 4.8 |
Q11. 수치형 변수를 가진 컬럼을 출력하라
df2.select_dtypes(include = ['int', 'float' ] ).columns
Index(['id', '거주인구', '근무인구', '방문인구', '총 유동인구', '평균 속도', '평균 소요 시간', '평균 기온', '일강수량', '평균 풍속'], dtype='object')
df2.select_dtypes(exclude = ['object']).columns
Index(['id', '거주인구', '근무인구', '방문인구', '총 유동인구', '평균 속도', '평균 소요 시간', '평균 기온', '일강수량', '평균 풍속'], dtype='object')
Q12.범주형 변수를 가진 컬럼을 출력하라
df2.select_dtypes(include = ['object' ] ).columns
Index(['일자', '시도명', '읍면동명'], dtype='object')
Q13.각 컬럼의 결측치 숫자를 파악하라
df2.isnull().sum()
id 0 일자 0 시도명 0 읍면동명 0 거주인구 0 근무인구 0 방문인구 0 총 유동인구 0 평균 속도 0 평균 소요 시간 0 평균 기온 0 일강수량 0 평균 풍속 0 dtype: int64
df2.isnull().sum(axis = 1).sum() #DataFrame 전체의 결측치 확인
0
Q14. 각 컬럼의 데이터수, 데이터타입을 한번에 확인하라
df2.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 9621 entries, 0 to 9620 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 9621 non-null int64 1 일자 9621 non-null object 2 시도명 9621 non-null object 3 읍면동명 9621 non-null object 4 거주인구 9621 non-null float64 5 근무인구 9621 non-null float64 6 방문인구 9621 non-null float64 7 총 유동인구 9621 non-null float64 8 평균 속도 9621 non-null float64 9 평균 소요 시간 9621 non-null float64 10 평균 기온 9621 non-null float64 11 일강수량 9621 non-null float64 12 평균 풍속 9621 non-null float64 dtypes: float64(9), int64(1), object(3) memory usage: 977.3+ KB
Q15.각 수치형 변수의 분포(사분위, 평균, 표준편차, 최대 , 최소)를 확인하라
df2.describe()
id | 거주인구 | 근무인구 | 방문인구 | 총 유동인구 | 평균 속도 | 평균 소요 시간 | 평균 기온 | 일강수량 | 평균 풍속 | |
---|---|---|---|---|---|---|---|---|---|---|
count | 9621.000000 | 9.621000e+03 | 9621.000000 | 9621.000000 | 9.621000e+03 | 9621.000000 | 9621.000000 | 9621.000000 | 9621.000000 | 9621.000000 |
mean | 27258.000000 | 3.174315e+05 | 35471.201510 | 195889.561802 | 5.487922e+05 | 41.109084 | 37.215873 | 13.550828 | 6.972426 | 2.753171 |
std | 2777.487804 | 2.982079e+05 | 40381.214775 | 140706.090325 | 4.608802e+05 | 8.758631 | 12.993786 | 7.745515 | 27.617260 | 1.498538 |
min | 22448.000000 | 9.305552e+03 | 1407.936000 | 11538.322000 | 2.225181e+04 | 24.333000 | 12.667000 | -9.600000 | 0.000000 | 0.000000 |
25% | 24853.000000 | 9.539939e+04 | 12074.498000 | 99632.153000 | 2.216910e+05 | 34.250000 | 27.889000 | 7.600000 | 0.000000 | 1.700000 |
50% | 27258.000000 | 2.221105e+05 | 21960.928000 | 152805.335000 | 3.866935e+05 | 39.640000 | 34.500000 | 13.400000 | 0.000000 | 2.400000 |
75% | 29663.000000 | 4.106671e+05 | 40192.032000 | 236325.109000 | 6.406918e+05 | 49.105000 | 46.176000 | 19.700000 | 1.500000 | 3.400000 |
max | 32068.000000 | 1.364504e+06 | 263476.965000 | 723459.209000 | 2.066484e+06 | 103.000000 | 172.200000 | 30.400000 | 587.500000 | 13.333000 |
Q16. 거주인구 컬럼의 값들을 출력하라
#방법1
df2['거주인구']
0 32249.987 1 213500.997 2 1212382.218 3 33991.653 4 155036.925 ... 9616 228260.005 9617 459959.064 9618 28397.481 9619 348037.846 9620 1010643.372 Name: 거주인구, Length: 9621, dtype: float64
#방법2
df2.iloc[:,4] # ':' : 모든 행
0 32249.987 1 213500.997 2 1212382.218 3 33991.653 4 155036.925 ... 9616 228260.005 9617 459959.064 9618 28397.481 9619 348037.846 9620 1010643.372 Name: 거주인구, Length: 9621, dtype: float64
#방법3
df2.loc[:,'거주인구'] # ':' : 모든 행
0 32249.987 1 213500.997 2 1212382.218 3 33991.653 4 155036.925 ... 9616 228260.005 9617 459959.064 9618 28397.481 9619 348037.846 9620 1010643.372 Name: 거주인구, Length: 9621, dtype: float64
Q17. 평균 속도 컬럼의 4분위 범위(IQR) 값을 구하여라
IQR = df2['평균 속도'].quantile(0.75) - df2['평균 속도'].quantile(0.25)
round(IQR,3)
14.855
Q18. 읍면동명 컬럼의 유일값 갯수를 출력하라
len(df2['읍면동명'].unique())
41
Q19. 읍면동명 컬럼의 유일값을 모두 출력하라
df2['읍면동명'].unique()
array(['도두동', '외도동', '이도2동', '일도1동', '대천동', '서홍동', '한경면', '송산동', '조천읍', '일도2동', '영천동', '예래동', '대륜동', '삼도1동', '이호동', '건입동', '중앙동', '삼양동', '삼도2동', '이도1동', '남원읍', '대정읍', '정방동', '효돈동', '아라동', '한림읍', '구좌읍', '용담1동', '오라동', '화북동', '연동', '표선면', '중문동', '성산읍', '안덕면', '천지동', '노형동', '동홍동', '용담2동', '봉개동', '애월읍'], dtype=object)