728x90
반응형

stockvaluation.xlsx
0.01MB
stockprice.xlsx
0.01MB

import pandas as pd
df1 = pd.read_excel('stockprice.xlsx')
df2 = pd.read_excel('stockvaluation.xlsx')
df3 = pd.concat([df1, df2], axis=1) # 열기준 병합
print(df3)

       id stock_name          value   price      id       name           eps  \
0  128940       한미약품   59385.666667  421000  130960     CJ E&M   6301.333333   
1  130960     CJ E&M   58540.666667   98900  136480         하림    274.166667   
2  138250      엔에스쇼핑   14558.666667   13200  138040    메리츠금융지주   2122.333333   
3  139480        이마트  239230.833333  254500  139480        이마트  18268.166667   
4  142280     녹십자엠에스     468.833333   10200  145990        삼양사   5741.000000   
5  145990        삼양사   82750.000000   82000  161390      한국타이어   5648.500000   
6  185750        종근당   40293.666667  100500  181710  NHN엔터테인먼트   2110.166667   
7  192400      쿠쿠홀딩스  179204.666667  177500  185750        종근당   3990.333333   
8  199800         툴젠   -2514.333333  115400  204210     모두투어리츠     85.166667   
9  204210     모두투어리츠    3093.333333    3475  207940   삼성바이오로직스   4644.166667   

      bps        per       pbr  
0   54068  15.695091  1.829178  
1    3551  11.489362  0.887074  
2   14894   6.313806  0.899691  
3  295780  13.931338  0.860437  
4  108090  14.283226  0.758627  
5   51341   7.453306  0.820007  
6   78434  30.755864  0.827447  
7   40684  25.185866  2.470259  
8    5335  40.802348  0.651359  
9   60099  89.790059  6.938551
result2 = pd.merge(df1, df2)
print(result2)
print(result2.columns)

       id stock_name          value   price    name           eps     bps  \
0  130960     CJ E&M   58540.666667   98900  CJ E&M   6301.333333   54068   
1  139480        이마트  239230.833333  254500     이마트  18268.166667  295780   
2  145990        삼양사   82750.000000   82000     삼양사   5741.000000  108090   
3  185750        종근당   40293.666667  100500     종근당   3990.333333   40684   
4  204210     모두투어리츠    3093.333333    3475  모두투어리츠     85.166667    5335   

         per       pbr  
0  15.695091  1.829178  
1  13.931338  0.860437  
2  14.283226  0.758627  
3  25.185866  2.470259  
4  40.802348  0.651359  
Index(['id', 'stock_name', 'value', 'price', 'name', 'eps', 'bps', 'per',
       'pbr'],
      dtype='object')
# 병합시, 두개의 데이터 프레임을 연결컬럼을 설정하기
# 연결컬럼을 key라고 한다,
# outer 방식
result3 = pd.merge(df1, df2, on='id', how='outer')

print(result3)
       id stock_name          value     price       name           eps  \
0   128940       한미약품   59385.666667  421000.0        NaN           NaN   
1   130960     CJ E&M   58540.666667   98900.0     CJ E&M   6301.333333   
2   138250      엔에스쇼핑   14558.666667   13200.0        NaN           NaN   
3   139480        이마트  239230.833333  254500.0        이마트  18268.166667   
4   142280     녹십자엠에스     468.833333   10200.0        NaN           NaN   
5   145990        삼양사   82750.000000   82000.0        삼양사   5741.000000   
6   185750        종근당   40293.666667  100500.0        종근당   3990.333333   
7   192400      쿠쿠홀딩스  179204.666667  177500.0        NaN           NaN   
8   199800         툴젠   -2514.333333  115400.0        NaN           NaN   
9   204210     모두투어리츠    3093.333333    3475.0     모두투어리츠     85.166667   
10  136480        NaN            NaN       NaN         하림    274.166667   
11  138040        NaN            NaN       NaN    메리츠금융지주   2122.333333   
12  161390        NaN            NaN       NaN      한국타이어   5648.500000   
13  181710        NaN            NaN       NaN  NHN엔터테인먼트   2110.166667   
14  207940        NaN            NaN       NaN   삼성바이오로직스   4644.166667   

         bps        per       pbr  
0        NaN        NaN       NaN  
1    54068.0  15.695091  1.829178  
2        NaN        NaN       NaN  
3   295780.0  13.931338  0.860437  
4        NaN        NaN       NaN  
5   108090.0  14.283226  0.758627  
6    40684.0  25.185866  2.470259  
7        NaN        NaN       NaN  
8        NaN        NaN       NaN  
9     5335.0  40.802348  0.651359  
10    3551.0  11.489362  0.887074  
11   14894.0   6.313806  0.899691  
12   51341.0   7.453306  0.820007  
13   78434.0  30.755864  0.827447  
14   60099.0  89.790059  6.938551  



print(result3.columns)

Index(['id', 'stock_name', 'value', 'price', 'name', 'eps', 'bps', 'per',
       'pbr'],
      dtype='object')
# 변합시 사용되는 키의 이름이 다른 경우
result4 = pd.merge(df1, df2, how='left', left_on='stock_name', right_on='name')
print(result4)
print(result4.columns)

     id_x stock_name          value   price      id_y    name           eps  \
0  128940       한미약품   59385.666667  421000       NaN     NaN           NaN   
1  130960     CJ E&M   58540.666667   98900  130960.0  CJ E&M   6301.333333   
2  138250      엔에스쇼핑   14558.666667   13200       NaN     NaN           NaN   
3  139480        이마트  239230.833333  254500  139480.0     이마트  18268.166667   
4  142280     녹십자엠에스     468.833333   10200       NaN     NaN           NaN   
5  145990        삼양사   82750.000000   82000  145990.0     삼양사   5741.000000   
6  185750        종근당   40293.666667  100500  185750.0     종근당   3990.333333   
7  192400      쿠쿠홀딩스  179204.666667  177500       NaN     NaN           NaN   
8  199800         툴젠   -2514.333333  115400       NaN     NaN           NaN   
9  204210     모두투어리츠    3093.333333    3475  204210.0  모두투어리츠     85.166667   

        bps        per       pbr  
0       NaN        NaN       NaN  
1   54068.0  15.695091  1.829178  
2       NaN        NaN       NaN  
3  295780.0  13.931338  0.860437  
4       NaN        NaN       NaN  
5  108090.0  14.283226  0.758627  
6   40684.0  25.185866  2.470259  
7       NaN        NaN       NaN  
8       NaN        NaN       NaN  
9    5335.0  40.802348  0.651359  
Index(['id_x', 'stock_name', 'value', 'price', 'id_y', 'name', 'eps', 'bps',
       'per', 'pbr'],
      dtype='object')
# df2 데이터셋의 내용을 모두 조회되도록,
pd.set_option('display.max_columns', 10)
pd.set_option('display.max_colwidth', 20)

result5 = pd.merge(df1, df2, how = 'right', left_on = 'stock_name', right_on = 'name')

print(result5)

       id_x stock_name          value     price    id_y       name  \
0  130960.0     CJ E&M   58540.666667   98900.0  130960     CJ E&M   
1       NaN        NaN            NaN       NaN  136480         하림   
2       NaN        NaN            NaN       NaN  138040    메리츠금융지주   
3  139480.0        이마트  239230.833333  254500.0  139480        이마트   
4  145990.0        삼양사   82750.000000   82000.0  145990        삼양사   
5       NaN        NaN            NaN       NaN  161390      한국타이어   
6       NaN        NaN            NaN       NaN  181710  NHN엔터테인먼트   
7  185750.0        종근당   40293.666667  100500.0  185750        종근당   
8  204210.0     모두투어리츠    3093.333333    3475.0  204210     모두투어리츠   
9       NaN        NaN            NaN       NaN  207940   삼성바이오로직스   

            eps     bps        per       pbr  
0   6301.333333   54068  15.695091  1.829178  
1    274.166667    3551  11.489362  0.887074  
2   2122.333333   14894   6.313806  0.899691  
3  18268.166667  295780  13.931338  0.860437  
4   5741.000000  108090  14.283226  0.758627  
5   5648.500000   51341   7.453306  0.820007  
6   2110.166667   78434  30.755864  0.827447  
7   3990.333333   40684  25.185866  2.470259  
8     85.166667    5335  40.802348  0.651359  
9   4644.166667   60099  89.790059  6.938551
price_under = df1[df1['price'] < 50000]
print(price_under)

       id stock_name         value  price
2  138250      엔에스쇼핑  14558.666667  13200
4  142280     녹십자엠에스    468.833333  10200
9  204210     모두투어리츠   3093.333333   3475
result6 = pd.merge(price_under, df2)
print(result6)

       id stock_name        value  price    name        eps   bps        per  \
0  204210     모두투어리츠  3093.333333   3475  모두투어리츠  85.166667  5335  40.802348   

        pbr  
0  0.651359

 

 

 

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

