ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
< ๋ฐ์ดํฐํ๋ ์ ํ๋จ์/์ด๋จ์ ํฉ์น๊ธฐ >
import pandas as pd
ํ๋จ์ ํฉ์น๊ธฐ
### ์์ ๋ฐ์ดํฐ ์์ฑ
# ์์ ๋ฐ์ดํฐ
data = [["Dog", 3], ["Cat", 5], ["Tiger", 2]]
index = [0, 1, 2]
columns = ["๋๋ฌผ", "๋์ด"]
df_temp1 = pd.DataFrame(data,
index=index,
columns=columns)
df_temp1
### ์์ ๋ฐ์ดํฐ ์์ฑ
# ์์ ๋ฐ์ดํฐ
data = [["์ง", 3], ["์ด์", 5], ["์ด์", 2]]
index = [0, 1, 2]
columns = ["์ฌ๋๊ณณ", "๋ฟ์๊ฐฏ์"]
df_temp2 = pd.DataFrame(data,
index=index,
columns=columns)
df_temp2
df_temp1๊ณผ df_temp2๋ฅผ ํ๋จ์๋ก ํฉ์น๊ธฐ(ํ์ผ๋ก ์ถ๊ฐ)
### df_temp1๊ณผ df_temp2๋ฅผ ํ๋จ์๋ก ํฉ์น๊ธฐ(ํ์ผ๋ก ์ถ๊ฐ)
pd.concat([df_temp1, df_temp2], axis=0, ignore_index=True)
< ์ด๋จ์๋ก ํฉ์น๊ธฐ >
### ์ด๋จ์๋ก ํฉ์น ๋๋ ํ์ ๊ฐฏ์๊ฐ ๋์ผํด์ผ ํ๋ค
pd.concat([df_temp1, df_temp2], axis=1)
< ์ด๋จ์ ํฉ์น๊ธฐ : ํค๊ฐ์ ์ด์ฉํด์ ํฉ์น๋ ๋ฐฉ์ >
### ์์ ๋ฐ์ดํฐ ์์ฑ
# ์์ ๋ฐ์ดํฐ
data1 = {"๊ตญ์ ์ฝ๋" : [1001, 1002, 1003],
"๊ตญ๊ฐ" : ["ํ๊ตญ", "๋ฏธ๊ตญ", "์ธ๋"]}
df_info1 = pd.DataFrame(data1)
data2 = {"๊ตญ์ ์ฝ๋" : [1001, 1001, 1005],
"์ธ๊ตฌ" : [100, 200, 300]}
df_info2 = pd.DataFrame(data2)
df_info1
df_info2
๊ตญ์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ๋ค์ ๋ํด์ ํฉ์น๊ธฐ
### ๊ตญ์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ๋ค์ ๋ํด์ ํฉ์น๊ธฐ
# - ๊ธฐ์ค์ df_info1
pd.merge(left=df_info1,
right=df_info2,
how="inner",
left_on="๊ตญ์ ์ฝ๋",
right_on="๊ตญ์ ์ฝ๋")
๊ตญ์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ์๋๋ก, ๊ฐ์ง ์์ผ๋ฉด NaN์ผ๋ก ํฉ์น๊ธฐ
### ๊ตญ์ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ์๋๋ก, ๊ฐ์ง ์์ผ๋ฉด NaN์ผ๋ก ํฉ์น๊ธฐ
# - ๊ธฐ์ค์ df_info1
pd.merge(left=df_info1,
right=df_info2,
how="left",
left_on="๊ตญ์ ์ฝ๋",
right_on="๊ตญ์ ์ฝ๋")
< ์ ์ฒ๋ฆฌ >
๊ฒฐ์ธก์น ์ฒ๋ฆฌ
### bicycle.csv ํ์ผ ์ฝ์ด๋ค์ด๊ธฐ
df = pd.read_csv("./data/bicycle.csv", encoding="euc-kr")
df
๊ฒฐ์ธก๋ฐ์ดํฐ ํ์ธํ๊ธฐ
### ๊ฒฐ์ธก๋ฐ์ดํฐ ํ์ธํ๊ธฐ
df.info()
### ๊ฒฐ์ธก์น ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
# - ๊ฒฐ์ธก ๋ฐ์ดํฐ ๊ฐ์ True, ์ ์ ๋ฐ์ดํฐ๋ False
df.isnull()
### ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
df.notnull()
< ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฐฉ๋ฒ >
1. ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ง/๋ง์ง ๊ฒฐ์
2. ์ฌ์ฉ ์ ํ๋ค๋ฉด -> ์ปฌ๋ผ๊ณผ ํ ์ค์ ์ด๋ ๋ถ๋ถ์ ์ ๊ฑฐํ ์ง ๊ฒฐ์
3. ์ฌ์ฉํ๋ค๋ฉด -> ์ด๋ป๊ฒ ๋์ฒดํ ์ง ๊ฒฐ์
(๋์ฒด ๋ฐฉ๋ฒ)
3.1. ๊ฒฐ์ธก์น๊ฐ ์๋ ํด๋น ์ปฌ๋ผ์ ํ๊ท ์ผ๋ก ๋ชจ๋ ๋์ฒด
3.2. ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ์๋ ๋ฒ์ฃผ์ ๋น์จ๋๋น๋ก ๋์ฒด
3.3. ์ซ์๊ฐ์ธ ๊ฒฝ์ฐ ๋ชจ๋ 0์ผ๋ก ๋์ฒด
3.4. ๊ฒฐ์ธก๋ฐ์ดํฐ๊ฐ ์ํ ์ฃผ๋ณ ์ปฌ๋ผ๋ค์ ๋ฐ์ดํฐ ์ ํ๊ณผ ์ ์ฌํ ๋ฐ์ดํฐ๋ค์ ํ๊ท ์ผ๋ก ๋์ฒด
3.5. ๊ฒฐ์ธก์น๊ฐ ์๋ ์ปฌ๋ผ์ ์ง์ /์งํ ๋ฐ์ดํฐ์ ํ๊ท ์ผ๋ก ๋์ฒด
< ๊ฒฐ์ธก๋ฐ์ดํฐ ํํฉ ํ์ธ >
์ปฌ๋ผ๋ณ ๊ฒฐ์ธก ํํฉ
### ๊ฒฐ์ธก๋ฐ์ดํฐ ํํฉ ํ์ธ
# ์ปฌ๋ผ๋ณ ๊ฒฐ์ธก ํํฉ
# - sum(0) : 0์ ์๋ฏธ๋ ๊ฐ ์ด์ ํ๋จ์๋ฅผ ์๋ฏธํจ
df.isnull().sum(0)
ํ๋ณ ๊ฒฐ์ธก ํํฉ
# ํ๋ณ ๊ฒฐ์ธก ํํฉ
# - sum(0) : 0์ ์๋ฏธ๋ ๊ฐ ํ์ ์ปฌ๋ผ ๋จ์๋ฅผ ์๋ฏธํจ
df.isnull().sum(1)
< ๊ฒฐ์ธก๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ >
๊ฒฐ์ธก์น๊ฐ ์๋ ๋ชจ๋ ํ๋ค ์ญ์ ํ๊ธฐ
### ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ชจ๋ ํ๋ค ์ญ์ฌํ๊ธฐ
df_drop = df.dropna(axis=0)
df_drop.info()
๊ฒฐ์ธก์น๊ฐ ์๋ ๋ชจ๋ ์ปฌ๋ผ ์ญ์ ํ๊ธฐ
### ๊ฒฐ์ธก์น๊ฐ ์๋ ๋ชจ๋ ์ปฌ๋ผ ์ญ์ ํ๊ธฐ
df_drop_col = df.dropna(axis=1)
df_drop_col.info()
df["์ด์ฉ๊ฑฐ๋ฆฌ"].fillna(0)
df["์ด์ฉ๊ฑฐ๋ฆฌ"].fillna("missing")
df["์ด์ฉ๊ฑฐ๋ฆฌ"].fillna(df["์ด์ฉ๊ฑฐ๋ฆฌ"].mean())
< ์ค๋ณต๋ฐ์ดํฐ ์ฒ๋ฆฌ >
- keep : first, last, False
keep : ์ค๋ณต ์ค์ ๋ช ๋ฒ์งธ ์ค๋ณต์ False(๋จ๊ฒจ ๋ ๊ฒ์ธ์ง)๋ก ํ ๊ฒ์ธ์ง
์ค๋ณต ์ค์ ์ฒซ๋ฒ์งธ๋ False, ๋๋จธ์ง ๋ค์ ์ค๋ณต๋ค์ ๋ชจ๋ True๋ก
first : ์ฒซ๋ฒ์งธ์ธ False(enlWhr ์ค๋ณต ๋ฐ์ดํฐ๋ ๋ชจ๋ True) -> ๊ธฐ๋ณธ๊ฐ, ์๋ต ๊ฐ๋ฅ
last : ๋ง์ง๋ง๋ง False(์์ชฝ ์ค๋ณต ๋ฐ์ดํฐ๋ ๋ชจ๋ True)
False : ์ค๋ณต๋ฐ์ดํฐ ์ ์ฒด True
df["์ด์ฉ๊ฑฐ๋ฆฌ"]
### ์ค๋ณต๋ฐ์ดํฐ๊ฐ ์๋ ํ์ ์์น ํ์ธํ๊ธฐ
df[df.duplicated(["์ด์ฉ๊ฑฐ๋ฆฌ"])]
### keep : ์ค๋ณต ์ค์ ๋ช ๋ฒ์งธ ์ค๋ณต์ False(๋จ๊ฒจ ๋ ๊ฒ์ธ์ง)๋ก ํ ๊ฒ์ธ์ง
### ์ค๋ณต ์ค์ ์ฒซ๋ฒ์งธ๋ False, ๋๋จธ์ง ๋ค์ ์ค๋ณต๋ค์ ๋ชจ๋ True๋ก
# - keep : first, last, False
# first : ์ฒซ๋ฒ์งธ์ธ False(enlWhr ์ค๋ณต ๋ฐ์ดํฐ๋ ๋ชจ๋ True) -> ๊ธฐ๋ณธ๊ฐ, ์๋ต ๊ฐ๋ฅ
# last : ๋ง์ง๋ง๋ง False(์์ชฝ ์ค๋ณต ๋ฐ์ดํฐ๋ ๋ชจ๋ True)
# False : ์ค๋ณต๋ฐ์ดํฐ ์ ์ฒด True
df.duplicated(["์ด์ฉ๊ฑฐ๋ฆฌ"], keep="first")
df.duplicated(["์ด์ฉ๊ฑฐ๋ฆฌ"], keep="last")
df.duplicated(["์ด์ฉ๊ฑฐ๋ฆฌ"], keep="False")
df.duplicated(["์ด์ฉ๊ฑฐ๋ฆฌ"], keep="first").value_counts()
### ์ค๋ณต ๋ฐ์ดํฐ๋ ์ฌ์ฉํ ์ง ๋ง์ง๋ง ๊ฒฐ์ ํ๋ฉด ๋ฉ๋๋ค.
df.drop_duplicates(["์ด์ฉ๊ฑฐ๋ฆฌ"])
< ์ด์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ >
<์ด์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์>
1. ๊ฒฐ์ธก์น ์ฒ๋ฆฌ๊ฐ ์ ํ๋์ด์ผ ํฉ๋๋ค.
- ๊ฒฐ์ธก์น๋ ๋ฐ์ดํฐ๋ก ์ธ์๋๊ธฐ ๋๋ฌธ์
2. ์ด์๋ฐ์ดํฐ์๋ ๋ฒ์ฃผํ, ์ซ์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ค๋ฆ
- ์ผ๋ฐ์ ์ผ๋ก ์ด์๋ฐ์ดํฐ๋ ์ซ์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ฃผ๋ก ํฉ๋๋ค.
3. ์ด์ ๋ฐ์ดํฐ ํ์ธ์ ์๊ฐํ(boxplot)๋ฅผ ํตํด์ ํ์ธํฉ๋๋ค.
4. ์ค์ ์ฒ๋ฆฌ๋ ๊ณ์ฐ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฌ์ฉํ ๋ฐ์ดํฐ ์ฝ์ด๋ค์ด๊ธฐ
### ์ฌ์ฉํ ๋ฐ์ดํฐ ์ฝ์ด๋ค์ด๊ธฐ
df = pd.read_csv("./data/bicycle_out.csv", encoding="euc-kr")
df.info()
๊ฒฐ์ธก์น ์ฒ๋ฆฌํ๊ธฐ
### ๊ฒฐ์ธก์น ์ฒ๋ฆฌํ๊ธฐ
df["๋์ฌ๊ฑฐ์น๋"] = df["๋์ฌ๊ฑฐ์น๋"].fillna(int(df["๋์ฌ๊ฑฐ์น๋"].mean()))
df["๋ฐ๋ฉ๊ฑฐ์น๋"] = df["๋ฐ๋ฉ๊ฑฐ์น๋"].fillna(int(df["๋ฐ๋ฉ๊ฑฐ์น๋"].mean()))
df["์ด์ฉ์๊ฐ"] = df["์ด์ฉ์๊ฐ"].fillna(int(df["์ด์ฉ์๊ฐ"].mean()))
df["์ด์ฉ๊ฑฐ๋ฆฌ"] = df["์ด์ฉ๊ฑฐ๋ฆฌ"].fillna(int(df["์ด์ฉ๊ฑฐ๋ฆฌ"].mean()))
df.info()
ํ๋จ์ ์ค๋ณต์ฒดํฌ
### ํ๋จ์ ์ค๋ณต์ฒดํฌ
df.duplicated().value_counts()
์ด์๋ฐ์ดํฐ ํ์ธํ๊ธฐ
### ์ด์๋ฐ์ดํฐ ํ์ธํ๊ธฐ
df.describe()
๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์๋ฐ์ดํฐ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ธฐ
- ๋ฐ์ค ์์ชฝ ์ : Max Outliers
- ๋ฐ์ค ์์ชฝ ์ : Min Ounliers
- ์ด์์น๋ก ์์ฌ๋๋ ๋ฐ์ดํฐ : Max ๋ฐ Min Ounliers๋ฅผ ๋ฒ์ด๋ ๋ฐ์ดํฐ๋ค
### ๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์๋ฐ์ดํฐ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ธฐ
# - ๋ฐ์คํ๋กฏ(boxplot)์ ์ด์ฉํด์ ์๊ฐํ ํฉ๋๋ค.
plt.boxplot(df["๋์ด"])
plt.show()
"""
- ๋ฐ์ค ์์ชฝ ์ : Max Outliers
- ๋ฐ์ค ์์ชฝ ์ : Min Ounliers
- ์ด์์น๋ก ์์ฌ๋๋ ๋ฐ์ดํฐ : Max ๋ฐ Min Ounliers๋ฅผ ๋ฒ์ด๋ ๋ฐ์ดํฐ๋ค
"""
์ด์์น ๊ณ์ฐ๊ณต์
# ์ต๋ = q3 + (1.5 * IQR)
# ์ต์ = q1 - (1.5 * IQR)
25% ๋ฐ 75% ์์ ์ ๊ฐ ์ถ์ถํ๊ธฐ
### 25% ๋ฐ 75% ์์ ์ ๊ฐ ์ถ์ถํ๊ธฐ
q1, q3 = np.percentile(df["๋์ด"], [25, 75])
q1, q3
IQR ๊ณ์ฐ
### IQR ๊ณ์ฐ
iqr = q3 - q1
iqr
### max outliners ๊ณ์ฐ
upper_bound = q3 + (1.5 * iqr)
### min outliners ๊ณ์ฐ
lower_bound = q1 - (1.5 * iqr)
upper_bound, lower_bound
์ด์์น๋ก ์์ฌ๋๋ max ๋๋ min์ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ
### ์ด์์น๋ก ์์ฌ๋๋ max ๋๋ min์ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ
df[((df["๋์ด"] > upper_bound) | (df["๋์ด"] < lower_bound))]