Part IV: Clustering and Visualising

Jump to :

  • Part 1 Extracting Street Addresses & Coordinates
  • Part 2, Extracting Foursquare Data
  • Part 3 , Exploratory Data Analysis
  • Part 5, Conclusion & Discussion

Step 1: Load environment and data

In [1]:
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
In [7]:
orderedStreetTrikkBussMetroTog = pd.read_csv('./orderedStreetTrikkBusMetroTog.csv')
orderedStreetTrikkBussMetroTog.head()
Out[7]:
Street Street Latitude Street Longitude Trikk Trikk Distance 0 1 2 3 4 ... 16 17 T-bane_1 T-bane_2 T-bane_3 T-bane_4 Train Station Total Transport Total Bus Binned Transport
0 Lilletorget 59.913500 10.755900 Jernbanetorget (Trikk/B) 356.0 buss 500 Buss 30 Buss 252 Buss 70 Buss 34 ... 550 Oslo Bussterminal - Lillestrøm Plattform 18 - Buss 411 Lillestrøm ('Jernbanetorget (T)', 248) ('Grønland (T)', 318) NaN NaN ('Oslo Sentralstasjon', 332) 22 18 19-22
1 Europarådets plass 59.912000 10.749300 Jernbanetorget (Trikk/B) 48.0 Buss 31 E Buss 34 Buss 542 Seiersten Ekspress Buss 54 Buss 82E ... 81A-bussen platform 29 oslo bussterminal ('Jernbanetorget (T)', 164) ('Stortinget (T)', 420) NaN NaN ('Oslo Sentralstasjon', 300) 22 18 19-22
2 Brugata 59.914005 10.755774 Jernbanetorget (Trikk/B) 375.0 Buss 30 buss 500 Buss 252 Buss 54 Buss 70 ... Plattform 18 - Buss 411 Lillestrøm NaN ('Jernbanetorget (T)', 277) ('Grønland (T)', 345) NaN NaN ('Oslo Sentralstasjon', 384) 21 17 19-22
3 Pløens gate 59.913900 10.749325 Jernbanetorget (Trikk/B) 187.0 Buss 54 Buss 31 Buss 54 Buss 30 Buss 37 ... platform 29 oslo bussterminal NaN ('Jernbanetorget (T)', 241) ('Stortinget (T)', 428) NaN NaN ('Oslo Sentralstasjon', 443) 21 17 19-22
4 Sonja Henies plass 59.912700 10.755500 NaN NaN Buss 252 platform 29 oslo bussterminal buss 500 Buss 70 Buss 30 ... 550 Oslo Bussterminal - Lillestrøm plattform 20-Buss 501 enebakk-Lillestrøm ('Jernbanetorget (T)', 190) ('Grønland (T)', 327) NaN NaN ('Oslo Sentralstasjon', 240) 21 18 19-22

5 rows × 31 columns

Step 2: K-Means Clustering

In [4]:
#K-means clustering on Total Transport
kclusters = 7

#Create object
kmClust = KMeans(init = 'k-means++', n_clusters = kclusters, n_init= 12, random_state= 1)

#Fit
kmLabels = kmClust.fit(orderedStreetTrikkBussMetroTog[['Total Transport']])