15. 스크래핑  (0) 2021.10.28
14. Stockprice (2  (0) 2021.10.26
12. titanic (2  (0) 2021.10.26
11. 행정안전부, 연령별 인구 분석  (0) 2021.10.26
10. folium 2  (0) 2021.10.26
728x90
반응형
import seaborn as sns
df = sns.load_dataset('titanic')
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
# deck열의 nan  개수 확인
nan_deck = df['deck'].value_counts(dropna = False)
nan_deck

NaN    688
C       59
B       47
D       33
E       32
A       15
F       13
G        4
Name: deck, dtype: int64
# isnull 누락데이터 여부 누락 True, 아니면 False
df.isnull().sum(axis=0)
# 반대 notnull()
# df.head().isnull().sum(axis=0) # 누락분의 합계

survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64
# 각열의 nan개수 계산하기
missing_df = df.isnull()
for col in missing_df.columns :
    missing_count = missing_df[col].value_counts()
    try :
        print(col, ':', missing_count[True]) # True 있으면 에러처리됨,
    except :
        print(col, ':', 0) # 예외 처리되면 0, 없음

survived : 0
pclass : 0
sex : 0
age : 177
sibsp : 0
parch : 0
fare : 0
embarked : 2
class : 0
who : 0
adult_male : 0
deck : 688
embark_town : 2
alive : 0
alone : 0
#  dropna nan 500개되는 열  삭제
df_thresh = df.dropna(axis = 1, thresh = 500) 
print(df_thresh.columns)
df_thresh.info

Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare',
       'embarked', 'class', 'who', 'adult_male', 'embark_town', 'alive',
       'alone'],
      dtype='object')
<bound method DataFrame.info of      survived  pclass     sex   age  sibsp  parch     fare embarked   class  \
0           0       3    male  22.0      1      0   7.2500        S   Third   
1           1       1  female  38.0      1      0  71.2833        C   First   
2           1       3  female  26.0      0      0   7.9250        S   Third   
3           1       1  female  35.0      1      0  53.1000        S   First   
4           0       3    male  35.0      0      0   8.0500        S   Third   
..        ...     ...     ...   ...    ...    ...      ...      ...     ...   
886         0       2    male  27.0      0      0  13.0000        S  Second   
887         1       1  female  19.0      0      0  30.0000        S   First   
888         0       3  female   NaN      1      2  23.4500        S   Third   
889         1       1    male  26.0      0      0  30.0000        C   First   
890         0       3    male  32.0      0      0   7.7500        Q   Third   

       who  adult_male  embark_town alive  alone  
0      man        True  Southampton    no  False  
1    woman       False    Cherbourg   yes  False  
2    woman       False  Southampton   yes   True  
3    woman       False  Southampton   yes  False  
4      man        True  Southampton    no   True  
..     ...         ...          ...   ...    ...  
886    man        True  Southampton    no   True  
887  woman       False  Southampton   yes   True  
888  woman       False  Southampton    no  False  
889    man        True    Cherbourg   yes   True  
890    man        True   Queenstown    no   True  

[891 rows x 14 columns]>
# nan 값있는 행 삭제
df_age = df.dropna(subset = ['age'], how = 'any', axis = 0)
print(len(df_age))
print(df_age.info())

714
<class 'pandas.core.frame.DataFrame'>
Int64Index: 714 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     714 non-null    int64   
 1   pclass       714 non-null    int64   
 2   sex          714 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        714 non-null    int64   
 5   parch        714 non-null    int64   
 6   fare         714 non-null    float64 
 7   embarked     712 non-null    object  
 8   class        714 non-null    category
 9   who          714 non-null    object  
 10  adult_male   714 non-null    bool    
 11  deck         184 non-null    category
 12  embark_town  712 non-null    object  
 13  alive        714 non-null    object  
 14  alone        714 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 70.2+ KB
None
# df 데이터 : age 열의 nan 값을 다른 나이 데이터의 평균으로 변경하기
print(df.info())
mean_age = df['age'].mean(axis=0)
df['age'].fillna(mean_age, inplace = True)
print(df.info())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
None
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          891 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
None
# embarktown 컬럼의 결측값은 컬럼의 값 중 빈도수가 가장 많은 값으로 치환하기
# most_freq = df['embark_town'].value_counts(dropna = True)
most_freq = df['embark_town'].value_counts(dropna = True).idxmax() # 가장 많은 것 출력
print(most_freq)

# Southampton
df['embark_town'].fillna(most_freq, inplace = True)
print(df.info())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          891 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  891 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
None
# 재 업로드
df = sns.load_dataset('titanic')
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
print(df['embark_town'][825:830])

825     Queenstown
826    Southampton
827      Cherbourg
828     Queenstown
829            NaN
Name: embark_town, dtype: object
# 결측치를 앞의 값으로 치환
df['embark_town'].fillna(method='ffill', inplace = True)
print(df['embark_town'][825:830])

825     Queenstown
826    Southampton
827      Cherbourg
828     Queenstown
829     Queenstown
Name: embark_town, dtype: object

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

