티스토리 뷰

subway 분석
In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [33]:
f = open('CARD_SUBWAY_MONTH_201901.csv', encoding='utf-8')

head = f.readline()

data=[]

for line in f:
    l = line.strip().split(',')
    l2 = [i.strip('"') for i in l]
    
    l2[0]=int(l2[0])
    l2[2]=int(l2[2])
    l2[4]=int(l2[4])
    l2[5]=int(l2[5])
    l2[6]=int(l2[6])
    
    l2.append(l2[0]//10000)
    l2.append((l2[0]//100)%100) # l2[0]%10000//100
    l2.append(l2[0]%100)
    
    
    data.append(l2)
    
    
f.close()
In [34]:
head
Out[34]:
'\ufeff"사용일자","노선명","역ID","역명","승차총승객수","하차총승객수","등록일자"\n'
In [35]:
data[-10:]  # 숫자로 바꾸면 0201 같은 경우 201로 바뀐다
Out[35]:
[[20190131, '2호선', 201, '시청', 29981, 29575, 20190203, 2019, 1, 31],
 [20190131, '1호선', 159, '동묘앞', 9483, 9727, 20190203, 2019, 1, 31],
 [20190131, '1호선', 158, '청량리(서울시립대입구)', 29384, 30328, 20190203, 2019, 1, 31],
 [20190131, '1호선', 157, '제기동', 25142, 26221, 20190203, 2019, 1, 31],
 [20190131, '1호선', 156, '신설동', 18001, 17784, 20190203, 2019, 1, 31],
 [20190131, '1호선', 155, '동대문', 14563, 15139, 20190203, 2019, 1, 31],
 [20190131, '1호선', 154, '종로5가', 30249, 29703, 20190203, 2019, 1, 31],
 [20190131, '1호선', 153, '종로3가', 36804, 35050, 20190203, 2019, 1, 31],
 [20190131, '1호선', 152, '종각', 51970, 50080, 20190203, 2019, 1, 31],
 [20190131, '1호선', 151, '시청', 29059, 29169, 20190203, 2019, 1, 31]]
In [36]:
type(data)
Out[36]:
list
In [40]:
#기본적으로 for문 이용하여 한줄씩 읽어가며 원하는 정보를 하나씩 빼내

data2= [[line[4], line[5]] for line in data]
data2[:10]
Out[40]:
[[1520, 1436],
 [275, 114],
 [1509, 1083],
 [357, 271],
 [1772, 1963],
 [787, 765],
 [2649, 2661],
 [734, 726],
 [1347, 1534],
 [1542, 1516]]
In [41]:
subway = np.array(data2, dtype=float)
subway.shape
Out[41]:
(18334, 2)
In [47]:
import matplotlib.pyplot as plt

plt.scatter(subway[:,0],subway[:,1], alpha=0.2)
plt.plot([0,150000],[0,150000],'r')
plt.axis('equal')
Out[47]:
(-7500.0, 157500.0, -7500.014486754966, 157500.00068984547)
In [51]:
plt.scatter(subway[:,0],subway[:,1], alpha=0.2)

plt.axis('scaled')
plt.xlim(0,20000)
plt.ylim(0,30000)
Out[51]:
(0, 30000)
In [83]:
from sklearn.linear_model import LinearRegression

model = LinearRegression()



X=subway[:,[0]]   # subway[:,0].reshape(-1,1)
y=subway[:,1]

model.fit(X,y)

display(model.coef_, model.intercept_)
display(model.score(subway[:,[0]], subway[:,1]))
array([1.00866016])
-156.5876922830248
0.9886980443792561
In [82]:
a= list(subway[:,1]/subway[:,0])        # 각 점의 기울기를 알아낸다.

plt.scatter(subway[:,0], a, alpha=0.2)
plt.ylabel('slope')
plt.xlabel('boarding')
Out[82]:
Text(0.5,0,'boarding')
In [71]:
sort_a = np.argsort(a)  # 인덱스로 바꿔서 정렬

sort_a[::-1]# 반대방향 정렬
Out[71]:
array([11361,    19,  6567, ...,  1077,  7642, 16750], dtype=int64)
In [73]:
sort_a[-10:]
Out[73]:
array([ 2498,  3443, 15947,   330, 11019, 15259,  7476,  6567,    19,
       11361], dtype=int64)
In [75]:
data[11361]
Out[75]:
[20190120, '4호선', 426, '서울역', 6619, 16305, 20190123, 2019, 1, 20]
In [76]:
data[19]
Out[76]:
[20190101, '경의선', 1282, '월롱', 719, 1761, 20190104, 2019, 1, 1]
In [77]:
data[6567]
Out[77]:
[20190112, '4호선', 426, '서울역', 9022, 21800, 20190115, 2019, 1, 12]
In [79]:
data[7476]
Out[79]:
[20190113, '4호선', 426, '서울역', 6578, 15843, 20190116, 2019, 1, 13]

pandas 적용 예시

In [84]:
import pandas as pd
In [85]:
cols = ["사용일자","노선명","역ID","역명","승차총승객수","하차총승객수","등록일자","년도","월","일"]
subway_df = pd.DataFrame(data, columns=cols)
In [87]:
subway_df
Out[87]:
사용일자 노선명 역ID 역명 승차총승객수 하차총승객수 등록일자 년도
0 20190101 경춘선 1323 가평 1520 1436 20190104 2019 1 1
1 20190101 경춘선 1322 상천 275 114 20190104 2019 1 1
2 20190101 경춘선 1321 청평 1509 1083 20190104 2019 1 1
3 20190101 경춘선 1320 대성리 357 271 20190104 2019 1 1
4 20190101 경춘선 1319 마석 1772 1963 20190104 2019 1 1
5 20190101 경춘선 1318 천마산 787 765 20190104 2019 1 1
6 20190101 경춘선 1317 평내호평 2649 2661 20190104 2019 1 1
7 20190101 경춘선 1316 금곡 734 726 20190104 2019 1 1
8 20190101 경춘선 1315 사릉 1347 1534 20190104 2019 1 1
9 20190101 경춘선 1314 퇴계원 1542 1516 20190104 2019 1 1
10 20190101 경춘선 1313 별내 1321 1232 20190104 2019 1 1
11 20190101 경춘선 1312 갈매 1068 954 20190104 2019 1 1
12 20190101 경인선 1804 부천 24321 24169 20190104 2019 1 1
13 20190101 경인선 1803 역곡 13653 14049 20190104 2019 1 1
14 20190101 경인선 1802 오류동 7126 6603 20190104 2019 1 1
15 20190101 경인선 1801 개봉 11366 11785 20190104 2019 1 1
16 20190101 경의선 1296 계양 1 0 20190104 2019 1 1
17 20190101 경의선 1284 문산 3860 4170 20190104 2019 1 1
18 20190101 경의선 1283 파주 729 659 20190104 2019 1 1
19 20190101 경의선 1282 월롱 719 1761 20190104 2019 1 1
20 20190101 경의선 1280 금촌 4346 5071 20190104 2019 1 1
21 20190101 경의선 1279 금릉 2311 2469 20190104 2019 1 1
22 20190101 경의선 1278 운정 2572 2670 20190104 2019 1 1
23 20190101 경의선 1277 야당 2377 2265 20190104 2019 1 1
24 20190101 경의선 1276 탄현 3252 3199 20190104 2019 1 1
25 20190101 경의선 1275 일산 3725 3768 20190104 2019 1 1
26 20190101 경의선 1274 풍산 2476 2508 20190104 2019 1 1
27 20190101 경의선 1273 백마 2606 2497 20190104 2019 1 1
28 20190101 경의선 1272 곡산 215 209 20190104 2019 1 1
29 20190101 경의선 1271 능곡 1748 1700 20190104 2019 1 1
... ... ... ... ... ... ... ... ... ... ...
18304 20190131 2호선 221 역삼 63414 69744 20190203 2019 1 31
18305 20190131 2호선 220 선릉 69459 61644 20190203 2019 1 31
18306 20190131 2호선 219 삼성(무역센터) 65186 67747 20190203 2019 1 31
18307 20190131 2호선 218 종합운동장 10254 10959 20190203 2019 1 31
18308 20190131 2호선 217 잠실새내 27967 27937 20190203 2019 1 31
18309 20190131 2호선 216 잠실(송파구청) 89355 85642 20190203 2019 1 31
18310 20190131 2호선 215 잠실나루 20006 19265 20190203 2019 1 31
18311 20190131 2호선 214 강변(동서울터미널) 44302 44291 20190203 2019 1 31
18312 20190131 2호선 213 구의(광진구청) 28067 26975 20190203 2019 1 31
18313 20190131 2호선 212 건대입구 44899 49051 20190203 2019 1 31
18314 20190131 2호선 211 성수 34567 37720 20190203 2019 1 31
18315 20190131 2호선 210 뚝섬 21130 22598 20190203 2019 1 31
18316 20190131 2호선 209 한양대 8791 9700 20190203 2019 1 31
18317 20190131 2호선 208 왕십리(성동구청) 20764 17129 20190203 2019 1 31
18318 20190131 2호선 207 상왕십리 16668 15952 20190203 2019 1 31
18319 20190131 2호선 206 신당 16242 16890 20190203 2019 1 31
18320 20190131 2호선 205 동대문역사문화공원 17863 20145 20190203 2019 1 31
18321 20190131 2호선 204 을지로4가 13946 13843 20190203 2019 1 31
18322 20190131 2호선 203 을지로3가 26344 26216 20190203 2019 1 31
18323 20190131 2호선 202 을지로입구 55692 56015 20190203 2019 1 31
18324 20190131 2호선 201 시청 29981 29575 20190203 2019 1 31
18325 20190131 1호선 159 동묘앞 9483 9727 20190203 2019 1 31
18326 20190131 1호선 158 청량리(서울시립대입구) 29384 30328 20190203 2019 1 31
18327 20190131 1호선 157 제기동 25142 26221 20190203 2019 1 31
18328 20190131 1호선 156 신설동 18001 17784 20190203 2019 1 31
18329 20190131 1호선 155 동대문 14563 15139 20190203 2019 1 31
18330 20190131 1호선 154 종로5가 30249 29703 20190203 2019 1 31
18331 20190131 1호선 153 종로3가 36804 35050 20190203 2019 1 31
18332 20190131 1호선 152 종각 51970 50080 20190203 2019 1 31
18333 20190131 1호선 151 시청 29059 29169 20190203 2019 1 31

18334 rows × 10 columns

In [88]:
subway_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18334 entries, 0 to 18333
Data columns (total 10 columns):
사용일자      18334 non-null int64
노선명       18334 non-null object
역ID       18334 non-null int64
역명        18334 non-null object
승차총승객수    18334 non-null int64
하차총승객수    18334 non-null int64
등록일자      18334 non-null int64
년도        18334 non-null int64
월         18334 non-null int64
일         18334 non-null int64
dtypes: int64(8), object(2)
memory usage: 1.4+ MB
In [89]:
subway_df.describe()
Out[89]:
사용일자 역ID 승차총승객수 하차총승객수 등록일자 년도
count 1.833400e+04 18334.000000 18334.000000 18334.000000 1.833400e+04 18334.0 18334.0 18334.000000
mean 2.019012e+07 1882.867296 12100.360751 12048.564143 2.019013e+07 2019.0 1.0 16.002182
std 8.945375e+00 1178.994356 12968.981816 13155.849968 2.615326e+01 0.0 0.0 8.945375
min 2.019010e+07 150.000000 1.000000 0.000000 2.019010e+07 2019.0 1.0 1.000000
25% 2.019011e+07 1030.000000 3848.250000 3661.250000 2.019011e+07 2019.0 1.0 8.000000
50% 2.019012e+07 1812.000000 8364.000000 8177.000000 2.019012e+07 2019.0 1.0 16.000000
75% 2.019012e+07 2634.000000 15865.000000 15733.750000 2.019013e+07 2019.0 1.0 24.000000
max 2.019013e+07 4713.000000 132727.000000 137826.000000 2.019020e+07 2019.0 1.0 31.000000
In [91]:
subway_df['승차총승객수']  #subway_Df.승차총승객수
Out[91]:
0         1520
1          275
2         1509
3          357
4         1772
5          787
6         2649
7          734
8         1347
9         1542
10        1321
11        1068
12       24321
13       13653
14        7126
15       11366
16           1
17        3860
18         729
19         719
20        4346
21        2311
22        2572
23        2377
24        3252
25        3725
26        2476
27        2606
28         215
29        1748
         ...  
18304    63414
18305    69459
18306    65186
18307    10254
18308    27967
18309    89355
18310    20006
18311    44302
18312    28067
18313    44899
18314    34567
18315    21130
18316     8791
18317    20764
18318    16668
18319    16242
18320    17863
18321    13946
18322    26344
18323    55692
18324    29981
18325     9483
18326    29384
18327    25142
18328    18001
18329    14563
18330    30249
18331    36804
18332    51970
18333    29059
Name: 승차총승객수, Length: 18334, dtype: int64

numpy에서는 괄호 안에 어떤 값을 넣으면 행에 대해 처리하지만, pandas는 열에 대해 처리

In [93]:
subway_df.iloc[:5,:4]
Out[93]:
사용일자 노선명 역ID 역명
0 20190101 경춘선 1323 가평
1 20190101 경춘선 1322 상천
2 20190101 경춘선 1321 청평
3 20190101 경춘선 1320 대성리
4 20190101 경춘선 1319 마석
In [95]:
subway_df[['승차총승객수', '하차총승객수']]
# 칼럼단위이므로 내가 원하는 정보를 리스트 안에 넣어서 해야해
Out[95]:
승차총승객수 하차총승객수
0 1520 1436
1 275 114
2 1509 1083
3 357 271
4 1772 1963
5 787 765
6 2649 2661
7 734 726
8 1347 1534
9 1542 1516
10 1321 1232
11 1068 954
12 24321 24169
13 13653 14049
14 7126 6603
15 11366 11785
16 1 0
17 3860 4170
18 729 659
19 719 1761
20 4346 5071
21 2311 2469
22 2572 2670
23 2377 2265
24 3252 3199
25 3725 3768
26 2476 2508
27 2606 2497
28 215 209
29 1748 1700
... ... ...
18304 63414 69744
18305 69459 61644
18306 65186 67747
18307 10254 10959
18308 27967 27937
18309 89355 85642
18310 20006 19265
18311 44302 44291
18312 28067 26975
18313 44899 49051
18314 34567 37720
18315 21130 22598
18316 8791 9700
18317 20764 17129
18318 16668 15952
18319 16242 16890
18320 17863 20145
18321 13946 13843
18322 26344 26216
18323 55692 56015
18324 29981 29575
18325 9483 9727
18326 29384 30328
18327 25142 26221
18328 18001 17784
18329 14563 15139
18330 30249 29703
18331 36804 35050
18332 51970 50080
18333 29059 29169

18334 rows × 2 columns

Tab을 잘 활용하자!! 어떤 글자를 쓰고 tab누르면 관련 명령어가 다 나옴.

In [97]:
subway_df['노선명'].unique()
Out[97]:
array(['경춘선', '경인선', '경의선', '경원선', '경부선', '2호선', '경강선', '수인선', '분당선',
       '9호선2~3단계', '9호선', '8호선', '7호선', '6호선', '공항철도 1호선', '5호선', '4호선',
       '3호선', '1호선', '중앙선', '안산선', '우이신설선', '일산선', '장항선', '과천선'],
      dtype=object)
In [101]:
subway_df['노선명'].value_counts()   # numpy의 bincount와 유사
Out[101]:
7호선         1581
5호선         1581
2호선         1550
경부선         1209
6호선         1164
분당선         1071
3호선         1049
경원선          912
4호선          806
경의선          806
9호선          775
중앙선          651
경인선          620
경춘선          589
8호선          527
공항철도 1호선     434
9호선2~3단계     403
수인선          403
우이신설선        403
안산선          403
경강선          341
일산선          312
1호선          310
과천선          248
장항선          186
Name: 노선명, dtype: int64
In [102]:
subway_df['사용일자'].value_counts()
Out[102]:
20190129    593
20190103    593
20190121    593
20190130    593
20190114    592
20190112    592
20190113    592
20190102    592
20190116    592
20190101    592
20190107    592
20190120    592
20190111    592
20190127    592
20190124    592
20190128    592
20190115    591
20190131    591
20190122    591
20190109    591
20190117    591
20190110    591
20190126    591
20190119    591
20190118    591
20190108    591
20190106    590
20190123    590
20190104    590
20190105    589
20190125    589
Name: 사용일자, dtype: int64

모든 역이 매일 정보가 있는건 아닐까? 아니면 2번 이상 들어간 역이 있어서?

In [104]:
subway_df['역명'].value_counts()
Out[104]:
서울역                 164
공덕                  124
김포공항                102
홍대입구                 95
동대문역사문화공원            93
고속터미널                93
종로3가                 93
디지털미디어시티             93
왕십리(성동구청)            93
신설동                  93
선정릉                  62
잠실(송파구청)             62
온수(성공회대입구)           62
동작(현충원)              62
성신여대입구(돈암)           62
양평                   62
삼각지                  62
상봉(시외버스터미널)          62
노원                   62
가락시장                 62
충정로(경기대입구)           62
도곡                   62
당산                   62
석촌                   62
교대(법원.검찰청)           62
영등포구청                62
이촌(국립중앙박물관)          62
선릉                   62
옥수                   62
청구                   62
                   ... 
방배                   31
남춘천                  31
덕정                   31
장지                   31
증미                   31
광명                   31
성환                   31
증산(명지대앞)             31
언주                   31
단대오거리                31
기흥                   31
마석                   31
영종                   31
삼동                   31
상월곡(한국과학기술연구원)       31
광나루(장신대)             31
개화                   31
범계                   31
미아사거리                31
매교                   31
동암                   31
영등포                  31
안국                   31
정발산                  31
중동                   31
장암                   31
상계                   31
남한산성입구(성남법원.검찰청)     31
을지로입구                31
원인재                  31
Name: 역명, Length: 509, dtype: int64


데이터 출처 : http://data.seoul.go.kr/


'beginner > 파이썬 머신러닝 기초' 카테고리의 다른 글

지도학습 - LinearSVM_2  (0) 2019.03.05
지도학습 - LinearSVM_1  (0) 2019.03.05
지도학습 - 선형회귀  (1) 2019.02.27
와인 데이터 분석  (0) 2019.02.26
sklearn 기본 틀  (0) 2019.02.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함