#Check labels
kmLabels.labels_[0:6]
Out[4]:
array([3, 3, 3, 3, 3, 3], dtype=int32)
In [8]:
#Insert into dataframe of ordered bus trikk
#orderedStreetTrikkBussMetroTog.drop('Cluster', axis = 'columns', inplace = True)#In case Cluster exists already from previous rounds
orderedStreetTrikkBussMetroTog.insert(3, 'Cluster', kmLabels.labels_)
orderedStreetTrikkBussMetroTog.head(20)
Out[8]:
Street Street Latitude Street Longitude Cluster Trikk Trikk Distance 0 1 2 3 ... 16 17 T-bane_1 T-bane_2 T-bane_3 T-bane_4 Train Station Total Transport Total Bus Binned Transport
0 Lilletorget 59.913500 10.755900 3 Jernbanetorget (Trikk/B) 356.0 buss 500 Buss 30 Buss 252 Buss 70 ... 550 Oslo Bussterminal - Lillestrøm Plattform 18 - Buss 411 Lillestrøm ('Jernbanetorget (T)', 248) ('Grønland (T)', 318) NaN NaN ('Oslo Sentralstasjon', 332) 22 18 19-22
1 Europarådets plass 59.912000 10.749300 3 Jernbanetorget (Trikk/B) 48.0 Buss 31 E Buss 34 Buss 542 Seiersten Ekspress Buss 54 ... 81A-bussen platform 29 oslo bussterminal ('Jernbanetorget (T)', 164) ('Stortinget (T)', 420) NaN NaN ('Oslo Sentralstasjon', 300) 22 18 19-22
2 Brugata 59.914005 10.755774 3 Jernbanetorget (Trikk/B) 375.0 Buss 30 buss 500 Buss 252 Buss 54 ... Plattform 18 - Buss 411 Lillestrøm NaN ('Jernbanetorget (T)', 277) ('Grønland (T)', 345) NaN NaN ('Oslo Sentralstasjon', 384) 21 17 19-22
3 Pløens gate 59.913900 10.749325 3 Jernbanetorget (Trikk/B) 187.0 Buss 54 Buss 31 Buss 54 Buss 30 ... platform 29 oslo bussterminal NaN ('Jernbanetorget (T)', 241) ('Stortinget (T)', 428) NaN NaN ('Oslo Sentralstasjon', 443) 21 17 19-22
4 Sonja Henies plass 59.912700 10.755500 3 NaN NaN Buss 252 platform 29 oslo bussterminal buss 500 Buss 70 ... 550 Oslo Bussterminal - Lillestrøm plattform 20-Buss 501 enebakk-Lillestrøm ('Jernbanetorget (T)', 190) ('Grønland (T)', 327) NaN NaN ('Oslo Sentralstasjon', 240) 21 18 19-22
5 Nygata 59.913150 10.750750 3 Jernbanetorget (Trikk/B) 108.0 Buss 54 Buss 54 Buss 34 Buss 30 ... platform 29 oslo bussterminal NaN ('Jernbanetorget (T)', 126) ('Stortinget (T)', 492) NaN NaN ('Oslo Sentralstasjon', 329) 21 17 19-22
6 Kirkeristen 59.913000 10.747450 3 Jernbanetorget (Trikk/B) 166.0 Buss 37 Buss 31 E Buss 54 Buss 54 ... 81A-bussen NaN ('Jernbanetorget (T)', 276) ('Stortinget (T)', 307) NaN NaN ('Oslo Sentralstasjon', 447) 21 17 19-22
7 Lybekkergata 59.913567 10.752767 3 Jernbanetorget (Trikk/B) 212.0 Buss 30 Buss 54 Buss 54 Buss 34 ... 150 Oslo Bussterminal - Gullhaug - Oslo Busst... 81A-bussen ('Jernbanetorget (T)', 147) NaN NaN NaN ('Oslo Sentralstasjon', 329) 21 18 19-22
8 Jernbanetorget 59.911300 10.750425 3 Jernbanetorget (Trikk/B) 107.0 Buss 31 E Buss 542 Seiersten Ekspress Buss 82E Buss 143 ... platform 29 oslo bussterminal NaN ('Jernbanetorget (T)', 146) NaN NaN NaN ('Oslo Sentralstasjon', 210) 20 17 19-22
9 Stenersgata 59.913111 10.752633 3 Jernbanetorget (Trikk/B) 174.0 Buss 30 Buss 34 Buss 70 Buss 54 ... 150 Oslo Bussterminal - Gullhaug - Oslo Busst... NaN ('Jernbanetorget (T)', 96) NaN NaN NaN ('Oslo Sentralstasjon', 281) 20 17 19-22
10 Biskop Gunnerus’ gate 59.912050 10.752583 3 Jernbanetorget (Trikk/B) 144.0 Buss 70 Buss 34 Buss 143 Buss 252 ... NaN NaN ('Jernbanetorget (T)', 33) NaN NaN NaN ('Oslo Sentralstasjon', 172) 19 16 19-22
11 Skippergata 59.910339 10.747331 3 Jernbanetorget (Trikk/B) 260.0 Buss 542 Til Drøbak Buss 542 Seiersten Ekspress Buss 82E 81B-Bussen ... NaN NaN ('Jernbanetorget (T)', 346) ('Stortinget (T)', 408) NaN NaN ('Oslo Sentralstasjon', 373) 18 14 16-18
12 Stortorvet 59.912733 10.745589 3 Jernbanetorget (Trikk/B) 253.0 Buss 37 Buss 83 Buss 31 E Buss 542 Til Drøbak ... NaN NaN ('Jernbanetorget (T)', 371) ('Stortinget (T)', 203) NaN NaN NaN 18 15 16-18
13 Strandgata 59.909950 10.749200 3 Jernbanetorget (Trikk/B) 259.0 81B-Bussen Buss 82E Buss 542 Til Drøbak Buss 542 Seiersten Ekspress ... NaN NaN ('Jernbanetorget (T)', 307) NaN NaN NaN ('Oslo Sentralstasjon', 279) 17 14 16-18
14 Olafiagangen 59.912900 10.759117 3 Brugata (trikk) 379.0 Buss 490E buss 500 Plattform 18 - Buss 411 Lillestrøm 550 Oslo Bussterminal - Lillestrøm ... NaN NaN ('Grønland (T)', 127) ('Jernbanetorget (T)', 392) NaN NaN ('Oslo Sentralstasjon', 378) 17 13 16-18
15 Anne-Cath. Vestlys plass 59.908700 10.752100 3 Jernbanetorget (Trikk/B) 411.0 Buss 82E Buss 143 Buss 542 Til Drøbak Buss 542 Seiersten Ekspress ... NaN NaN ('Jernbanetorget (T)', 397) NaN NaN NaN ('Oslo Sentralstasjon', 243) 16 13 16-18
16 Robert Levins gate 59.908433 10.753400 3 NaN NaN Konkurenten Bus 28 Buss 82E Buss 143 Buss 542 Til Drøbak ... NaN NaN ('Jernbanetorget (T)', 432) NaN NaN NaN ('Oslo Sentralstasjon', 251) 15 13 13-15
17 Fred. Olsens gate 59.909600 10.747857 3 Jernbanetorget (Trikk/B) 318.0 Buss 542 Til Drøbak 81A-bussen Buss 82E 81B-Bussen ... NaN NaN ('Jernbanetorget (T)', 383) NaN NaN NaN ('Oslo Sentralstasjon', 362) 15 12 13-15
18 Henny Mürers gang 59.908256 10.754389 0 Jernbanetorget (trikk) 434.0 Buss 143 Buss 82E buss 500 Buss 252 ... NaN NaN NaN NaN NaN NaN ('Oslo Sentralstasjon', 269) 14 12 13-15
19 Youngstorget 59.914583 10.749083 0 Jernbanetorget (Trikk/B) 265.0 Buss 31 Buss 54 Buss 54 Buss 37 ... NaN NaN ('Jernbanetorget (T)', 310) ('Stortinget (T)', 443) NaN NaN NaN 14 11 13-15

