๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/50
[python pandas] 3. pandas ๊ธฐ์ด ์ฌ์ฉ (3) - ์ง๊ณ, ๊ฒฐ์ธก๊ฐ, ์ ๋ ฌ
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/49 https://silvercoding.tistory.com/48 [python pandas] pandas ๊ธฐ์ด ์ฌ์ฉ (1) ๋ฌ๋์คํผ ์์ ์ ๋ฆฌ * ํ๋ค์ค ๊ธฐ๋ณธ ํจ์ ๋ฐ์ดํฐ ํ์ผ ์ฝ๊ธฐ :..
silvercoding.tistory.com
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ & ์ดํด๋ณด๊ธฐ
import pandas as pd
file = './data/babyNamesUS.csv'
raw = pd.read_csv(file)
raw.head()
raw.info()
๋จ๋ ๊ตฌ๋ถ์์ด '๋ง์ด' ์ฌ์ฉ๋๋ ๊ณตํต ์ด๋ฆ ?
idea : ๋จ๋ ์ด๋ฆ ๊ฐ์์ ๋น์จ ์ฐจ์ด๊ฐ ์์์๋ก ์ฑ๋ณ ๊ตฌ๋ถ์ด ์๋ ์ด๋ฆ์ผ ๊ฒ์ด๋ค !
# ์ฑ๋ณ์ ๋ฐ๋ฅธ ์ด๋ฆ ๊ฐ์ ์ง๊ณ
name_df = raw.pivot_table(index = 'Name', columns = 'Sex', values = 'Number', aggfunc='sum')
# ๊ฒฐ์ธก๊ฐ ์ฑ์ฐ๊ธฐ (0)
name_df = name_df.fillna(0)
# float -> int
name_df = name_df.astype(int)
name_df.head()
์ฌ๊ธฐ๊น์ง ์ ๋ฒ ํฌ์คํ ์์ ํ๋ ๋ด์ฉ์ด๋ค.
name_df['Sum'] = name_df['M'] + name_df['F']
name_df.head()
๋จ๋ ์ด๋ฆ ๊ฐ์๋ฅผ ๋ชจ๋ ๋ํด์ sum ์ด๋ผ๋ ์ปฌ๋ผ์ ์์ฑํ๋ค.
# ๋จ, ๋
๋น์จ ๊ณ์ฐ
name_df['F_ratio'] = name_df['F'] / name_df['Sum']
name_df['M_ratio'] = name_df['M'] / name_df['Sum']
# ๋จ, ๋
๋น์จ ๊ฐ ์ฐจ์ด
name_df['M_F_Gap'] = abs(name_df['F_ratio'] - name_df['M_ratio'])
name_df.head()
-1 ~ 1 ์ ๋ฒ์๋ฅผ abs() (์ ๋๊ฐ) ๋ฅผ ์ฌ์ฉํ์ฌ 0 ~ 1 ๋ฒ์๋ก ๋ฐ๊พธ์ด ์ค๋ค.
# ์ด๋ฆ ์ด ๊ฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
name_df = name_df.sort_values(by = 'Sum', ascending=False)
name_df.head(20)
๋ง์ด ์ฌ์ฉ๋ ์ด๋ฆ์ ๋ฝ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ด ํฉ๊ณ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ค๋ค.
cond = name_df['M_F_Gap'] < 0.1
name_df[cond].head(10)
์ด ๋ ๋น์จ์ฐจ์ด๊ฐ ์ ์ ๊ฒ์ 0.1 ๋ฏธ๋ง์ผ๋ก ๊ธฐ์ค ์ก๊ณ , M_F_Gap ์ปฌ๋ผ์ด 0.1 ๋ณด๋ค ์์ ํ๋ค์ ์ถ๋ ฅ์ํจ๋ค.
# ์ฑ๋ณ ๊ตฌ๋ถ์์ด ๋ง์ด ์ฌ์ฉ๋๋ ์ด๋ฆ Top 10
name_df[cond].head(10).index
๊ฐ์ฅ ๋ํ์ ์ธ ๋ฏธ๊ตญ์ ์ด๋ฆ ? ( ์ต๊ทผ ํธ๋ ๋ )
idea : ์ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ต๊ทผ ์ธ๋(2020, 1990) ์ด๋ฆ ๊ฐ์์ ๋น์จ์ด ํฐ ์ด๋ฆ์ด ์ต๊ทผ ํธ๋ ๋์ ๋ง๋ ๋ํ์ ์ธ ๋ฏธ๊ตญ ์ด๋ฆ์ผ ๊ฒ์ด๋ค !
raw.head()
# unique() ๋ฅผ ํตํด, ๊ธฐ๊ฐ์ ๋ค์ด๊ฐ๋ ๊ฐ๋ค์ ์ดํด๋ด
๋๋ค.
raw['YearOfBirth'].unique()
array([1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015], dtype=int64)
* ์ธ๋ ๋๋๊ธฐ
ํ ์ธ๋ ๋๋๋ ๊ธฐ์ค 30๋ : 2020๋ ๊ธฐ์ค 30๋ ์ฉ ๊ตฌ๋ถ
- 1930๋ ๋ ์ด์
- 1960๋ ๋ ์ด์
- 1990๋ ๋ ์ด์
- 2020๋ ์ด์
year_class_list = [ ]
for year in raw['YearOfBirth']:
if year <= 1930:
year_class = '1930๋
์ด์ '
elif year<= 1960:
year_class = '1960๋
์ด์ '
elif year <= 1990:
year_class = '1990๋
์ด์ '
else:
year_class = '2020๋
์ด์ '
year_class_list.append(year_class)
์์๊ฐ์ด ๋ฐ๋ณต๋ฌธ๊ณผ if๋ฌธ์ ์ฌ์ฉํ์ฌ ์ถ์๋ ๋๋ฅผ 4๊ฐ์ ์ธ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ์ค๋ค.
raw['year_class'] = year_class_list
raw.head()
์ธ๋ ๊ทธ๋ฃน์ ์ ์ฅํ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ year_class ์ปฌ๋ผ์ ์์ฑํ๋ค.
name_period = raw.pivot_table(index = ['Name', 'Sex'], columns = 'year_class', values = 'Number', aggfunc='sum')
name_period = name_period.fillna(0)
name_period = name_period.astype(int)
name_period.head()
์ด๋ฆ๊ณผ ์ฑ๋ณ์ ์ธ๋ฑ์ค๋ก ์ค์ ํ๊ณ , year_class์ ๋ฐ๋ฅธ number์ ํฉ๊ณ๋ฅผ ์ถ๋ ฅํ๋ค.
name_period['sum'] = name_period.sum(axis = 1)
name_period.head()
์ด๋ฆ ์ด ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด sum(axis=1) ์ ์ฌ์ฉํ๋ค. axis=1์ด๋ฉด ๊ฐ๋ก๋ฐฉํฅ์ผ๋ก ๊ณ์ฐ์ ํ๊ฒ ๋๋ค.
# ์ธ๋ ๋ณ ๋น์จ ๊ณ์ฐ
for col in name_period.columns:
col_new = col+"๋น์จ"
name_period[col_new] = name_period[col] / name_period['sum']
name_period.head()
์ธ๋ ๋ณ ๋น์จ์ ๊ณ์ฐํ์ฌ ๊ฐ ์ปฌ๋ผ์ ๋ง๋ค์ด ์ค๋ค.
# ์ด๋ฆ ์ฌ์ฉ์ ํฉ๊ณ, 2020๋
์ด์ ๋น์จ, 1990๋
์ด์ ๋น์จ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
name_period = name_period.sort_values(by = ['sum', '2020๋
์ด์ ๋น์จ','1990๋
์ด์ ๋น์จ'], ascending=False)
name_period
1์์ ์ด๋ฆ ๊ฐ์ ์ด ํฉ , 2์์ 2020๋ ์ด์ ๋น์จ , 3์์ 1990๋ ์ด์ ๋น์จ ๋ก ์ ๋ ฌ์ ํ์ฌ ์ต์ ํธ๋ ๋์ ๋ง๋ ๋ฏธ๊ตญ ๋ํ์ด๋ฆ์ ์์๋ณธ๋ค.
# ์ธ๋ฑ์ค๊ฐ ์ฌ๋ฌ ๋ ๋ฒจ๋ก ๋์ด์์ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ํ์ฉํด ์ปจํธ๋กค ํ๋ ๊ฒ์ ๋ณต์ก
# reset_index()๋ฅผ ํ์ฉํ์ฌ ์ธ๋ฑ์ค๋ก ์ค์ ๋ ์ด๋ฆ๊ณผ ์ฑ๋ณ์ ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝ
name_period = name_period.reset_index()
name_period.head()
์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ์ปจํธ๋กค์ด ์ด๋ ค์ฐ๋ฏ๋ก ํ์ํ ์ง๊ณ, ์ฐ์ฐ์ด ๋๋ ๋ค์๋ reset_index๋ฅผ ์ฌ์ฉํ์ฌ column์ผ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
# ๋จ์ ์ด๋ฆ๋ง ์ ํ
cond = name_period['Sex'] =='M'
name_period[cond].head(10)
์ฑ๋ณ์ด ๋จ์ฑ์ธ ์ด๋ฆ๋ค ์ค์์ ์์ 10๊ฐ๋ฅผ ๋ฝ์๋ณด๋ฉด ์์ ๊ฐ๋ค.
# ์ด๋ฒ์๋ ์ฌ์์ด๋ฆ
cond = name_period['Sex'] =='F'
name_period[cond].head(10)
์ด๋ฒ์ ์ฑ๋ณ์ด ์ฌ์ฑ์ธ ์ด๋ฆ์ ์์ 10๊ฐ๋ฅผ ๋ฝ์ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์์ง์ ์ด์ํ๋ค. ํนํ ์ฑ๋ณ์ด ์ฌ์์ธ ์ด๋ฆ์ ํ์์ ์ฒซ๋ฒ์งธ row๋ 1960๋ ์ด์ ์ธ๋์์ ์ฝ 50%์ ๋น์จ์ ์ฐจ์งํ๊ณ ์๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๊ฑด๋ค.
cond_age = name_period['2020๋
์ด์ ๋น์จ'] > 0.3
cond_sex = name_period['Sex'] == 'M'
cond = cond_age & cond_sex
name_period[cond].head(5)
2020๋ ์ด์ ๋น์จ์ด 0.3 ์ด์์ด๋ฉด์ ์ฑ๋ณ์ด ๋จ์ฑ์ธ ์กฐ๊ฑด์ธ row๋ฅผ ์ ํํ๋ค.
๊ฒฐ๊ณผ : < ๋จ์ฑ Top 5 ์ด๋ฆ Christopher, Daniel, Matthew, Anthony, Andrew >
cond_age = name_period['2020๋
์ด์ ๋น์จ'] > 0.3
cond_sex = name_period['Sex'] == 'F'
cond = cond_age & cond_sex
name_period[cond].head(5)
์ฌ์ฑ์ ๊ฒฝ์ฐ๋ ๋์ผํ ์กฐ๊ฑด์ผ๋ก ์งํํ๋ค.
๊ฒฐ๊ณผ : < ์ฌ์ฑ Top 5 ์ด๋ฆ Jessica, Sarah, Ashley, Stephanie, Emily >
'๋ฐ์ดํฐ ๋ถ์ ์ด๋ก > pandas' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python pandas] 3. pandas ๊ธฐ์ด ์ฌ์ฉ (3) - ์ง๊ณ, ๊ฒฐ์ธก๊ฐ, ์ ๋ ฌ (0) | 2021.08.05 |
---|---|
[python pandas] 2. pandas ๊ธฐ์ด ์ฌ์ฉ (2) - ์ถ๊ฐ, ๋ณํฉ, ์ ์ฅ (0) | 2021.08.04 |
[python pandas] 1. pandas ๊ธฐ์ด ์ฌ์ฉ (1) (0) | 2021.08.04 |