14. Stockprice (2  (0) 2021.10.26
13. Stockprice  (0) 2021.10.26
11. 행정안전부, 연령별 인구 분석  (0) 2021.10.26
10. folium 2  (0) 2021.10.26
9. tips || '21.06.28.  (0) 2021.10.26
728x90
반응형

age1_utf.csv
1.54MB

# 행안부, 연령별 인구 현황 파일 다운받기, 계, 연령구분단위 1세, 0~100세
import csv
f = open('./age1_utf.csv',encoding="utf8")
data = csv.reader(f)
next(data) # 헤더 제거, 첫줄 읽어버리기
for row in data :
    print(row)
    
['서울특별시  (1100000000)', '9,575,355', '9,575,355', '44,116', '47,612', '51,389', '54,644', '60,226', '66,775', '68,122', '67,105', '72,631', '72,433', '74,702', '69,966', '72,360', '78,681', '74,635', '71,679', '75,052', '80,554', '81,153', '89,544', '108,121', '114,369', '120,701', '133,889', '142,513', '155,641', '160,766', '166,742', '172,551', '170,425', '155,942', '149,727', '146,537', '138,384', '137,327', '138,403', '134,457', '144,175', '151,702', '158,712', '157,393', '155,800', '139,387', '137,722', '136,405', '139,782', '148,291', '158,851', '163,010', '166,672', '171,150', '162,638', '166,009', '149,296', '141,771', '143,737', '145,888', '134,601', '151,699', '143,144', '162,666', '152,287', '142,186', '136,982', '127,836', '123,489', '127,802', '99,709', '99,786', '91,396', '76,633', '85,104', '80,194', '81,207', '79,145', '55,147', '59,598', '56,681', '63,261', '59,700', '46,471', '42,577', '39,035', '33,287', '29,726', '26,231', '21,958', '17,597', '14,591', '12,017', '9,371', '7,894', '6,808', '5,082', '3,741', '2,523', '1,790', '1,469', '1,321', '828', '2,520']
#  인구구조 알고싶은 동 입력
import numpy as np
import csv
import matplotlib.pyplot as plt
f = open('./age1_utf.csv',encoding="utf8")
# 스트림 : 데이터의 이동 통로
# 한번 읽으면 사라짐, 그래서 문제가 될지도, 또 쓰고 싶으면, 별도로 저장해야 함.
data = csv.reader(f)
next(data) # 헤더 제거, 첫줄 읽어버리기
name = input('지역의 이름(읍면동 단위) 입력')

for row in data :
    if name in row[0] :
        name = row[0]
        print(name)
        row = list(map((lambda x : x.replace(',', '')), row)) # 문자열 제거 숫자내부 m 제거해서 정수값 변경가능
        home = np.array(row[3:], dtype = int)
        
plt.style.use('ggplot')        
plt.figure(figsize = (10, 5), dpi = 100)
plt.rc('font', family = 'Malgun Gothic')
plt.title(name + ' 지역의 인구 구조')
plt.plot(home)
plt.show()

# 지역의 이름(읍면동 단위) 입력강남구
# 서울특별시 강남구 (1168000000)

가장 비슷한 인구구조를 가진 그래플와 지역 출력

# 가장 비슷한 인구구조를 가진 그래플와 지역 출력
import numpy as np
import csv
import matplotlib.pyplot as plt
import re
f = open('./age1_utf.csv',encoding="utf8")
# 스트림 : 데이터의 이동 통로
# 한번 읽으면 사라짐, 그래서 문제가 될지도, 또 쓰고 싶으면, 별도로 저장해야 함.
data = csv.reader(f)
next(data) # 헤더 제거, 첫줄 읽어버리기
# name = input('지역의 이름(읍면동 단위) 입력')
data =list(data)
name = '상록'
mn = 1 # 파라미터 초기화, 최소차이 저장
result_name = ''
result = 0

for row in data :
    if name in row[0]:
        row = list(map((lambda x : x.replace(',', '')), row)) # 문자열 제거 숫자내부 m 제거해서 정수값 변경가능
        home = np.array(row[3:], dtype =int) / int(row[2])

for row in data :
    row = list(map((lambda x : x.replace(',', '')), row))
    away = np.array(row[3:], dtype =int) / int(row[2])
    s = np.sum((home - away)**2) # 차이가 마이너스가 될수도, 절대값 개념
    if s < mn and name not in row[0] :
        mn = s #  mn 저장
        result_name = row[0]
        result = away
        
plt.style.use('ggplot')        
plt.figure(figsize = (10, 5), dpi = 100)
plt.rc('font', family = 'Malgun Gothic')
plt.title(name + ' 지역의 인구 구조')
plt.plot(home, label = name) # 선택지역
plt.plot(result, label = result_name) # 가장 비슷한 지역
plt.legend()
plt.show()

 

age_14.csv
1.42MB

import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import re

df = pd.read_csv('age_14.csv', encoding="cp949", index_col = 0)
print(df.head())
df = df.div(df['총인구수'], axis=0)
del df['총인구수'], df['연령구간인구수']
name = '신림동'
a = df.index.str.contains(name) # 신림동 레코드
df2 = df[a]

plt.rc('font', family = 'Malgun Gothic')
df2.T.plot()
plt.show()

                               총인구수  연령구간인구수     0세     1세     2세     3세  \
행정구역                                                                        
서울특별시  (1100000000)          9857426  9857426  61253  70532  74322  72482   
서울특별시 종로구 (1111000000)        154770   154770    652    794    911    895   
서울특별시 종로구 청운효자동(1111051500)    13272    13272     81     82     90    105   
서울특별시 종로구 사직동(1111053000)       9441     9441     43     63     75     68   
서울특별시 종로구 삼청동(1111054000)       2907     2907     12      4     22     13   

                                4세     5세     6세     7세  ...   91세   92세  \
행정구역                                                     ...               
서울특별시  (1100000000)          71688  78941  75386  75929  ...  5892  4695   
서울특별시 종로구 (1111000000)         859   1046    909   1012  ...   149   115   
서울특별시 종로구 청운효자동(1111051500)     97    116    117    116  ...    12    14   
서울특별시 종로구 사직동(1111053000)       76     81     74     83  ...    11    13   
서울특별시 종로구 삼청동(1111054000)       12     13     20     11  ...     5     2   

                              93세   94세   95세   96세   97세   98세  99세  100세 이상  
행정구역                                                                           
서울특별시  (1100000000)          3589  3501  2569  1851  1436  1010  736     5519  
서울특별시 종로구 (1111000000)         95    79    81    60    46    37   26      226  
서울특별시 종로구 청운효자동(1111051500)     7     7     8     3     5     1    1       17  
서울특별시 종로구 사직동(1111053000)       7     5     7     3     6     4    4       17  
서울특별시 종로구 삼청동(1111054000)       3     3     2     2     0     2    1        7  

[5 rows x 103 columns]

 

 

 

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

13. Stockprice  (0) 2021.10.26
12. titanic (2  (0) 2021.10.26
10. folium 2  (0) 2021.10.26
9. tips || '21.06.28.  (0) 2021.10.26
8. iris || '21.06.28.  (0) 2021.10.26
728x90
반응형

서울지역 대학교 위치.xlsx
0.01MB
Library.csv
0.03MB
경기도인구데이터.xlsx
0.01MB
경기도행정구역경계.json
0.11MB

import folium
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)
seoul_map.save('seoul.html')

seoul.html
0.00MB

# tiles : 지도 스타일 설정
# openstreetmap, cartodbdark_matter, cartodbpositron, stamenterrain,
seoul_map2 = folium.Map(location=[37.55, 126.98], zoom_start=12, tiles = "openstreetmap")
seoul_map2.save('seoul2.html')

seoul2.html
0.00MB

import pandas as pd
import folium
df = pd.read_excel('서울지역 대학교 위치.xlsx', index_col=0,engine='openpyxl')
print(df.head())
                     위도          경도
KAIST 서울캠퍼스   37.592573  127.046737
KC대학교         37.548345  126.854797
가톨릭대학교(성신교정)  37.585922  127.004328
가톨릭대학교(성의교정)  37.499623  127.006065
감리교신학대학교      37.567645  126.961610


print(df.index)
Index(['KAIST 서울캠퍼스 ', 'KC대학교', '가톨릭대학교(성신교정)', '가톨릭대학교(성의교정)', '감리교신학대학교',
       '건국대학교', '경기대학교 서울캠퍼스 ', '경희대학교 서울캠퍼스 ', '고려대학교', '광운대학교', '국민대학교',
       '덕성여자대학교', '동국대학교', '동덕여자대학교', '명지대학교 서울캠퍼스 ', '삼육대학교', '상명대학교 서울캠퍼스 ',
       '서강대학교', '서경대학교', '서울과학기술대학교', '서울교육대학교', '서울기독대학교', '서울대학교', '서울시립대학교',
       '서울여자대학교', '서울한영대학교', '성공회대학교', '성균관대학교 서울캠퍼스  ', '성신여자대학교', '세종대학교',
       '숙명여자대학교', '숭실대학교', '연세대학교', '육군사관학교', '이화여자대학교', '장로회신학대학교',
       '중앙대학교 서울캠퍼스 ', '총신대학교', '추계예술대학교', '한국방송통신대학교', '한국성서대학교', '한국예술종합학교',
       '한국외국어대학교', '한국체육대학교', '한성대학교', '한양대학교', '홍익대학교'],
      dtype='object')
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12, tiles = "openstreetmap")
for name, lat, lng in zip(df.index, df.위도, df.경도) :
    # marker = w지도 표시 객체 ,  popup 마커 표시내용\
    # tooltip 마커에 커서가 들어온 경우 표시됨
    folium.Marker([lat, lng], popup=name, tooltip=name).add_to(seoul_map)
seoul_map.save('seoul_colleges.html')
seoul_map3 = folium.Map(location=[37.55, 126.98], zoom_start=12, tiles = "openstreetmap")
for name, lat, lng in zip(df.index, df.위도, df.경도) :
    folium.CircleMarker([lat, lng], # 위경도
                        radius = 10, #  반지름
                        color = 'brown', # 색 
                        fill= True, # 원 둘레 색
                        fillcolor= 'coral', # 원을 채우는 색
                        fill_opacity=0.7,# 투명도
                        popup=name
                       ).add_to(seoul_map)
seoul_map3.save('seoul_colleges.html')
# 아이콘 마커표시3
seoul_map4 = folium.Map(location=[37.55, 126.98], zoom_start=12, tiles = "openstreetmap")
for name, lat, lng in zip(df.index, df.위도, df.경도) :
    folium.CircleMarker([lat, lng], # 위경도
                        popup=name,
                        # icon home, flag, bookmark, star
                        icon = folium.Icon(color = 'blue', icon='star')
                       ).add_to(seoul_map)
seoul_map4.save('seoul_colleges.html')

seoul_colleges.html
0.04MB

 

 

library.csv

import pandas as pd
import folium
from folium import Marker
library = pd.read_csv('library.csv')
lib_map = folium.Map(location=[37.55, 126.98], zoom_start=12)

print(df1.head())
   고유번호   구명   법정동명  산지여부  주지번 부지번                 새주소명                 시설명  \
0    21  구로구   구로3동     1  777   1  구로구 디지털로 27다길 65 2층             꿈마을 도서관   
1    22  용산구    후암동     1   30  84        용산구 후암동 30-84              남산 도서관   
2    23   중구    신당동     1  844                중구 다산로 32  남산타운 문화체육센터 어린이도서관   
3    24  노원구  상계10동     1  686               노원구 온곡길 21            노원 정보도서관   
4    25  노원구   중계3동     1  508             노원구 중계3동 508            노원 평생학습관   

         운영기관 설립주체    시설구분         개관일      면적                       홈페이지주소  \
0  구로구 시설관리공단        구립도서관  2007-04-05   476.0    lib.guro.go.kr/dreamtown/   
1                   교육청도서관  1922-10-05     0.0  lib.sen.go.kr/lib_index.jsp   
2      시설관리공단        구립도서관  2010-04-01   273.8        www.e-junggulib.or.kr   
3   노원 교육복지재단        구립도서관  2006-02-15  6526.0              www.nowonlib.kr   
4                   교육청도서관  1990-05-08     0.0  lib.sen.go.kr/lib_index.jsp 

print(df1.index)
            연락처 생성일          경도         위도  
0      830-5807      126.890115  37.487220  
1                    126.981375  37.552664  
2  02-2280-8520      127.009297  37.549020  
3   02-950-0029      127.064177  37.660927  
4                    127.067120  37.640120  
RangeIndex(start=0, stop=123, step=1)

color='blue'

# color='blue'
for name, lat, lng, kbn in zip(library['시설명'],library['위도'],library['경도'],library['시설구분']) :
    if kbn == '구립도서관' :
        color ='green'
    else :
        color = 'blue'
    Marker(location = [lat, lng], 
           popup = kbn,
           tooltip=name, 
           icon = folium.Icon(color=color,icon='bookmark')
          ).add_to(lib_map)
lib_map.save('library.html')

library.html
0.30MB

markercluster 기능

# markercluster 기능
from folium.plugins import MarkerCluster
lib_map = folium.Map(location=[37.55, 126.98], zoom_start=12)

 

# add points to the map
mc = MarkerCluster()
# 데이터 중 한개 레코드씩 조회 row 따고 그중 하나씩
# _ 인덱스값 저장, 사용안하지만 절차상 피룡
for _, row in library.iterrows(): 
    mc.add_child(
        Marker(location = [row['위도'], row['경도']],
              popup = row['시설구분'],
              tooltip = row['시설명']
              )
    )
lib_map.add_child(mc)
lib_map.save('library2.html')

library2.html
0.09MB

# 경기도 인구데이텉와 위치정보를 가지고 지도 표시
import pandas as pd
import folium
import json
file_path = './경기도인구데이터.xlsx'
df = pd.read_excel(file_path, index_col = '구분', engine = 'openpyxl')
df.columns = df.columns.map(str)
geo_path = './경기도행정구역경계.json'
try :
    geo_data = json.load(open(geo_path, encoding = 'utf-8')) # 이게 안되면 
except :
    geo_data = json.load(open(geo_path, encoding = 'utf-8-sig')) # 이걸로
print(type(geo_data)) # dict
g_map = folium.Map(location=[37.5502, 126.982], zoom_start=9)
year = '2017'
# <class 'dict'>
# choropleth 클래스로 단계구분 표시
# fill_color BuGn, PuRd, BuPu, GnBu, OrRd, PuBu, PuBuGn
folium.Choropleth(geo_data = geo_data, # 지도 경계 
                 data = df[year], # 표시하려는 데이터
                 columns = [df.index, df[year]],
                 fill_color = 'YlOrRd', # 면적 색깔
                  fill_opacity=0.7, # 면적 투명도 
                  line_opacity=0.3,  # 선 투명도
                 threshold_scale = [10000,100000,300000,500000,700000], # 색깔구분
                 key_on ='feature.properties.name', # 이름으로 구분
                 ).add_to(g_map) # 에 추가하자
g_map.save('./gyonggi_population_'+year+'.html')

gyonggi_population_2017.html
0.07MB

 

 

 

us-states.json
0.08MB

# json
import pandas as pd
import folium
import json
file_path = './US_Unemployment_Oct2012.csv'
df = pd.read_csv(file_path)
df.columns = df.columns.map(str)
geo_path = './us-states.json'
try :
    geo_data = json.load(open(geo_path, encoding = 'utf-8')) # 이게 안되면 
except :
    geo_data = json.load(open(geo_path, encoding = 'utf-8-sig')) # 이걸로
print(type(geo_data)) # dict
g_map = folium.Map(location=[37, -100], zoom_start=3, tiles="stamentoner")
# <class 'dict'>
# choropleth 클래스로 단계구분 표시
# fill_color BuGn, PuRd, BuPu, GnBu, OrRd, PuBu, PuBuGn
folium.Choropleth(geo_data = geo_data, # 지도 경계 
                 data = df, # 표시하려는 데이터
                 columns = ['State','Unemployment'],
                 fill_color = 'YlGn', # 면적 색깔
                  fill_opacity=0.7, # 면적 투명도 
                  line_opacity=0.3,  # 선 투명도
                 threshold_scale = [0, 2, 4, 6, 8, 10, 12], # 색깔구분
                  
                  legend_name='Unemployment Rate (%)',
                 key_on ='feature.id', # 이름으로 구분
                 ).add_to(g_map) # 에 추가하자
g_map.save('./US_Unemployment_Oct_'+'11'+'.html')

US_Unemployment_Oct2012.csv
0.00MB

import pandas as pd
import folium
import json
file_path='US_Unemployment_Oct2012.csv'
df=pd.read_csv(file_path)
df.head()
df.columns=df.columns.map(str)
geo_path='us-states.json'

try:
    geo_data=json.load(open(geo_path,encoding='utf-8'))
except:
    geo_data=json.load(open(geo_path,encoding='utf-8-sig'))

print(type(geo_data))

g_map = folium.Map(location=[37,-102],zoom_start=3)
folium.Choropleth(geo_data=geo_data, #지도 경계
data=df,
columns=['State','Unemployment'], #열 지정
fill_color='YlGn',fill_opacity=0.7,line_opacity=0.3,
legent_name="Unemployment Rate (%)",
key_on='feature.id',
).add_to(g_map)
g_map.save('US_Unemployment.html')

US_Unemployment.html
0.11MB

 

 

 

crime_in_Seoul_final.csv
0.01MB
skorea_municipalities_geo_simple.json
0.01MB

import pandas as pd
import folium
import json
file_path='crime_in_Seoul_final.csv'
df=pd.read_csv(file_path,index_col='구별')
df.head()
df.columns=df.columns.map(str)
geo_path='skorea_municipalities_geo_simple.json'

try:
    geo_data=json.load(open(geo_path,encoding='utf-8'))
except:
    geo_data=json.load(open(geo_path,encoding='utf-8-sig'))

print(type(geo_data))
g_map = folium.Map(location=[37.5502,126.978],zoom_start=10)
typ='강간'
folium.Choropleth(geo_data=geo_data,
data=df[typ], 
columns=[df.index,df[typ]],
fill_color='YlOrRd',fill_opacity=0.7,line_opacity=0.3,
key_on='feature.properties.name',
).add_to(g_map)
g_map.save('crime_Seoul3.html')

crime_Seoul.html
0.04MB

 

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

12. titanic (2  (0) 2021.10.26
11. 행정안전부, 연령별 인구 분석  (0) 2021.10.26
9. tips || '21.06.28.  (0) 2021.10.26
8. iris || '21.06.28.  (0) 2021.10.26
7. folium || '21.06.24.  (0) 2021.10.26
728x90
반응형
import seaborn as sns
print(sns.get_dataset_names())
tips = sns.load_dataset('tips')
print(tips.head())
# ['anagrams', 'anscombe', 'attention', 'brain_

['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg', 'penguins', 'planets', 'tips', 'titanic']
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
sns.set_style('darkgrid')
# darkgrid, whitegrid, dark, white, ticks 등
# 선형회귀, 산점도
sns.regplot(x='total_bill',
           y='tip',
           data = tips)
plt.title('총지불금액과 팁')
plt.xlabel('총지불금액')
plt.ylabel('팀')
plt.show()

sns.barplot(x='time', y='tip', data=tips)

 

 

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

11. 행정안전부, 연령별 인구 분석  (0) 2021.10.26
10. folium 2  (0) 2021.10.26
8. iris || '21.06.28.  (0) 2021.10.26
7. folium || '21.06.24.  (0) 2021.10.26
6. Titanic || '21.06.24.  (0) 2021.10.26
728x90
반응형
import seaborn as sns
print(sns.get_dataset_names())
iris = sns.load_dataset('iris')
print(iris.head())
# ['anagrams', 'anscombe', 'attention', 'brain_

['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg', 'penguins', 'planets', 'tips', 'titanic']
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
iris_pair = iris[['sepal_length','sepal_width','petal_length','petal_width', 'species']]
print(iris_pair)
# 조건에 따라 그리드 나누기
g = sns.pairplot(iris_pair, hue = 'species')

     sepal_length  sepal_width  petal_length  petal_width    species
0             5.1          3.5           1.4          0.2     setosa
1             4.9          3.0           1.4          0.2     setosa
2             4.7          3.2           1.3          0.2     setosa
3             4.6          3.1           1.5          0.2     setosa
4             5.0          3.6           1.4          0.2     setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  virginica
146           6.3          2.5           5.0          1.9  virginica
147           6.5          3.0           5.2          2.0  virginica
148           6.2          3.4           5.4          2.3  virginica
149           5.9          3.0           5.1          1.8  virginica

[150 rows x 5 columns]

# boxplot 막대 그래프 건수 출력
fig = plt.figure(figsize = (10,5))
ax1 = fig.add_subplot(2,2,1) # 위
ax2 = fig.add_subplot(2,2,2) # 아래
ax3 = fig.add_subplot(2,2,3) # 아래
ax4 = fig.add_subplot(2,2,4) # 아래

sns.boxplot(x='species', y= 'sepal_length', data=iris, ax=ax1)
sns.boxplot(x='species', y= 'sepal_width', data=iris, ax=ax2)
sns.boxplot(x='species', y= 'petal_length', data=iris, ax=ax3)
sns.boxplot(x='species', y= 'petal_width', data=iris, ax=ax4)

plt.show()

 

 

 

반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

10. folium 2  (0) 2021.10.26
9. tips || '21.06.28.  (0) 2021.10.26
7. folium || '21.06.24.  (0) 2021.10.26
6. Titanic || '21.06.24.  (0) 2021.10.26
5. auto-mpg 분석 || '21.06.24.  (0) 2021.10.26
728x90
반응형
# 지도 그리기
# folium 모듈 사용
import folium  # pip install folium
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)
seoul_map.save('seoul.html')

seoul.html
0.00MB

pip install folium
반응형

'Data_Science > Data_Analysis_Py' 카테고리의 다른 글

9. tips || '21.06.28.  (0) 2021.10.26
8. iris || '21.06.28.  (0) 2021.10.26
6. Titanic || '21.06.24.  (0) 2021.10.26
5. auto-mpg 분석 || '21.06.24.  (0) 2021.10.26
4. 시도별 전출입 인구수 분석 ( 2 || '21.06.24.  (0) 2021.10.26
728x90
반응형

seaborn

  • matplot 모듈 기능, 스타일 확장한 고급 시각화 도구, 데이터 셋 저장 모듈
import seaborn as sns
print(sns.get_dataset_names())
titanic = sns.load_dataset('titanic')
# ['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg', 'penguins', 'planets', 'tips', 'titanic']
print(titanic.head())

   survived  pclass     sex   age  sibsp  parch     fare embarked  class  \
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third   

     who  adult_male deck  embark_town alive  alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True
print(titanic.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
None
sns.set_style('darkgrid')
# darkgrid, whitegrid, dark, white, ticks 등
fig = plt.figure(figsize = (15, 5)) # fig 크기
ax1 = fig.add_subplot(1,2,1) # 위
ax2 = fig.add_subplot(1,2,2) # 아래
# 선형회귀, 산점도
sns.regplot(x='age',
           y='fare',
           data = titanic,
           ax = ax1)

sns.regplot(x='age',
           y='fare',
           data = titanic,
           ax = ax2,
           fit_reg=False)

plt.show()

히스토그램

  • distplot 두개 다
  • kedplot 선형 분포
  • histplot 막대 분포
fig = plt.figure(figsize = (15, 5)) # fig 크기
ax1 = fig.add_subplot(1,3,1) # 위
ax2 = fig.add_subplot(1,3,2) # 아래
ax3 = fig.add_subplot(1,3,3) # 아래
# distplot : 합친 것
sns.distplot(titanic['fare'], ax=ax1)
# kdeplot : 커널 밀도
sns.kdeplot(x='fare', data =titanic, ax=ax2)
# sns.distplot(titanic['fare'], hist = False, ax=ax1)
# histplot : 히스토그램
sns.histplot(x='fare', data =titanic, ax=ax3)
# sns.distplot(titanic['fare'], kde = False, ax=ax1)

ax1.set_title('titanic fare - distplot')
ax2.set_title('titanic fare - kdeplot')
ax3.set_title('titanic fare - histplot')
plt.show()

히트맵

sns.set_style('darkgrid')
# 피벗테이블로 범주현 변수를 각각 행, 열로 재구분하여 정리
table = titanic.pivot_table(index = ['sex'], columns = ['class'], aggfunc='size')
# 성별이 인덱스, 컬럼이 탑승등급, aggdfunc 건수 표시
# 피벗테이블 : 범위를 가지는 값 별로 건수로 출력되는 테이블
# 히트맵 그리기
sns.heatmap(table,                  # 데이터 프레임
           annot = True, fmt = 'd', # 데이터 값 표시, 정수형 포맷
           cmap='YlGnBu',           # 컬러맵
           linewidth=5,             # 구분선
           cbar=True)              # 컬러 바 표시 여부

plt.show()

# 산점도
sns.set_style('whitegrid')
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(1,2,1) # 위
ax2 = fig.add_subplot(1,2,2) # 아래
# 이산형 변수 의 분포 데이터 분산 미고려
sns.stripplot(x = 'class',
            y = 'age',
            data = titanic,
            ax = ax1)
# 이산형 변수의 분포 : 데이터 분산 고려, 중복 없음, 겹치지 않게 옆으로 밀어냄
sns.swarmplot(x = 'class',
            y = 'age',
            data = titanic,
            ax = ax2)
# 차트제목 표시
ax1.set_title('Strip Plot')
ax2.set_title('Swarm Plot')
plt.show()

# 산점도
sns.set_style('whitegrid')
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(1,2,1) # 위
ax2 = fig.add_subplot(1,2,2) # 아래
# 이산형 변수 의 분포 데이터 분산 미고려
sns.stripplot(x = 'class',
            y = 'age',
            data = titanic,
            hue = 'sex', # 데이터 구분 컬럼 // 동일 배치에 색깔로 구분
            ax = ax1)
# 이산형 변수의 분포 : 데이터 분산 고려, 중복 없음, 겹치지 않게 옆으로 밀어냄
sns.swarmplot(x = 'class',
            y = 'age',
            data = titanic,
            hue = 'sex', 
            ax = ax2)
# 차트제목 표시
ax1.set_title('Strip Plot')
ax2.set_title('Swarm Plot')
ax1.legend(loc = 'upper right')
ax2.legend(loc = 'upper right')
plt.show()

 

# 막대 그래프
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(1,3,1) # 위
ax2 = fig.add_subplot(1,3,2) # 아래
ax3 = fig.add_subplot(1,3,3) # 아래

sns.barplot(x='sex', y='survived', data=titanic, ax=ax1)
sns.barplot(x='sex', y='survived', hue = 'class', data=titanic, ax=ax2)
sns.barplot(x='sex', y='survived', hue = 'class', dodge = False, data=titanic, ax=ax3)

# 차트제목 표시
ax1.set_title('titanic survived  sex')
ax2.set_title('titanic survived  sex/class')
ax3.set_title('titanic survived  sex/class(stacked)')
plt.show()

# countplot 막대 그래프 건수 출력
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(1,3,1) # 위
ax2 = fig.add_subplot(1,3,2) # 아래
ax3 = fig.add_subplot(1,3,3) # 아래

sns.countplot(x='class', palette='Set1', data=titanic, ax=ax1)
sns.countplot(x='class', hue = 'who', palette='Set1', data=titanic, ax=ax2)
sns.countplot(x='class', hue = 'who', palette='Set1', dodge = False, data=titanic, ax=ax3)
# 차트제목 표시
ax1.set_title('titanic survived')
ax2.set_title('titanic survived - who')
ax3.set_title('titanic survived - who(stacked)')
plt.show()

# boxplot 막대 그래프 건수 출력
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(2,2,1) # 위
ax2 = fig.add_subplot(2,2,2) # 아래
ax3 = fig.add_subplot(2,2,3) # 아래
ax4 = fig.add_subplot(2,2,4) # 아래

sns.boxplot(x='alive', y= 'age', data=titanic, ax=ax1)
sns.boxplot(x='alive', y= 'age', hue = 'sex', data=titanic, ax=ax2)
sns.violinplot(x='alive', y='age', data=titanic, ax=ax3)
sns.violinplot(x='alive', y='age', hue = 'sex', data=titanic, ax=ax4)

# 차트제목 표시
ax2.legend(loc='upper center')
ax4.legend(loc='upper center')
plt.show()

# 조인트그래프 - 산점도
j1 = sns.jointplot(x='fare', y= 'age', data=titanic)
# 조인트그래프 - 회귀선
j2 = sns.jointplot(x='fare', y= 'age', kind = 'reg', data=titanic)
# 조인트그래프 - 육각 그래프
j3 = sns.jointplot(x='fare', y='age', kind = 'hex', data=titanic)
# 조인트그래프 - 커럴 밀집 그래프
j4 = sns.jointplot(x='fare', y='age', kind = 'kde', data=titanic)

# 차트제목 표시
j1.fig.suptitle('titanic fare - scatter',size = 15)
j2.fig.suptitle('titanic fare - reg',size = 15)
j3.fig.suptitle('titanic fare - hex',size = 15)
j4.fig.suptitle('titanic fare - kde',size = 15)
plt.show()

# 조건에 따라 그리드 나누기
# who : man, woman, child
# survived : 0 1
g = sns.FacetGrid(data = titanic, col='who', row='survived') # 한방에, 컬럼 로우별
# 그래프 적용하기
g = g.map(plt.hist, 'age')
plt.show()

# 이변수 데이터 분포 그리기 pairplot
# 각변수들의 산점도 출력, 대각선 위치의 그래프는 히스토그램 으로 표시
# pairplot
titanic_pair = titanic[['age', 'pclass', 'fare']]
print(titanic_pair)
# 조건에 따라 그리드 나누기
g = sns.pairplot(titanic_pair)

      age  pclass     fare
0    22.0       3   7.2500
1    38.0       1  71.2833
2    26.0       3   7.9250
3    35.0       1  53.1000
4    35.0       3   8.0500
..    ...     ...      ...
886  27.0       2  13.0000
887  19.0       1  30.0000
888   NaN       3  23.4500
889  26.0       1  30.0000
890  32.0       3   7.7500

[891 rows x 3 columns]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
728x90
반응형
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('default')

auto-mpg.csv
0.02MB

scatter 산점도

df = pd.read_csv('auto-mpg.csv', header=None)
df.columns = ['mpg', 'cylinders', 'desplacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']
df.plot(kind = 'scatter', x='weight', y='mpg', c ='coral', s=10, figsize = (10, 5))
plt.title('Scatter Plot - mpg vs. weight')
plt.show()

bubble => s로 크기 지정, alpha로 투명도

df = pd.read_csv('auto-mpg.csv', header=None)
df.columns = ['mpg', 'cylinders', 'desplacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']
cylineder_size = df.cylinders / df.cylinders.max() * 300
df.plot(kind = 'scatter', x='weight', y='mpg', c ='coral', s=cylineder_size, figsize = (10, 5), alpha = 0.3)
plt.title('Scatter Plot - mpg vs. weight')
plt.show()

색상 설정

cylineder_size = df.cylinders / df.cylinders.max() * 300
df.plot(kind = 'scatter', x='weight', y='mpg', marker ='+', s=50, c=cylineder_size, cmap='viridis', figsize = (10, 5), alpha = 0.3)
# cmap color mapping
plt.title('Scatter Plot - mpg vs. weight - cylinder')
# plt.savefig('scatter_transparent.png', transparent = True) # 현재 그림을 이미지파일 생성
plt.savefig('scatter_transparent.png', transparent = True) # transparent 투명한 그림으로 표시
plt.show()

pie graph

df['count'] = 1
print(df.head())
df_origin = df.groupby('origin').sum()# origin 기준으로 그룹별 합이 df_origin
print(df_origin.head())
# df_origin['count'] 국가별 자동차 갯수
df_origin.index = ['USA','EU','JAPAN']
# 제조국가 origin 값을 실제 지역명으로 변경
# '%1.1f%%' : %1.1f 소숫점 이하 한자리, %% 퍼센트 표시
df_origin['count'].plot(kind='pie', figsize = (7, 5), autopct='%1.1f%%',# 퍼센트% 표시
                        startangle = 10, # 파이조각 나누는 시작점  각도 표시
                        colors=['chocolate','bisque','cadetblue']
                       )
plt.title('model origin', size = 20)
plt.axis('equal') # 파이차트 비율 같게, 원에 가깝게 조정
plt.legend(labels = df_origin.index, loc='upper right')
plt.show()


    mpg  cylinders  desplacement horsepower  weight  acceleration  model year  \
0  18.0          8         307.0      130.0  3504.0          12.0          70   
1  15.0          8         350.0      165.0  3693.0          11.5          70   
2  18.0          8         318.0      150.0  3436.0          11.0          70   
3  16.0          8         304.0      150.0  3433.0          12.0          70   
4  17.0          8         302.0      140.0  3449.0          10.5          70   

   origin                       name  count  
0       1  chevrolet chevelle malibu      1  
1       1          buick skylark 320      1  
2       1         plymouth satellite      1  
3       1              amc rebel sst      1  
4       1                ford torino      1  
           mpg  cylinders  desplacement    weight  acceleration  model year  \
origin                                                                        
1       5000.8       1556       61229.5  837121.0        3743.4       18827   
2       1952.4        291        7640.0  169631.0        1175.1        5307   
3       2405.6        324        8114.0  175477.0        1277.6        6118   

        count  
origin         
1         249  
2          70  
3          79

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
rc('font', family = 'Malgun Gothic')
plt.style.use('seaborn-poster')
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('auto-mpg.csv', header=None)
df.columns = ['mpg', 'cylinders', 'desplacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

fig = plt.figure(figsize = (15, 5)) # fig 크기
ax1 = fig.add_subplot(1,2,1) # 위
ax2 = fig.add_subplot(1,2,2) # 아래

ax1.boxplot(x=[df[df['origin']==1]['mpg'],
              df[df['origin']==2]['mpg'],
              df[df['origin']==3]['mpg']],
            labels = ['USA','EU', 'JAPAN'])
# 가로               
ax2.boxplot(x=[df[df['origin']==1]['mpg'],
              df[df['origin']==2]['mpg'],
              df[df['origin']==3]['mpg']],
            labels = ['USA','EU', 'JAPAN'], vert = False)               
ax1.set_title('제조국가별 연비 분포(수직 박스 플롯)')
ax2.set_title('제조국가별 연비 분포(수직 박스 플롯)')               
plt.show()

 

 

반응형
728x90
반응형
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
rc('font', family='Malgun Gothic') # 폰트지정
df = pd.read_excel('./시도별 전출입 인구수.xlsx', engine='openpyxl', header=0)
df = df.fillna(method = 'ffill')
mask = (df['전출지별'] == '서울특별시') & (df['전입지별'] != '서울특별시')
df_seoul = df[mask]
df_seoul = df_seoul.drop(['전출지별'], axis = 1)
df_seoul.rename({'전입지별' : '전입지'}, axis = 1, inplace = True)
df_seoul.set_index('전입지', inplace = True)

print(df_seoul.head())
         1970     1971     1972     1973     1974     1975     1976     1977  \
전입지                                                                             
전국     1448985  1419016  1210559  1647268  1819660  2937093  2495620  2678007   
부산광역시    11568    11130    11768    16307    22220    27515    23732    27213   
대구광역시        -        -        -        -        -        -        -        -   
인천광역시        -        -        -        -        -        -        -        -   
광주광역시        -        -        -        -        -        -        -        -   

          1978     1979  ...     2008     2009     2010     2011     2012  \
전입지                      ...                                                
전국     3028911  2441242  ...  2083352  1925452  1848038  1834806  1658928   
부산광역시    29856    28542  ...    17353    17738    17418    18816    16135   
대구광역시        -        -  ...     9720    10464    10277    10397    10135   
인천광역시        -        -  ...    50493    45392    46082    51641    49640   
광주광역시        -        -  ...    10846    11725    11095    10587    10154   

          2013     2014     2015     2016     2017  
전입지                                                 
전국     1620640  1661425  1726687  1655859  1571423  
부산광역시    16153    17320    17009    15062    14484  
대구광역시    10631    10062    10191     9623     8891  
인천광역시    47424    43212    44915    43745    40485  
광주광역시     9129     9759     9216     8354     7932
print(df_seoul.info())
<class 'pandas.core.frame.DataFrame'>
Index: 17 entries, 전국 to 제주특별자치도
Data columns (total 48 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   1970    17 non-null     object
 1   1971    17 non-null     object
 2   1972    17 non-null     object
 3   1973    17 non-null     object
 4   1974    17 non-null     object
 5   1975    17 non-null     object
 6   1976    17 non-null     object
 7   1977    17 non-null     object
 8   1978    17 non-null     object
 9   1979    17 non-null     object
 10  1980    17 non-null     object
 11  1981    17 non-null     object
 12  1982    17 non-null     object
 13  1983    17 non-null     object
 14  1984    17 non-null     object
 15  1985    17 non-null     object
 16  1986    17 non-null     object
 17  1987    17 non-null     object
 18  1988    17 non-null     object
 19  1989    17 non-null     object
 20  1990    17 non-null     object
 21  1991    17 non-null     object
 22  1992    17 non-null     object
 23  1993    17 non-null     object
 24  1994    17 non-null     object
 25  1995    17 non-null     object
 26  1996    17 non-null     object
 27  1997    17 non-null     object
 28  1998    17 non-null     object
 29  1999    17 non-null     object
 30  2000    17 non-null     object
 31  2001    17 non-null     object
 32  2002    17 non-null     object
 33  2003    17 non-null     object
 34  2004    17 non-null     object
 35  2005    17 non-null     object
 36  2006    17 non-null     object
 37  2007    17 non-null     object
 38  2008    17 non-null     object
 39  2009    17 non-null     object
 40  2010    17 non-null     object
 41  2011    17 non-null     object
 42  2012    17 non-null     object
 43  2013    17 non-null     object
 44  2014    17 non-null     object
 45  2015    17 non-null     object
 46  2016    17 non-null     object
 47  2017    17 non-null     object
dtypes: object(48)
memory usage: 6.5+ KB
None
col_years = list(map(str, range(1970, 1980))) # 문자열 리스트
sr1 = df_seoul.loc[['충청남도', '경상북도', '강원도'], col_years]
print(sr1)

       1970   1971   1972   1973   1974   1975   1976   1977   1978   1979
전입지                                                                       
충청남도  15954  18943  23406  27139  25509  51205  41447  43993  48091  45388
경상북도  11868  16459  22073  27531  26902  46177  40376  41155  42940  43565
강원도    9352  12885  13561  16481  15479  27837  25927  25415  26700  27599
plt.style.use('ggplot') #print(plt.style.available)로 스타일 설정 가능
fig = plt.figure(figsize=(20,5)) # 크기 지정
ax = fig.add_subplot(1,1,1) # 1행1열 1번째

ax.plot(col_years, sr1.loc['충청남도', :], marker = 'o',\
         markerfacecolor = 'green', markersize = 10, color = 'olive',\
        linewidth = 2, label = '서울 -> 충남') # 선그래프
ax.plot(col_years, sr1.loc['경상북도', :], marker = 'o',\
         markerfacecolor = 'blue', markersize = 10, color = 'skyblue',\
        linewidth = 2, label = '서울 -> 경북') # 선그래프
ax.plot(col_years, sr1.loc['강원도', :], marker = 'o',\
         markerfacecolor = 'red', markersize = 10, color = 'magenta',\
        linewidTh = 2, label = '서울 -> 강원') # 선그래프

ax.legend(loc='best', fontsize = 20) # best 최적의 장소, 우상은 그래프로 가리니깐 좌상으로 감
ax.set_title('서울 -> 충남, 경북, 강원 인구이동', size = 20) # 차트 제목
ax.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax.set_xlabel('기간', size = 12)     
ax.set_xticklabels(col_years, rotation = 90)
ax.tick_params(axis = "x", labelsize = 10)
ax.tick_params(axis = "y", labelsize = 10)
plt.show()

col_years = list(map(str, range(2000, 2018))) # 문자열 리스트
sr2 = df_seoul.loc[['경기도','부산광역시'], col_years]
print(sr2)

         2000    2001    2002    2003    2004    2005    2006    2007    2008  \
전입지                                                                             
경기도    435573  499575  516765  457656  400206  414621  449632  431637  412408   
부산광역시   15968   16128   16732   16368   15559   15915   17079   17182   17353   

         2009    2010    2011    2012    2013    2014    2015    2016    2017  
전입지                                                                            
경기도    398282  410735  373771  354135  340801  332785  359337  370760  342433  
부산광역시   17738   17418   18816   16135   16153   17320   17009   15062   14484
plt.style.use('ggplot') #print(plt.style.available)로 스타일 설정 가능
fig = plt.figure(figsize=(20,5)) # 크기 지정
ax = fig.add_subplot(1,1,1) # 1행1열 1번째

ax.plot(col_years, sr2.loc['경기도', :], marker = 'o',\
         markerfacecolor = 'green', markersize = 10, color = 'olive',\
        linewidth = 2, label = '서울 -> 경기') # 선그래프
ax.plot(col_years, sr2.loc['부산광역시', :], marker = 'o',\
         markerfacecolor = 'blue', markersize = 10, color = 'skyblue',\
        linewidth = 2, label = '서울 -> 부산') # 선그래프


ax.legend(loc='best', fontsize = 20) # best 최적의 장소, 우상은 그래프로 가리니깐 좌상으로 감
ax.set_title('서울 -> 경기, 부산 인구이동', size = 20) # 차트 제목
ax.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax.set_xlabel('기간', size = 12)     
ax.set_xticklabels(col_years, rotation = 90)
ax.tick_params(axis = "x", labelsize = 10) # x축의 라벨 크기, 문자 크기
ax.tick_params(axis = "y", labelsize = 10)
plt.show()

# 그림판 여러개 그래프 작성
col_years = list(map(str, range(1970, 2018))) # 문자열 리스트
sr3 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
print(sr3)
         1970   1971   1972   1973   1974   1975   1976   1977   1978   1979  \
전입지                                                                          
충청남도  15954  18943  23406  27139  25509  51205  41447  43993  48091  45388   
경상북도  11868  16459  22073  27531  26902  46177  40376  41155  42940  43565   
강원도    9352  12885  13561  16481  15479  27837  25927  25415  26700  27599   
전라남도  10513  16755  20157  22160  21314  46610  46251  43430  44624  47934   

      ...   2008   2009   2010   2011   2012   2013   2014   2015   2016  \
전입지   ...                                                                  
충청남도  ...  27458  24889  24522  24723  22269  21486  21473  22299  21741   
경상북도  ...  15425  16569  16042  15818  15191  14420  14456  15113  14236   
강원도   ...  23668  23331  22736  23624  22332  20601  21173  22659  21590   
전라남도  ...  16601  17468  16429  15974  14765  14187  14591  14598  13065   

       2017  
전입지          
충청남도  21020  
경상북도  12464  
강원도   21016  
전라남도  12426  

[4 rows x 48 columns]
plt.style.use('ggplot') #print(plt.style.available)로 스타일 설정 가능
fig = plt.figure(figsize=(20,10)) # 크기 지정
ax1 = fig.add_subplot(2,2,1) # 1행1열 1번째
ax2 = fig.add_subplot(2,2,2) # 1행1열 1번째
ax3 = fig.add_subplot(2,2,3) # 1행1열 1번째
ax4 = fig.add_subplot(2,2,4) # 1행1열 1번째
ax1.plot(col_years, sr3.loc['충청남도', :], marker = 'o',\
         markerfacecolor = 'green', markersize = 10, color = 'olive',\
        linewidth = 2, label = '서울 -> 충남') # 선그래프
ax2.plot(col_years, sr3.loc['경상북도', :], marker = 'o',\
         markerfacecolor = 'blue', markersize = 10, color = 'skyblue',\
        linewidth = 2, label = '서울 -> 경북') # 선그래프
ax3.plot(col_years, sr3.loc['강원도', :], marker = 'o',\
         markerfacecolor = 'red', markersize = 10, color = 'red',\
        linewidth = 2, label = '서울 -> 강원') # 선그래프
ax4.plot(col_years, sr3.loc['전라남도', :], marker = 'o',\
         markerfacecolor = 'yellow', markersize = 10, color = 'yellow',\
        linewidth = 2, label = '서울 -> 전남') # 선그래프

ax1.legend(loc='best', fontsize = 20)
ax2.legend(loc='best', fontsize = 20)
ax3.legend(loc='best', fontsize = 20)
ax4.legend(loc='best', fontsize = 20)

ax1.set_title('서울 ->충남 인구이동', size = 20) # 차트 제목
ax2.set_title('서울 ->경북 인구이동', size = 20) # 차트 제목
ax3.set_title('서울 ->강원 인구이동', size = 20) # 차트 제목
ax4.set_title('서울 ->전남 인구이동', size = 20) # 차트 제목

ax1.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax1.set_xlabel('기간', size = 12)     
ax2.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax2.set_xlabel('기간', size = 12)     
ax3.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax3.set_xlabel('기간', size = 12)     
ax4.set_ylabel('이동 인구수', size = 12) #  x축 이름
ax4.set_xlabel('기간', size = 12)     

ax1.set_xticklabels(col_years, rotation = 90)
ax2.set_xticklabels(col_years, rotation = 90)
ax3.set_xticklabels(col_years, rotation = 90)
ax4.set_xticklabels(col_years, rotation = 90)

ax1.tick_params(axis = "x", labelsize = 10) # x축의 라벨 크기, 문자 크기
ax1.tick_params(axis = "y", labelsize = 10)
ax2.tick_params(axis = "x", labelsize = 10) # x축의 라벨 크기, 문자 크기
ax2.tick_params(axis = "y", labelsize = 10)
ax3.tick_params(axis = "x", labelsize = 10) # x축의 라벨 크기, 문자 크기
ax3.tick_params(axis = "y", labelsize = 10)
ax4.tick_params(axis = "x", labelsize = 10) # x축의 라벨 크기, 문자 크기
ax4.tick_params(axis = "y", labelsize = 10)

plt.show()

# 면적그래프 area 선그래프 작성시 선과 x축 공간 을 색으로 표시
sr4 = sr3.T

plt.style.use('ggplot')
# T 된 년도가 인덱스
sr4.index = sr4.index.map(int)
# area 그래프 작성 // 메모리 구조 스택 LIFO T 쌓여진 형태 // F 겹쳐진 혀애
sr4.plot(kind = 'area', stacked = True, alpha= 0.2, figsize = (20,10)) # alpha 투명도
plt.title('서울 -> 타도시 인구이동')
plt.ylabel('인구이동수',size = 20)
plt.xlabel('기간',size = 20)
plt.legend(loc='best')
plt.show()

# 막대그래프
plt.style.use('ggplot')
# area 그래프 작성 // 메모리 구조 스택 LIFO T 쌓여진 형태 // F 겹쳐진 혀애
sr4.plot(kind = 'bar', figsize = (20,10), width = 0.7, color=['orange','green','skyblue','blue']) # alpha 투명도
plt.title('서울 -> 타도시 인구이동', size= 30)
plt.ylabel('인구이동수',size = 20)
plt.xlabel('기간',size = 20)
plt.ylim(5000,60000)
plt.legend(loc='best')
plt.show()

# 그림판 여러개 그래프 작성
col_years = list(map(str, range(2000, 2017))) # 문자열 리스트
sr5 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
print(sr3)


전입지
충청남도    23083
경상북도    14576
강원도     22832
전라남도    22969
Name: 2000, dtype: object
# 막대그래프
plt.style.use('ggplot')
# area 그래프 작성 // 메모리 구조 스택 LIFO T 쌓여진 형태 // F 겹쳐진 혀애
sr5.plot(kind = 'bar', figsize = (20,10), width = 0.7, color=['orange','green','skyblue','blue']) # alpha 투명도
plt.title('서울 -> 타도시 인구이동', size= 30)
plt.ylabel('인구이동수',size = 20)
plt.xlabel('기간',size = 20)
plt.ylim(5000,60000)
plt.legend(loc='best')
plt.show()

#가로 막대그래프
# print(sr3.sum(axis=1))
sr3['합계'] = sr3.sum(axis=1)
print(sr3['합계'])
# 합계 내림차순
sr3_tot = sr3[['합계']].sort_values(by='합계', ascending=True)
print(sr3_tot)

전입지
충청남도    6117092.0
경상북도    4208700.0
강원도     4585100.0
전라남도    5526628.0
Name: 합계, dtype: float64
             합계
전입지            
경상북도  4208700.0
강원도   4585100.0
전라남도  5526628.0
충청남도  6117092.0
# 수직
plt.style.use('ggplot')
sr3_tot.plot(kind = 'barh', figsize = (10,5), width = 0.5, color='cornflowerblue') # alpha 투명도
plt.title('서울 -> 타도시 인구이동', size= 30)
plt.ylabel('전입지',size = 20)
plt.xlabel('이동인구 수',size = 20)
plt.legend(loc='best')
plt.show()

# 그림판 여러개 그래프 작성
col_years = list(map(str, range(2010, 2018))) # 문자열 리스트
sr6 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
sr6['합계'] = sr6.sum(axis=1)
# print(sr6[['합계']]) 데이터 프레임 여러개 중에 한개
# print(sr6['합계']) 시리즈 한열
# 합계 내림차순
sr6_tot = sr6[['합계']].sort_values(by='합계', ascending=True)
print(sr6_tot)


전입지
충청남도    179533.0
경상북도    117740.0
강원도     175731.0
전라남도    116035.0
Name: 합계, dtype: float64
            합계
전입지           
전라남도  116035.0
경상북도  117740.0
강원도   175731.0
충청남도  179533.0

수직 막대

# 수직
plt.style.use('ggplot')
sr6_tot.plot(kind = 'barh', figsize = (10,5), width = 0.5, color='cornflowerblue') # alpha 투명도
plt.title('서울 -> 타도시 인구이동', size= 30)
plt.ylabel('전입지',size = 20)
plt.xlabel('이동인구 수',size = 20)
plt.legend(loc='best')
plt.show()

리스트데이터를 막대로 출력

# 리스트데이터를 막대로 출력
import matplotlib.pyplot as plt

plt.style.use('ggplot')

subjects = ['Orable', 'R', 'Python','Sklearn', 'Tensorflow']
scores = [65,90,85,60,95]

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.bar(range(len(subjects)), scores, align = 'center', color = 'darkblue') # 수치 데이터 삽입

ax1.xaxis.set_ticks_position('bottom')
ax1.yaxis.set_ticks_position('left') # 축 수치 위치
plt.xticks(range(len(subjects)), subjects, rotation = 0, fontsize = 'small') # 종류 데이터 삽입

plt.xlabel('subject') # 축 이름 
plt.ylabel('score')
plt.title('Class Score') # 제목

plt.savefig('bar_plot.png', dpi=400, bbox_inches='tight') # 저장
plt.show()

연합 막대 그리기

# 연합 막대 그리기
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.rcParams['axes.unicode_minus'] = False # 마이너스 부호 출력

# Excel 데이터 프레임으로 변환
df = pd.read_excel('남북한발전전력량.xlsx', engine='openpyxl')
df = df.loc[5:9]
df.drop('전력량 (억㎾h)', axis='columns', inplace = True)
df.set_index('발전 전력별', inplace=True)
df = df.T
print(df.head())

발전 전력별   합계   수력   화력 원자력
1990    277  156  121   -
1991    263  150  113   -
1992    247  142  105   -
1993    221  133   88   -
1994    231  138   93   -

증감율 변동률 계산

# 증감율 변동률 계산
df = df.rename(columns={'합계' : '총발전량'})
 # shift 앞의 값으로 내값을 가져와 // 그래서 맨 위값은 결측값, 가져올게 없어서
df['총발전량 - 1년'] = df['총발전량'].shift(1)
df['증감율'] = ((df['총발전량'] / df['총발전량 - 1년'])- 1) *100
# 2축 그래프 그리기
ax1 = df[['수력', '화력']].plot(kind='bar', figsize = (20,10), width=0.7, stacked=True)

ax2 = ax1.twinx() # 복사, 같은 영역인 것처럼
ax2.plot(df.index, df.증감율, ls='--', marker='o', markersize=20, color='green', label='전년대비 증감율(%)')
# ls -- 점선, marker 0, color green
ax1.set_ylim(0, 500)
ax2.set_ylim(-50, 50)
ax1.set_xlabel('연도', size=20)
ax1.set_ylabel('발전량 (억㎾h)')
ax2.set_ylabel('전년 대비 증감율(%)')
plt.title('북한 전력 발전량 (1990 ~ 2016)', size = 30)
ax1.legend(loc='upper left')

plt.show()

히스토그램

# 히스토그램
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('classic')
df= pd.read_csv('auto-mpg.csv', header = None)
df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']
df['mpg'].plot(kind='hist', bins=100, color='coral', figsize = (10,5))
plt.title('Histogram')
plt.xlabel('mpg')
plt.show()

  • plot(kind='hist') 히스토그램
  • plot(kind='area') 면적
  • plot(kind='bar') 막대
  • plot(kind='barh') 수직 막대
  • bins = 10 구간 10개
# 1 
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
rc('font',family='Malgun Gothic')
df = pd.read_excel('시도별 전출입 인구수.xlsx',engine='openpyxl')
df = df.fillna(method='ffill')
mask = (df['전출지별'] == '서울특별시') & (df['전입지별'] == '전국')
df_seoul_out = df[mask]
df_seoul_out = df_seoul_out.drop(["전출지별"],axis=1)
df_seoul_out.rename(columns={'전입지별':'전입지'},inplace=True)
df_seoul_out.set_index('전입지',inplace=True)

mask2 = (df['전출지별'] == '전국') & (df['전입지별'] == '서울특별시')
df_seoul_in = df[mask2]
df_seoul_in = df_seoul_in.drop(["전입지별"],axis=1)
df_seoul_in.rename(columns={'전출지별':'전출지'},inplace=True)
df_seoul_in.set_index('전출지',inplace=True)

print(df_seoul_in.head())

        1970     1971     1972     1973     1974     1975     1976     1977  \
전출지                                                                           
전국   1742813  1671705  1349333  1831858  2050392  3396662  2756510  2893403   

        1978     1979  ...     2008     2009     2010     2011     2012  \
전출지                    ...                                                
전국   3307439  2589667  ...  2025358  1873188  1733015  1721748  1555281   

        2013     2014     2015     2016     2017  
전출지                                               
전국   1520090  1573594  1589431  1515602  1472937  

[1 rows x 48 columns]

print(df_seoul_out.head())

        1970     1971     1972     1973     1974     1975     1976     1977  \
전입지                                                                           
전국   1448985  1419016  1210559  1647268  1819660  2937093  2495620  2678007   

        1978     1979  ...     2008     2009     2010     2011     2012  \
전입지                    ...                                                
전국   3028911  2441242  ...  2083352  1925452  1848038  1834806  1658928   

        2013     2014     2015     2016     2017  
전입지                                               
전국   1620640  1661425  1726687  1655859  1571423  

[1 rows x 48 columns]

 

plt.style.use('ggplot')
fig = plt.figure(figsize=(20,5))
ax = fig.add_subplot(1,1,1) 
ax.plot(df_seoul_in.loc['전국',:],marker='o',markerfacecolor='green',markersize=5,color='olive', \
linewidth=2, label='서울 전입자')
ax.plot(df_seoul_out.loc['전국',:],marker='o',markerfacecolor='darkblue',markersize=5,color='blue', \
linewidth=2, label='서울 전출자')
ax.legend(loc='best')
ax.set_title('연도별 서울 전입/전출',size = 20)
ax.set_xlabel('기간',size=12)
ax.set_ylabel('이동 인구수',size=12)
ax.tick_params(axis='x',labelsize=10) 
ax.tick_params(axis='y',labelsize=10)

# 2 
import pandas as pd
import matplotlib.pyplot as plt

from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname='c:/Windows/Fonts/malgun.ttf').get_name()
rc('font',family=font_name)

df = pd.read_excel('시도별 전출입 인구수.xlsx', engine='openpyxl')
df = df.fillna(method='ffill')
mask = ((df['전출지별'] == '서울특별시') & (df['전입지별'] == '전국')) |\
((df['전출지별']=='전국') & (df['전입지별'] == '서울특별시'))
df_seoul = df[mask]
df_seoul = df_seoul.drop('전출지별',axis=1)
df_seoul.rename(columns={'전입지별':'전입지'}, inplace =True)
df_seoul.set_index('전입지',inplace=True)
df_seoul = df_seoul.T
df_seoul.rename(columns={'서울특별시':'전입'},inplace=True)
df_seoul.rename(columns={'전국':'전출'}, inplace=True)
df_seoul['증감율'] =((df_seoul['전입'] / df_seoul['전출']) - 1) * 100
plt.style.use('ggplot')
ax1 = df_seoul[['전입','전출']].plot(kind='bar',figsize=(20,10), width=0.8, color=['pink','skyblue'])
ax2 = ax1.twinx()
ax2.plot(df_seoul.index, df_seoul.증감율, ls='--', marker='o', markersize=5,
color='yellowgreen', label='증감율(%)')
ax1.set_ylim(0,4000000)
ax2.set_ylim(-50,50)
ax1.set_xlabel('년도',size=20)
ax1.set_ylabel('이동 인구 수')
ax2.set_ylabel('증감율(%)')
plt.title('서울의 전입 전출 정보',size=30)
ax1.legend(loc='upper left',fontsize=15)
ax2.legend(loc='upper right', fontsize=15)
plt.show()

# 3
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

font_name = font_manager.FontProperties(fname='c:/Windows/Fonts/malgun.ttf').get_name()
rc('font',family=font_name)

plt.style.use('ggplot')
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('남북한발전전력량.xlsx', engine='openpyxl')
df = df.loc[0:4]
df.drop('전력량 (억㎾h)',axis='columns', inplace=True)
df.set_index('발전 전력별', inplace=True)
df = df.T
print(df.head())
print(df.tail())
df = df.rename(columns={'합계':'총발전량'})
df['총발젼량 - 1년'] = df['총발전량'].shift(1)
df['증감율'] = ((df['총발전량'] / df['총발젼량 - 1년']) - 1) * 100

발전 전력별    합계  수력    화력  원자력 신재생
1990    1077  64   484  529   -
1991    1186  51   573  563   -
1992    1310  49   696  565   -
1993    1444  60   803  581   -
1994    1650  41  1022  587   -
발전 전력별    합계  수력    화력   원자력  신재생
2012    5096  77  3430  1503   86
2013    5171  84  3581  1388  118
2014    5220  78  3427  1564  151
2015    5281  58  3402  1648  173
2016    5404  66  3523  1620  195
​
ax1 = df[['수력','화력','원자력']].plot(kind='bar', figsize=(20,10), width = 0.7, stacked=True)
ax2 = ax1.twinx()
ax2.plot(df.index, df.증감율, ls='--', marker='o', markersize=10,
color='green', label='전년대비 증감율(%)')
ax1.set_ylim(0,7000)
ax2.set_ylim(-50,50)
ax1.set_xlabel('년도',size=20)
ax1.set_ylabel('발전량(억 kWh)')
ax2.set_ylabel('전년 대비 증감율(%)')
plt.title('남한 전력 발전량(1990 ~ 2016)', size= 30)
ax1.legend(loc='upper left')
plt.show()

 

 

반응형

+ Recent posts