20 rows × 32 columns

In [10]:
# Matplotlib and associated plotting modules
import matplotlib.cm as cm
import matplotlib.colors as colors
import folium

#Make map object
latitude = 59.9133301
longitude = 10.7389701

map_cluster = folium.Map(location=[latitude, longitude], zoom_start=11)


# set color scheme for the clusters
x = np.arange(kclusters)#kclusters
ys = [i + x + (i*x)**2 for i in range(kclusters)]#kclusters
colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))
rainbow = [colors.rgb2hex(i) for i in colors_array]

# add markers to map
markers_colors = []
for lat, lng, street, cluster, group in zip(orderedStreetTrikkBussMetroTog['Street Latitude'], orderedStreetTrikkBussMetroTog['Street Longitude'],
                                   orderedStreetTrikkBussMetroTog['Street'], orderedStreetTrikkBussMetroTog['Cluster'].astype('int'), orderedStreetTrikkBussMetroTog['Binned Transport']):
    

    #label = folium.Popup(str(street) + ' Cluster ' + str(cluster) + ' ' + str(group), parse_html=True)
    label = folium.Popup(str(street) + ' Group:' + str(group) + '\nCluster:'+ str(cluster) , parse_html = True)
    folium.CircleMarker(
        [lat, lng],
        radius=5,
        popup=label,
        color=rainbow[cluster-1],
        fill=True,
        fill_color=rainbow[cluster-1],
        fill_opacity=0.7).add_to(map_cluster)
       
map_cluster
Out[10]: