๋ฒ ์ด์ง ๋ฌธํญ
1. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
ํ์ดํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ ๋ค์ df๋ผ๋ ๋ณ์์ ๋ด๊ณ ๋ฐ์ดํฐ์ ๋ด์ฉ์ ํ์ธํ์ธ์.
import pandas as pd
df = pd.read_csv('train.csv')
print(df)
- ํ์ฅ์์ ๋ฐ๋ฅธ ํ์ผ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ → Pandas library ํ์ฉํ๊ธฐ
- read_csv : csv ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
- read_excel : excel ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
2. ์์กด์ ์ ๊ณ์ฐ
ํ์ดํ๋ ์ ์ฒด ์์กด์ ์์ ์ฌ๋ง์ ์๋ฅผ ๊ณ์ฐํ๊ณ ์ถ๋ ฅํ์ธ์.
survival = df['Survived']
dead =0
survived =0
for i in survival:
if i ==0:
dead+=1
else:
survived +=1
print(f"์ฌ๋ง์๋ {dead}๋ช
, ์์กด์๋ {survived}๋ช
์
๋๋ค.")
- `df['Survived']`: ํ๋ค์ค์ ์๋ฆฌ์ฆ ํ์ ์ผ๋ก iterable(๋ฐ๋ณต O)ํจ.
3. ํ๊ท ์ฐ๋ น ๊ณ์ฐ
ํ์ดํ๋ ์น๊ฐ์ ํ๊ท ์ฐ๋ น์ ๊ณ์ฐํ๊ณ ์ถ๋ ฅํ์ธ์.
ages = df['Age']
sum_age =0
cnt =0
for j in ages:
if pd.isnull(j)==False:
sum_age+=j
cnt+=1
avg_age = round(sum_age/cnt,1)
print(f"์น๊ฐ๋ค์ ํ๊ท ์ฐ๋ น์ {avg_age}์ธ ์
๋๋ค.")
- `pd.isnull()` : ํ๋ค์ค ํจ์๋ก ๊ฒฐ์ธก๊ฐ์ด ์๋์ง ์๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ด ๋ฃ์ผ๋ฉด ๊ฒฐ์ธก๊ฐ์ด ์๋์ง(True), ์๋์ง(False) ์ ์ ์์.
์คํ ๋ค๋ ๋ฌธํญ
4. ์ฌ์ฑ ์์กด์ ์ ๊ณ์ฐ
ํ์ดํ๋ ์น๊ฐ์ ์์กด์ ์ค ์ฌ์ฑ ์์กด์์ ์๋ฅผ ๊ณ์ฐํ๊ณ ์ถ๋ ฅํ์ธ์.
gender = df['Sex']
female_survivor = 0
for x, y in zip(gender, survival):
if x == 'female' and y == 1:
female_survivor+=1
print(f"์ฌ์ฑ ์์กด์์ ์๋ {female_survivor}๋ช
์
๋๋ค.")
- `zip(a, b)` : a์ b๋ฅผ ๋์์ ๋ฐ๋ณตํ ์ ์๊ฒ ํด์ค.
5. ๊ฐ์ฅ ๋ง์ ๊ฐ์กฑ์ ๊ฐ์ง ์น๊ฐ
๊ฐ์กฑ์ ๊ฐ์ง ์น๊ฐ๋ค ์ค์์ ๊ฐ์ฅ ๋ง์ ๊ฐ์กฑ์ ๊ฐ์ง ์น๊ฐ์ ์ฐพ์ผ์ธ์.
# ํ์ด 1
family = df['SibSp']+df['Parch']
for i, k in enumerate(family):
if k == max(family):
print(df['Name'][i])
# ํ์ด 2
max_family = []
for i, k in enumerate(family):
if k == max(family):
max_family.append(i)
for j in max_family:
print(df['Name'][j])
- `max_family`๋ผ๋ ๋น ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ ,`Parch` ์ `SibSp`์ ๋ํด ๊ฐ์กฑ ์๋ฅผ ๋ํ๋ด๋ family๋ฅผ ์์ฑํ๋ค.
- for๋ฌธ๊ณผ enumerate๋ฅผ ์ฌ์ฉํด ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌ์ฃผ๊ณ , ๊ฐ์กฑ ์๋ k๋ก ๋ฐ์์ค๋ค.
- ๊ฐ์ฅ ๋ง์ ๊ฐ์กฑ์ ์๋ `max(family)`๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ๋ง์ผ i๋ฒ์งธ ํ์ ์น๊ฐ์ ๊ฐ์กฑ์๊ฐ `max(family)`์ ๊ฐ์ ๊ฒฝ์ฐ ํด๋น ํ์ ์ธ๋ฑ์ค(i)๋ฅผ `max_family`๋ผ๋ ๋ฆฌ์คํธ์ appendํด์ค๋ค.
- ๊ฐ์ด ์ ์ฅ๋ ๋ฆฌ์คํธ `max_family`์ ๊ฐ์ j๋ก ๋ฐ๋ ๋๋ฒ์งธ for๋ฌธ์ ์ด์ฉํด ๋ฐ์ดํฐ ํ๋ ์์์ ์ด๋ฆ์ ๋ํ๋ด๋ ์ปฌ๋ผ Nameํ์์ [j]๋ฒ ์งธ ์น๊ฐ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋๋ก ํ๋ค.
6. ํน์ ์ฐ๋ น๋ ์น๊ฐ ์ถ์ถ
20์ธ ์ดํ์ ์น๊ฐ์ ์ด๋ฆ๋ค์ ์ถ์ถ ํ์ฌ ์น๊ฐ์ ์ด๋ฆ์ key๋ก, ์น๊ฐ์ ๋์ด๋ฅผ value๋ก ํ๋ ๋์ ๋๋ฆฌ๋ฅผ ์์ฑํ์ธ์.
names = df['Name']
dictionary = {}
for key, value in zip(names, ages):
if value<=20:
dictionary[key] = int(value)
print(dictionary)
์ฑ๋ฆฐ์ง ๋ฌธํญ
7. ๊ฐ์ฅ ๋ง์ ํ์น๊ฐ ์๋ฅผ ๊ฐ์ง ์ ์ค ๋ฑ๊ธ ์ฐพ๊ธฐ
ํ์ดํ๋์ ์ ์ค ๋ฑ๊ธ ์ค์์ ๊ฐ์ฅ ๋ง์ ํ์น๊ฐ์ด ์ด์ฉํ ์ ์ค ๋ฑ๊ธ์ ์ฐพ์ผ์ธ์.
# ํ์ด 1
grouped = df.groupby('Pclass')['Name'].count()
pclass=grouped.idxmax()
print(grouped)
print(f"๊ฐ์ฅ ๋ง์ ํ์น๊ฐ์ด ์ด์ฉํ ์ ์ค ๋ฑ๊ธ์ {pclass}๋ฑ๊ธ ์
๋๋ค.")
# ํ์ด 2
c1 = 0
c2 = 0
c3 = 0
for i in df['Pclass']:
if i == 1:
c1 += 1
elif i == 2:
c2 += 1
else:
c3 +=1
class_cnt = { '1' : c1, '2' : c2, '3': c3}
max_family = max(class_cnt, key = class_cnt.get)
print(f"๊ฐ์ฅ ๋ง์ ํ์น๊ฐ์ด ์ด์ฉํ ์ ์ค ๋ฑ๊ธ์ {max_family}๋ฑ๊ธ ์
๋๋ค.")
- idxmax() : ์ต๋/์ต์๊ฐ์ด ํฌํจ๋ ํ/์ด ๊ตฌํ๊ธฐ
๐ก ๋์ ๋๋ฆฌ์์ value๊ฐ ๊ฐ์ฅ ํฐ key๊ฐ ๋ฐํํ๋ ๋ฐฉ๋ฒ
`max_value = max(dictionary, key = dictonary.get)`
๋ฐ๋๋ก ๋์ ๋๋ฆฌ์์ ๊ฐ์ฅ ํฐ key๊ฐ์ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์๋ค.
`max_key = max(dictionary)`
8. ๊ฐ์ฅ ๋ง์ ์๊ธ์ ๋ธ ์น๊ฐ ์ ๋ณด ์ถ๋ ฅ
ํ์ดํ๋์ ์น๊ฐ ์ค ๊ฐ์ฅ ๋ง์ ์๊ธ์ ๋ธ ์น๊ฐ์ ์ฐพ์ผ์ธ์
# ํ์ด 1
fare = df['Fare']
for i, f in enumerate(fare):
if f == max(fare):
print(df.loc[i]['Name'])
# ํ์ด 2
for i, f in enumerate(fare):
if f == max(fare):
print(df['Name'][i])
- family์ ์๊ฐ ๊ฐ์ฅ ๋ง์ `max(family)`์ ๊ฒฝ์ฐ df์์ ํด๋น ๋ฐ์ดํฐ์ ํi์ ๊ตฌํ ํ ํด๋น ํ์์ Name์ปฌ๋ผ์ ์ ํํด์ฃผ๋ฉด, ๊ฐ์ฅ ๋ง์ ๊ฐ์กฑ์ ๊ฐ์ง ์น๊ฐ์ ์ด๋ฆ์ ์ถ๋ ฅํ ์ ์๋ค.
- Pandas '.loc[]' : ๋ฐ์ดํฐํ๋ ์์์ ํ ์กฐํํ๊ธฐ
๐ก df.loc[ ํ ์ธ๋ฑ์ฑ ๊ฐ, ์ด ์ธ๋ฑ์ฑ ๊ฐ]
๋ผ๋ฒจ๋ก ์ธ๋ฑ์ฑ, ๋๋ฒํธ ํฌํจ ์ฌ๋ผ์ด์ฑ ๊ฐ๋ ์ ์ฉ ๊ฐ๋ฅ
9. ๊ฐ ์ฑ๋ณ์ ์์กด์จ ๊ณ์ฐ
ํ์ดํ๋ ๊ฐ ์ฑ๋ณ (๋จ์ฑ/์ฌ์ฑ) ๊ฐ๊ฐ์ ์์กด์จ์ ๊ณ์ฐํ์ธ์
# ํ์ด 1
survival_rate = df.groupby('Sex')['Survived'].sum() / df.groupby('Sex')['Survived'].count()
print(round(survival_rate,2))
## Sex
## female 0.74
## male 0.19
# ํ์ด 2
female_survivor = 0
female_passenger = 0
male_survivor = 0
male_passenger = 0
for sex, survival in zip(df['Sex'],df['Survived']):
if sex == 'female':
female_passenger +=1
if survival == 1:
female_survivor +=1
else:
male_passenger+=1
if survival == 1:
male_survivor +=1
female_survival_rate = round(female_survivor/female_passenger,2)
male_survival_rate = round(male_survivor/male_passenger,2)
print(f"์ฌ์ฑ ์น๊ฐ์ ์์กด์จ์ {female_survival_rate}, ๋จ์ฑ ์น๊ฐ์ ์์กด์จ์ {male_survival_rate}์
๋๋ค.")
## ์ฌ์ฑ ์น๊ฐ์ ์์กด์จ์ 0.74, ๋จ์ฑ ์น๊ฐ์ ์์กด์จ์ 0.19์
๋๋ค.
- ํ์ด 1
- ํ๋ค์ค๋ฅผ ํ์ฉํ๋ฉด, .groupby()์ ์ง๊ณํจ์(sum, count ๋ฑ)๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ํ๋ ์ ํํ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
- ์ฑ๋ณ(Sex)๋ก ๊ทธ๋ฃนํ๋ฅผ ํ๊ณ , ๊ฐ๊ฐ์ ์ฑ๋ณ์์ 'survived'๋ฅผ ๋ชจ๋ ํฉํ๋ฉด ์ฑ๋ณ๋ณ ์์กด์ ์๋ฅผ ๊ตฌํ ์ ์๋ค.
- ํ์ด 2
- ์ฑ๋ณ์ ๋ฐ๋ฅธ ํ์น๊ฐ ์์ ์์กด์ ์๋ฅผ ๊ณ์ฐํด์ค ๋ณ์๋ค์ ๋ง๋ค์ด์ค๋ค.
- zip์ ์ด์ฉํด ์ฑ๋ณ์ ๋ํ๋ด๋ df['Sex'],df['Survived']๋ฅผ ๋ฌถ์ด์ฃผ๊ณ ๊ฐ๊ฐ์ ๊ฐ์ sex์survival๋ก ๋ฐ๋ for๋ฌธ์ ์์ฑํ๋ค.
- ์ฑ๋ณ์ด '์ฌ์ฑ'์ธ ๊ฒฝ์ฐ female_passenger์ 1์ฉ ๋ํ๊ณ ๊ทธ ์ค์์ survived๊ฐ์ด 1์ธ ๊ฒฝ์ฐ(0์ด๋ฉด ์ฌ๋ง, 1์ด๋ฉด ์์กด) female_survivor๋ผ๋ ๋ณ์์ 1์ฉ์ ๋ํด์ค๋ค. (๋จ์ฑ ์น๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฐ๋ค.)
- ์ฌ์ฑ ์น๊ฐ์ ์์กด๋ฅ ์ female_survival_rate์ผ๋ก ์ด ์ฌ์ฑ ์น๊ฐ(female_passenger) ์ ์์กดํ ์ฌ์ฑ ์น๊ฐ(female_survivor)๋ก ๋๋ ์ค๋ค. (*์ด๋ ํธ์๋ฅผ ์ํด ์์ ๋์งธ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผํ๋ค.)
10. ๊ฐ์ฅ ๋ง์ ์ถ๋ฐํญ๊ตฌ ์ฐพ๊ธฐ
์น๊ฐ๋ค์ด ์ถ๋ฐํ ํญ๊ตฌ ์ค์์ ๊ฐ์ฅ ๋ง์ ํญ๊ตฌ๋ฅผ ์ฐพ๊ณ ๊ทธ ํญ๊ตฌ๋ฅผ ์ถ๋ฐํ ์น๊ฐ ์๋ฅผ ์ถ๋ ฅํ์ธ์.
# ํ์ด 1
embarked = df.groupby('Embarked')['Name'].count()
max_embarked = embarked.idxmax()
max_cnt = embarked.max()
print(f"๊ฐ์ฅ ๋ง์ ์น๊ฐ์ด ํ์นํ ํญ๊ตฌ๋ {max_embarked}๋ก, {max_cnt}๋ช
์ ์น๊ฐ์ด {max_embarked}์์ ํ์นํ์ต๋๋ค.")
# ํ์ด 2
embarked_C = 0
embarked_Q = 0
embarked_S = 0
for i in df['Embarked']:
if i == 'C':
embarked_C +=1
elif i == 'Q':
embarked_Q +=1
else:
embarked_S +=1
cnt_max = max(embarked_C, embarked_Q, embarked_S)
embarked_cnt = { 'C' : embarked_C, 'Q' : embarked_Q, 'S': embarked_S }
embarked_max = max(embarked_cnt, key=embarked_cnt.get)
print(f"๊ฐ์ฅ ๋ง์ ์น๊ฐ์ด ํ์นํ ํญ๊ตฌ๋ {embarked_max}๋ก, {cnt_max}๋ช
์ ์น๊ฐ์ด {embarked_max}์์ ํ์นํ์ต๋๋ค.")
์ฑ๋ฆฐ์ง + ๋ฌธํญ
11. ํจ์๋ก ๋ง๋ค์ด ์ ๋ฆฌํ๊ธฐ
2๋ฒ๋ฌธ์ ๋ถํฐ 10๋ฒ ๋ฌธ์ ๊น์ง ์์ฑํ๋ ์ฝ๋๋ค์ ํจ์๋ก ๋ง๋์ธ์.
def solution(df):
return answer
์์ ๊ฐ์ ํํ๋ก ์์ ์๋ ๋ชจ๋ ๋ฌธ์ ๋ค์ ๋ฐ๊ฟ์ฃผ์๋ค.!
๋๋ณด๊ธฐ
# 2๋ฒ
def survival_titanic(df):
survival = df['Survived']
dead =0
survived =0
for i in survival:
if i ==0:
dead+=1
else:
survived +=1
answer = print(f"์ฌ๋ง์๋ {dead}๋ช
, ์์กด์๋ {survived}๋ช
์
๋๋ค.")
return answer
survival_titanic(df)
# 3๋ฒ
def avg_age(df):
ages = df['Age']
sum_age =0
cnt =0
for j in ages:
if pd.isnull(j)==False:
sum_age+=j
cnt+=1
avg_age = round(sum_age/cnt,1)
return avg_age
avg_age(df)
# 4๋ฒ
def survived_female(df):
gender = df['Sex']
survival = df['Survived']
female_survivor = 0
for x, y in zip(gender, survival):
if x == 'female' and y == 1:
female_survivor+=1
return female_survivor
survived_female(df)
# 5๋ฒ
def largest_family(df):
family = df['SibSp']+df['Parch']
answer = []
for i, k in enumerate(family):
if k == max(family):
answer.append(df.loc[i]['Name'])
return answer
largest_family(df)
# 6๋ฒ
def passenger_age(df):
names = df['Name']
ages = df['Age']
names_ages = {}
for key, value in zip(names, ages):
if value<=20:
names_ages[key] = int(value)
return names_ages
passenger_age(df)
# 7๋ฒ
def P_class(df):
classes_cnt = df.groupby('Pclass')['Name'].count()
pclass=classes_cnt.idxmax()
return pclass
P_class(df)
# 8๋ฒ
def highest_fare(df):
fare = df['Fare']
answer =[]
for i, f in enumerate(fare):
if f == max(fare):
answer.append(df.loc[i]['Name'])
return answer
highest_fare(df)
# 9๋ฒ
def gender_survival(df):
female_passengers=0
female_survivor = 0
male_passengers=0
male_survivor = 0
for i in df['Sex']:
if i == 'female':
female_passengers +=1
else:
male_passengers +=1
for x,y in zip(df['Sex'],df['Survived']):
if y == 1:
if x == 'female':
female_survivor +=1
else:
male_survivor +=1
female_survival_rate = round(female_survivor/female_passengers,2)
male_survival_rate = round(male_survivor/male_passengers,2)
answer = print(f"์ฌ์ฑ ํ์น๊ฐ์ ์์กด์จ์ {female_survival_rate}์ด๊ณ , ๋จ์ฑ ํ์น๊ฐ์ ์์กด์จ์ {male_survival_rate}์
๋๋ค.")
return answer
gender_survival(df)
# 10๋ฒ
def max_embarked(data):
embarked = df.groupby('Embarked')['Name'].count()
max_embarked = embarked.idxmax()
max_cnt = embarked.max()
answer=print(f"๊ฐ์ฅ ๋ง์ ์น๊ฐ์ด ํ์นํ ํญ๊ตฌ๋ {max_embarked}๋ก, {max_cnt}๋ช
์ ์น๊ฐ์ด {max_embarked}์์ ํ์นํ์ต๋๋ค.")
return answer
max_embarked(df)
12. ํจ์์ ๊ธฐ๋ฅ ์ฌ์ฉํ๊ธฐ
4๋ฒ๋ฌธ์ ์ 6๋ฒ๋ฌธ์ ๊ฐ๊ฐ ์กฐ๊ฑด๋ฌธ์ ์๋ ์ฑ๋ณ(’female’, ‘male’)๊ณผ ๋์ด๋ฅผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ๊ณ ๊ฐ๊ฐ์ ํจ์์์ ์ฑ๋ณ๊ณผ ๋์ด๋ฅผ ์ธ์๋ก ๋ฐ์์ฌ ์ ์๋๋ก ํจ์๋ฅผ ์์ ํ์ธ์.
- 4๋ฒ ๋ฌธ์
# 4๋ฒ ๋ฌธ์ ์ ์ฑ๋ณ ์ธ์๋ฅผ ๋ฃ์ง ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ธ์.
def survived_female(df, gender = 'female'):
female_survivor = 0
for x, y in zip(df['Sex'], df['Survived']):
if x == gender and y == 1:
female_survivor+=1
return female_survivor
survived_female(df)
## 233
# 4๋ฒ ๋ฌธ์ ์ ์ฑ๋ณ ์ธ์๋ฅผ ‘male’์ด๋ผ๊ณ ์ค์ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ธ์.
survived_female(df, 'male')
## 109
→ ์ฑ๋ณ์ `gender`๋ผ๋ ๋งค๊ฐ๋ณ์๋ก ์ค์ ํ๊ณ , `gender = 'female'`๋ก ์ค์ ํด ๊ธฐ๋ณธ๊ฐ์ female๋ก ๋ฐ๊พธ์ด์ฃผ์๋ค.
- 6๋ฒ ๋ฌธ์
# 6๋ฒ ๋ฌธ์ ์ ๋์ด ์ธ์๋ฅผ ๋ฃ์ง ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ธ์.
def passenger_age(df, age = 20):
names = df['Name']
ages = df['Age']
names_ages = {}
for key, value in zip(names, ages):
if value<= age:
names_ages[key] = int(value)
return names_ages
passenger_age(df)
# 6๋ฒ ๋ฌธ์ ์ ๋์ด ์ธ์๋ฅผ 30, 40, 50 ๊ฐ๊ฐ ๋ฐ๊พธ์ด ๋ณด๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ธ์.
passenger_age(df, 30)
passenger_age(df, 40)
passenger_age(df, 50)
→ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ด๋ฅผ `age`๋ผ๋ ๋งค๊ฐ๋ณ์๋ก ์ค์ ํ๊ณ ๊ธฐ๋ณธ๊ฐ์ 20์ผ๋ก ์ค์ ํด์ฃผ์๋ค.